Skip to main content

后处理类开发步骤

编译

CMakeLists.txt文件配置

主要用于设置后处理动态库的目标文件以及链接相关的第三方库。每一个后处理都有一个CMakeLists.txt文件与之对应。对于新增后处理的CMakeLists.txt文件,用户只需修改生成的后处理名和生成动态库的目标文件即可,沿用原有的其他配置。以开发一个ResNet-50后处理为例,示例操作如下:

其中,“samplepostprocess”和“SamplePostProcess.cpp”分别代表生成的后处理动态库名和生成后处理的目标文件,其他的配置沿用原有的后处理。

命令行编译

命令行编译主要根据“CMakeLists.txt”文件的配置,进行插件的编译和生成。以下步骤中*{sdk_install_path}*为mxVision软件包的安装路径。

  1. 新建并进入“SamplePostProcess”目录。

    cd {sdk_install_path}/samples/
    mkdir SamplePostProcess
    cd SamplePostProcess
  2. 将后处理动态库头文件、源文件和“CMakeLists.txt”文件存放至“SamplePostProcess”目录。

  3. 新建并进入“build”目录。

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

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

    make -j
  6. 将生成后处理的.so文件拷贝至“{sdk_install_path}/lib/modelpostprocessors”目录下。

    make install

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

模型后处理介绍

:::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框架)

在线提单