模型后处理配置参数
运行
运行样例前,需设置mxVison环境变量。
source {mxVison安装目录}/mxVision/set_env.sh
运行
用户准备好自己的源码文件“main.py”,以及Python运行环境。
使用python3执行文件,命令参考如下。
python3 main.py
:::note 说明
- 若程序执行出现libascendcl.so报错,请参见程序执行出现libascendcl.so报错解决。
- 若调用API参考(Python)视频解码/编码接口结束时出现core dumped现象,请参见调用API参考(Python)视频解码/编码接口结束时出现core dumped现象解决。 :::
父主题: 使用API接口方式开发(Python)
模型支持列表
模型种类 | 模型框架 | 使用后处理动态库 | 获取途径 |
|---|---|---|---|
YOLOv3 | TensorFlow | (tensorinfer框架)modelpostprocessors/libyolov3postprocess.so | |
ResNet-50 | TensorFlow | (tensorinfer框架)modelpostprocessors/libresnet50postprocess.so | |
Faster Rcnn | TensorFlow | (tensorinfer框架)modelpostprocessors/libfasterrcnnpostprocess.so | |
MindSpore | (tensorinfer框架)modelpostprocessors/libfasterrcnnpostprocess.so | ||
YOLOv4 | Pytorch | (tensorinfer框架)modelpostprocessors/libyolov3postprocess.so | |
SSD-VGG16 | Caffe | (tensorinfer框架)modelpostprocessors/libssdvggpostprocess.so | 无 |
SSD MobileNet v1 FPN | TensorFlow | (tensorinfer框架)modelpostprocessors/libssdmobilenetfpnpostprocess.so | |
CRNN | TensorFlow | (tensorinfer框架)modelpostprocessors/libcrnnpostprocess.so | |
YOLOv5 | Pytorch | (tensorinfer框架)modelpostprocessors/libyolov3postprocess.so | |
FasterRCNN-FPN/CascadeRCNN-FPN | Pytorch | (tensorinfer框架)modelpostprocessors/libfasterrcnnpostprocess.so | |
ResNet-18 | TensorFlow | (tensorinfer框架)modelpostprocessors/libresnet50postprocess.so | |
CTPN | TensorFlow | (tensorinfer框架)modelpostprocessors/libctpnpostprocess.so | |
CTPN | MindSpore | (tensorinfer框架)modelpostprocessors/libctpnpostprocess.so | |
DeepLabv3 | MindSpore | (tensorinfer框架)modelpostprocessors/libdeeplabv3post.so | |
BERT-Base (Uncased) | TensorFlow | (tensorinfer框架)modelpostprocessors/libresnet50postprocess.so | |
U-Net | MindSpore | (tensorinfer框架)modelpostprocessors/libunetmindsporepostprocess.so | |
Mask R-CNN | Pytorch | (tensorinfer框架)modelpostprocessors/libmaskrcnnmindsporepost.so | |
FaceNet | TensorFlow | 无需后处理。 | |
SSD MobileNet v1 FPN | MindSpore | (tensorinfer框架)modelpostprocessors/libSsdMobilenetFpn_MindsporePost.so | |
OpenPose | TensorFlow | (tensorinfer框架)modelpostprocessors/libopenposepostprocess.so | 无 |
RetinaNet | TensorFlow | (tensorinfer框架)modelpostprocessors/retinanetpostprocess.so | |
HigherHRnet | Pytorch | (tensorinfer框架)modelpostprocessors/libhigherhrnetpostprocess.so | |
YoloV7Detection | Pytorch | 无 | 无 |
PPYOLOEPlusDetection | Paddle | 无 | 无 |
父主题: 模型支持参考
模型后处理配置参数
各个模型所需要的配置参数见下表。
表1 YOLOv3模型后处理配置参数(yolov3_tf_bs1_fp16.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| CLASS_NUM | 类别数量。 | 80 | 无 |
| BIASES_NUM | anchor宽高的数量(18表示9个anchor,每个对应一对宽高值)。 | 18 | [0, 100] |
| BIASE | 每两个数组成一个anchor的宽高值,例如10、13表示第一个anchor的宽、高值。 | 10,13,16,30,33,23,30,61,62,45,59,119,116,90,156,198,373,326 | 无 |
| SCORE_THRESH | 目标是否为某种类别物体的阈值,大于阈值即认为是该目标。 | 0.3 | [0.0, 1.0] |
| OBJECTNESS_THRESH | 是否为目标的阈值,大于阈值即认为是目标。 | 0.3 | [0.0, 1.0] |
| IOU_THRESH | 两个框的IOU阈值,超过阈值即认为同一个框。 | 0.45 | [0.0, 1.0] |
| YOLO_TYPE | 表示输出Tensor的个数,3表示有三个feature map输出。 | 3 | [0, 16] |
| ANCHOR_DIM | 每个feature map对应的anchor框数量。 | 3 | [0, 16] |
| MODEL_TYPE | 数据排布格式,0表示NHWC,1表示NCHW,2表示NCHWC。 | 0 | 无 |
| FRAMEWORK | String类型,可选值有MindSpore,PyTorch,TensorFlow 和Caffe。 | TensorFlow | 无 |
| SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) | 无 |
表2 ResNet-50模型后处理配置参数(resnet50_aipp_tf.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| CLASS_NUM | 类别数量。 | 1001 | [0, 2000] |
| SOFTMAX | 布尔型,是否需要在后处理中做softmax计算。 | false | 无 |
| TOP_K | 前K个可能性最大的类。 | 1 | [0, 16] |
表3 FasterRcnn模型后处理配置参数(faster_rcnn_uncut.cfg)
参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
CLASS_NUM | 类别数量。 | 91 | [0, 1000] |
SCORE_THRESH | 目标是否为某种类别物体的阈值,大于阈值即认为是该目标。 | 0.5 | [0.0, 1.0] |
IOU_THRESH | 两个框的IOU阈值,超过阈值即认为同一个框。 | 0.45 | [0.0, 1.0] |
SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) | 无 |
MODEL_TYPE | 可选以下三个值: 0:original 1:nms_cut(模型未做非极大值抑制) 2:FPN | 0 | 无 |
FRAMEWORK | 可选以下三个值: | TensorFlow | 无 |
NMS_FINISHED | modelinfer框架特有的属性值,为布尔值: | true | 无 |
注:“MODEL_TYPE”和“FRAMEWORK”参数配套说明如下: | |||
表4 ssd_vgg模型后处理配置参数(ssd_vgg16_caffe_release.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 5 |
| SCORE_THRESH | 目标阈值。 | 0.4 |
| SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) |
表5 Ssd-Mobilenet-v1-Fpn模型后处理配置参数(ssd_mobilenetv1_fpn.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 3 |
| SCORE_THRESH | 目标是否为某种类别物体的阈值,大于阈值即认为是该目标。 | 0.5 |
| SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) |
表6 CRNN模型后处理配置参数(crnn_ssh_2.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| CLASS_NUM | 类别数量。 | 0 | [0, 10000] |
| OBJECT_NUM | 可检测的字符数上限。 | 0 | [0, 1000] |
| BLANK_INDEX | 空白符的索引值。 | 0 | [0, 10000] |
| WITH_ARGMAX | 模型backbone是否已经做了argmax。 | false | 无 |
表7 modelinfer框架ResNet特征模型后处理配置参数(resnet_feature_caffe_release.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| ACTIVATION_FUNCTION | 用来激活模型输出数据的激活函数。 | None |
表8 modelinfer框架ResNet多分类属性模型后处理配置参数(resnet_attribute_caffe_release.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| ATTRIBUTE_NUM | 模型输出属性的数量。 | 5 |
| ACTIVATION_FUNCTION | 激活函数的类型,目前仅支持sigmoid函数。 | 无 |
| ATTRIBUTE_INDEX | 模型输出属性的索引。请确保索引的数量与ATTRIBUTE_NUM值相等。 | 无 |
表9 modelinfer框架ResNet二分类属性模型后处理配置参数(resnet_attribute_caffe_release.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 5 |
表10 modelinfer框架YOLOv4模型后处理配置参数(yolov4_pt_bs1_fp16.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 80 |
| BIASES_NUM | anchor宽高的数量(18表示9个anchor,每个对应一对宽高值) | 18 |
| BIASES | 每两个数组成一个anchor的宽高值,例如10、13表示第一个anchor的宽、高值。 | 10,13,16,30,33,23,30,61,62,45,59,119,116,90,156,198,373,326 |
| SCORE_THRESH | 目标是否为某种类别物体的阈值,大于阈值即认为是该目标。 | 0.3 |
| OBJECTNESS_THRESH | 是否为目标的阈值,大于阈值即认为是目标。 | 0.3 |
| IOU_THRESH | 两个框的IOU阈值,超过阈值即认为同一个框。 | 0.45 |
| YOLO_TYPE | 表示输出Tensor的个数,3表示有三个feature map输出。 | 3 |
| ANCHOR_DIM | 每个feature map对应的anchor框数量。 | 3 |
| MODEL_TYPE | 数据排布格式,0表示NHWC,1表示NCHW。 | 0 |
| FRAMEWORK_TYPE | 模型框架,0表示Pytorch,1表示MindSpore。 | 0 |
| SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) |
表11 YOLOv4模型后处理配置参数(yolov4_pt_bs1_fp16.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 80 |
| BIASES_NUM | anchor宽高的数量(18表示9个anchor,每个对应一对宽高值)。 | 18 |
| BIASES | 每两个数组成一个anchor的宽高值,例如10、13表示第一个anchor的宽、高值。 | 10,13,16,30,33,23,30,61,62,45,59,119,116,90,156,198,373,326 |
| SCORE_THRESH | 目标是否为某种类别物体的阈值,大于阈值即认为是该目标。 | 0.3 |
| OBJECTNESS_THRESH | 是否为目标的阈值,大于阈值即认为是目标。 | 0.3 |
| IOU_THRESH | 两个框的IOU阈值,超过阈值即认为同一个框。 | 0.45 |
| YOLO_TYPE | 表示输出Tensor的个数,3表示有三个feature map输出。 | 3 |
| ANCHOR_DIM | 每个feature map对应的anchor框数量。 | 3 |
| MODEL_TYPE | 数据排布格式,0表示NHWC,1表示NCHW,2表示NCHWC。 | 0 |
| FRAMEWORK | String类型,可选值有MindSpore,PyTorch,TensorFlow 和Caffe。 | MindSpore |
| SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) |
| YOLO_VERSION | 使用的yolo模型版本。 | (必选)YOLO_VERSION=4 |
表12 YOLOv5模型后处理配置参数(yolov5_pt_bs1_fp32.cfg)
| 参数名 | 描述 | 默认值 | 取值空间 |
|---|---|---|---|
| CLASS_NUM | 类别数量。 | 80 | [0, 1000] |
| BIASES_NUM | anchor宽高的数量(18表示9个anchor,每个对应一对宽高值)。 | 18 | [0, 1000] |
| BIASE | 每两个数组成一个anchor的宽高值,例如10、13表示第一个anchor的宽、高值。 | 10,13,16,30,33,23,30,61,62,45,59,119,116,90,156,198,373,326 | 无 |
| SCORE_THRESH | 目标是否为某种类别物体的阈值,大于阈值即认为是该目标。 | 0.3 | [0.0, 1.0] |
| OBJECTNESS_THRESH | 是否为目标的阈值,大于阈值即认为是目标。 | 0.3 | [0.0, 1.0] |
| IOU_THRESH | 两个框的IOU阈值,超过阈值即认为同一个框。 | 0.45 | [0.0, 1.0] |
| YOLO_TYPE | 表示输出Tensor的个数,3表示有三个feature map输出。 | 3 | [0, 1000] |
| ANCHOR_DIM | 每个feature map对应的anchor框数量。 | 3 | [0, 1000] |
| MODEL_TYPE | 数据排布格式,0表示NHWC,1表示NCHW,2表示NCHWC(当前仅支持的PyTorch框架模型)。 | 2 | [0, 1000] |
| FRAMEWORK | String类型,可选值有MindSpore,PyTorch,TensorFlow 和Caffe。 | PyTorch | 无 |
| SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) | 无 |
| YOLO_VERSION | 使用的yolo模型版本。 | (必选)YOLO_VERSION=5 | 无 |
表13 modelinfer框架FasterRCNN-Fpn/CascadeRCNN-Fpn模型后处理配置参数(fasterrcnn.cfg或cascadercnn.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| SCORE_THRESH | 目标是否为某种类别物体的阈值,大于阈值即认为是该目标,实验使用0.3。 | 0.5 |
| FPN_SWITCH | FPN开关,这两个模型均要设为true。 | false |
表14 DeepLabV3+(TensorFlow)模型后处理配置参数(deeplabv3.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 21 |
| FRAMEWORK_TYPE | 深度学习框架类型选择。 | TensorFlow框架选择0 |
表15 CTPN模型后处理配置参数(ctpn_tf.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| IS_ORIENTED | 是否进行检测框倾斜。 | false | 无 |
| BOX_IOU_THRESH | 检测小框的iou阈值。 | 0.7 | [0.0, 1.0] |
| TEXT_IOU_THRESH | 最终文本框的iou阈值。 | 0.2 | [0.0, 1.0] |
| TEXT_PROPOSALS_MIN_SCORE | 检测小框的最小分数过滤。 | 0.7 | [0.0, 1.0] |
| LINE_MIN_SCORE | 最终文本框的最小分数过滤。 | 0.9 | [0.0, 1.0] |
| IS_MINDSPORE | 是否为MindSpore框架。 | false | 无 |
表16 CTPN模型后处理配置参数(ctpn_mindspore.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| IS_ORIENTED | 是否进行检测框倾斜。 | false | 无 |
| BOX_IOU_THRESH | 检测小框的iou阈值。 | 0.7 | [0.0, 1.0] |
| TEXT_IOU_THRESH | 最终文本框的iou阈值。 | 0.2 | [0.0, 1.0] |
| TEXT_PROPOSALS_MIN_SCORE | 检测小框的最小分数过滤。 | 0.7 | [0.0, 1.0] |
| LINE_MIN_SCORE | 最终文本框的最小分数过滤。 | 0.9 | [0.0, 1.0] |
| IS_MINDSPORE | 是否为MindSpore框架。 | true | 无 |
表17 ResNet-18模型后处理配置参数(resnet18_aipp_tf.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 2 |
表18 DeepLabv3(MindSpore)模型后处理配置参数(deeplabv3.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 21 |
| MODEL_TYPE | 模型推理输出数据的排布格式,0表示NHWC,1表示NCHW。 | 1 |
| FRAMEWORK_TYPE | 深度学习框架类型选择。 | MindSpore框架选择2 |
表19 BERT-Base (Uncased) 模型后处理配置参数(bert.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 2 |
| CHECK_MODEL | 检查模型兼容性。 | false |
表20 DeepLabV3+(Pytorch)模型后处理配置参数(deeplabv3.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 21 |
| CHECK_MODEL | 检查模型兼容性。 | true |
| MODEL_TYPE | 模型推理输出数据的排布格式,0表示NHWC,1表示NCHW。 | 1 |
| FRAMEWORK_TYPE | 深度学习框架类型选择。 | Pytorch框架选择1 |
表21 U-Net模型后处理配置参数(unet_simple.cfg)
| 参数名 | 描述 | 默认值 |
|---|---|---|
| CLASS_NUM | 类别数量。 | 2 |
| POST_TYPE | 模型后处理方式,0表示对模型logits输出(NHWC型)做argmax,1表示对模型argmax输出结果(NHW型)透传。 | 1 |
| RESIZE_TYPE | 对像素图做插值还原的方式,暂只支持两种方式: 0:不做插值还原。 1:最邻近插值还原。 | 1 |
表22 Mask R-CNN模型后处理配置参数(mask_rcnn_2017.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| CLASS_NUM | 推理类别总数,背景不计算在内。 | 80 | [0, 100] |
| SCORE_THRESH | 置信度得分阈值,可根据业务场景调整。 | 0.7 | [0.0, 1.0] |
| IOU_THRESH | IOU阈值,可根据业务场景调整。 | 0.5 | [0.0, 1.0] |
| RPN_MAX_NUM | Region Proposal Network最大个数。 | 1000 | [0, 1000] |
| MAX_PER_IMG | 按置信度排序,每张图预测框的最大值。 | 128 | [0, 150] |
| MASK_THREAD_BINARY | 输入RCNN的掩码阈值。 | 0.5 | [0.0, 1.0] |
| MASK_SHAPE_SIZE | mask_rcnn中掩码的形状,只支持单参数表示正方形。 | 28 | [0, 100] |
| MODEL_TYPE | 可选以下两个值。 0:MindSpore 1:Pytorch | 0 | 无 |
| SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) | 无 |
表23 Ssd_Mobilenet_v1_Fpn_for_MindSpore模型后处理配置参数(ssd_mobilenetv1_fpn.cfg))
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| CLASS_NUM | 类别数量。 | 81 | [0, 100] |
| SCORE_THRESH | 目标是否为某种类别物体的阈值,大于阈值即认为是该目标。 | 0.5 | [0.0, 1.0] |
| IOU_THRESH | 目标重合程度的阈值,大于阈值即认为两个目标框对应同一个目标。 | 0.6 | [0.0, 1.0] |
| SEPARATE_SCORE_THRESH | 各个类别对应的阈值。 | CLASS_NUM(数量)个SCORE_THRESH(阈值),以逗号为分隔符。(阈值数量等于CLASS_NUM。) | 无 |
表24 OpenPose模型后处理配置参数(openpose.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| KEYPOINT_NUM | 关键点个数,加上背景(背景算一个)。 | 19 | [0, 100] |
| FILTER_SIZE | 高斯滤波核的长(或宽)。 | 25 | [0, 100] |
| SIGMA | 高斯滤波核的方差。 | 3 | [0, 10] |
表25 HigherHRnet模型后处理配置参数(higherhrnet.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| KEYPOINT_NUM | 关键点个数。 | 17 | [0, 20] |
| SCORE_THRESH | 关键点阈值。 | 0.1 | [0.0, 1.0] |
表26 Unet++模型后处理配置参数(unet_nested.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| CLASS_NUM | 类别数量。 | 3 | 无 |
| POST_TYPE | 模型后处理方式,0表示对模型logits输出(NHWC型)做argmax,1表示对模型argmax输出结果(NHW型)透传。 | 1 | [0, 16] |
| RESIZE_TYPE | 对像素图做插值还原的方式,暂只支持两种方式: 0:不做插值还原。 1:最邻近插值还原。 | 1 | [0, 16] |
表27 RetinaNet模型后处理配置参数(retinanet_tf.cfg)
| 参数名 | 描述 | 默认值 | 取值区间 |
|---|---|---|---|
| CLASS_NUM | 代表数据集类别数量(默认COCO数据集是80类)。 | 80 | [0, 100] |
| MODEL_TYPE | 代表模型类别,目前仅支持TensorFlow模型。 | 0 | [0, 100] |
| SCORE_THRESH | 代表分数阈值。 | 0.5 | [0.0, 1.0] |
父主题: 模型支持参考
模型结构
YOLOv3
- 可接受的模型与YOLOv3具有类似的输出张量。一般有三个输出张量(YOLOv3-Tiny只有两个,配置参数“YOLO_TYPE”需设为“2”),分别是8倍,16倍与32倍降采样后的特征层。
- 每个输出张量的第一维与模型所支持的最大batchsize相同,按照NHWC或NCHW,输出张量形状略有差异,W与H分别等于模型输入宽高除以8,16,32,C等于先验框个数anchorDim=3 * (边框坐标4 + 边框置信度1 + 类别数80) 。
- 配置参数MODEL_TYPE = 0时,采取NHWC,MODEL_TYPE = 1时,采取NCHW。
图1 NHWC型

图2 NCHW型

FasterRCNN
-
支持两种结构的模型,原生FasterRCNN模型,以及对模型中NMS(非最大值抑制)进行裁剪后的模型。
-
配置参数NMS_FINISHED = 0时,采取后者,NMS_FINISHED = 1时采取前者。
-
原生模型:
有四个输出张量,分别为目标数,置信度,坐标框和类别ID。
图3 FasterRCNN原生模型

-
裁剪NMS后:
有三个输出张量,分别为目标数,每种类别目标可能的坐标框,每种类别目标框的置信度。
图4 FasterRCNN裁剪NMS后

SSD MobileNet v1 FPN
SSD MobileNet v1 FPN与FasterRCNN原生模型类似,有四个输出张量,分别为目标数,置信度,坐标框和类别ID。
图5 SSD MobileNet v1 FPN

SSD-VGG16
SSD-VGG16有两个输出张量,第一个输出张量是目标数,第二个输出张量的为目标框的信息[batch, keep_top_k, 8],其中的“8”表示batchID、label(classID)、score(类别概率)、xmin、ymin、xmax、ymax、null。
图6 SSD-VGG16
CRNN
CRNN的输出张量仅一个,第一维是batchsize,第二维即其所能检测的目标数上限,代表其识别到的每个目标的类别ID(包含占位符)。
图7 CRNN
ResNet-50
ResNet-50仅需一个输出张量,第一维是batchsize,第二维与类别数一致,为模型特征层softmax之后的结果。第二个输出张量为概率最大的类别对应的类别ID。
图8 ResNet-50
YOLOv4
YOLOv4与YOLOv3模型类似,有三个输出张量,分别是8倍,16倍与32倍降采样后的特征层。
图9 YOLOv4

YOLOv5
- YOLOv5有三个输出张量,分别是8倍,16倍与32倍降采样后的特征层。
- 输出张量按照N(C0)HW(C1)的形式排布,W与H分别等于模型输入宽高除以8、16、32,C等于先验框个数anchorDim=3 * (边框坐标4 + 边框置信度1 + 类别数80) 。
图10 YOLOv5

FasterRCNN-Fpn/CascadeRCNN-Fpn
模型有两个输出张量,分别是5 * 100的预测框和置信度(x0, y0, x1, y1,confidence)(其中坐标为左上和右下的检测框的坐标),1 * 100是每个类别的分值。输入为固定size的RGB图片:3 * 1216 * 1216 。
图11 FasterRCNN-Fpn/CascadeRCNN-Fpn

CTPN(TensorFlow)
CTPN(TensorFlow)模型有两个输出张量,分别是38 * 67 * 40的预测小框,相当于38 * 67 * 4的每个像素点生成10个小框,38 * 67 * 20的预测分数,相当于38 * 67 * 2的每个像素点生成10个预测分数。输入为固定size的RGB图片:3 * 608 * 1072 。
图12 CTPN(TensorFlow)

CTPN(MindSpore)
CTPN(MindSpore)模型有两个输出张量,分别是1000个预测小框,5个维度分别是四个坐标和分数, 另一个1000是每个小框的类别,分别为1、0,表示前景还是后景。输入则是固定size的RGB图片:3 * 576 * 960 。
图13 CTPN(MindSpore)

ResNet-18+
ResNet-18+模型输入是1 * 408 * 64 * 3大小的张量。输出是1 * 2的张量,表示每个样本的分类概率。
图14 ResNet-18+
BERT-Base(Uncased)
BERT-Base(Uncased)模型输入有三个张量,shape都是1 * 128。1表示batchsize,128表示句长。
模型输出有一个张量,1 * 2,表示每个分类类别的概率。
图15 BERT-Base(Uncased)

DeeplabV3+(TensorFlow)
DeeplabV3+(TensorFlow)模型输出有一个张量,是1 * 513 * 513 * 21的NHWC排布方式,物理含义相当于每个像素点的分类概率。原始输入图片是动态shape的RGB图片。模型输入是1 * 513 * 513 * 3的张量。
图16 DeeplabV3+(TensorFlow)

DeepLabV3(MindSpore)
DeepLabV3(MindSpore)模型输入是NHWC排布的,输出以NCHW排布。
图17 DeepLabV3(MindSpore)

DeepLabV3(Pytorch)
DeepLabV3(Pytorch)模型输入以NHWC排布,输出为NCHW排布。
图18 DeepLabV3(Pytorch)

Unet(MindSpore)
Unet(MindSpore)模型输出Tensor为NCHW,其中N为1,C为2,作为mxVision后处理输入。
- 在C通道上进行argmax,得到最大概率值的索引值,生成数值为0和1的二维数组。
- 判断模型输出Tensor的HW是否与输入原图尺寸一致,若一致则直接输出argmax后的二维数组,否则进行最近邻插值到输入图片尺寸。
图19 Unet(MindSpore)

Mask R-CNN(TensorFlow)
Mask R-CNN(TensorFlow)模型输入张量为4维NHWC(1 * 480 * 640 * 3)排布格式。
- N为批数量。
- H为输入图像的高度(480)。
- W为输入图像的宽度(640)。
Mask R-CNN(TensorFlow)模型输出张量有5个(tensor[0]~tensor[4])。
- tensor[0]的维度为1维(1),第一维长度为1,代表模型检测出的目标的个数。
- tensor[1]的维度为2维(1 * 100),第一维长度为1,代表批数量。第二维长度为100,代表前top100个目标的置信度分数。
- tensor[2]的维度为3维为(1 * 100 * 4), 第一维长度为1,代表批数量。第二维长度为100,代表前top100个目标框。第三维长度为4,代表目标框的四个顶点坐标(x0, y0, x1, y1)。
- tensor[3]的维度为4维(1 * 100 * 33 * 33),第一维长度为1,代表批数量。第二维长度为100,代表前top100个目标框。第三维和第四维代表一张33 * 33大小的掩码图。
- tensor[4]的维度为2维(1 * 100), 第一维长度为1,代表批数量。第二维长度为100,代表前top100目标的分类类别。
图20 Mask R-CNN(TensorFlow)

FaceNet(TensorFlow)
FaceNet(TensorFlow)输入张量的形状为 NHWC (1*160*160*3),数据类型为UINT8。
- N为批数量。
- H代表输入图像的高度160。
- W代表输入图像的宽度160。
- C代表图像的通道数。
输出张量为目标图像对应的特征向量,形状为1 * 512,第一维代表批数量,第二维为特征向量的长度512,数据类型为FLOAT32。
图21 FaceNet(TensorFlow)

SSD MobileNet v1 FPN(MindSpore)
SSD MobileNet v1 FPN(MindSpore)有2个输出张量,分别为坐标框和置信度。
图22 SSD MobileNet v1 FPN(MindSpore)

OpenPose
OpenPose输出张量为[batch, outputHeight, outputWidth, channel],“outputHeight”表示输出图像的高,“outputWidth”表示输出图像的宽,“channel”由两部分组成,前1/3为heat mat,后2/3为paf mat。此模型输出为[1, 54, 46, 57]。
图23 OpenPose

Unet++(MindSpore)
Unet++(MindSpore)模型后处理有一个NCHW的输入Tensor,为模型进行argmax操作之后经过aipp处理后输入给后处理模块;有一个NHW的输出Tensor,由于模型已经做了argmax,C通道已经计算在Tensor HW对应的值。
图24 Unet++(MindSpore)
父主题: 模型支持参考
使用须知
须知
本章节开放的类,请遵循同一个类实例在单一线程中使用的原则,请勿将同一个类实例在不同的线程中使用。
API划分
mxVision C++ API目前分为三大部分:面向昇腾硬件底层接口的基础组件层、面向插件开发和流程编排的编程框架层。
接口管理规范
- 标记有宏 SDK_AVAILABLE_FOR_OUT 的接口,表示对用户开放。
- 标记有宏 SDK_AVAILABLE_FOR_IN 的接口,表示内部使用,请用户不要使用。
- 标记有宏 SDK_UNAVAILABLE_FOR_OTHER 的接口,表示为隐藏,用户无法使用。
- 标记有宏 SDK_DEPRECATED_FOR 的接口,表示在未来版本会弃用,建议使用替代接口。
父主题: API参考(C++)
多进程编写规范
避免父子进程嵌套
对父子进程事先进行职责区分,父进程负责创建子进程,子进程负责调度推理,避免父子进程同时调度推理,造成资源抢占问题。在实际使用中,请在fork()执行后再在返回的父子进程中执行模型推理。程序逻辑示意图如图1所示。
图1 避免父子进程嵌套

采用不同Device执行推理任务
若业务上需要父子进程嵌套,则规范对于Device的指定,避免父子进程同时在同一Device上执行推理,而是将二者的推理指定到不同Device上。程序逻辑如图2、图3所示。
图2 父子进程推理指定到不同Device上

图3 新建的子进程可设定同一个device_id

子进程推理在前,父进程推理在后
若业务需要父子进程嵌套,建议先让子进程进行推理, 再调用父进程推理,但此解决方案在调用逻辑上来讲比较难以理解,因此不推荐使用、程序调用逻辑如图4所示。
图4 先进行子进程推理,再调用父进程推理

示例代码
int main(){
// 下文的func()函数代表一个完整的推理任务
// 以下为推荐的多进程调用方式,请在fork()后于返回的父子进程中调用推理
pid_t pid;
int i;
for (i = 0; i < 5; ++i)
{
pid = fork(); //创建子进程
if (pid == -1)
{
perror("fork失败!");
exit(1);
}
if (pid==0)
{
break;
}
}
//返回大于0的进程就是父进程
if(pid>0) //父进程
{
printf("父进程: pid= %d , ppid=%d,子进程: %d \n", getpid(),getppid(),pid);
func(); //在fork()后进行调用推理
sleep(1); //这里延迟父进程程序,等子进程先执行完。
}
else if(pid == 0) //子进程
{
func(); //在fork()后进行调用推理
printf("i的变量是: %d 子进程: pid= %d , ppid=%d \n", i,getpid(),getppid());
}
return 0;
}
父主题: API参考(C++)
在线提单