Skip to content

Latest commit

 

History

History

week4

Quantize and Evaluate Hourglass

1. 论文阅读

Stacked hourglass networks for human pose estimation: 📝笔记

2. 部署流程

2.1 了解Hourglass在mmpose中的实现

根据配置文件: config-hourglass52_coco_256x256.py,可以知道整个姿态检测网络使用HourglassNet作为backbone,而使用了TopdownHeatmapMultiStageHead作为keypoint_head(关键点的预测头)。

HourglassNet中,只涉及到了torch中的Conv2dUpsample两种算子。其前向传播,输入为256*256*3的图像,输出为多个64*64*256的heatmap组成的list。输出的list是包含了网络中各个hourglass模块提取的特征。在配置文件中,HourglassNet仅仅只使用了一个hourglass模块,因此输出的list中仅包含一个heatmap。

TopdownHeatmapMultiStageHead中,涉及到了ConvTranspose2dConv2d两种算子。其前向传播,输入为一个包含多个heatmap的list,然后通过多个预测头分别将其映射成64*64*17的预测图,并输出一个包含多个预测图的list。在配置文件中,TopdownHeatmapMultiStageHead仅仅只有一个stage,也就是只包含一个预测头;同时,反卷积数量也设置为0,因此该部分也仅仅只使用了Conv2d算子。

值得注意的是,对于keypoint_head,训练时调用forward的方法,而推理时调用其inference_model方法。可见TopDown pose dtector,其中抽象了训练和测试前向传播的流程,由backbone->neck->keypoint_head。

对于TopdownHeatmapMultiStageHead的inference_model方法,其在forward方法返回的list的基础上,取该list中的最后一个预测图作为输出。但是其在mmppse中的实现还涉及了flip_pairs操作,和将输出结果转至nd.array。上述这些在部署时是不需要的,因此在mmdeploy中对inference_model重写,删除了这些操作。

通过上述分析,可以看出在模型推理过程中仅仅涉及了如下三个torch算子,而它们在ONNX中均有对应的算子。

torch onnx11
Conv2d Conv
upsample_bilinear2d Resize
ConvTranspose2d ConvTranspose

2.2 新增deploy config

deploy config由三部分组成,分别是codebase_config,onnx_config,和backend_config。参见write_config.md

codebase_config:其中mmdeploy已经支持了mmpose库的PoseDetection任务,可见codebase

codebase_config = dict(type='mmpose', task='PoseDetection')

onnx_config:hourglass对输入图像的尺寸有要求。

onnx_config = dict(input_shape=[256, 256])

backend_config:使用ncnn或者ncnn-int8。

backend_config = backend_config = dict(type='ncnn', precision='FP32', use_vulkan=False)

⚙️ 新增configs:configs

2.3 部署并测试

🔧 测试结果:result.md