编译
log类函数集
| 函数名 | 参数类型 | 说明 |
|---|---|---|
| debug(str) | String | 打印Debug级日志。 |
| info(str) | String | 打印Info级日志。 |
| warning(str) | String | 打印Warning级日志。 |
| error(str) | String | 打印Error级日志。 |
| fatal(str) | String | 打印Fatal级日志。 |
| init() | - | 日志初始化。 |
父主题: 日志输出
模型后处理介绍
模型后处理为与模型一一对应的配套操作,在mxVision中其主要工作是用于对模型推理插件传入的推理结果张量进行处理,如在目标检测任务中,需要对目标框进行去重,排序,筛选等,最后将处理结果写入目标信息的类对象中,传递回给目标检测后处理插件进行写入元数据以传递给下游插件。目前mxVision所支持的模型均已开发相应的后处理动态库,具体请参见表1。请用户根据实际情况选择现有后处理插件或自行开发适配所需模型,具体操作步骤请参见后处理类开发步骤。
表1 已支持模型及对应后处理动态库
已支持模型名称 | 后处理类名称 | 推理插件使用的后处理动态库 |
|---|---|---|
YOLOv3 | Yolov3PostProcess | modelpostprocessors/libyolov3postprocess.so |
YOLOv3-tiny | ||
ResNet-50 | Resnet50PostProcess | modelpostprocessors/libresnet50postprocess.so |
Faster Rcnn | FasterRcnnPostProcess | modelpostprocessors/libfasterrcnnpostprocess.so |
SSD-VGG16 | Ssdvgg16PostProcess | modelpostprocessors/libssdvgg16postprocess.so |
SSD MobileNet v1 FPN | SsdMobilenetv1FpnPostProcess | modelpostprocessors/libssdmobilenetv1fpnpostprocess.so |
CRNN | CrnnPostProcessor | modelpostprocessors/libcrnnpostprocess.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 carchariasBtiger shark, Galeocerdo cuvieri…… -
每个模型所需要的配置参数一般不相同,用户可自行定义增加。后处理基类中已经读取“CHECK_MODEL”参数,当值为“true”时会对模型的输出张量形状进行校验,并拦截后处理不兼容的模型,当值为“false”时会跳过模型校验。当前mxVision已支持的模型输出张量形状与配置文件参数请见模型后处理配置参数。
父主题: 模型后处理(tensorinfer框架)
后处理类开发步骤
-
根据任务类型,选择mxVision已经支持的后处理基类去派生一个新的子类,后处理基类分别为目标检测、分类任务、语义分割、文本生成,这些基类都继承自相同的父类PostProcessBase。
在Init函数中,需要调取父类的Init()接口读取配置参数,然后再调用父类对象的configData_.GetFileValue()接口读取子类所需要的配置参数。
在Process函数中,需要以模型的输出张量Tensors作为输入,以对应的数据结构类对象作为输出。
-
调用父类的CheckAndMoveTensors()接口,对Tensors的形状进行校验并将内存移动至Host侧,然后再进行相应操作获得结果。
-
后处理开发完成后,增加一个对外的接口如GetObjectInstance(),以便于让业务流中的后处理插件动态加载此后处理so。
如果当前后处理基类所采用的数据结构无法满足需求,可以新增后处理基类继承PostProcessBase,并写入新的数据结构。
// 1.目标检测数据结构:
class ObjectInfo {
public:
float x0;
float y0;
float x1;
float y1;
float confidence;
float classId;
std::string className;
std::vector<std::vector <int>> mask; // 用于实例分割
};
// 2.分类任务数据结构:
class ClassInfo {
public:
int classId;
float confidence;
std::string className;
};
// 3.语义分割任务数据结构:
class SemanticSegInfo {
public:
std::vector<std::vector<int>> pixels;
std::vector<std::string> labelMap;
};
// 4.文本生成(机器翻译,文字识别,语音识别等)接口:
class TextsInfo {
public:
std::vector<std::string> text;
};
// 5.文本框检测接口:
class TextObjectInfo {
public:
float x0;
float y0;
float x1;
float y1;
float x2;
float y2;
float x3;
float y3;
float confidence;
std::string result;
};
图1 已支持模型的后处理UML类图

父主题: 模型后处理(tensorinfer框架)
编译
CMakeLists.txt文件配置
主要用于设置后处理动态库的目标文件以及链接相关的第三方库。每一个后处理都有一个CMakeLists.txt文件与之对应。对于新增后处理的CMakeLists.txt文件,用户只需修改生成的后处理名和生成动态库的目标文件即可,沿用原有的其他配置。以开发一个ResNet-50后处理为例,示例操作如下:
其中,“samplepostprocess”和“SamplePostProcess.cpp”分别代表生成的后处理动态库名和生成后处理的目标文件,其他的配置沿用原有的后处理。
命令行编译
命令行编译主要根据“CMakeLists.txt”文件的配置,进行插件的编译和生成。以下步骤中*{sdk_install_path}*为mxVision软件包的安装路径。
-
新建并进入“SamplePostProcess”目录。
cd {sdk_install_path}/samples/mkdir SamplePostProcesscd SamplePostProcess -
将后处理动态库头文件、源文件和“CMakeLists.txt”文件存放至“SamplePostProcess”目录。
-
新建并进入“build”目录。
mkdir buildcd build -
创建Makefile文件,避免污染项目的CMakeLists。
cmake .. -
根据生成的Makefile文件编译项目。
make -j -
将生成后处理的.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/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框架)
在线提单