Stacked hourglass networks for human pose estimation: 📝笔记
根据配置文件: config-hourglass52_coco_256x256.py,可以知道整个姿态检测网络使用HourglassNet
作为backbone,而使用了TopdownHeatmapMultiStageHead
作为keypoint_head(关键点的预测头)。
在HourglassNet中,只涉及到了torch中的Conv2d
和Upsample
两种算子。其前向传播,输入为256*256*3的图像,输出为多个64*64*256的heatmap组成的list。输出的list是包含了网络中各个hourglass模块提取的特征。在配置文件中,HourglassNet仅仅只使用了一个hourglass模块,因此输出的list中仅包含一个heatmap。
在TopdownHeatmapMultiStageHead中,涉及到了ConvTranspose2d
和Conv2d
两种算子。其前向传播,输入为一个包含多个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 |
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
-
启动deploy.sh。 onnx, ncnn, ncnn-int8的模型会保存至work_dir下。
-
启动test_ncnn.sh/test_ncnn_int8.sh。在ncnn/ncnn_int8下评估模型精度。
🔧 测试结果:result.md。