前言¶
本文介绍如何将开源框架的网络模型(如Caffe、Onnx等),通过ATC(Advanced Tensor Compiler)将其转换成图像分析引擎支持的离线模型,模型转换过程中可以实现算子调度的优化、权值数据重排、内存使用优化等,可以脱离设备完成模型的预处理。
与本文档相对应的产品版本如下。
本文档主要适用于以下工程师:
技术支持工程师
软件开发工程师
掌握以下经验和技能可以更好地理解本文档:
熟悉Linux基本命令。
对机器学习、图像分析方法有一定的了解。
在本文中可能出现下列标志,它们所代表的含义如下。
修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。
|
图像分析引擎小节新增Scatter/ScatterElements,Flatten、Where、ScatterND涉及修改 |
||
简介¶
工具功能架构¶
ATC工具功能架构如图1所示。从图1中可以看出,用户可以将开源框架网络模型通过ATC工具转换成适配图像分析引擎的离线模型,也可以将转换后的离线模型转成json文件,方便文件查看。用户也可以直接将开源框架网络模型文件通过ATC工具转成json文件。
工具运行流程¶
使用ATC工具进行模型转换的总体流程如图1所示。
详细流程说明如下。
使用入门¶
准备动作¶
获取ATC工具¶
独立安装CANN包,详请请参见《驱动和开发环境安装指南》"2.3.4 软件包安装"。
本手册以ATC独立安装CANN包为例进行说明。
设置环境变量¶
须知:
使用export方式设置环境变量后,环境变量只在当前窗口有效。如果用户之前在.bashrc文件中设置过ATC安装路径的环境变量,则在执行上述命令之前,需要先手动删除原来设置的ATC安装路径环境变量。
如果用户之前在.bashrc文件中设置过之前版本ATC安装路径的环境变量,则在执行atc命令之前,需要先手动删除原来设置的ATC安装路径环境变量,然后设置如下环境变量。设置完成后,切换到新窗口执行atc模型转换命令。
必选环境变量(如下环境变量中${install_path}以软件包使用默认安装路径为例进行说明)
export PATH=${install_path}/Ascend/ascend-toolkit/{software version}/atc/bin:$PATH
export LD_LIBRARY_PATH=${install_path}/Ascend/ascend-toolkit/{software version}/atc/third_party_lib:$LD_LIBRARY_PATH
或者执行如下命令配置环境变量。
source ${install_path}/Ascend/ascend-toolkit/{software version}/x86_64-linux/script/setenv.sh
转换样例¶
须知: 使用高版本ATC工具转换的模型,在低版本环境上使用可能会出现不兼容问题,建议使用匹配的版本重新进行模型转换。
以ATC运行用户登录开发环境,并将模型转换过程中用到的模型文件(*.prototxt)、权重文件(*.caffemodel)等上传到开发环境任意路径,例如上传到$HOME_/test/_目录下。
执行如下命令生成离线模型。(如下命令中使用的目录以及文件均为样例,请以实际为准)
atc --model=$HOME/test/xxx.prototxt --weight=$HOME/test/xxx.caffemodel --framework=0 --output=$HOME/test/out/xxx --image_list="data:$HOME/test/xxx_image_list.txt" --insert_op_conf="$HOME/test/image_preprocess.txt"关于参数的详细解释以及使用方法请参见参数说明。
若提示如下信息,则说明模型转换成功。
end binary code generating成功执行命令后,在output参数指定的路径下,可查看离线模型(如:xxx.om)。
说明:
如果用户使用Faster RCNN、YOLOv3、YOLOv2、SSD等Caffe框架网络模型进行模型转换,由于此类网络中包含了一些原始Caffe框架中没有定义的算子结构,如ROIPooling、Normalize、PSROI Pooling和Upsample等。为了使图像分析引擎能支持这些网络,需要对原始的Caffe框架网络模型进行扩展,降低开发者开发自定义算子/开发后处理代码的工作量,详细扩展方法请参见检测网硬化加速prototxt示例。
以ATC运行用户登录开发环境,并将模型转换过程中使用到的模型文件(*.onnx)等上传到开发环境任意路径,例如$HOME_/test/_目录下。
执行如下命令生成离线模型。(如下命令中使用的目录以及文件均为样例,请以实际为准)
atc --model=$HOME/test/xxx.onnx --framework=5 --output=$HOME/test/out/xxx.om –image_list=”data:$HOME/test/xxx_image_list.txt”关于参数的详细解释以及使用方法请参见参数说明。
若提示如下信息,则说明模型转换成功。
end binary code generating成功执行命令后,在output参数指定的路径下,可查看离线模型(如:xxx.om)。
输出文件说明¶
*.om: 转换后的模型文件,文件名通过--output配置。
atc_perf.csv: 预估模型在板端运算时实际计算量。
calibration_param.txt: 模型使用的量化参数。
cnn_net_tree_parser.dot:原始模型解析后的算子信息。
cnn_net_tree_adapt.dot:网络适配后的算子信息。
cnn_net_tree.dot:网络优化后的算子信息。
cnn_net_tree_after_tiling_seg_0.dot:网络深度融合后的算子信息。
说明:
通过命令dot把*.dot 文件转为pdf文件方便查看,如:dot -Tpdf cnn_net_tree.dot -o cnn_net_tree.pdf。
安装dot命令:apt install graphvizmapper_debug.log:转换模型的调试日志。
mapper_error.log:转换模型的错误日志。
layer.json:输出原始模型的算子信息,见命令行参数--json。
shape.json:输出原始模型每个算子的shape信息,见命令行参数--json。
om.json:输出转换后的模型信息,见命令行参数--json。
模型信息包括但不限于:
tmp_buf_size:板端运行模型时图像分析引擎算子需要的临时缓存。
aacpu_buf_size:板端运行模型时CPU算子需要的缓存。
dump_buf_size: 板端运行模型时, dump算子数据时需要的缓存。
model_param_size:om模型的参数大小。
atc_version:转换模型时用的ATC版本号。
batch_num:支持的动态batch数,见命令行参数--batch_num。
算子信息包括但不限于:
name: 算子名。
type: 算子类型。
device_type:算子类型是CPU或图像分析引擎。
input_desc:算子输入信息。
output_desc:算子输出信息。
data_flow:算子输入、计算、输出的数据类型。
参数说明¶
概览¶
总体约束¶
在进行模型转换前,请务必查看如下约束要求。
如果要将Faster RCNN等网络模型转成适配图像分析引擎的离线模型,则务必参见定制网络修改(Caffe)先修改prototxt模型文件。
支持原始框架类型为Caffe、Onnx的模型转换,输入数据类型为FP32、FP16、INT16、UINT16、INT8、UINT8。
当原始框架类型为Caffe时,模型文件(.prototxt)和权重文件(.caffemodel)的层名、层类型必须保持名称一致(包括大小写)。
不支持动态shape的输入,例如:NCHW输入为[?,3,?,?]多个维度可任意指定数值。模型转换时需指定固定数值。
输入数据最大支持四维,转维算子(reshape等)不能输出五维。
模型中的所有层算子除const算子外,输入和输出需要满足每个维度不为零。
只支持算子规格说明中的算子,并需满足算子限制条件。不支持的算子需用户在板端使用CPU实现,把网络切分编译多个om,然后调用板端ACL API串通网络。
当模型输入是4维或2维,且第0维>1时,ATC识别第0维为batch,为节省work buffer,把第0维改为1。
参数配置方式¶
ATC 支持2种配置方式,命令行支持的参数,文件参数都支持。
文件参数方式:
atc cfg_file
示例:atc test.cfg
文件参数格式:
[param1] value1
[param2] value2
…
文件参数格式示例:
[model] test.prototxt
[weight] test.caffemodel
[image_list] image_list.txt
[insert_op_conf] image_preprocess.txt
命令行参数方式:
atc param1=value1 param2=value2 ...
示例:
--model=$HOME/test/resnet50.prototxt --weight=$HOME/test/resnet50.caffemodel --image_list=image_list.txt --insert_op_conf=image_preprocess.txt
参数概览¶
通过atc --help命令查询出所有支持的参数。
基础功能¶
以下介绍部分常用参数选项,更多选项用法请输入--help。
总体选项¶
--help¶
功能说明:显示帮助信息。
关联参数:无
参数取值:无
推荐配置及收益:无
示例:atc --help
依赖约束:无
--version¶
功能说明:显示ATC版本信息。
关联参数:无
参数取值:无
推荐配置及收益:无
示例:atc --version
依赖约束:无
--mode¶
功能说明:运行模式。
关联参数:若--mode取值为1或3,则需要与 --om、--json参数配合使用。如果将原始模型文件转换成带shape信息的json文件,则还需要与 --dump_mode参数配合使用。
参数取值:
参数值
0:生成离线模型。
1:离线模型或原始模型文件转json,方便查看模型中的参数信息。
3:仅做预检,检查模型文件的内容是否合法。
参数值约束:配置为1或3时不会转换离线模型。
参数默认值:0
推荐配置及收益:无
示例:
--mode=0或--mode 0
说明: 使用atc命令进行模型转换时,命令有两种方式,用户根据实际情况进行选择,本章节以选择第一种方式为例进行说明:
atc param1=value1 param2=value2 ...(value值前面不能有空格,否则会导致截断,param取的value值为空)
atc param1 value1 param2 value2 ...
依赖约束:无
ATC输入选项¶
--model¶
功能说明:原始模型文件路径与文件名。
关联参数:当原始模型为Caffe框架时,需要和--weight参数配合使用。
参数取值:
参数值:模型文件路径与文件名。
参数值格式:路径和文件名,支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
推荐配置及收益:无
示例:
--model=$HOME/test/resnet50.prototxt --weight=$HOME/test/resnet50.caffemodel
依赖约束:无
--weight¶
功能说明:
权重文件路径与文件名。
当原始模型是Caffe时需要指定。
关联参数:当原始模型为Caffe框架时,需要和--model参数配合使用。
参数取值:
参数值:权重文件路径与文件名。
参数值格式:路径和文件名,支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
推荐配置及收益:无
示例:
--model=$HOME/test/resnet50.prototxt --weight=$HOME/test/resnet50.caffemodel
依赖约束:无
--om¶
功能说明:需要转换为json格式的离线模型(.om)、原始模型文件(.prototxt、.onnx)。
关联参数:若--mode=1,则该参数必填,并且需要与 --json参数配合使用。
参数取值:
参数值:离线模型(.om)、原始模型文件(.prototxt、.onnx)。
参数值格式:路径和文件名,支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
推荐配置及收益:无
示例:
离线模型转换为json
--mode=1 --om=$HOME/test/module/out/caffe_resnet50.om --json=$HOME/test/module/out/result.json原始模型文件转换为json
--mode=1 --om=$HOME/module/resnet50.prototxt --json=$HOME/module/out/result.json --framework=0
依赖约束:无
--framework¶
功能说明:原始框架类型。
关联参数:无
参数取值:
参数值:
0:Caffe
5:ONNX
6:ABSTRACT(使用构图接口)
参数值约束:当 --mode为1时,该参数可选,可以指定Caffe、Onnx、原始模型转成json,不指定时默认为离线模型转json,如果指定时需要保证--om模型和--framework类型对应一致,例如:
--mode=1 --framework=0 --om=$HOME/test/resnet18.prototxt --mode=1 --framework=5 --om=$HOME/test/resnet101.onnx
推荐配置及收益:无
示例:
--mode=0 --framework=0 --model=$HOME/test/resnet50.prototxt --weight=$HOME/test/resnet50.caffemodel
依赖约束:无
--custom_ops_lib¶
功能说明:自定义算子库文件路径与文件名。如果没有配置--custom_ops_lib,默认从环境变量LD_LIBRARY_PATH中加载名为libsvp_custom.so的自定义算子库。如果配置了--custom_ops_lib,则优先加载--custom_ops_lib。当转换的模型包含自定义算子,而环境变量LD_LIBRARY_PATH没有包含libsvp_custom.so时,必须配置--custom_ops_lib指定自定义算子库,否则转换模型失败。
参数取值:
参数值:自定义算子库文件路径与文件名。绝对路径或相对ATC执行的路径。
参数值格式:路径和文件名,支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
推荐配置及收益:无
示例:
--custom_ops_lib=$HOME/test/libsvp_custom.so
依赖约束:无
ATC输出选项¶
--output¶
功能说明:如果是开源框架的网络模型,存放转换后的离线模型的路径以及文件名,例如:$HOME/test/out/caffe_resnet18或$HOME/test/out/tf_resnet18,转换后的模型文件名以指定的文件名为准,自动以.om后缀结尾,例如:caffe_resnet18.om。
关联参数:无
参数取值:
参数值:如果是开源框架的网络模型:存放转换后的离线模型的路径以及文件名。
参数值格式:路径和文件名:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
推荐配置及收益:无
示例:
--output=$HOME/test/out/caffe_resnet18
依赖约束:无
--check_report¶
功能说明:预检结果保存文件路径和文件名。
关联参数:
--mode:当--mode=3仅做预检时,用于生成check_result.json预检结果文件。
参数取值:
参数值:预检结果保存文件路径和文件名。
参数默认值:无
参数值格式:路径和文件名:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
推荐配置及收益:无
示例:
--check_report=$HOME/test/out/check_result.json
依赖约束:无
--json¶
功能说明:离线模型、原始模型文件、转换为json格式文件的路径和文件名。
关联参数:
离线模型转换为json
原始模型文件转换为json
该参数需要与--mode=1、--om参数、 --framework配合使用,caffe还需配合--weight使用。
参数取值:
参数值:json格式文件的路径和文件名。
参数值格式:路径和文件名:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
推荐配置及收益:无
示例:
离线模型转换为包含模型信息和算子信息的json
--mode=1 --om=$HOME/test/module/out/caffe_resnet50.om --json=$HOME/test/module/out/om.json原始模型文件转换为包含层信息的json
--mode=1 --om=$HOME/module/resnet50.prototxt --json=$HOME/module/out/layer.json --framework=0原始模型文件转换为包含形状信息的json
--mode=1 --om=$HOME/module/resnet50.prototxt --weight=$HOME/module/resnet50.caffemodel --json=$HOME/module/out/shape.json --framework=0 --dump_mode=1
依赖约束:无
模型输入选项¶
--insert_op_conf¶
功能说明:插入图像预处理的配置。配置了图像预处理的Data层表示输入数据格式为图像,没有配置的为Feature Map。
关联参数:无
参数取值:
参数值:插入图像预处理的配置文件路径与文件名。
参数值格式:路径和文件名,支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
推荐配置及收益:无
图像预处理配置文件模板:
须知:
图像预处理当前仅支持色域转换、通道数据交换、减均值、乘系数,按顺序执行。
请按原始模型的图像预处理、板端运行时输入的数据格式配置。
模板中参数取值都为默认值,实际使用时,如果配置文件中某些参数未配置,则模型转换时自动设置成该模板中相应参数的默认值。
input_format属性为必选属性,其余属性均为可选配置,如果未配置,则模型转换时自动设置成该模板中相应参数的默认值。
模型转换时开启或没有AAPP,在进行推理业务时,输入图片数据都要求为NCHW排布。
若图像输入为YUV400,要求输入channel为1;若图像输入为YUV420SP、YVU420SP、YUV422SP、YVU422SP、BGR_PLANAR、RGB_PLANAR、RGB_PACKAGE、BGR_PACKAGE,要求输入channel为3;其他输入格式要求输入channel为4。
图像预处理中的色域转换、通道数据交换根据input_format和model_format使能,不支持ax_swap_switch和input_bias等参数配置使能。
# 图像预处理的配置以aapp_op开始,标识这是AAPP算子的配置,所有输入的配置都在aapp_op里描述。
aapp_op {
# related_input_rank参数为可选,标识对模型的第几个输入做图像预处理,从0开始,默认为0。例如模型有两个输入,需要对第2个输入做图像预处理,则配置related_input_rank为1。
# 类型: 整型
# 配置范围 >= 0
related_input_rank: 0
# 板端运行时输入的图像格式,必选
# 类型: enum
# 取值范围:YUV420SP、YVU420SP、YUV422SP、YVU422SP、YUV400、BGR_PLANAR、RGB_PLANAR、RGB_PACKAGE、BGR_PACKAGE、XRGB_PLANAR、ARGB_PLANAR、XBGR_PLANAR、ABGR_PLANAR、RGBX_PLANAR、RGBA_PLANAR、BGRX_PLANAR、BGRA_PLANAR、XRGB_PACKAGE、ARGB_PACKAGE、XBGR_PACKAGE、ABGR_PACKAGE、RGBX_PACKAGE、RGBA_PACKAGE、BGRX_PACKAGE、BGRA_PACKAGE、RAW_RGGB、RAW_GRBG、RAW_GBRG、RAW_BGGR
input_format : BGR_PLANAR
# 原始模型训练时的图像格式(通道数据顺序),可选
# 类型: enum
# 取值范围:RGB、BGR、ARGB、ABGR、RGBA、BGRA、XRGB、XBGR、RGBX、BGRX、RGGB、GRBG、GBRG、BGGR
# 图像格式为灰度图(GRAY)时,不需配置。
model_format : BGR
# 减均值、乘系数设置
# 注意:均值和系数的通道顺序为按model_format做完通道数据交换后的顺序。
# 计算规则如下:
# pixel_out_chx(i) = [pixel_in_chx(i) – mean_chn_i] * var_reci_chn
# 每个通道的均值,可选
# 类型:float32
# 取值范围:[-65504.0, 65504.0]
mean_chn_0 :0
mean_chn_1 :0
mean_chn_2 :0
mean_chn_3 :0
# 每个通道的系数,可选
# 类型:float32
# 取值范围:[0, 65504]
var_reci_chn_0 :1.0
var_reci_chn_1 :1.0
var_reci_chn_2 :1.0
var_reci_chn_3 :1.0
}
示例:下面以插入图像预处理算子为例进行说明,配置文件内容示例如下(文件名举例为:insert_op.cfg)。
aapp_op {
#第一个输入
related_input_rank:0
input_format:YUV420SP
model_format:RGB
# 以pytorch的预处理为例,如torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
# 即 y = (x/255 - mean)/std = (x - 255*mean) * 1/(255*std)
# 所以 mean_chn_x = 255*mean, var_reci_chn_x = 1/(255*std)
mean_chn_0:123.675
mean_chn_1:116.28
mean_chn_2:103.53
var_reci_chn_0:0.01712475
var_reci_chn_1:0.017507002
var_reci_chn_2:0.01742919
# 第二个输入
related_input_rank:1
input_format: RGB_PLANAR
model_format:BGR
# 以Caffe 的ImageData层预处理为例:
#transform_param {
# scale: 0.0078125
# mean_value: 104.0
# mean_value: 117.0
# mean_value: 123.0
#}
# 即 y = (x - mean_value) * scale,
# 所以 mean_chn_x = mean_value, var_reci_chn_x = scale
mean_chn_0:104
mean_chn_1:117
mean_chn_2:126
var_reci_chn_0:0.0078125
var_reci_chn_1:0.0078125
var_reci_chn_2:0.0078125
}
将配置好的insert_op.cfg文件上传到ATC工具所在服务器任意目录,例如上传到/home/test /,使用示例如下。
--insert_op_conf=/home/test/insert_op.cfg
依赖约束:无
--input_type¶
功能说明:指定网络Data层的输入数据类型,只用于Feature map 输入的Data层,不能用于图片输入的Data层。
关联参数:--insert_op_conf未配置Data层输入为图片格式,即输入为Feature map时,才可以指定输入数据类型。
参数取值:
参数值:格式为op_name:data_type
op_name:指定算子的层名,必须为Data层。
data_type:支持数据类型FP16, FP32, INT16, INT8, S16, S8, U16, U8, UINT16, UINT8。
参数值约束:指定多个输入数据类型时,使用英文分号隔开,用双引号括住。如:--input_type="data0:INT8;data1:FP16"。
参数默认值:Feature map未指定数据类型时,默认FP32。
推荐配置及收益:无
示例:
--input_type="data0:INT8;data1:FP16"
依赖约束:无
--input_shape¶
功能说明:指定模型输入数据的shape。
关联参数:--dynamic_image_size
参数取值:
参数值:
模型输入的shape信息,例如:"input_name1:n1,c1,h1,w1;input_name2:n2,c2,h2,w2"。指定的节点必须放在双引号中,节点中间使用英文分号分隔。input_name必须是转换前的网络模型中的节点名称。
参数值约束:
设置为固定取值,例如,取值为“1,2,3...”,用于将输入数据某个维度不固定的原始模型转换为固定维度的离线模型。
推荐配置及收益:无
示例:
--input_shape="input_name1:n1,c1,h1,w1;input_name2:n2,c2,h2,w2"
依赖约束:input_shape需要与image_list的量化校准文件数据匹配。
--input_format¶
功能说明:输入数据格式。
关联参数:无
参数取值:
参数值:只支持NCHW。
参数默认值:默认为NCHW。
参数值约束:无
推荐配置及收益:无
示例:
--input_format=NCHW
依赖约束:无
模型输出选项¶
--output_type¶
功能说明:指定网络输出数据类型或指定输出节点的输出类型。
关联参数:
若指定某个输出节点的输出类型,则需要和--out_nodes参数配合使用。
参数取值:
参数值:支持两种格式。
格式1:data_type, 表示指定所有输出节点的输出数据类型。
格式2:op_name:output_index:data_type,表示指定某个输出节点的某个输出的输出数据类型。
op_name:指定算子的层名,必须为--out_nodes指定的输出层。
output_index:指定输出层的第几个输出。
data_type:支持数据类型FP16, FP32, INT16, INT8, S16, S8, U16, U8, UINT16, UINT8。
参数默认值:FP32
推荐配置及收益:无
示例:
指定网络输出类型
--output_type=FP32指定某个输出节点的输出类型
output_type="conv1:0:FP32" --out_nodes="conv1:0"
依赖约束:CPU算子只支持输出FP32。
--out_nodes¶
功能说明:指定输出节点。当用户想要查看网络中间某层算子的输出时,则需要指定输出此算子。模型的最后一层默认输出,不需要指定。
关联参数:无
参数取值:
参数值:
网络模型中的节点(node_name)名称。
指定的输出节点必须放在双引号中,节点中间使用英文分号分隔。node_name必须是模型转换前的网络模型中的节点名称,冒号后的数字表示第几个输出,例如node_name1:0,表示节点名称为node_name1的第1个输出。
参数值约束:
如果模型转换过程中该算子被离线计算融合掉,则该算子不能作为输出节点,配置不生效。
没有实际运算而被优化删除的算子,不能作为输出节点,配置不生效。如Cast, Dropout算子。
配置的输出节点的顺序与最后输出的顺序无关。
即使最后一层的节点没有被指定,也一定会被输出。
输出节点个数最大为32,即--out_nodes配置的节点加上默认输出的节点个数不能大于32。
推荐配置及收益:无
示例:
参数值取网络模型中的节点(node_name)名称。
--out_nodes="node_name1:0;node_name1:1;node_name2:0"
依赖约束:无
--output_reorder¶
功能说明:转换后的模型输出节点顺序和原始模型是否保持一致。
关联参数:无
参数取值:
参数值:[0,1]
0:转换后的模型输出节点与原始模式保持一致。
1:转换后的模型输出节点重新排列,与原始模式可能不一致。
参数默认值:1
示例:
--output_reorder=1
依赖约束:包含CPU算子网络时,不支持参数配置为0
量化选项¶
--gfpq_param_file¶
功能说明:GFPQ(Grouped Floating Point Quantization)分组量化参数配置文件。AMCT校准或retrain输出此文件,如quant_param_record.txt。ATC转换模型校准时输出此文件,如calibration_param.txt。
关联参数:
--model:当输入模型为定点模型时,必须配置此参数。定点模型即AMCT校准后输出权重参数为定点的模型。
参数取值:参数值:protobuf格式的文件路径,支持txt和bin格式。
文件格式定义:Proto定义
syntax = "proto2";
package calibration;
enum DataType {
S4 = 0;
U4 = 1;
S8 = 2;
U8 = 3;
S16 = 4;
U16 = 5;
F16 = 6;
S32 = 7;
U32 = 8;
F32 = 9;
}
message FactorParam
{
required DataType data_type = 1 [default = S8];
repeated float scale = 2;
repeated float offset = 3;
optional bytes params = 4;
}
message QuantParam
{
repeated FactorParam input = 1;
optional FactorParam weight = 2;
}
message LayerParam
{
required string name = 1;
optional DataType calc_data_type = 2 [default = S8];
required QuantParam quant_param = 3;
}
message CalibrationParam
{
optional uint32 version = 1 [default = 65536];
repeated LayerParam layer = 2;
}
示例:
version: 65536
layer {
name: "conv1"
calc_data_type: S8
quant_param {
input {
data_type: S8
scale: 12.75
offset: -77
}
weight {
data_type: S8
scale: 127
}
}
}
推荐配置及收益:
配置量化参数后,ATC不需要再校准,节省转换模型的时间。
使用AMCT重训或校准后的quant_param_record.txt,精度更好。
示例:
--gfpq_param_file=quant_param_record.txt
依赖约束:无
--image_list¶
功能说明:转换模型生成量化参数时用的校准数据。支持Feature map文本和二进制格式文件和图片格式文件。
关联参数:
--model:当输入模型为定点模型时,不需要配置此参数。
--gfpq_param_file:配置了所有层的量化参数时,不需要配置此参数。已配置量化参数的层,不校准,只使用image_list做forward。
--dump_data:需要导出校准数据时,必须配置此参数。
--input_type:校准数据使用二进制文件时,需要文件的数据类型和--input_type匹配,如果没有配置,默认FP32。
--insert_op_conf:配置了图像预处理的Data层使用图片文件格式,没有则使用Feature map格式。
参数取值:
参数值:输入的层名和校准数据的文件路径。
参数值格式:多输入时,使用半角分号“;”隔开,用双引号括住。示例:
--image_list="name1:file1;name2:file2"
此外,多输入时,也可以使用多个image_list分别输入。示例:
--image_list="name1:file1"
--image_list="name2:file2"
文件格式:
--insert_op_conf没有配置图像预处理时,即输入为Feature map。
文本文件:
文件内容为浮点文本数据,数据间以空格或逗号分隔,一行的数据个数为输入形状channel × height × width。一行表示一个batch。示例:
输入形状 3×2×2,4个batch。即一行12个数据,共4行。feature_map.txt:
1 2 3 4 5 6 7 8 9 10 11 12 0.46 0.05 -0.01 -0.20 -7 -0.6114 -0.12 0.87 0.553 -0.67 -0.027 0.164082 -0.367 0.373 0.99 -0.0820 0.04 -0.454 -0.311 0.52 -0.033 -0.3 0.731473 0.09 -0.012 0.928 -0.903 0.374 0.7 0.4 -0.48 -0.490 0.473455 -0.146 -0.83 -0.637
二进制文件:
文件内容为数据值的二进制,文件名必须以“.bin”为后缀。数据类型需要和--input_type匹配。
--insert_op_conf配置图像预处理,即输入为图片时,文件内容为图片文件路径,一行一个图片文件路径,一行表示一个batch。图片大小不限,ATC根据输入的height × width缩放。
图片文件路径支持以下三种。
绝对路径;
相对--image_list的路径;
相对ATC执行的路径。
示例:testcase/image_list.txt,3个batch配置3个图片文件。
/home/xxx/testcase/images/test_1.jpg images/test_2.png testcase/images/test_3.bmp
--insert_op_conf图像预处理配置的input_format为YUV420SP、YVU420SP、YUV422SP、YVU422SP、YUV400、BGR_PLANAR、RGB_PLANAR、RGB_PACKAGE、BGR_PACKAGE、XRGB_PLANAR、ARGB_PLANAR、XBGR_PLANAR、ABGR_PLANAR、RGBX_PLANAR、RGBA_PLANAR、BGRX_PLANAR、BGRA_PLANAR、XRGB_PACKAGE、ARGB_PACKAGE、XBGR_PACKAGE、ABGR_PACKAGE、RGBX_PACKAGE、RGBA_PACKAGE、BGRX_PACKAGE、BGRA_PACKAGE时,使用图片路径文本格式,支持图片后缀bmp、jpeg、jpg、jpe、jp2、png。
--insert_op_conf图像预处理配置的input_format为RAW_RGGB、RAW_GRBG、RAW_GBRG、RAW_BGGR时,使用浮点文本格式,数据排列格式为RAW图像通道拆分前的顺序。
示例:输入4×2×2的RAW_RGGB, 通道拆分前的顺序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16通道拆分后的数据:
1 3 9 11 2 4 10 12 5 7 13 15 6 8 14 16即:
Channel_0:1 3 9 11 Channel_1:2 4 10 12 Channel_2:5 7 13 15 Channel_3:6 8 14 16
推荐配置及收益:校准时需要的图片是典型场景图片,建议从网络模型的测试场景随机选择3~5张作为参考图片进行量化,选择的图像要尽量覆盖模型的各个场景(图像要包含分类或检测的目标,如分类网的目标是苹果、梨、桃子,则参考图像至少要包含苹果、梨、桃子。比如检测人、车的模型,参考图像中必须有人、车,不能仅使用人或者无人无车的图像进行量化)。图片影响校准生成量化参数,选择典型场景的图片计算出来的量化参数对典型场景的量化误差越小。所以请不要选择偏僻场景、过度曝光、纯黑、纯白的图片,请选择识别率高,色彩均匀的典型场景图片。
示例:
--image_list=”data1:feature_map.txt;data2:images.txt”依赖约束:无
--compile_mode¶
功能说明:编译模式,量化后的数据bit位宽,不影响权重量化的bit位宽,权重固定是8bit量化。
关联参数:
--gfpq_param_file:优先使用配置的量化参数。未配置量化参数时,compile_mode才生效。
参数取值:
参数值
0:数据和权重量化使用8bit。
1:数据量化使用16bit,权重量化使用8bit。
5:数据和权重量化使用8bit,且仅对CUBE算子进行量化,非CUBE算子使用fp16格式。
6:数据量化使用16bit,权重量化使用8bit,且仅对CUBE算子进行量化,非CUBE算子使用fp16格式。
CUBE算子:Conv、ConvTranspose、DepthwiseConv、InnerProduct、Gemm、MatMul、Pooling系列算子。
参数值约束:无
参数默认值:0
推荐配置及收益:
配置为0时,带宽小,板端缓存小,耗时少,精度损失大。
配置为1时,带宽大,板端缓存大,耗时大,精度损失小。
配置为5时,带宽、板端缓存、耗时比模式0大,比模式1和6小;精度损失比模式0小,与模式1相比则和网络结构相关,若网络中含有大量的非CUBE算子,则此模式可能精度损失更小。
配置为6时,带宽大,板端缓存大,耗时大,精度损失很小。
示例:
--compile_mode=0
依赖约束:无
--weight_quant_per_channel¶
功能说明:权重是否每个卷积单独量化,对应一组量化参数。只有Convolution和Deconvolution 支持。
关联参数:
--gfpq_param_file:优先使用配置的量化参数。未配置量化参数时, --weight_quant_per_channel才生效。
参数取值:
参数值
0:去使能。
1:使能。
参数默认值:1
推荐配置及收益:配置为1时,权重量化粒度细,精度更好。
示例:
--weight_quant_per_channel=1
依赖约束:无
--quant_mode¶
功能说明:量化算法模式
参数取值:
0:使用默认量化算法,linear_quant
1:数据和权重使用不同的量化算法,其中数据使用ifmr算法进行量化,权重使用arq算法进行量化
参数值约束:无
参数默认值:0
示例:
--quant_mode=0
依赖约束:无
--high_precision_layer¶
功能说明:高精度层配置。如果配置的层是CUBE算子,该算子会进行量化,数据量化使用16bit,权重量化使用8bit,如果是非CUBE算子,则使用fp16格式。
CUBE算子:Conv,ConvTranspose,DepthwiseConv,InnerProduct,Gemm,MatMul,Pooling系列算子。
参数取值:字符串。网络模型中的节点(node_name)名称的集合。
推荐配置及收益:无
示例:其中opName0、opName1、opName2为需要配置的节点在网络模型中的名称
--high_precision_layer=opName0;opName1;opName2
--all_batch_quant_together_enable¶
功能说明:量化时,是否所有batch一起进行量化参数计算。
参数取值:
参数值:
0:去使能
1:使能
参数默认值:0
示例:
--all_batch_quant_together_enable=1
--matmul_per_channel_enable¶
功能说明:权重是否每通道单独量化,对应一组量化参数。只有Matmul、Innerproduct、Gemm 支持。
关联参数:
--gfpq_param_file:优先使用配置的量化参数。未配置量化参数时, --matmul_per_channel_enable才生效。
--weight_quant_per_channel:当该配置为0时,--matmul_per_channel_enable不生效
参数取值:
参数值
0:去使能。
1:使能。
参数默认值:0
推荐配置及收益:配置为1时,权重量化粒度细,精度更好。
示例:
--matmul_per_channel_enable=1
依赖约束:无
RPN硬化层选项¶
--nms_threshold¶
功能说明:Nms层阈值,只用于ATC量化校准时的RPN硬化层,板端推理时不使用此值。
关联参数:无
参数取值:
参数值:[0,1)
参数默认值:0.75
推荐配置及收益:无
示例:
--nms_threshold=0.75
依赖约束:无
--low_score_threshold¶
功能说明:Filter层最低分数阈值,只用于ATC量化校准时的RPN硬化层,板端推理时不使用此值。
关联参数:无
参数取值:
参数值:[0,1)
参数默认值:0.08
推荐配置及收益:无
示例:
--low_score_threshold=0.08
依赖约束:无
--min_width¶
功能说明:Filter层最低宽度阈值。
关联参数:无
参数取值:
参数值:[1,4096]
参数默认值:1
推荐配置及收益:无
示例:
--min_width=1
依赖约束:无
--min_height¶
功能说明:Filter层最低高度阈值。
关联参数:无
参数取值:
参数值: [1,4096]
参数默认值:1
推荐配置及收益:无
示例:
--min_height=1
依赖约束:无
--image_width¶
功能说明:
网络包含RPN硬化层,输入为Feature map,不是图片时,需指定原图的宽。
关联参数:无
参数取值:
参数值:[1,4096]
参数默认值:0
推荐配置及收益:无
示例:
--image_width=224
依赖约束:无
--image_height¶
功能说明:网络包含RPN硬化层,输入为Feature map,不是图片时,需指定原图的高。
关联参数:无
参数取值:
参数值:[1,4096]
参数默认值:0
推荐配置及收益:无
示例:
--image_height=224
依赖约束:无
--generate_anchors_file¶
功能说明:锚点坐标文件。使用硬化层的Faster RCNN、RFCN、SSD网络必须配置。
关联参数:无
参数取值:
参数值:anchors文件路径与文件名。
参数值格式:路径和文件名:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
文件内容的格式:
Faster RCNN和RFCN锚点坐标文件每行内容为“xmin, ymin, xmax, ymax”如下。
-84.000000 -40.000000 99.000000 55.000000 -176.000000 -88.000000 191.000000 103.000000 -360.000000 -184.000000 375.000000 199.000000 -56.000000 -56.000000 71.000000 71.000000 ……
请参考samples/2_object_detection/fasterrcnn/fasterrcnn_alexnet/caffe_model/anchors.txt和samples/2_object_detection/rfcn/rfcn_resnet50/caffe_model/anchors.txt
生成anchors.txt的方法,例如Caffe框架在py-faster-rcnn/rpn/proposal_layer.py保存anchors,如下图。

