输入数据获取
模型后处理介绍
:::note 说明 从当前版本不再演进,预计2024年退出,建议使用模型后处理(tensorinfer框架)。 :::
模型后处理为与模型一一对应的配套操作,在mxVision中其主要工作是用于对模型推理插件传入的推理结果张量进行处理,如在目标检测任务中,需要对目标框进行去重,排序,筛选等。最后将处理结果写入推理插件的元数据中。目前mxVision所支持的模型均已开发相应的后处理参见。如果现有后处理无法兼容用户模型,用户应自行开发后处理,步骤见本章后续介绍。
表1 已支持的模型及对应的后处理动态库
已支持模型名称 | 后处理类名称 | 推理插件使用的后处理动态库 |
|---|---|---|
YOLOv3 | Yolov3PostProcessor | libMpYOLOv3PostProcessor.so |
YOLOv3-tiny | ||
ResNet-50 | Resnet50PostProcessor | libresnet50postprocessor.so |
Faster Rcnn | FasterRcnnPostProcessor | libfasterrcnnpostprocessor.so |
SSD-VGG16 | SsdvggPostProcessor | libssdvggpostprocessor.so |
SSD MobileNet v1 FPN | SsdmobilenetfpnPostProcessor | libssdmobilenetfpnpostprocessor.so |
CRNN | CrnnPostProcessor | libcrnnpostprocessor.so |
后处理需要一个配置文件和一个标签文件。
-
标签文件只需将所有类别的名称按类别ID顺序逐行输入即可(#开头的行不会被读取),如下所示。
# This is modified from https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3aunknown typetench, Tinca tincagoldfish, Carassius auratusgreat white shark, white shark, man-eater, man-eating shark, Carcharodon carchariastiger shark, Galeocerdo cuvieri…… -
每个模型所需要的配置参数一般不相同,用户可自行定义增加。后处理基类中已经读取“CHECK_MODEL”的参数。
- 当其为“true”时,会对模型的输出张量形状进行校验并拦截后处理不兼容的模型。
- 当其为“false”时,会跳过模型校验。
当前mxVision已支持的模型输出张量形状与配置文件参数请见模型支持参考。
父主题: 模型后处理(modelinfer框架)
后处理类开发步骤
开发步骤如下:
- 继承“ModelPostProcessorBase.h”中的ModelPostProcessorBase基类,并自定义后处理类名。
- 用户重写基类中的Init()、DeInit()、Process()三个成员函数,参见表1。
- 用户可选择重写CheckModelCompatibility,用于对所读取模型的输出形状进行校验。
- 在后处理类中实现“std::shared_ptr
GetInstance() ”接口函数功能。
表1 成员函数说明
| 成员函数 | 说明 |
|---|---|
| Init() | 该接口仅调用一次,用于实现配置参数获取、业务逻辑初始化。 |
| DeInit() | 该接口仅调用一次,用于实现去初始化任务(例如内存释放)。 |
| Process() | 该接口由数据驱动,用于接收上游插件传入的数据,用于对模型输出进行处理,并将处理结果写入元数据。 |
| MemoryDataToHost | 可选,该接口可用于将上游推理插件传入的推理结果张量搬运到Host侧。 |
| LoadConfigDataAndLabelMap | 可选,该接口由Init()调用,用于实现配置参数获取。 |
| GetModelTensorsShape | 可选,该接口由Init()调用,用于获取模型的输入输出张量形状。 |
| CheckModelCompatibility | 可选,该接口由Init()调用,用于对所读取模型的输出形状进行校验。 |
对于目标检测类的模型,也可以让后处理依赖于已经开发好的ObjectPostProcessorBase基类。
表2 成员函数说明
| 成员函数 | 说明 |
|---|---|
| Init() | 该接口仅调用一次,用于实现配置参数获取。 |
| DeInit() | 该接口仅调用一次,用于实现去初始化任务(例如内存释放)。 |
| Process() | 该接口由数据驱动,用于对模型输出进行目标处理,如去重,排序,筛选等。并将处理结果写入元数据。 |
| ObjectDetectionOutput | 该接口由Process()调用,用于对模型输出进行目标处理,如去重,排序,筛选等。 |
:::note 说明 后处理动态库中尽量避免使用静态变量,须保证多个后处理动态库实例间不会相互干扰。 :::
父主题: 模型后处理(modelinfer框架)
输入数据获取
后处理的数据输入是通过“Process()”函数,将数据以入参的形式传入,具体参数参考模型后处理类参考(modelinfer框架)中的参数说明。
父主题: 模型后处理(modelinfer框架)
输出结果发送
metaDataPtr :向下游插件传输数据指针。
具体操作参考如下:
std::shared_ptr<MxTools::MxpiObjectList> objectList =
std::static_pointer_cast<MxTools::MxpiObjectList>(metaDataPtr);
MxTools::MxpiObject* objectData = objectList->add_objectvec();
objectData->set_x0(objInfo.x0 + xOffset);
objectData->set_y0(objInfo.y0 + yOffset);
objectData->set_x1(objInfo.x1 + xOffset);
objectData->set_y1(objInfo.y1 + yOffset);
其中,“objInfo”为后处理计算得出的框坐标, “xOffset”和“yOffset”为目标框坐标在原图上的偏移值。
父主题: 模型后处理(modelinfer框架)
编译
CMakeLists文件配置
CMakeLists用于设置后处理动态库的目标文件以及链接相关的第三方库,每一个后处理都有一个“CMakeLists.txt”文件与之对应。对于后处理的CMakeLists.txt文件,用户需要修改其中生成的后处理名和生成动态库的目标文件,延用原有的其他配置。以ResNet-50后处理为例,示例操作参见如下。
其中,“resnet50postprocessor”和“ResNet50PostProcessor.cpp”分别代表生成的后处理动态库名和生成后处理的目标文件,其他的配置延用原有的后处理。
命令行编译
命令行编译主要根据“CMakeLists.txt”文件的配置,进行插件的编译和生成。
-
新建“ResNet50PostProcessor”目录。
cd {sdk_install_path}/samples/mkdir ResNet50PostProcessor:::note 说明 *{sdk_install_path}*为mxVision软件包的安装路径。 :::
-
跳转到“ResNet50PostProcessor”目录下。
cd ResNet50PostProcessor -
将后处理动态库头文件、源文件和“CMakeLists.txt”文件存放至“ResNet50PostProcessor”目录。
-
新建一个“build”文件夹,并跳转到“build”文件夹中。
mkdir buildcd build -
创建Makefile文件,避免污染项目的CMakeLists。
cmake .. -
根据生成的Makefile文件编译项目。
make -j -
将生成后处理的.so文件拷贝至“lib”目录下。
make install
父主题: 模型后处理(modelinfer框架)
工具介绍
一键式信息收集工具用于快速收集MindX SDK问题,定位所依赖的相关信息,避免用户反复收集确认日志。主要包括芯片信息(版本和日志)、操作系统版本信息、环境变量、网络信息以及MindX SDK信息(版本、配置文件、日志、第三方库版本)等。
该工具由“sdk_info_collector.sh”和“sdk_info_collector.py”两个文件组成,其中在“sdk_info_collector.sh”文件中调用了“sdk_info_collector.py”文件。此外,用户可以根据自己的需求在已有的信息收集工具上扩展新功能。
一键式信息收集工具为芯片日志和MindX SDK日志的信息收集提供了可配置的参数,请参见表1,其他的信息都默认收集。
表1 参数介绍
| 参数 | 说明 |
|---|---|
| --help|-h|-H | 查看帮助信息。 |
| --version|-v|-V | 查看版本信息。 |
| -p | 必须设置的MindX SDK的日志存放目录,该目录下的日志文件数量不超过1500个。 -p logs_path:logs_path必须是绝对路径的形式。 |
| -x | 可配置的芯片日志收集参数。 - 默认不收集芯片信息。 - -x n:收集指定n号芯片的日志信息,n必须是整数。 - -x n1,n2,n3:收集指定n1,n2,n3号芯片的日志信息,n1,n2,n3必须是整数。 - -x -1:收集所有芯片的日志信息。 |
| -r | 可配置的MindX SDK日志天数收集参数。 - 默认收集所有日志信息。 - -r xd:收集x天内的日志信息,x必须是整数。 - -r full:收集每天的日志信息。 |
| -t | 可配置的MindX SDK日志级别收集参数。 - 默认收集所有日志信息。 - -t d:收集调试(debug)日志及以上级别的日志信息。 - -t i:收集正常(info)日志及以上级别的日志信息。 - -t w:收集警告(warn)日志及以上级别的日志信息。 - -t e:收集错误(error)日志及以上级别的日志信息。 - -t f:收集致命(fatal)日志信息。 - -t full:收集所有级别的日志信息。 |
父主题: 一键式运维数据收集工具
在线提单