Yolo模型部署的两种方法
目录
1 需求描述
第1种:封装darknet框架
第2种:weights模型转pb模型
2 weights模型转pb模型方法
3 重要备注
(1)关于预处理:
(2)关于模型输入输出的数据结构和节点名称:
(3)关于NMS
1 需求描述
工程部署使用的C++,模型用darknet(AB版)YoloV3训练的,格式为weights。目前已实测通过了两种方式调用yoloV3模型。
第1种:封装darknet框架
将darknet框架封装成dll,在C++中通过非常简单易懂的语法直接调用weights,cfg这两个原生文件。
优点:
编译非常简单:darknet(AB版)自带编译成dll的方法,操作过程也很简单,没有各种版本兼容性问题。
dll非常小:darknet框架编译出来的dll只有1.7MB。
C++语法非常精简易懂:完成模型调用和输出只有5行代码左右。
第2种:weights模型转pb模型
如果已经将tensorflow框架封装成dll,那么也可以将weights模型转成能供tensorflow直接使用的pb模型。
优点:使用tensorflow部署还是更可靠点,而且有时候一个项目不仅用一个算法,所有框架的模型都可以用tensorflow去实现。
2 weights模型转pb模型方法
darknet框架实现的yolo3有两个版本,一个是yolo3作者原版,还有一个是yolo4作者优化后的版本(AB版),虽然两者的cfg文件中内容一模一样,但是使用GitHub上找的不同版本的weights模型转pb轮子,将会出现异常。即,使用原版darknet yolo3的weights转pb的代码去转AB版yolo3 weights,虽然能转换成功,但是这个pb模型的精度几乎为0。
原因据查是AB版对yolo3算法做了模型结构之外的一些改进,这可能导致weights转pb的源代码不通用。
由于AB版darknet相对原版做了很多优化,而且为了能够在未来部署AB版的yolo4算法,这次仅记录下AB版yolo3的转换和部署方法。
weights转pb
转换代码在https://github.com/hunglc007/tensorflow-yolov4-tflite开源项目中,1100星,作者使用TF2.0框架将AB版darknet的yolo3和4复现了,里面有yolo3,yolo4转pb,转tensorflow lite(移动部署),转tensorRT模型的轮子。
步骤1:下载上述项目。(TF2.3版以上)
步骤2:CMD中执行如下指令即可转换成功:(修改你的weights模型位置,和你的输入大小)
python save_model.py --weights ./data/yolov3.weights --output ./checkpoints/yolov3-608 --input_size 608 --model yolov3
程序将会在当前项目路径内,生成一个./checkpoints/yolov3-608/文件夹,里面存放了如下转换结果:
步骤3:将saved_model.pb和variables两个东西放到你C++项目工程中就行了。
步骤4:C++中的模型调用和结果解析语法,可以参考如下博主的完整代码:
tensorflow C++接口调用 目标检测 pb模型代码 :https://www.cnblogs.com/cnugis/p/11506767.html
tensorflow C++接口调用 图像分类 pb模型代码:https://www.cnblogs.com/cnugis/p/11507872.html
3 重要备注
(1)关于预处理:
上述转换项目,仅仅是将yolo3模型原封不动的转成pb模型,这就表示,在C++工程中,还需要将输入pb模型的Mat图像先归一化,然后resize成608*608,最后才去调用pb模型进行预测。这些步骤,如果不想在C++中写,可以修改转换代码,即在python中先加一道预处理,修改模型输入的数据结构,然后再将weights转成pb。
(2)关于模型输入输出的数据结构和节点名称:
在save_model.py中,作者定义的pb模型输出是:“pred = tf.concat([boxes, pred_conf], axis=-1)”,即所有检测框坐标和预测值全部由一个输出变量表示。所以,C++那边就只要定义一个输出节点的名称。
pb模型输入输出节点的名称,以及输入输出的数据结构,可以在save_model.py中去寻找踪迹,也可用使用Netron软件打开pb模型去找到,比如:
例子1:yolo3一个输入(float32,表示接受float格式图像,大概率是要提前归一化后才能输入!),2个输出节点:
例子2:yolo3一个输入(uint8,表示图像是0-255,接受非归一化图像!),4个输出节点:
关于模型输入输出为什么是这个英文名,应该是程序默认的,除非自己定义了。
关于节点名称后面新增的“:0, :1”什么的,就是模型给予的默认的防止同名的输入输出节点。
(3)关于NMS
使用上述项目转换,模型的预测结果并没有经过NMS处理,这导致输出里面有很多近乎重叠的检测框。在C++中写NMS算法来筛选pb模型的检测结果可能比较麻烦,我们可以在转换模型过程中,将NMS也写进去,这样pb模型的输出就直接是经过NMS操作后的结果。
方法:
①在上述开源项目中,打开detect.py文件。
②复制其中的:boxes, scores, classes, valid_detections = tf.image.combined_non_max_suppression(......)这行代码。
③将上述代码粘贴在save_model.py中的“pred = tf.concat([boxes, pred_conf], axis=-1)”之前,并注释“pred = tf.concat([boxes, pred_conf], axis=-1)”,替换成“pred = (boxes, scores) ”,如下所示:
1
Yolo模型部署的两种方法相关推荐
- DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练、预测
DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练.预测 导读 利用python的numpy计算库,进行自定义搭建2层神经网络TwoLayerN ...
- 机器学习模型部署的三种方法
"企业机器学习需要从数据工程和数据平台的角度看待大局[...],"贾斯汀·诺曼(Justin Norman)在今年巴塞罗那的DataWorks峰会上关于机器学习模型的部署的演讲中说 ...
- 深度学习模型部署的几种方法
由于模型训练完之后需要上线部署,这个过程中需要将模型集成到当前的软件架构中,因此要根据软件架构考虑模型的实际部署方法.目前来看主流的部署方法有以下几种方案: 1.python服务接口 在python服 ...
- 加载dict_PyTorch 7.保存和加载pytorch模型的两种方法
众所周知,python的对象都可以通过torch.save和torch.load函数进行保存和加载(不知道?那你现在知道了(*^_^*)),比如: x1 = {"d":" ...
- ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练)
ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练) 目录 模型训练评估中常用的两种方法代码实现 T1.留一法一次性切分训练 T2.K折交叉验证训 模型训练评估中 ...
- 测量模型不确定性的两种简单方法
在本文中,我们将介绍两种方法,它们允许你获得模型的不确定性:蒙特卡罗Dropout法(MC Dropout)和深度集成法. 它们适用于各种各样的任务,但在本文中,我们将展示一个图像分类的示例.它们都相 ...
- 水平集方法引入主动轮廓模型算法中的两种方法
水平集方法引入主动轮廓模型算法中的两种方法 1.传统的基于主动轮廓模型和水平集理论的方法 2.变分水平集方法 在讲解水平集理论在主动轮廓模型中的应用前,我们先用流程图说明一下常见的处理主动轮廓模型的流 ...
- 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你
在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 目录 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 1.文章中的标题较多,每个单独调整格式太费劲,这里我们用一 ...
- YOLOX模型部署Android端-NCNN方法
YOLOX模型部署Android端-NCNN方法 1.YOLOX代码仓库的下载 2.ONNX模型转换 3.NCNN框架模型转换 4 安装Android Studio 5 准备Android项目文件 6 ...
最新文章
- 一些极其简易的自动巡线车模
- 在中小型公司建立企业根证书颁发机构 (CA)
- 合并多个Word文档
- Codepen 每日精选(2018-4-22)
- python字典怎么设置_在python中设置字典中的属性
- Python编程基础04:输入与输出
- 次小生成树 最小度限制生成树
- Android开发笔记(三十七)按钮类控件
- ZOJ1109_Language of FatMouse(STL/map)
- 百度文库下载文档,没财富值,没下载卷也能下载
- android 音频压缩 silk,微信音频silk导出多个mp3,合并成一个mp3,压缩大小
- 谷歌五笔输入法电脑版_一种比拼音打字更快的输入法,为何却很少有人用
- 运维面试官喜欢问的问题
- 奔跑中的交银施罗德基金,崛起的新生代基金经理
- Java第十一章总结
- 推荐系统中的bais系统(二)—Select Bais和Exposure Bias
- 无需SVIP,两步实现百度网盘不限速
- 罗切斯特大学计算机博士,罗切斯特大学生物博士排名,千万得慎重点看清
- 数据挖掘之用户价值分析
- MNIST 数据集分类