SSD锚点坐标文件每行内容为“xmin, ymin, xmax, ymax, var0, var1, var2, var3”,如下。
-11.000000 -11.000000 19.000000 19.000000 0.099854 0.099854 0.199951 0.199951 -17.000000 -17.000000 25.000000 25.000000 0.099854 0.099854 0.199951 0.199951 -17.000000 -6.000000 25.000000 14.000000 0.099854 0.099854 0.199951 0.199951 -6.000000 -17.000000 14.000000 25.000000 0.099854 0.099854 0.199951 0.199951 ……
请参考samples/2_object_detection/ssd/caffe_model/anchors.txt
生成anchors.txt方法:例如Caffe框架下保存mbox_priorbox层的输出,再生成anchors,示例python代码如下。
import numpy as np
data = np.loadtxt("mbox_priorbox_output0_2_34928_caffe.float")
image_width=300
image_height=300
anchors_num = int(data.size / 8)
data = data.reshape(int(data.size / 4), -1)
boxes = data[ : anchors_num]
boxes[:,[0,2]] = boxes[:,[0,2]] * image_width
boxes[:,[1,3]] = boxes[:,[1,3]] * image_height
variance = data[ anchors_num : ]
anchors = np.hstack((boxes, variance))
np.savetxt("anchors_txt", anchors, fmt="%.6f")
推荐配置及收益:无
示例:
--generate_anchors_file=anchors.txt
依赖约束:无
--detection_out_accuracy¶
功能说明:RPN层是否输出高精度。
关联参数:无
参数取值:
参数值:[0,1]
0: 低精度,使用FP16。
1:高精度,使用FP32。
参数默认值:0。
推荐配置及收益:无
示例:
--detection_out_accuracy=0
依赖约束:无
--use_class_id¶
功能说明:RPN层输出是否包括class id。
关联参数:无
参数取值:
参数值:[0,1]
0:不包括class id。
1:包括class id。
参数默认值:1。
推荐配置及收益:当前版本只支持配1
示例:
--use_class_id=1
依赖约束:无
Recurrent网络选项¶
--recurrent_max_total_t¶
功能说明:Recurrent网络(包含LSTM/RNN/GRU层)每一句话的最大帧数,用于板端运行时分配输入内存。
关联参数:无
参数取值:
参数值:[1, 1024]
参数默认值:1024
推荐配置及收益:按板端实际部署运行时每一句话的最大帧数配置,配置越大,分配的输入内存越大。
须知: ONNX框架下无需配置该参数。
示例:
--recurrent_max_total_t=1024
依赖约束:必须大于等于每一句话的最大帧数,否则输入数据不完整,计算错误。
--recurrent_tmax¶
功能说明:Recurrent网络(包含LSTM/RNN/GRU层)执行期间,将基于continuous对输入的每一句话进行子句切分,一句话会被切分为若干子句以实现并行处理。该参数表示由切分所产生的若干子句中,子句的最大帧数,用于板端运行时分配临时缓存。假设某Recurrent层第二个输入continuous的数据为 [0, 1, 0],这意味着帧数为3的句子将被切分为帧数为2和1的两个子句,子句的最大帧数为2,故该参数取2。ONNX模式下无该参数。
关联参数:无
参数取值:
参数值:[1, 1024]
参数默认值:1024
推荐配置及收益:按板端实际部署运行时每一句话基于continuous做子句切分后,子句的最大帧数配置,若难以明确子句的最大帧数,则配置为每一句话的最大帧数即可,配置越大占用临时缓存越大。
须知: ONNX框架下无需配置该参数。
示例:
--recurrent_tmax=1024
依赖约束:必须大于等于每一句话进行子句切分后的子句最大帧数,否则计算错误。
目标解决方案选项¶
--soc_version¶
功能说明:模型转换时指定解决方案版本。
关联参数:无
参数取值:
参数值:SS626V100,SS928V100
参数默认值:SS626V100
用户根据具体板端解决方案,选择对应的取值。
推荐配置及收益:无
示例:
--soc_version=SS626V100
依赖约束:无
高级功能¶
以下介绍部分常用参数选项,更多选项用法请输入--help。
功能配置选项¶
--max_roi_frame_cnt¶
功能说明:包含ROI/PSROI网络的RPN阶段输出的候选框最大数目。
关联参数:无
参数取值:
参数值:[1,2048]
参数默认值:300
推荐配置及收益:无
示例:
--max_roi_frame_cnt=300
依赖约束:无
--online_model_type¶
功能说明:转换生成模型的类型,用于板端执行profiling或dump数据。
关联参数:
--layer_fusion_enable:深度融合的层不支持dump,即*.om转json文件里,属性is_dump_available为0的层不支持dump。
参数取值:
参数值:[0,7]。
0: 没有调试相关的内容,没有网络结构和算子信息。
1: 调试带层信息。
2: 调试带层开始和结束标记,板端profiling 用。
3: 调试带层信息、层开始和结束标记。
4: 调试带层TRAP指令,板端dump数据用。
5: 调试带层信息、层TRAP指令。
6: 调试带层开始和结束标记、层TRAP指令。
7: 调试带层信息、层开始和结束标记、TRAP指令。
参数默认值:2
推荐配置及收益:
Release 配置 0。
Debug for profile配置2。
Debug for dump and compare配置4。
示例:
--online_model_type=2
依赖约束:不支持dump的层包括:深度融合的层、RoiPooling的第三路代表框个数的输入层。
--dynamic_image_size¶
功能说明:设置输入的动态分辨率档位,在板端运行时可选择其中的一个作为输入的大小。
关联参数:
--input_shape:当某个输入采用动态分辨率时,需要配置该选项,且将宽、高配置成-1。
参数取值:
参数值:
模型输入的动态分辨率信息,例如:"h1,w1;h2,w2"。指定的分辨率必须放在双引号中,分辨率中间使用英文分号分隔。
参数值约束:
可支持设置【2,100】组分辨率。第一组分辨率必须为最大的分辨率。
每组分辨率宽、高的取值范围为【1,16384】。
推荐配置及收益:配置的动态分辨率越多时,生成的OM也会越大,请根据实际需要设置。
示例:
--dynamic_image_size="h1,w1;h2,w2"
--input_shape="input1:1,3,-1,-1"
表示input1使用动态分辨率,且动态分辨率有两组,分别为【h1, w1】、【h2, w2】。
在运行时,可以指定采用【h1, w1】或【h2, w2】进行推理。若未指定,则使用第一档分辨率【h1,w1】进行推理。
依赖约束:模型本身不支持其他分辨率时,不支持动态分辨率。如模型包含FC层。
模型调优选项¶
--batch_num¶
功能说明:
支持batch处理的层单次处理的数据份数。影响性能和临时缓存大小。例如InnerProduct层支持batch处理,当batch_num配置为0或1时,则分配1份输入和输出所需的内存,单次处理1份数据。
当batch_num配置为256时,则分配256份的输入和输出所需的内存,单次处理256份数据。
关联参数:无
参数取值:
参数值:[0,256]。
0和1:表示single(单张)模式。Batch层一次处理一张图片,临时缓存为一张图片分配。
大于1:表示batch(多张)模式。Batch层一次处理batch张图片,临时缓存为batch张图片分配。
参数默认值:网络包含CPU层时默认为1。其他情况默认为256。
参数值约束:
网络包含Recurrent层且Recurrent层连接非FC层时,网络包含ROIPooling/PSROIPooling层、RPN硬化层时,不支持batch,强制设置batch_num为1。
网络包含CPU层时,板端ACL配置的dynamic batch size必须小于等于ATC转模型时配置的batch_num。
推荐配置及收益:对于batch层,batch模式比single模式性能好,占用内存也会更多。batch层包括InnerProduct、LSTM、RNN、GRU。
示例:
--batch_num=256
依赖约束:无
--internal_stride¶
功能说明:DDR读写对齐字节数。
关联参数:无
参数取值:
参数值:{16,32,64,128,256}。
参数默认值:16
推荐配置及收益:
DDR类型为DDR4时,读写32字节对齐性能最好,建议配置为32。
每个width占用的内存对齐到internal_stride,当width*sizeof(data_type)不能整除internal_stride时,internal_stride越大越占用内存,读写内存越多也越耗时间,所以并不是internal_stride越大越好。
示例:
--internal_stride=16
依赖约束:无
--fusion_switch_file¶
功能说明:融合规则开关配置文件路径以及文件名。
关联参数:--fusion_switch_file是控制指定某个图优化开关,--net_optimize_enable是控制所有图优化开关。
当配置--net_optimize_enable=0时,--fusion_switch_file不生效。
当配置--net_optimize_enable=1时,--fusion_switch_file生效。
参数取值:
参数值:配置文件路径以及文件名。
参数值格式:路径和文件名:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
参数值约束:如果用户想使用经过昇腾模型压缩工具量化后的模型,进行精度比对,则该参数必填。通过配置该文件,关闭融合功能。
推荐配置及收益:无
示例:支持如下融合规则。
BatchNormMergeToConvWeight: BatchNorm层融合到前一层Conv/Deconv/FC的权重。
BatchNormMergeToConvActive: BatchNorm层融合到前一层Conv/Deconv/FC的输出参数。
ScaleMergeToConvWeight: Scale层融合到前一层Conv/Deconv/FC的权重。
ScaleMergeToConvActive: Scale层融合到前一层Conv/Deconv/FC的输出参数。
BiasMergeToConv: Bias层融合到前一层Conv/Deconv/FC的权重。
ReluMerge: Relu层融合到前一层的输出参数。
PReluMerge: PRelu层融合到前一层的输出参数。
AbsMerge: Abs层融合到前一层的输出参数。
BatchNormTransfromToDepthwiseConv: BatchNorm层转换为DepthwiseConv层。性能大幅提升,精度略微降低。
EltwiseMergeToCube:Eltwise层融合到Cube层,Cube层包括Conv/Deconv/DepthwiseConv/Pool。性能提升,量化参数有溢出风险。
PoolMergeToConv:MaxPooling层融合到Conv层。
支持文件配置,配置文件样例如下,冒号前面为融合规则名,后面字段表示融合规则是否开启(文件名举例为fusion_switch.txt)。
BatchNormMergeToConvWeight:on BatchNormMergeToConvActive:off ScaleMergeToConvWeight:on ScaleMergeToConvActive:off BiasMergeToConv:on ReluMerge:on PReluMerge:on AbsMerge:on BatchNormTransfromToDepthwiseConv:on PoolMergeToConv:on EltwiseMergeToCube:on
将配置好的fusion_switch.txt文件上传到ATC工具所在服务器任意目录,例如上传到/home/test/,使用示例如下。
--fusion_switch_file=/home/test/fusion_switch.txt支持直接配置融合规则,使用示例如下。
--fusion_switch_file=BatchNormMergeToConvWeight:off;BatchNormMergeToConvActive:off;ScaleMergeToConvWeight:off;ScaleMergeToConvActive:off
依赖约束:无
--net_optimize_enable¶
功能说明:所有融合规则的使能开关。
关联参数:--fusion_switch_file是控制指定某个融合规则的开关,--net_optimize_enable是控制所有融合规则的开关。
当配置--net_optimize_enable=0时,关闭所有融合规则,--fusion_switch_file不生效。
当配置--net_optimize_enable=1时,使能所有融合规则,如果配置了--fusion_switch_file,以配置的融合规则文件为准。
参数取值:
参数值:[0,1]
0:去使能。
1:使能。
参数默认值:1
推荐配置及收益:融合可以减少算子,提升性能,推荐配置1。
示例:
--net_optimize_enable=1
依赖约束:无
--layer_fusion_enable¶
功能说明:层间深度融合的使能开关。层间深度融合是指多层之间融合在一起,切小块循环计算,数据在内部RAM传递,不读写DDR。
关联参数:无
参数取值:
参数值:[0,1]
0:去使能。
1:使能。
参数默认值:1
推荐配置及收益:层间深度融合可以减少DDR读写,提升性能,推荐配置1。
示例:
--layer_fusion_enable=1
依赖约束:无
--layer_m2m_enable¶
功能说明:层间数据共享的使能开关。层间数据共享是指两层之间,上一层的输出数据在内部RAM共享给下一层作为输入数据,不读写DDR。
关联参数:无
参数取值:
参数值:[0,1]
0:去使能。
1:使能。
参数默认值:1
推荐配置及收益:层间数据共享可以减少DDR读写,提升性能,推荐配置1。
示例:
--layer_m2m_enable=1
依赖约束:无
--force_to_cpu¶
功能说明:强制指定某些层为cpu层。
关联参数:无
参数取值:指定算子的层名。
参数值约束:只能配置支持cpu的算子。
推荐配置及收益:如fp16数据范围精度导致的精度问题下降,可将对应算子设置成cpu算子,提升精度。
示例:
指定gather1和gather2为cpu算子
--force_to_cpu=gather1;gather2
--softmax_optimize_enable¶
功能说明:softmax性能优化开关。
关联参数:无
参数取值:
参数值:[0,1]
0:关闭softmax性能优化。
1:使能softmax性能优化,axis为-1时性能收益2-4倍。
当(最大值 - 数据)> 9.010911时,存在精度损失风险。如输入数据[10, 0.1],预期输出[0.9999498, 0.0000501],实际输出[1.000000, 0.000000]。
参数默认值:0
示例:
--softmax_optimize_enable=1
依赖约束:无
--n_loop_enable¶
功能说明:当n>1,是否开启n循环。
关联参数:当开启该功能时,--batch_num将强制为1
参数取值:
参数值:[0,1]
0:去使能。
1:使能。
参数默认值:0
参数值约束:网络包含Recurrent层、ROIPooling/PSROIPooling层、RPN硬化层、IF/LOOP/SCAN等控制层时,不支持该配置使能
推荐配置及收益:开启n循环可以使网络使用n==1的shape进行指令生成:更小的shape将更易进行片上buffer交互,减少ddr交互,提升性能。但如果网络n>1的shape不大,算子间在未开启n循环的时候就能使用片上buffer交互,那么该配置将没有收益,或者会有负收益。因此该配置不一定有性能收益,可以先尝试是否有收益再使用。
示例:
--n_loop_enable=1
依赖约束:无
调试选项¶
--save_original_model¶
功能说明:是否生成原始模型文件,用于功能仿真。原始模型文件包含了离线模型文件,所以也可用于上板运行。
关联参数:该参数需要与 --output参数配合使用。
参数取值:
参数值
false:不生成原始模型文件。
true:生成原始模型文件。
参数默认值:false
参数值约束:若设置为true,在--output参数指定路径下生成原始模型文件(以后缀“*_original.om”格式结尾),用于功能仿真,也可用于上板运行。
推荐配置及收益:无
示例:
--output=/home/test/out/caffe_resnet50 --save_original_model=true
模型转换成功后,在out目录下生成原始模型文件caffe_resnet50_original.om。
依赖约束:无
--dump_mode¶
功能说明:是否生成带shape信息的json文件。
关联参数:该参数需要与--json、--mode=1、--framework、--om参数(需要为原始模型文件,如果为Caffe框架模型文件,还需要增加--weight参数)配合使用。
参数取值
参数值:
0:不使能。
1:使能。
参数默认值:0
推荐配置及收益:无
示例:
atc --mode=1 --om=$HOME/test/resnet50.prototxt --json=$HOME/test/out/resnet50.json --framework=0 --weight=$HOME/test/resnet50.caffemodel --dump_mode=1
依赖约束:无
--dump_data¶
功能说明:导出ATC转换模型过程中的数据到文件。
关联参数:无
参数取值
参数值:范围[0,31]
0:不导出。
1:导出校准量化参数时每层quant->dequant->forward的数据到mapper_quant目录。文件为protobuf格式,.dump后缀。
2:导出使用量化参数仿真时每层quant->forward->dequant的数据到mapper_simulate目录,文件为protobuf格式,.dump后缀。
4:导出校准量化参数时的权重、模型参数等数据。
8:导出校准量化参数时每层quant->dequant->forward的数据到mapper_quant目录,文件为txt格式,.float后缀。
16:导出使用量化参数仿真时每层quant->forward->dequant的数据到mapper_simulate目录,文件为txt格式,.float后缀。
值{1,2,4}可以组合成{3,5,6,7},如配置3,即1+2,同时导出mapper_quant和mapper_simulate。
参数默认值:0
参数值约束:mapper_simulate依赖mapper_quant,即导出mapper_simulate时需同时导出mapper_quant。
推荐配置及收益:无
示例:
--image_list=input_data.txt --dump_data=3
依赖约束:需配置--image_list才能导出数据,否则编译报错。
--is_precheck¶
功能说明:预检查输入的参数、模型等是否满足转换离线模型的要求。满足则返回成功,但不会生成离线模型;不满足,则返回失败,用户按提示信息修改参数或模型。
关联参数:无
参数取值
参数值:[0,1]
0:关闭预检查。
1:使能预检查。
参数默认值:0
推荐配置及收益:转换模型需要校准生成量化参数,比较耗时,使能预检查可以跳过校准,快速检查是否可以正常转换模型,节省时间。
示例:
--is_precheck=1
依赖约束:无
--log_level¶
功能说明:ATC的日志级别。
关联参数:无
参数取值
参数值:[0,3]
0:必要的日志信息。
1:接口级的日志信息。
2:模块级的日志信息。
3:函数级的日志信息。
参数默认值:0
推荐配置及收益:配置值越大,输出日志信息越多,转换模型的时间越长,推荐配置为0。
示例:
--log_level=0
依赖约束:无
--forward_quantization_option¶
功能说明:ATC转换模型校准时的量化选项。控制推理时是否使能数据量化或权重量化。
关联参数:无
参数取值
参数值:
0:关闭数据和权重量化。
1:使能数据量化。
2:使能权重量化。
3:使能数据和权重量化。
参数默认值:3
推荐配置及收益:无
示例:
--forward_quantization_option=0
依赖约束:无
仅文件方式支持的参数¶
以下参数仅支持以cfg文件方式配置,不支持命令行方式配置,用于兼容使用NNIE的cfg配置文件转模型。cfg文件格式见参数配置方式。
模型输入选项¶
以下配置不能和insert_op_conf同时配置。
image_type¶
功能说明:输入数据格式。
关联参数:一个输入对应一组image_type,norm_type,data_scale,mean_file。
参数取值:
参数值:整型数。
0:Feature map
1:BGR_PLANAR
2:YUV420SP
3:YVU420SP
4:YUV422SP
5:YVU422SP
6:YUV400
7:RGB_PLANAR
8:RGB_PACKAGE
9:BGR_PACKAGE
10:XRGB_PLANAR
11:XBGR_PLANAR
12:RGBX_PLANAR
13:BGRX_PLANAR
14:XRGB_PACKAGE
15:XBGR_PACKAGE
16:RGBX_PACKAGE
17:BGRX_PACKAGE
18:RAW_RGGB
19:RAW_GRBG
20:RAW_GBRG
21:RAW_BGGR
参数值约束: 不能和insert_op_conf同时配置
推荐配置及收益:无
示例:
[image_type] 1
[norm_type] 5
[data_scale] 0.00390625
[mean_file] mean.txt
依赖约束:无
norm_type¶
功能说明:对输入数据的预处理方法。
关联参数:一个输入对应一组image_type,norm_type,data_scale,mean_file。
参数取值:
参数值:整型数。
0:不做任何预处理;
1:减图像均值;
2:减通道均值;
3:对图像像素值乘以data_scale;
4:减图像均值后再乘以data_scale;
5:减通道均值后再乘以data_scale。
参数值约束: 不能和insert_op_conf同时配置
推荐配置及收益:无
示例:
[image_type] 1
[norm_type] 5
[data_scale] 0.00390625
[mean_file] mean.txt
依赖约束:无
data_scale¶
功能说明:数据预处理缩放比例,配置为浮点数,配合norm_type使用。
关联参数:一个输入对应一组image_type,norm_type,data_scale,mean_file。
参数取值:
参数值:浮点数。
参数值约束: 不能和insert_op_conf同时配置
参数默认值:0.00390625
推荐配置及收益:无
示例:
[image_type] 1
[norm_type] 5
[data_scale] 0.00390625
[mean_file] mean.txt
依赖约束:无
mean_file¶
功能说明:均值文件。
关联参数:一个输入对应一组image_type,norm_type,data_scale,mean_file。
参数取值:
参数值:文件路径与文件名。
参数值格式:路径和文件名,支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
参数值约束:
不能和insert_op_conf同时配置。
norm_type为1、4时,表示均值文件xxx.binaryproto,caffe框架导出的预处理文件,已经过时,不建议使用。
norm_type为2、5时,表示通道均值文件。
norm_type为0、3时,用户也需要配置mean_file项,但具体内容可以是一个无效路径,比如null;通道均值文件中每一行的浮点数表示对应的通道均值,如单通道只有一个值。
示例:3个通道的mean.txt
123.675 116.28 103.53
推荐配置及收益:无
示例:
[image_type] 1
[norm_type] 5
[data_scale] 0.00390625
[mean_file] mean.txt
依赖约束:无
RGB_order¶
功能说明:对输入数据做通道转换,转换后的通道顺序。
关联参数:image_type。
参数取值:
参数值:字符串。取值范围{RGB,BGR,XRGB,RGBX,XBGR,BGRX,RGGB,GRBG,GBRG,BGGR}
参数值约束: 配置值需和image_type的类型匹配。多个输入时,共用一个配置。
推荐配置及收益:无
示例:
[RGB_order] RGB
依赖约束:image_type配置的输入为图像格式时才生效。
已废弃参数¶
--recurrent_cont:仅支持continuous模式,不需要配置。
定制网络修改(Caffe)¶
简介¶
本章节修改只适用于Caffe网络模型。
网络的算子可以分为如下几类。
标准算子:图像分析引擎支持的Caffe标准算子,比如Convolution等。
扩展算子:图像分析引擎支持的公开但非Caffe标准算子,分为 2 种:
一种是基于Caffe框架进行自定义扩展的算子,比如Faster RCNN中的ROIPooling、SSD中的归一化算子Normalize等。
另外一种是来源于其他图像分析方法框架的自定义算子,比如YOLOv2中Passthrough等。
Faster RCNN、SSD等网络模型都包含了一些原始Caffe框架中没有定义的算子结构,如ROIPooling、Normalize、PSROI Pooling和Upsample等。为了使图像分析引擎能支持这些网络,需要对原始的Caffe框架网络模型进行扩展,降低开发者开发自定义算子/开发后处理代码的工作量。若开发者的Caffe框架网络模型中使用了这些扩展算子,在进行模型转换时,需要先在prototxt中修改/添加扩展层的定义,才能成功进行模型转换。
本章节提供了图像分析引擎的扩展算子列表,并给出了如何根据扩展算子修改prototxt文件方法。
Recurrent网络prototxt示例¶
须知: 带continuous模式下:同caffe prototxt一致,data层及Recurrent层包含continuous,但是N维度必须1; 请参考customer/Software/sample/中lstm、rnn、gru 的sample写法。
prototxt针对RNN层书写规范¶
RNN的基本计算公式如下 (与Caffe一致):
输入: xt,cont,ht-1
输出:Ot,ht
隐藏层:ht=tanh(wxhxt+whhht-1+bh)
输出层:ot=tanh(whoht+b0)
若有额外固定输入向量 xstatic,计算公式变为:
输入: xt,cont,ht-1
输出:Ot,ht
隐藏层:ht=tanh(wxhxt+whhht-1+wshxstatic+bh)
输出层:ot=tanh(whoht+b0)
基于以上计算公式,RNN的prototxt有以下4种场景。
prototxt针对LSTM层书写规范¶
LSTM的基本计算公式如下 (与Caffe一致):
输入门:it=sigmoid(wxixt+whiht-1+bi)
遗忘门:ft=sigmoid(wxfxt+whfht-1+bf)
输入值:gt=tanh(wxgxt+whght-1+bg)
当前cell:ct=it*gt +ft*ct-1
输出门:ot=sigmoid(wxoxt+whoht-1+b0)
若有额外固定输入向量_x_static,计算公式变为:
输入门:it=sigmoid(wxixt+whiht-1+wsixstatic+bi)
遗忘门:ft=sigmoid(wxfxt+whfht-1+wsfxstatic+bf)
输入值:gt=tanh(wxgxt+whght-1+wsgxstatic+bg)
当前cell:ct=it*gt +ft*ct-1
输出门:ot=sigmoid(wxoxt+whoht-1+wsoxstatic+b0)
基于以上计算公式,LSTM的prototxt有以下4种场景。
通常场景(expose_hidden=false,2输入,1输出)¶
Input: xt(1~T),cont(1~T)
Output: ht(1~T)
Prototxt示例如下,有2个bottom和1个top,其中bottom[0]对应_x_t(1~T),bottom[1]对应cont_(1~T),top[0]对应_ht(1~T)。
若recurrent_param的expose_hidden 没配,默认值为false;
不支持recurrent_param 的debug_info,配置不会生效。
layer {
name: "lstm1"
type: "LSTM"
bottom: "data0_xt"
bottom: "data1_cont"
top: "lstm1_ht"
recurrent_param {
num_output: 1000
weight_filler {
type: "uniform"
min: -0.08
max: 0.08
}
bias_filler {
type: "constant"
value: 0
}
}
}
具有额外的固定输入(expose_hidden=false,3输入,1输出)¶
Input: xt(1~T),cont(1~T),_ x_static
Output: ht(1~T)
Prototxt示例如下,有3个bottom和1个top,其中bottom[0]对应_x_t(1~T),bottom[1]对应_cont1(~T), bottom[2]对应_xstatic,top对应_h_t(1~T);
xt_(1~T)_和_cont(1~T)的向量维度,必须与_xstatic的向量维度一致;
只有前两个bottom与第一个top有时间的纬度;
如果recurrent_param 的expose_hidden 没配,默认值为false;
不支持recurrent_param 的debug_info,配置不会生效。
layer {
name: "lstm1"
type: "LSTM"
bottom: "data0_xt"
bottom: "data1_cont"
bottom: "data2_xstatic"
top: "lstm1_ht"
recurrent_param {
num_output: 1000
weight_filler {
type: "uniform"
min: -0.08
max: 0.08
}
bias_filler {
type: "constant"
value: 0
}
}
}
prototxt针对GRU层书写规范¶
GRU的基本计算公式如下 (与Caffe一致):
重置门:R_t _= sigmoid(wxrxt+whrht-1+bi)
更新门:Z_t _= sigmoid(wxzxt+whzht-1+bf)
中间结果:hhatt = tanh(whhat(Rt_ * h_t-1)+bg)
输出门:ht = sigmoid((1 - Zt) * ht-1 + Zt * hhatt)
若有额外固定输入向量_x_static,计算公式变为:
重置门:Rt = sigmoid(wxrxt+whrht-1+wsrxstatic+bi)
更新门:Zt = sigmoid(wxzxt+whzht-1+wszxstatic+bf)
中间结果:hhatt = tanh(whhat(Rt_ * h_t-1)+bg)
输出门:ht = sigmoid((1 - Zt) * ht-1 + Zt * hhatt)
基于以上计算公式,GRU的prototxt有以下4种场景。
通常场景(expose_hidden=false,2输入,1输出)¶
Input: xt(1~T),cont(1~T)
Output: ht(1~T)
Prototxt示例如下,有2个bottom和1个top,其中bottom[0]对应_x_t(1~T),bottom[1]对应cont_(1~T),top[0]对应_ht(1~T):
若recurrent_param的expose_hidden 没配,默认值为false;
不支持recurrent_param 的debug_info,配置不会生效。
layer {
name: "GRU1"
type: "GRU"
bottom: "data0_xt"
bottom: "data1_cont"
top: "ht"
recurrent_param {
num_output: 1000
weight_filler {
type: "uniform"
min: -0.08
max: 0.08
}
bias_filler {
type: "constant"
value: 0
}
}
}
隐藏参数显式输入输出(expose_hidden=true,3输入,2输出)¶
Input: xt(1~T)__,cont(1~T),h0
Output: ht(1~T),hT
Prototxt示例如下,有2个bottom和2个top,其中bottom[0]对应_x_t(1~T),bottom[1]对应_cont(1~T),bottom[2]对应_h0,top[0]对应_h_t(1~T),top[1]对应_h_T;
h0的向量维度须与recurrent_param的num_output一致;
只有前两个bottom与第一个top有时间的维度;
不支持recurrent_param 的debug_info,配置不会生效;
expose_hidden=true配置下,不支持后接InnerProduct层。
layer {
name: "GRU1"
type: "GRU"
bottom: "data0_xt"
bottom: "data1_cont"
bottom: "data2_h0"
top: "ht"
top: "hT"
recurrent_param {
num_output: 1000
expose_hidden = 1
weight_filler {
type: "uniform"
min: -0.08
max: 0.08
}
bias_filler {
type: "constant"
value: 0
}
}
}
具有额外的固定输入(expose_hidden=false,3输入,1输出)¶
Input: xt(1~T)__,cont(1~T),_ x_static
Output: ht(1~T)
Prototxt示例如下,有3个bottom和1个top,其中bottom[0]对应_x_t(1~T),bottom[1]对应_cont(1~T),bottom[2]对应_xstatic,top对应_h_t(1~T);
xt_(1~T)_和_cont(1~T)的向量维度,必须与_xstatic的向量维度一致;
只有前两个bottom与第一个top有时间的纬度;
如果recurrent_param 的expose_hidden 没配,默认值为false;
不支持recurrent_param 的debug_info,配置不会生效。
layer {
name: "GRU1"
type: "GRU"
bottom: "data0_xt"
bottom: "data1_cont"
bottom: "data2_xstatic"
top: "ht"
recurrent_param {
num_output: 1000
weight_filler {
type: "uniform"
min: -0.08
max: 0.08
}
bias_filler {
type: "constant"
value: 0
}
}
}
既有固定输入,又有显式的隐藏参数(expose_hidden=true,4输入,2输出)¶
Input: xt(1~T)__,cont(1~T),x_static _,h0
Output: ht(1~T),hT
Prototxt示例如下,有4个bottom和2个top,其中bottom[0]对应_x_t(1~T),bottom[1]对应_cont(1~T),bottom[2]对应_xstatic,bottom[3]对应_h_0,top[0]对应_h_t(1~T),top[1]对应_h_T;
h0的向量维度必须与recurrent_param的num_output一致;
xt_(1~T)_和_cont(1~T)的向量维度,必须与_xstatic的向量维度一致;
只有前两个bottom与第一个top有时间的纬度;
不支持recurrent_param 的debug_info,配置不会生效;
expose_hidden=true配置下,不支持后接InnerProduct层。
layer {
name: "gru1"
type: "GRU"
bottom: "data0_xt"
bottom: "data1_cont"
bottom: "data2_xstatic"
bottom: "data3_h0"
top: "ht"
top: "hT"
recurrent_param {
num_output: 1000
expose_hidden = 1
weight_filler {
type: "uniform"
min: -0.08
max: 0.08
}
bias_filler {
type: "constant"
value: 0
}
}
}
Recurrent网络约束¶
若Recurrent网络中包含诸如Conv等4D规格的算子,则存在如下约束。
Prototxt首层的N轴为1,即维度为1×C×H×W;
若batch_num配置为batch(多张)模式,Recurrent算子的第二个输入continuous必须为Data层;
若batch_num配置为batch(多张)模式,Prototxt构图时,需确保每张图片的计算不存在数据依赖。例如,不同图片所产生的帧数据不能拼接为整体以作为Recurrent第一个输入。
检测网硬化加速prototxt示例¶
针对Faster RCNN、RFCN、SSD、YOLOV1、YOLOV2、YOLOV3等检测网络,支持对Proposal、SsdDetectionOutput、YoloDetectionOutput等层进行硬化,达到加速目的。本节描述如何把Proposal、SsdDetectionOutput、YoloDetectionOutput改为RPN硬化的DetectionOutput层。
注意:DetectionOutput、DecBBox、Sort、Nms、Filter等硬化层不能作为首层;输出的得分是float型。
DecBBox、Sort、Nms、Filter层功能说明¶
针对Faster RCNN、RFCN、SSD、YOLOV1、YOLOV2、YOLOV3等检测网络,DecBBox会根据prototxt里面的calc_mode的参数配置解析对应的网络模型,将不同个数以及不同格式的tensor转换成统一的格式。因此DecBBox的输入取决于calc_mode参数的配置,下文会有详细介绍。DecBBox的输出为1×C×6×N的tensor,其中C为检测类别的数量,N为锚点的数量,height等于6表示检测框xmin, ymin, xmax, ymax, score, classID等六个信息,数据类型均为浮点型。当不需要输出类别信息时,DecBBox的输出为1×C×5×N。
Filter层的作用是将DecBBox根据设定的score的阈值将分数小于等于阈值的检测框滤掉,阈值的数据类型为浮点型,输入范围为[0,1)。
Sort层的作用是根据分数大小对DecBBox层的输出进行排序,当参数multi_class_sorting配置为true时,Sort层采取所有类别混合排序的策略,当参数multi_class_sorting配置为true时,Sort层采取每个类别之间根据分数分开排序的策略。Sort层支持top_k的配置,即保留候选框的最大个数。当实际检测框个数小于top_k时,按实际检测框的数量输出。阈值top_k的数据类型为uint型,支持大于1的正整数。
NMS(Non-Maximum Suppression)层的作用是当两个候选框交叠面积除以两张图片占用的总面积大于一定阈值的时候过滤掉得分较低的检测框。阈值的数据类型为浮点型,输入的数据范围支持[0,1)。
Nms层和Filter层所需要的阈值信息由用户给定的data层输入,输入数据类型为float,一共包含四个点,分别对应nms的阈值、filter层的得分阈值、filter的高度阈值和filter层的宽度阈值。
注意:Filter层、Sort层、Nms层只能接在DecBBox层后面,Filter层、Sort层、Nms层之间的连接顺序和数量任意。
硬化层参数配置¶
须知: FilterBox层不支持配置top_k参数。SSD,FASTRCNN, RFCN网络需配置锚点信息的文件。配置的nms_threshold, low_score_threshold, min_height, min_width等参数仅用作ATC推理时使用,实际板端仿真使用参数需通过API接口配置。API配置参数与推理参数建议保持一致。
表 1 硬化层参数配置限制
表 2 Faster RCNN RFCN SSD硬化层参数配置
表 3 YOLOV1 YOLOV2 YOLOV3硬化层参数配置
Faster RCNN 网络¶
Faster RCNN Proposal层硬化结构如图1所示,发布包中提供了基于alexnet的sample:samples/2_object_detection/fasterrcnn/fasterrcnn_alexnet,请参考此示例进行适配。
输出给Proposal硬化后的DetectionOutput层的得分数据类型必须是float型,并且此Softmax层和Proposal硬化层之间不能有任何计算层,参考如下所示。
layer {
name: "rpn_cls_prob"
type: "Softmax"
bottom: "rpn_cls_score_reshape"
top: "rpn_cls_prob"
}
Proposal硬化层描述请参考samples/2_object_detection/fasterrcnn/fasterrcnn_alexnet/caffe_model/fasterrcnn_alexnet.prototxt。
图 1 Faster RCNN Proposal层硬化结构图

