仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
点击上方“小白学视觉”,选择加\“星标\“或“置顶”
重磅干货,第一时间送达
作者丨Civ@知乎(已授权)
来源丨https ://www. zhihu.com/question/66532235/answer/2782357337
编辑丨极市平台
极市导读
本文以C++推理框架ncnn为例,介绍一下部署的大致流程。其它C++推理框架的思路类似,唯一的学习成本是推理框架本身的API
方法有很多种,比较简单的路径是:
PyTorch模型–>ONNX格式–>C++推理框架
本文以C++推理框架ncnn为例,介绍一下大致流程。其它C++推理框架的思路类似,唯一的学习成本是推理框架本身的API。
简单来说,可以把ONNX当做一个中间格式。绝大多数的机器学习/深度学习框架都可以将自身的模型转换成ONNX,同样也能把ONNX转换成自身框架的格式,如下图所示。
ONNX官网地址:https ://onnx. ai/
在PyTorch中,可以用如下方法非常方便地将一个PyTorch模型存储为ONNX格式:
需要注意的是,ONNX的目的是“通用”,所以难免会在一些情况出现算子不兼容的情况。具体的表现是,当你把某个框架(例如PyTorch)的模型转成ONNX后,再将ONNX转成另一框架模型(例如ncnn)时,可能会报错(xxx算子不支持)。不兼容的情况多种多样,这里不举例说明了,需要具体情况具体分析。
一些有效的解决方法:
避免依赖于中间变量的尺寸来进行运算。比如,在一些ImagetoImage的任务中,可能会根据中间tensor的尺寸来对另一些tensor进行resize。这时我们的做法是先去获取中间tensor的尺寸H、W,然后将它们作为参数送给其它方法。当遇到这种运算时,ONNX似乎会创建两个与H、W相关的变量,但它们的值会绑定为用dummy_input去forward一次时得到的H、W。这个值一旦绑定就不会改变。所以后续当使用不同尺寸输入时极大概率会报错(这点没有仔细验证过,但看中间结果很像是这种情况)。
另外强烈建议使用一些网络可视化工具。当遇到模型转换报错时可以用来方便定位出错的位置。个人比较喜欢的是netron,地址:https ://github. com/lutzroeder/netron
放一张仓库中的图,效果如下:
ncnn是腾讯开源的轻量级推理框架。简单易用是它最大的特点。但当功耗、时耗是主要考虑点的时候,需要多尝试其它框架,如TensorFlowLite。
ncnn地址:https ://github. com/Tencent/ncnn
onnx_model_path替换为自己的onnx模型地址。后两个参数可选。如果不写,那么会在onnx2ncnn. exe同目录下产生转换后的ncnn模型文件:一个. param文件和一个.bin文件。也可以自己填后两个参数来自己指定文件输出路径。
在任何框架下推理都只需要两步:加载模型和将数据转化为框架格式。
ncnn下加载模型的方法为(还有其它方法):
加载模型后,只需要将数据转化为ncnn的格式即可。ncnn模型输入的格式是ncnn::Mat。
OpenCV的Mat转ncnn::Mat的方法全列于此处:
https ://github. com/Tencent/ncnn/wiki/use-ncnn-with-opencv
如:
代码如:
有了模型和输入,最后forward一次,再取结果即可:
只要是转换模型,大多数路径都是如此,学习成本并不高。主要是学习推理框架的成本。芯片厂商自身的推理框架相对复杂点,各种奇奇怪怪的条条框框。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三+上海交大+视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~