跳到主要内容

输入数据获取

模型后处理介绍

:::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/942d3a0ac09ec9e5eb3a
    unknown type
    tench, Tinca tinca
    goldfish, Carassius auratus
    great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
    tiger shark, Galeocerdo cuvieri
    ……
  • 每个模型所需要的配置参数一般不相同,用户可自行定义增加。后处理基类中已经读取“CHECK_MODEL”的参数。

    • 当其为“true”时,会对模型的输出张量形状进行校验并拦截后处理不兼容的模型。
    • 当其为“false”时,会跳过模型校验。

    当前mxVision已支持的模型输出张量形状与配置文件参数请见模型支持参考

父主题: 模型后处理(modelinfer框架)

后处理类开发步骤

开发步骤如下:

  1. 继承“ModelPostProcessorBase.h”中的ModelPostProcessorBase基类,并自定义后处理类名。
  2. 用户重写基类中的Init()、DeInit()、Process()三个成员函数,参见表1
  3. 用户可选择重写CheckModelCompatibility,用于对所读取模型的输出形状进行校验。
  4. 在后处理类中实现“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”文件的配置,进行插件的编译和生成。

  1. 新建“ResNet50PostProcessor”目录。

    cd &#123;sdk_install_path&#125;/samples/
    mkdir ResNet50PostProcessor

    :::note 说明 *{sdk_install_path}*为mxVision软件包的安装路径。 :::

  2. 跳转到“ResNet50PostProcessor”目录下。

    cd ResNet50PostProcessor
  3. 将后处理动态库头文件、源文件和“CMakeLists.txt”文件存放至“ResNet50PostProcessor”目录。

  4. 新建一个“build”文件夹,并跳转到“build”文件夹中。

    mkdir build
    cd build
  5. 创建Makefile文件,避免污染项目的CMakeLists。

    cmake ..
  6. 根据生成的Makefile文件编译项目。

    make -j
  7. 将生成后处理的.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_pathlogs_path必须是绝对路径的形式。
-x可配置的芯片日志收集参数。
- 默认不收集芯片信息。
- -x n:收集指定n号芯片的日志信息,n必须是整数。
- -x n1,n2,n3:收集指定n1n2n3号芯片的日志信息,n1n2n3必须是整数。
- -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:收集所有级别的日志信息。

父主题: 一键式运维数据收集工具

在线提单