Faster RCNN Proposal硬化层的输入为两个tensor,分别对应图1中的bottom0以及bottom1。 假设N为锚点的总数量,则bottom0的维度为的为1×1×1× N,bottom1的维度为的1×1×4×N,输入数据为大于0的浮点型数据。DecBbox层中心点宽高的具体计算公式如下。
DecCx = priWidth * dx(P) + priCx
DecCy = priHeight * dy(P) + priCy
DecWidth = exp(dw(P)) * priWidth
DecHeight = exp(dh(P)) * priHeight
其中DecCx, DecCy, DecWidth, DecHeight分别对应检测框的中心点和宽高; priWidth, priHeight, priCx, priCy为锚点的宽高和中心点坐标。锚点的坐标由外部输入文件anchor.txt(对应 [generate_anchors_file]配置项)提供。具体格式为N行4列的数据,N为锚点的数量,4列数据分别对应锚点的xmin, ymin, xmax, ymax, 输入数据为大于0的整数,数据类型为浮点型。其他四组输入dx(P), dy(P), dw(P), dh(P)与图中的bottom对应。具体细节可参考sample用例。
Faster RCNN Proposal硬化层的输出信息由两个report层构成。第一个report层的输出信息为检测框的数量,第二个report层的输出信息为:xmin, ymin, xmax, ymax, 得分以及类别,按检测框的输出顺序按分数由大到小排列。假设最终有300个检测框,则第一个report层的输出信息为:检测框数量(300);第二个report层的信息为:检测框的xmin(300个xmin),检测框的ymin(300个ymin),检测框的xmax(300个max),检测框的ymax(300个ymax),对应的框的得分(300个分数,由大到小),以及对应的框的类别(300个classs ID)。注意,由于proposal层的类别信息(即classID)仅分为前景和背景,图中bottom0只对应前景的分数信息,因此实际最终的输出信息只有前景的检测框的个数、坐标、分数以及classID。
RFCN网络¶
RFCN Proposal层硬化结构如图1所示,发布包中提供了基于resnet50的sample:samples/2_object_detection/rfcn/rfcn_resnet50,请参考此示例进行适配。
输出给Proposal硬化后DetectionOutput层的得分数据类型必须是float型,并且此Softmax层和Proposal硬化层之间不能有任何计算层,如下所示。
layer {
name: "rpn_cls_prob"
type: "Softmax"
bottom: "rpn_cls_score_reshape"
top: "rpn_cls_prob"
}
Proposal硬化层描述请参考samples/2_object_detection/rfcn/rfcn_resnet50/caffe_model/rfcn_resnet50.prototxt。
RFCN网络Proposal硬化层的输入输出与Faster RCNN Proposal一致,此处不再赘述。
SSD网络¶
SSD DetectionOutput层硬化结构如图1所示,发布包中提供了sample:sample/samples/2_object_detection/ssd,请参考此示例进行适配。
输出给DetectionOutput硬化层的得分数据类型为float,并且此Softmax层和DetectionOutput硬化层之间不能有任何计算层,如下所示。
layer {
name: "mbox_conf_softmax"
type: "Softmax"
bottom: "mbox_conf_permute"
top: "mbox_conf_softmax"
softmax_param {
axis: 1
}
}
DetectionOutput硬化层描述请参考sample/samples/2_object_detection/ssd/caffe_model/ssd.prototxt。
SSD网络的rpn模块输入由三个部分组成,分别对应上图中的mbox_conf_extract、permute层和RPN threshold。具体公式如下。
DecCx = Var1 * L0c1 * priWidth + priCx
DecCy = Var2 * L0c2 * priHeight + priCy
DecWidth = exp(Var3 * L0c3) * priWidth
DecHeight = exp(Var4 * L0c4) * priHeight
其中DecCx, DecCy, DecWidth, DecHeight分别对应检测框的中心点和宽高;Var1, Var2, Var3, Var4为调整系数;L0c1, L0c2, L0c3, L0c4为框的预测信息;priWidth, priHeight, priCx, priCy为锚点的中心点坐标和宽高。锚点的坐标以及调整系数由外部输入文件anchor.txt(对应 [generate_anchors_file]配置项)提供。具体格式为N行8列的数据,N为锚点的数量,8列数据分别对应锚点的xmin, ymin, xmax, ymax 以及调整系数var1, var2, var3, var4。
permute层提供L0c1, L0c2, L0c3, L0c4坐标信息,维度为1×1*4×N,N为框的数量。
mbox_conf_extract提供分数信息和类别信息,维度为1×(C-1)×1×N,其中C为包含背景的类别数量,减1表示去掉背景,N为锚点数量。如果类别不需要去掉背景,请删除层mbox_conf_extract,直接mbox_conf_softmax输出给DetectionOutput层,修改DetectionOutput层的num_classes 为包含背景的类别数。
rpn_threshold提供4个阈值,分别是nms_threshold、low_score_threshold、min_height、min_width,ATC转换模型时自动加的data层,在板端ACL运行时通过data层输入。
SSD的输出信息由两个report层构成,第一个report层的输出信息为检测框输出的数量,第二个report层的信息为xmin, ymin, xmax, ymax, 得分以及类别,按检测框的输出顺序按分数由大到小排列。假设最终有300个检测框,则第一个report层输出的信息依次为:检测框数量(300);第二个report层输出的信息为:检测框的xmin(300个xmin),检测框的ymin(300个ymin),检测框的xmax(300个max),检测框的ymax(300个ymax),对应的框的得分(300个分数,由大到小),以及对应的框的类别(300个classs ID)。
YOLOV1网络¶
YOLOV1 DetectionOutput层硬化结构如图1所示,发布包中提供了sample: samples/2_object_detection/yolo,请参考此示例进行适配。
图 1 YOLOV1 DetectionOutput层硬化结构图

