1. 部署思路
pytorch中训练好模型,然后在python中转为onnx格式。通过opencv的dnn模块调用 onnx格式模型。
2. 转onnx成功后,发现opencv导入onnx模型, 报错
第一次变异的opencv版本是opencv450,cua10.1. 在c++中导入onnx模型时发现,出现内存异常。检查发现路径没有问题,怀疑是opencv 的bug,使用opencv-python,发现error:
error: OpenCV(4.5.0)
C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-6sxsq0tp\opencv\modules\dnn\src\onnx\onnx_importer.cpp:970: error: (-215:Assertion failed) layerId != layer_id.end() in function cv::dnn::dnn4_v20200609::ONNXImporter::populateNet’
3. github上有人issue了这个bug,并且已经被修复
https://github.com/opencv/opencv/issues/19359
https://github.com/opencv/opencv/pull/19372
3. 解决方案:
从新编译gpu版本的opencv453,测试发现没问题。
我的配置1:
uda11.1
opencv4.5.3
pytorch1.9
我的配置2:
cuda10.1
opencv4.5.3
pytorch1.1.1
5. 总结
这个部署思路比较简单,容易实现。但是受限于opencv的支持。希望opencv多多更新,大家发现问题多多反馈。
参考链接:
https://docs.opencv.org/4.5.3/d2/d58/tutorial_table_of_content_dnn.html