本仓库基于NVIDIA-阿里 2021 TRT 比赛hackthon,例程及环境配置来源于trt-samples-for-hackathon-cn
根据文章《Fully Convolutional Networks for Panoptic Segmentation》及其Github源代码得到模型的训练过程。网络模型如下图所示。该网络用于全景分割。
本仓库使用
nvidia-docker pull nvcr.io/nvidia/tensorrt:21.02-py3
新建docker容器并在此基础上进行工作,具体环境配置过程见传送门
python3 export_onnx.py --config-file ../Engine/PanopticFCN-R50-400-3x-FAST-nodeform.yaml --opts MODEL.WEIGHTS ../Engine/model_final.pth
导出onnx文件panoptic_fcn.onnx
trtexec --verbose --onnx=panoptic_fcn.onnx --saveEngine=panoptic_fcn.trt --explitBatch
trtexec --verbose --onnx=panoptic_fcn.onnx --saveEngine=panoptic_fcn_fp16.trt --explicitBatch --fp16
在testpics文件夹下准备足量照片(>batch_size*max_batch)或者修改tools/build_int8_engine中的文件类型和路径,设定batch_size。校准过程见calibrator.py。
python tools/build_int8_engine
文件会被储存在tools/models_save文件夹下,如没有特别标注不会生成panoptic_fcn_int.cache描述文件。为方便调用将该文件夹下的panoptic_fcn_int8.trt放于Engine文件夹下:
mv tools/models_save/panoptic_fcn_int8.trt Engine/
不建议使用cp命令,若models_save拥有trt文件的话会首先读入该引擎文件造成混淆。
运行appOnnxPanopticFCN.py文件获得
python appOnnxPanopticFCN.py --config-file Engine/PanopticFCN-R50-400-3x-FAST-nodeform.yaml --opts MODEL.WEIGHTS Engine/model_final.pth
性能表现:因为在全景分割中每一个像素点都会被准确的分配到某个类别中,所以本程序所使用的效果对比为PQ函数(全景分割评价指标),该标准对应的模型输出即 output['scores'] 这个输出 分别使用FP32、FP16和INT8模型进行模型部署,使用单张照片作为测试照片输入。测试结果如下:
FP32 | FP16 | INT8 | |
---|---|---|---|
运行时间 | 0.042133 | 0.015947 | 0.03828 |
加速比 | 2.87 | 7.59 | 3.16 |
scores减比 | -6e-6 | 2e-4 | -6e-6 |
在FP32和INT8中scores增加,可能是因为在训练中模型有过拟合现象。同时INT8的加速比并没有想象中的理想,推测原因是模型过于复杂导致在生成onnx或者trt模型时没有充分的生成trt可加速的layer。 |
mkdir build && cd build
cmake ..
make
./pansonicFCNEngine
改错误是因为没有开启调用TRT系统已经写好的Plugin,在C代码生成Engine之前加入一句:
initLibNvInferPlugins(&trtLogger,"");
本代码因为时间关系没有实现过于复杂的plugin,但是为了学习plugin操作实现了一个ReLU的plugin,源代码位于appPanopticFCNPlugin.cpp。更改CMakelists.txt中的
#添加文件
add_executable(${PROJECT_NAME} appPanopticFCNPlugin.cpp