Yolov1的输入维度为1×1×(C + 5)× N的tensor,数据类型为浮点型,其中C为类别的数量,N为检测框的个数。图1中直观的显示了rpn层输入的组成部分,左边的permute层对应类别信息,维度为1×1×C×N;中间的permute层对应坐标的信息,维度为1×1×4×N, 对应的取值范围为[0, 1]; reshape层对应分数的信息,维度为1×1×1×N。这三个层被concat层连接成1×1×(C+5)×N的tensor作为rpn层的输入。
Yolov1的输出信息由两个report层构成,第一个report层输出各类别检测框输出的数量,第二个report层输出各类别检测框的xmin, ymin, xmax, ymax, 得分以及类别,每一类的排序按检测框的输出顺序按分数由大到小排列。假设最终有300个检测框输出,包括人、猫、狗三种类别各50个,150个,100个,其对应的class ID分别为0,1,2。则第一个report层输出的信息依次为:人、猫、狗的检测框数量(50,100,150);第二个report层输出的信息为:人检测框的xmin(50个xmin),检测框的ymin(50个ymin),检测框的xmax(50个max),检测框的ymax(50个ymax),猫检测框的xmin(150个xmin),检测框的ymin(150个ymin),检测框的xmax(150个max),检测框的ymax(150个ymax),狗检测框的xmin(100个xmin),检测框的ymin(100个ymin),检测框的xmax(100个max),检测框的ymax(100个ymax);人对应的框的得分(50个分数,由大到小),猫对应的框的得分(150个分数,由大到小),狗对应的框的得分(100个分数,由大到小);人对应的框的类别(50个classs ID 0);猫检测框的xmin(150个xmin),检测框的ymin(150个ymin),检测框的xmax(150个max),检测框的ymax(150个ymax),对应的框的得分(150个分数,由大到小),猫对应的框的类别(150个classs ID 1);狗检测框的xmin(100个xmin),检测框的ymin(100个ymin),检测框的xmax(100个max),检测框的ymax(100个ymax),对应的框的得分(100个分数,由大到小),狗对应的框的类别(100个classs ID 2)。
YOLOV2网络¶
YOLOV2 DetectionOutput层硬化结构如图1所示,发布包中提供了sample:samples/2_object_detection/yolo,请参考此示例进行适配。
须知: DetectionOutput输出的是1×1×6×top_k的格式,类别中存放得分最高的分类序号,同YOLOV2/3中的1×class_num×6×top_k不同。
图 1 YOLOV2 DetectionOutput层硬化结构图

