建设政协网站的意义,wordpress时尚英文站,张家港网站建设哪家好,友联建设集团官方网站mmdetection转换 文章目录 mmdetection转换mmdetection 自带转换ONNX——无法测试使用mmdeploy(0.6.0)使用mmdeploy转onnx使用mmdeploy直接转tensorRT调试记录 先上结论#xff1a;作者最后是转tensorrt的小图才成功的#xff0c;大图一直不行。文章仅作者自我记录使用#…mmdetection转换 文章目录 mmdetection转换mmdetection 自带转换ONNX——无法测试使用mmdeploy(0.6.0)使用mmdeploy转onnx使用mmdeploy直接转tensorRT调试记录 先上结论作者最后是转tensorrt的小图才成功的大图一直不行。文章仅作者自我记录使用请谨慎参考。 部分版本可参考作者的上篇文章《【mmdeploy】mmdeploy安装linux windows》 mmdetection-2.22.0 自带转 onnx 无法测试MMCVDeformConv2d issue中也说明要转mmdeploy mmdeploy的onnx同样无法测试 mmdeploy整图转tensorRT结果有问题
mmdetection 自带转换ONNX——无法测试
一开始参考官方文档TUTORIAL 8: PYTORCH TO ONNX的教程来进行
CUDA_VISIBLE_DEVICES0 python -u tools/deployment/pytorch2onnx.py \work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/zjw_final_skin_config.py \work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/epoch_12.pth \--output-file work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/dcn_mask_rcnn_nwd.onnx \--input-img /home/wangjy/data/facedata_croped_1209/images/val_whole/CXM__何易霖_痤疮_20200904131918000_斑点.jpg \--test-img /home/wangjy/data/facedata_croped_1209/images/val_whole/CXM__何易霖_痤疮_20200904131918000_斑点.jpg \--shape 3448 4600 \
# --show \
# --verify \--dynamic-export \
# --cfg-options \
# model.test_cfg.deploy_nms_pre-1 \
# work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/pytorch2onnx.log原项目是版本是2.14.0在转换添加了DCN的Mask R-CNN模型时出现问题
RuntimeError: DeformConv is not implemented on CPU到mmdetection的issus中搜索mmdetection/issues/6047可知是mmcv的版本不够。刚好有个之前安装的2.22.0版本。但采用官方文档中的命令会在经过pytorch2onnx函数的torch.onnx.export(...)调用时直接被Kill没有错误信息。
把以上的命令修改一下精简为
CUDA_VISIBLE_DEVICES0 python -u tools/deployment/pytorch2onnx.py \work_dirs/train_skin_220416_maskrcnn/20220417_124418/skin_config_whole.py \work_dirs/train_skin_220416_maskrcnn/20220417_124418/epoch_14.pth \--output-file work_dirs/train_skin_220416_maskrcnn/20220417_124418/dcn_mask_rcnn.onnx \--shape 3448 4600 \能够输出一个onnx文件但是使用官方文档后续的onnx eval命令还是会报错
Fatal error: MMCVDeformConv2d is not a registered function/op这个时候搜到的一篇博客《Exporting MMDetection models to ONNX format》说可以用openvinotoolkit/mmdetection但我简单看了一下并没有用。而在mmdetection的issues中搜索该报错信息都建议使用mmdeploy。
使用mmdeploy(0.6.0)
在安装mmdeploy的基础上参考文档还需要安装mmdet库可能是商汤自己封装的所以用不了自己定义的方法。 # 克隆 mmdetection 仓库。转换时需要使用 mmdetection 仓库中的模型配置文件构建 PyTorch nn module
python -m pip install mmdet2.24.0
# git clone https://github.com/open-mmlab/mmdetection.git
export MMDET_DIR$(pwd)/mmdetection# 下载 Faster R-CNN 模型权重
export CHECKPOINT_DIR$(pwd)/checkpoints
wget -P ${CHECKPOINT_DIR} https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth# 设置工作路径
export WORK_DIR$(pwd)/mmdeploy_models/faster-rcnn# 执行转换命令实现端到端的转换
python ${MMDEPLOY_DIR}/tools/deploy.py \${MMDEPLOY_DIR}/configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py \${MMDET_DIR}/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \${CHECKPOINT_DIR}/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \${MMDET_DIR}/demo/demo.jpg \--work-dir ${WORK_DIR} \--device cuda:0 \--dump-info使用mmdeploy转onnx
其中要把配置文件的test处理流程中的Resize行注释掉经过测试发现mmdetection中似乎把它注释了也没什么问题220723不对还是会出问题有待考量否则其会专门处理一下。实际最终命令
python -u tools/deploy.py \configs/mmdet/detection/detection_onnxruntime_dynamic.py \work_dirs/deploy_220721_dcn_mask_rcnn_nwd/zjw_final_skin_config.py \../mmdetection-2.22.0/work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/epoch_12.pth \/home/wangjy/data/facedata_croped_1209/images/val_whole/CXM__何易霖_痤疮_20200904131918000_斑点.jpg \--work-dir work_dirs/deploy_220721_dcn_mask_rcnn_nwd \--device cuda:0 \--dump-info报错
KeyError: MaskRCNN: RPNHeadNwd is not in the models registry又看了下文档参考文档MMDetection-install可以用pip install -v -e .从本地编译mmdetection
cd ../mmdetection-2.22.0 # 我的mmdet2.22.0本地文件
pip install -r requirements/build.txt
pip install -v -e . # or python setup.py develop其中由于报错改了一些代码
File /home/wangjy/research/mmdeploy/mmdeploy/codebase/mmdet/models/detectors/two_stage.py, line 58, in two_stage_detector__simple_testproposals, _ self.rpn_head.simple_test_rpn(x, img_metas)
ValueError: not enough values to unpack (expected 2, got 1)改为
proposals self.rpn_head.simple_test_rpn(x, img_metas)File /home/wangjy/research/mmdeploy/mmdeploy/codebase/mmdet/models/roi_heads/test_mixins.py, line 44, in bbox_test_mixin__simple_test_bboxesrois.shape[0], devicerois.device).float().view(-1, 1, 1).expand(
AttributeError: list object has no attribute shape将上一行的rois proposals改为rois torch.stack(proposals)
最后报错它要51个G这谁顶得住???!!!
RuntimeError: CUDA out of memory. Tried to allocate 51.02 GiB (GPU 0; 23.70 GiB total capacity; 2.24 GiB already allocated; 14.99 GiB free; 3.57 GiB reserved in total by PyTorch)发现了一些问题基于mask rcnn的模型应该算实例分割因而把上面的configs/mmdet/detection/detection_onnxruntime_dynamic.py换成了configs/mmdet/instance-seg/instance-seg_onnxruntime_dynamic.py可以成功生成。但进行eval的时候还是会报错
onnxruntime.capi.onnxruntime_pybind11_state.Fail: [ONNXRuntimeError] : 1 : FAIL : Load model from work_dirs/deploy_220721_dcn_mask_rcnn_nwd/onnx_dynamic/end2end.onnx failed:Fatal error: MMCVDeformConv2d is not a registered function/op使用mmdeploy直接转tensorRT
由于mmdetection配置中的coco_instance.py还是不能去掉而--dump-info参数所引发的逻辑要判断Resize中一定要有img_scale参数只好注释掉mmdeploy/backend/sdk/export_info.py中的部分语句该部分应该是仅用来配合--dump-info保存json文件变为 if transforms in pipeline[-1]:transforms pipeline[-1][transforms]transforms.insert(0, pipeline[0])# for transform in transforms:# # 220723: tools/deploy.py 最终调用到这里似乎只是为了保存一个pipline.json文件那你费这个劲# if transform[type] Resize:# transform[size] pipeline[-1].img_scale[::-1]# if img_scale in transform:# transform.pop(img_scale)命令如下可能需要注意tensorRT或者说所有后端的静态static与动态dynamic的区别这里先跑起来再说
python -u tools/deploy.py \configs/mmdet/instance-seg/instance-seg_tensorrt_dynamic-320x320-1344x1344.py \work_dirs/deploy_220721_dcn_mask_rcnn_nwd/zjw_final_skin_config.py \../mmdetection-2.22.0/work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/epoch_12.pth \/home/wangjy/data/facedata_croped_1209/images/val_whole/CXM__何易霖_痤疮_20200904131918000_斑点.jpg \--work-dir work_dirs/deploy_220721_dcn_mask_rcnn_nwd/tensorrt_dynamic \--device cuda:1 \--dump-info并且instance-seg_tensorrt_dynamic-320x320-1344x1344.py配置文件似乎一定需要三个shape不能注释掉因而采用以下三个shape进行替代并且整图生成需要修改max_workspace_size。
_base_ [../_base_/base_instance-seg_dynamic.py,../../_base_/backends/tensorrt.py
]backend_config dict(# common_configdict(max_workspace_size1 30),common_configdict(max_workspace_size1 31),model_inputs[dict(input_shapesdict(inputdict(
# min_shape[1, 3, 320, 320],
# opt_shape[1, 3, 800, 1344],
# max_shape[1, 3, 1344, 1344]min_shape[1, 3, 4171, 3128],opt_shape[1, 3, 4600, 3448],max_shape[1, 3, 5184, 3456])))])先别急参考模型重载需要重新复现RPNHeadNwd的get_boxes方法这个其实仿照mmdeploy原有的rpn_head的get_boxes方法写即可然后要注意上文onnx调试时修改的proposals, _ self.rpn_head.simple_test_rpn(x, img_metas)和rois proposals的代码要改回来似乎原来这个是适配的tensorRT流程。
注意tensorRT有topK的限制topK操作不能超过3840参考tensorrt-topKsetup这个可能要想办法规避。并且deploy后的整图模型进行test的时候效果极差几乎无了而crop1024的数据就正常不知道为啥。
在这里记录一下对于dcn_mask_rcnn模型来说mmdetection-2.22.0/work_dirs/train_skin_220416_maskrcnn/20220417_124418val_crop1024的test AP50为0.496的最好模型其在val_whole整图测试中的结果也记录在了issues/814中有人问。
调试记录
配置了pycharm远程连接进行调试目前可知mmdeploy/tools/test.py的调用如下
flowchart TDmmdeploy/tools/test.py -- mmdetection/mmdet/apis/test.py:single_gpu_test -- mmdeploy/mmdeploy/codebase/mmdet/deploy/object_detection_model.py:forward -- mmdeploy/mmdeploy/backend/tensorrt/wrapper.py:forwardoutputs是在最后的wrapper.py:forward中得到的但似乎无法查看模型的中间变量。
220801看一下post_processing结果要么就RuntimeError: CUDA error: an illegal memory access was encountered要么就爆显存以为是后处理参数改一点都不行那改回来吧还是爆绝望。