Yolov2相比于Yolov1在计算检测框宽高时增加了bias1, bias2两个参数。其中bias1和bias2的需要在prototxt中配置, bias1和bias2的数量等于每个grid内锚点的数量的两倍,输出顺序依次为每个锚点的bias1以及每个锚点的bias2。假设每个grid内一共有5个锚点,则需要输入的对应的bias顺序为: 锚点0的bias1, bias2; 锚点1的bias1, bias2以及锚点2的bias1,bias2。数据类型为float,取值范围为大于0的浮点数。详细设置可参照sample中的测试用例。Yolov2的输入tensor规格与Yolov1相同,对应图4-5中的最后一个permute层,此处不再赘述。
Yolov2的输出信息由两个report层构成,第一个report层输出检测框输出的的数量,第二个检测框输出xmin, ymin, xmax, ymax, 得分以及类别,按检测框的输出顺序按分数由大到小排列。假设最终有300个检测框,则第一个report层为输出检测框数量(300);第二个report层输出检测框的xmin(300个xmin),检测框的ymin(300个ymin),检测框的xmax(300个max),检测框的ymax(300个ymax),对应的框的得分(300个分数,由大到小),以及对应的框的类别(300个classs ID)。
YOLOV3/V5/V7网络¶
YOLOV3/V5/V7 Decbbox/DetectionOutput层硬化结构如图1所示,发布包中提供了sample:samples/2_object_detection/yolo,请参考此示例进行适配。
图 1 YOLOV3/V5/V7 Decbbox/DetectionOutput层硬化结构图

Yolov3的输入tensor规格以及prototxt中bias的规格与Yolov2相同,此处不再赘述。
Yolov3的输出信息由两个report层构成,第一个report层输出检测框输出的数量,第二个检测框输出xmin, ymin, xmax, ymax, 得分以及类别,按检测框的输出顺序按分数由大到小排列。假设最终有300个检测框,则第一个report层为输出检测框数量(300);第二个report层输出检测框的xmin(300个xmin),检测框的ymin(300个ymin),检测框的xmax(300个max),检测框的ymax(300个ymax),对应的框的得分(300个分数,由大到小),以及对应的框的类别(300个classs ID)。
YOLOV5/YOLOV7的计算公式如下。
x方向(y方向计算流程与x方向类似):
cX = (2 * sigmoid(X) - 0.5 + col) / gridNumWidth * img_w
halfW = 2 * sigmoid(w) * 2 * sigmoid(w) * bias / gridNumWidth * 0.5 * img_w
pMinX = cX_ – _halfW
pMaxX = halfW + cX
score:finalScore = sigmoid(objScore) * sigmoid(classScore)
其中col为列索引,gridNumWidth为锚点宽,img_w为放大系数,x和w为上一层的输出,bias为锚点bias参数,cX为检测框中心点x坐标,halfW为检测框宽*0.5,pMinX为检测框Xmin,pMaxX为检测框Xmax。objScore和classScore为上一层的输出,finalScore为最终分数。
YOLOV8网络¶
YOLOV8DecBBox/Sort/Nms/Filter层硬化结构图如图1所示,发布包提供了sample:samples/2_object_detection/yolo,请参考此示例进行适配。
图 1 YOLOV8 DecBBox/Sort/Nms/Filter层硬化结构图

YOLOV8的输入tensor规格、输出信息与YOLOV2相同,此处不再赘述。
坐标计算部分由DecBBox之前的算子实现,参考YOLOV8源码,采用DFL损失函数。
score在DecBBox中计算,计算公式:finalScore = sigmoid(classScore)
算子规格说明¶
须知: Caffe与Onnx框架算子规格中,如无特别说明,输入、输出形状支持范围如下。 向量:channel <= 65535,矩阵:width <= 65535,张量:width <= 65535 当计算数据类型为FP16时,值超出2048会有精度损失。
Caffe框架算子规格¶
该算子规格仅适用于Caffe框架原生IR定义的网络模型。
其他约束:不支持层名为空。
图像分析引擎¶
AbsVal¶
功能描述:求绝对值。
ArgMax¶
功能描述:沿某轴找出topk值及索引(因硬件限制,当前SVP NNN只支持top 1)。
|
不支持对argmax轴进行切分。没有配置axis时,须满足输入channel × height × width < 1048576,且均小于65536。配置axis轴时,argmax轴应小于65536。 |
|||
ArgMin¶
功能描述:沿某轴找出topk值及索引(因硬件限制,当前pico只支持top 1)。
|
不支持对argmin轴进行切分。没有配置axis时,须满足输入channel × height × width < 1048576,且均小于65536。配置axis轴时,argmin轴应小于65536。 |
|||
BatchNorm¶
功能描述:数据归一化。
Bias¶
功能描述:计算两个输入数据的和。
与axis配套使用,在axis = (1,-3)时num_axes支持配置为(1,-1),在axis=(0,-4)时num_axes支持配置为(2,-1),遵循caffe规则 |
BNLL¶
功能描述:按照一固定公式计算,激活函数。
Clip¶
功能描述:数据截断。
Concat¶
功能描述:至少两个输入,将它们在某个维度上拼接起来。
Convolution¶
功能描述:对输入做卷积。
规格约束:输入数据类型为NCHW,且N须为1。
CReLU¶
功能描述:激活函数CReLU(x)=[ReLU(x),ReLU(−x)]。
Crop¶
功能描述:数据裁剪。
Deconvolution¶
功能描述:卷积的反过程,将卷积的前向传播和后向传播置换。
规格约束:(dilation × (kernel -1) 大于等于pad。
DepthwiseConv¶
功能描述:对输入做卷积。
DetectionOutput¶
功能描述:RPN 硬化层。
Eltwise¶
功能描述:进行elementwise的计算操作,包括相加、相乘、求最大。当前不支持标量输入。
ELU¶
功能描述:一种固定公式的激活函数。
Exp¶
功能描述:计算exp。
Extract¶
功能描述:沿某个维度切割输入数据,输出1个切割的数据。
Flatten¶
功能描述:将输入的blob转成向量。
GRU¶
功能描述:GRU网络。
Hswish¶
功能描述:激活函数h-swish(x)=x*ReLU6(x+3)/6。
InnerProduct¶
功能描述:全连接层,计算内积。
Input¶
功能描述:输入层。
Interp¶
功能描述:计算双线性插值。
|
Out = In + (In - 1) × (zoom_factor - 1); Out = (In - 1) / shrink_factor + 1; |
||||
Log¶
功能描述:计算log。
LRN¶
功能描述:一种normalization的方法。
LSTM¶
功能描述:LSTM网络。
MatMul¶
功能描述:两个输入数据做矩阵乘。
Mish¶
功能描述:激活函数mish(x)=x*tanh(ln(1+exp(x)))。
MVN¶
功能描述:x'=(x-mean(x))/std(x)。
规格约束:仅支持4D输入。
Nop¶
功能描述:数据搬移。
Normalize¶
功能描述:一种数据归一化的方法。
规格约束:(只支持tensor输入)。
Pad¶
功能描述:对输入的数据进行填充。
|
当mode为"constant",且只在H/W轴做padding,且padding的值在[0, 15]范围内时,走图像分析引擎,其余场景走CPU。 |
|||||
指示各个轴填充或删除的元素个数,顺序为 n_begin, c_begin, h_begin, w_begin, n_end, c_end, h_end, w_end |
|||||
说明:
当mode为"reflect",pads必须小于对应轴的元素个数。
当pads为负数,pads的绝对值必须小于或等于对应轴的元素个数。
PassThrough¶
功能描述:把height和width的数据展开到channel维度。
规格约束:(只支持输入数据类型为NCHW)。
Permute¶
功能描述:数据转置。
规格约束:order为0312时,输入的width不能大于65535。
Pooling¶
功能描述:对输入做pooling。
|
若输出高度为1,stride_h <= input_height + pad_up + pad_down - kernel_h + 1 |
|||
|
若输出宽度为1,stride_w <= input_width + pad_left + pad_right - kernel_w + 1 |
|||
Power¶
功能描述:f(x)=(shift+scale∗x)^power
PReLU¶
功能描述:带参数的ReLU激活函数。
PSROIPooling¶
功能描述:位置敏感的候选区域池化。
规格约束:第二路输入仅支持rpn层或者data层。
Reduction¶
功能描述:将输入的blob reduction成一个scalar。
ReLU/ReLU6/RReLU¶
功能描述:ReLU激活函数。
Reorg¶
功能描述:Yolov2算子,Height和Width折叠到Channel的变形操作。
规格约束:(只支持输入数据类型为NCHW)。
Reshape¶
功能描述:维度变换。
规格约束:reshape 到第0维时,输出维度小于ub_size/sizeof(data_type)。例如ub_size为2M, data_type为int8_t, 则小于524288。
支持[-4,3]范围内可配,不支持N维度,默认为0,遵循caffe规则 特殊内容:当axis<0时,实际起始维度为axis+1。如当shape=NCHW时,axis=-2,意味着仅对W轴reshape。 |
|||
Reverse¶
功能描述:将输入在指定的轴上进行反转。
支持配置为0,若前后接Recurrent(LSTM/RNN/GRU)层,则表示在Recurrent层输入或输出的帧数轴上做反转。 |
|
RNN¶
功能描述:RNN网络。
ROIPooling¶
功能描述:目标检测的候选框区域池化。
规格约束:第二路输入仅支持rpn层或者data层。
Scale¶
功能描述:计算两个输入数据的乘,支持两个输入维度大小不一致。
规格约束:第一路输入的shape只支持4维或2维;如果存在第二路输入,其shape参考axis属性的配置规格要求。
ShuffleChannel¶
功能描述:将c分成group个子组,并通过逐一从每个子组中选择元素获得新的顺序。
Sigmoid¶
功能描述:sigmoid激活函数。
Slice¶
功能描述:沿某个维度切割输入的blob,输出多个切割的blob。
Silence¶
功能描述:屏蔽输出。
规格约束:只支持连接Slice,且Slice两个输出,屏蔽Slice的其中一个输出。连接其他层时,删除Silence层,不支持屏蔽。
Softmax¶
功能描述:计算softmax函数。
Split¶
功能描述:复制输入的blob到多个节点。
SPP¶
功能描述:对不同的输入做金字塔的pooling,输出一样的大小。
Swish¶
功能描述:激活函数swish(x)=x * sigmoid (beta * x) 。
TanH¶
功能描述:tanh激活函数。
Threshold¶
功能描述:输入与一个阈值相比较,大于则输出1,小于等于则输出0。
Tile¶
功能描述:沿某个维度复制。
Upsample¶
功能描述:上采样。
GroupNorm¶
功能描述:计算 y = scale * (x - mean) / sqrt(variance + epsilon) + bias。其中,mean和variance 是根据每个通道组的实例计算的,并且应为每组通道指定比例(scale)和偏差(B)。
规格约束:scale和B不支持在线输入。
Warp¶
功能描述:根据运动矢量,把输入数据映射到输出数据上。运动矢量包含x和y方向的移动单位,
在x方向上,正值表示像素点向左移动,负值表示像素点向右移动;
在y方向上,正值表示像素点向上移动,负值表示像素点向下移动。
假设src_x和src_y是原始的像素坐标,x和y是运动矢量,则映射后的坐标是dst_x=src_x-x,dst_y=src_y-y。
shape为1*4,4个值分别为[up_offset, bottom_offset, left_offset, right_offset],且4个值均需要为非负数; |
|||||
只支持4维tensor,channel必须为2;其H/W与data输入的H/W保持一致;mv这一路输入的值,范围必须在[-4, 4]之间 |
说明: warp支持2个或者3个在线输入;当有3个在线输入时,默认3个输入分别对应data、roi、motion_vector;当有2个在线输入时,默认2个输入分别是data、motion_vector。
CPU¶
Unpooling¶
功能描述:Pooling的部分逆操作。
规格约束:算子为双输入,第一路输入data,第二路输入mask(mask输入的index满足0 <= index < outHeight * outWidth;
其中 outHeight = (inHeight - 1) * stride_h - 2 * pad_h + kernel_h, outWidth = (inWidth - 1) * stride_w - 2 * pad_w + kernel_w
Onnx框架算子规格¶
该算子规格仅适用于Onnx框架原生IR定义的网络模型。
图像分析引擎¶
Abs¶
功能描述:求绝对值。
Add¶
功能描述:计算两个输入element-wise的和。
输入4维及以下的非广播场景或者有一路为离线输入的数据量为1使用图像引擎实现;输入4维及以下的广播场景满足以下要求使用图像引擎实现: |
|||||
ArgMax¶
功能描述:返回指定轴上最大值的索引。
ArgMin¶
功能描述:返回指定轴上最小值的索引。
AveragePool¶
功能描述:平均池化。
|
若输出高度为1,stride_h <= input_height + pad_up + pad_down - kernel_h + 1 若输出宽度为1,stride_w <= input_width + pad_left + pad_right - kernel_w + 1 |
||||||
BatchNormalization¶
功能描述:计算输入的batch normalization。
Ceil¶
功能描述:对输入X元素进行向上取整得到Y。
Clip¶
功能描述:根据上下边界对数据进行裁剪。
Compress¶
功能描述:从输入张量中沿给定轴根据condition中每个索引是否为true来选择切片。
Concat¶
功能描述:将多个输入在指定维度拼接。
Constant¶
功能描述:生成离线数据。
ConstantOfShape¶
功能描述:生成离线数据。
Conv¶
功能描述:对输入做卷积计算。
大小为2,顺序为(height, width),配置范围为[1,64],受dilation、stride、输入数据类型和输出数据类型的影响 |
|||||
格式为 [x1_begin, x2_begin...x1_end, x2_end,...],不可与auto_pad同时配置,配置范围为0~15 |
|||||
ConvTranspose¶
功能描述:对输入做反卷积计算。
规格约束:(dilations × (kernel_shape -1) 大于等于pads。
Dropout¶
功能描述:pico中仅将输入复制到输出。
Elu¶
功能描述:一种固定公式的激活函数。
Equal¶
功能描述:逐点计算A中元素是否等于B中元素。
输入4维及以下的非广播场景或者有一路为离线输入的数据量为1使用图像引擎实现;输入4维及以下的广播场景满足以下要求使用图像引擎实现: |
|||||
Exp¶
功能描述:计算exp。
Expand¶
功能描述:将输入tensor广播成输出tensor。
|
|||||
Erf¶
功能描述:一种固定公式的误差函数。
Flatten¶
功能描述:将输入以指定轴为界两边分别拉伸成2D Matrix。
规格约束:输入数据至少为二维
Gather¶
功能描述:将指定轴方向指定indices的数据聚合在一起。
Gemm¶
功能描述:实现两个矩阵的乘积。
opset version: 13
A和B仅支持二维输入。只有当transA为false,transB不做限制,C为一维向量,B和C都为离线输入时,即经过离线处理可以满足fc计算公式的[1,K]*[K,N]+[N]的条件时,使用图像分析引擎,其它情况用CPU。 |
||||||
Gelu¶
功能描述:Transformer网络常用的高斯误差线性单元激活函数。onnx opset v20算子,opset v20以下需以自定义算子形式构造。
|
GlobalAveragePool¶
功能描述:实现对同一channel的所有元素平均池化。
GlobalMaxPool¶
功能描述:实现对同一channel的所有元素最大池化。
Greater¶
功能描述:逐点计算A中元素是否大于B中元素。
输入4维及以下的非广播场景或者有一路为离线输入的数据量为1使用图像引擎实现;输入4维及以下的广播场景满足以下要求使用图像引擎实现: |
|||||
GroupNorm¶
功能描述:计算 y = scale * (x - mean) / sqrt(variance + epsilon) + B。其中,mean和variance 是根据每个通道组的实例计算的,并且应为每组通道指定比例(scale)和偏差(B)。
规格约束:scale和B不支持在线输入。
GRU¶
功能描述:GRU循环处理。
Identity¶
功能描述:将数据复制到输出。
If¶
功能描述:进行分支判断计算。当子图不包含CPU算子时,If为图像分析引擎算子。
LRN¶
功能描述:计算Local Response Normalization。
说明: 向量:输入width <= 21840
LayerNormalization¶
功能描述:LayerNormalization为层归一化,可以对网络中的每个算子的输出进行归一化,使得网络中每一层的输出都具有相似的分布。当模型的type配置为LayerNormalization时支持的归一化维度为W,HW和CHW;当模型的type配置为LayerNorm或LayerNormal时,支持对单W轴和单C轴进行归一化,不支持对单H轴进行归一化。
说明: 当type配置为LayerNormalization时:当axis==-3或1,Scale和B的shape必须是1*C*H*W;当axis==-2或2,Scale和B的shape必须是1*1*H*W;当axis==-1或3,Scale和B的shape必须是1*1*1*W。
LeakyRelu¶
功能描述:激活函数f(x) = alpha * x for x < 0, f(x) = x for x >= 0。
Log¶
功能描述:计算log。
LogSoftmax¶
功能描述:根据指定公式计算LogSoftmax(input, axis) = Log(Softmax(input, axis=axis))。
Loop¶
功能描述:对子图进行循环计算。当子图不包含CPU算子时,Loop为图像分析引擎算子。
说明: 不支持输出中含有scan_output的输出。
LSTM¶
功能描述:LSTM循环处理单元。
MatMul¶
功能描述:支持numpy-style的矩阵相乘。
opset version: 13
Max¶
功能描述:计算多输入element-wise的最大值。
MaxPool¶
功能描述:最大池化。
|
同时输出最大值索引(即算子有两路输出)时,仅支持接upsample算子。 若输出高度为1,stride_h <= input_height + pad_up + pad_down - kernel_h + 1 若输出宽度为1,stride_w <= input_width + pad_left + pad_right - kernel_w + 1 |
||||||
Mean¶
功能描述:计算多输入element-wise的均值。
MeanVarianceNormalization¶
功能描述:计算mvn。
规格约束:仅支持4D输入。
Min¶
功能描述:计算多输入element-wise的最小值。
Mul¶
功能描述:计算两个输入element-wise的乘积。
输入4维及以下的非广播场景或者有一路为离线输入的数据量为1使用图像引擎实现;输入4维及以下的广播场景满足以下要求使用图像引擎实现。
|
|||||
Pad¶
功能描述:对输入的数据进行填充。
|
当mode为"constant",且只在H/W轴做padding,且padding的值在[0, 15]范围内时,走图像分析引擎,其余场景走CPU。 |
|||||
说明: 当mode为"reflect",pads必须小于对应轴的元素个数。 当pads为负数,pads的绝对值必须小于或等于对应轴的元素个数。
PRelu¶
功能描述:带参数的ReLU激活函数。
Pow¶
功能描述:计算f(x) = x^exponent。
说明: 数据为张量时:width<=16384
ReduceMax¶
功能描述:对指定的轴求最大值。
规格约束:支持高维度,高维度走cpu实现。
ReduceMean¶
功能描述:对指定的轴计算求平均值。
ReduceMin¶
功能描述:对指定的轴计算最小值。
规格约束:支持高维度,高维度走CPU实现。
list中的每个axis[-r,r-1],r=rank(input) 当输入为3维,所有轴情况都支持使用图像分析引擎;当输入为4维,除第一根轴外均支持使用图像分析引擎 |
|||||
ReduceProd¶
功能描述:对指定的轴计算乘积。
list中的每个axis[-r,r-1],r=rank(input) 当输入为3维,所有轴情况都支持使用图像分析引擎;当输入为4维,除第一根轴外均支持使用图像分析引擎 |
|||||
ReduceSumSquare¶
功能描述:对指定的轴计算平方和。
list中的每个axis[-r,r-1],r=rank(input) 当输入为3维,所有轴情况都支持使用图像分析引擎;当输入为4维,除第一根轴外均支持使用图像分析引擎 |
|||||
ReduceSum/version<=12¶
功能描述:对指定的轴求和。
ReduceSum/version13¶
功能描述:对指定的轴求和。
Relu¶
功能描述:ReLU激活函数。
Resize¶
功能描述:将输入按指定mode进行缩放。
规格约束:仅支持coordinate_transformation_mode为asymmetric且mode为nearest,coordinate_transformation_mode为align_corners且mode为linear。
mode为nearest时,scales仅支持(1,1,2,2)、(1,1,4,4)和(1,1,8,8)。
coordinate_transformation_mode为 "tf_crop_and_resize",输入数据超出范围时使用的值。 |
|||||
必须且只能离线配置scales或者sizes中的一个,scales仅支持(1,1,2,2)、(1,1,4,4)和(1,1,8,8),sizes只支持hw扩大两倍,mode为linear时,输出width不支持大于2048。 |
|||||
Reshape¶
功能描述:将输入的维度转换为指定维度。
RNN¶
功能描述:RNN循环处理单元。
Scan¶
功能描述:做需要有时序的计算。
Scatter/ScatterElements¶
功能描述:替换输入数据指定位置的值。
同时满足以下条件时(转OneHot)走aicore,否则走cpu。
|
||||||
ScatterBEV¶
功能描述:沿H轴对first_input进行max操作,得到shape(P,1,C)的张量,一个(C)大小的向量就是一个“柱体特征”;根据坐标信息(包含在voxel_idxs中)将“柱体特征”以二维形式展开,得到BEV特征图。
规格约束:ScatterBEV算子融合了第二、三路输入,且这两路输入只给本算子使用;first_input可以没有batch维,有batch维时batch维只能为1,voxel_idxs、voxel_num不含batch维;voxel_num的数值必须是正整数,能取到的最大值为柱体数量P;voxel_idxs包含的是坐标信息,所有数值应是非负整数,y坐标值小于dense_shape[0],x坐标值小于dense_shape[1];dense_shape只能包含两个正整数。
每个柱体的坐标。P是柱体数量,4是坐标向量的长度,其中前两个数据无效,后两个数对应y坐标、x坐标。只支持data层输入。 |
|||||
Shape¶
功能描述:返回上层tensor的shape。
规格约束:不支持将shape层作为网络的最后一层。
Sigmoid¶
功能描述:计算sigmoid。
Size¶
功能描述:返回上层数据个数。
Slice¶
功能描述:将输入数据按照指定维度切割成多个数据。
SpaceToDepth¶
功能描述:重新排列空间数据块,将space数据转移到depth。
|
|||||
Split¶
功能描述:在指定数据轴对数据进行拆分。
Sqrt¶
功能描述:对输入数据求平方根。
Squeeze¶
功能描述:删除指定下标轴的1。
Sub¶
功能描述:tensor对应轴作减法。
输入4维及以下的非广播场景或者有一路为离线输入的数据量为1使用图像引擎实现;输入4维及以下的广播场景满足以下要求使用图像引擎实现:
|
|||||
Sum¶
功能描述:对所有的tensor对应值求和。
|
输入4维以下的非广播场景或者有一路为离线输入的数据量为1使用图像引擎实现;输入4维以下的广播场景满足以下要求使用图像引擎实现:
|
Tanh¶
功能描述:求tanh。
Tile¶
功能描述:对每一个轴的数据进行重复叠加。
必须为离线,size为InputDimNum的一维数组,且元素大于0。不支持除了CHW轴的重复,即除了CHW轴外,其他轴重复次数须等于1。 |
Transpose¶
功能描述:和numpy的transpose一样转置输入tensor。
Unsqueeze¶
功能描述:在指定下标轴插入1。
Softmax¶
功能描述:
Opset version 11: 计算指定轴往后所有轴的softmax。
Opset version 13: 计算指定轴的softmax。
DepthToSpace¶
功能描述:重新排列空间数据块,将depth数据转移到space。
|
|||||
Sign¶
功能描述:计算输入tensor的元素符号。
TopK¶
功能描述:沿指定轴检索最大或最小的K个元素。
Warp¶
功能描述:根据运动矢量,把输入数据映射到输出数据上。运动矢量包含x和y方向的移动单位,在x方向上,正值表示像素点向左移动,负值表示像素点向右移动;在y方向上,正值表示像素点向上移动,负值表示像素点向下移动。假设src_x和src_y是原始的像素坐标,x和y是运动矢量,则映射后的坐标是dst_x=src_x-x,dst_y=src_y-y。
shape为1*4,4个值分别为[up_offset, bottom_offset, left_offset, right_offset]; |
|||||
说明: warp支持2个或者3个在线输入;当有3个在线输入时,默认3个输入分别对应data、roi、motion_vector;当有2个在线输入时,默认2个输入分别是data、motion_vector。
Div¶
功能描述:对输入A、B进行除法运算得到输出C。
输入4维及以下的非广播场景或者有一路为离线输入的数据量为1使用图像引擎实现;输入4维及以下的广播场景满足以下要求使用图像引擎实现: |
|||||
Sin¶
功能描述:逐点求sin。
Cos¶
功能描述:逐点求cos。
Neg¶
功能描述:逐点求相反数。
InstanceNormalization¶
功能描述:计算y = scale * (x - mean) / sqrt(variance + epsilon) + B。
Where¶
功能描述:根据condition确定输出是X还是Y对应的元素。
|
1. 所有输入(condition、X、Y)shape一致,无需广播; 2. condition 需要广播,且其 C/H/W 维度中至少有一维与输出相同;X 和 Y 中一方 shape 与输出一致,另一方为元素数量为 1; |
||||||
ScatterND¶
功能描述:根据 indices 将 updates 写入 data 的特定位置。
CPU¶
Acos¶
功能描述:逐点求arccosine。
Acosh¶
功能描述:逐点求hyperbolic arccosine。
And¶
功能描述:对输入A、B进行elementwise逻辑与计算得到输出C。
说明:当And算子作为首层,使用--input_type设置数据类型时,需要设置成Fp32。
Asin¶
功能描述:逐点求arcsine。
Asinh¶
功能描述:逐点求hyperbolic arcsine。
Atan¶
功能描述:逐点求arctangent。
Atanh¶
功能描述:逐点求hyperbolic arctangent。
BitShift¶
功能描述:对输入的元素的二进制表示进行移位操作。
Celu¶
功能描述:一种固定公式的激活函数。
Cosh¶
功能描述:逐点求hyperbolic cosine。
CumSum¶
功能描述:计算输入元素沿给定轴的累加和。
Det¶
功能描述:求行列式。
Floor¶
功能描述:对输入X元素进行向下取整得到Y。
GatherElements¶
功能描述:是一种索引操作,通过在由indices的元素确定的索引位置处对输入数据张量进行索引来生成其输出。它的输出形状与索引的形状相同。
GlobalLpPool¶
功能描述:实现对同一channel的所有元素Lp norm。
GreaterOrEqual¶
功能描述:逐点计算A中元素是否大于等于B中元素。
HardMax¶
功能描述:如果沿着axis,输入的点是最大的则为1,否则为0。
HardSigmoid¶
功能描述:根据公式进行计算y = max(0, min(1, alpha * x + beta))。
If¶
功能描述:进行分支判断计算。当子图包含CPU算子时,If为CPU算子。
Less¶
功能描述:逐点计算A中元素是否小于B中元素。
LessOrEqual¶
功能描述:逐点计算A中元素是否小于等于B中元素。
Loop¶
功能描述:对子图进行循环计算。当子图包含CPU算子时,Loop为CPU算子。
LpNormalization¶
功能描述:对指定轴进行lp_norm计算。
MatMul¶
功能描述:支持numpy-style的矩阵相乘。
|
|||||
MaxUnPool¶
功能描述:MaxPool的部分逆操作。
Mod¶
功能描述:对输入数据的元素进行取余。
Neg¶
功能描述:对输入数据,进行符号翻转。
NonMaxSuppression¶
功能描述:过滤掉与其它框有高的IOU的框。其输出shape 随在线数据变化,模型转换时按最大shape分配内存和推理。
NonZero¶
功能描述:返回非零元素的索引。其输出shape 随在线数据变化,模型转换时按最大shape分配内存和推理。
Not¶
功能描述:对输入X进行逻辑非运算得到输出Y。
说明:当Not算子作为首层,使用--input_type设置数据类型时,需要设置成Fp32。
OneHot¶
功能描述:求onehot编码。
Or¶
功能描述:对输入A、B进行elementwise逻辑或计算得到输出C。
说明:当Or算子作为首层,使用--input_type设置数据类型时,需要设置成Fp32。
Range¶
功能描述:根据起始值,结束值,步长信息计算输出数列。
Resize¶
功能描述:将输入按指定mode进行缩放。
coordinate_transformation_mode为 "tf_crop_and_resize",输入数据超出范围时使用的值。 |
|||||
Reciprocal¶
功能描述:对每个点求倒数。
ReduceLogSum¶
功能描述:对指定的轴计算log_sum。
ReduceLogSumExp¶
功能描述:对指定的轴计算log_sum_exp。
Round¶
功能描述:对输入X求Round得到Y。
Scatter¶
功能描述:替换输入数据指定位置的值。
Selu¶
功能描述:Selu激活函数。
Shrink¶
功能描述:Shrink激活函数。
Sin¶
功能描述:计算sine。
Sinh¶
功能描述:逐点求hyperbolic sine。
Softplus¶
功能描述:计算ln(exp(x) + 1)。
Softsign¶
功能描述:计算(x/(1+|x|))。
ThresholdedRelu¶
功能描述:作为激活函数实现数据变换: y=x for x > alpha, y=0 otherwise
Transpose¶
功能描述:和numpy的transpose一样转置输入tensor。
Xor¶
功能描述:对输入A、B进行elementwise逻辑异或计算得到输出C。
Roi/Psroi Pooling算子输入格式¶
标准Caffe/Onnx的Roi/Psroi Pooling算子都有2个输入,其中第1个输入是维度为N×C×H×W的输入数据,第2个输入是维度为num_rois×5的ROI区域。本小节描述当Roi/Psroi Pooling算子作为网络首层时,ATC工具和板端需要的第2个输入(板端还需要第3个输入)的数据格式。
ATC工具的输入格式¶
ATC工具支持两种ROI输入格式。
与标准Caffe/Onnx的输入格式保持一致;
与硬化DecBBox层的输出格式保持一致,维度为1×1×H×num_rois,H >= 4。Prototxt的写法如图1所示。
对应两种不同的prototxt写法,相应的量化数据输入格式如图2所示。对于格式1),N维度为num_rois,所以每个ROI区域是一行。对于格式2),N维度为1,所以H×W个点在同一行;需要注意:当H > 4时,需保证表示ROI区域的坐标排在H0-H3,并且顺序为x0 -> y0 -> x1 -> y1。
板端的输入格式¶
当Roi/Psroi Pooling算子作为网络首层时,最终生成的网络结构如图1所示。第1个data层对应feature_map输入,第2个data层对应ROI区域输入,第3个data层的输入是实际有效ROI的个数,即ActualRoiNum。
板端只支持1种ROI区域(第2个data层)输入格式,类似ATC工具的第2种输入格式。ATC工具的输入配置为格式1)或2),不影响最终生成的om支持的输入格式。板端需要的ROI输入维度为1×1×H×MaxRoiFrameCnt,其中H等于prototxt中配置的H,MaxRoiFrameCnt等于cfg文件中指定的max_roi_frame_cnt。当ActualRoiNum < MaxRoiFrameCnt,每一行需要补齐到MaxRoiFrameCnt个点。Roi/Psroi Pooling算子会按照min(MaxRoiFrameCnt, ActualRoiNum)计算。
Recurrent(LSTM/GRU/RNN)算子板端输入输出格式¶
标准Caffe的Recurrent(LSTM/GRU/RNN)算子都有至少2个输入,其中第1个输入是维度为t×n×d的输入数据,第2个输入是维度为t×n的continuous数据。本小节描述当Recurrent网络包含诸如Conv等4D规格的算子且batch_num配置为batch(多张)模式时,板端的输入输出数据格式。
板端的输入格式¶
假设Recurrent网络片段结构如图1所示,Reshape层和Permute层负责将Conv输出的4D数据转换为3D数据并作为LSTM层的第一个输入,Data(Preprocess)层对应LSTM层的第二个continuous输入。当Prototxt首层N轴为1,即维度为1×C×H×W时,LSTM层的帧数轴t为18,句子轴n为1。
若batch_num配置为batch(多张)模式,针对LSTM层的continuous输入(Data层),板端需准备指定图片张数对应的数据量,并且数据排布等同于标准Caffe下,Prototxt首层N轴为batch_num时continuous的数据排布。以图1为例,板端准备的continuous数据应符合标准Caffe下continuous的shape为[18, batch_num]所对应的数据排布。
说明: 在ONNX框架下Recurrent网络的输入是X [T, N, D], sequence_lens [N], intial_h [num_directions, N, D]和intial_c [num_directions]。sequence_lens由于仅有batch轴,在准备时无需像上述continuous一样作出特殊输入规定,能保持与用户提供的输入一致。
板端的输出格式¶
当batch_num配置为batch(多张)模式时,板端的输出数据将按照图片顺序依次排列,即先排完第一张图片对应的全量数据,再依次排列后续各图片对应的全量数据。该排布可能和Caffe标准框架下Prototxt首层N轴为batch_num所产生的数据排布不一致。
仍以图1为例,LSTM层第一个输出shape为[18, 1, 128],板端在该层得到的输出符合shape为[batch_num, 18, 1, 128]对应的数据排布, 即依次排列每张图片对应的计算数据。在标准Caffe下,若Prototxt首层N轴为batch_num,LSTM层第一个输出符合shape为[18, batch_num, 128]对应的数据排布,即不同图片对应的数据间存在交叉排列。
同理,板端在ONNX框架下的处理也与上述Caffe类似。以输出HT [T, num_directions, N, D]为例,多图片下的板端输出排布为输出第一张图片的HT后再紧接排布下一张图片的HT。












