目录

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模型部署的两种方法相关推荐

  1. DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练、预测

    DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练.预测 导读 利用python的numpy计算库,进行自定义搭建2层神经网络TwoLayerN ...

  2. 机器学习模型部署的三种方法

    "企业机器学习需要从数据工程和数据平台的角度看待大局[...],"贾斯汀·诺曼(Justin Norman)在今年巴塞罗那的DataWorks峰会上关于机器学习模型的部署的演讲中说 ...

  3. 深度学习模型部署的几种方法

    由于模型训练完之后需要上线部署,这个过程中需要将模型集成到当前的软件架构中,因此要根据软件架构考虑模型的实际部署方法.目前来看主流的部署方法有以下几种方案: 1.python服务接口 在python服 ...

  4. 加载dict_PyTorch 7.保存和加载pytorch模型的两种方法

    众所周知,python的对象都可以通过torch.save和torch.load函数进行保存和加载(不知道?那你现在知道了(*^_^*)),比如: x1 = {"d":" ...

  5. ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练)

    ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练) 目录 模型训练评估中常用的两种方法代码实现 T1.留一法一次性切分训练 T2.K折交叉验证训 模型训练评估中 ...

  6. 测量模型不确定性的两种简单方法

    在本文中,我们将介绍两种方法,它们允许你获得模型的不确定性:蒙特卡罗Dropout法(MC Dropout)和深度集成法. 它们适用于各种各样的任务,但在本文中,我们将展示一个图像分类的示例.它们都相 ...

  7. 水平集方法引入主动轮廓模型算法中的两种方法

    水平集方法引入主动轮廓模型算法中的两种方法 1.传统的基于主动轮廓模型和水平集理论的方法 2.变分水平集方法 在讲解水平集理论在主动轮廓模型中的应用前,我们先用流程图说明一下常见的处理主动轮廓模型的流 ...

  8. 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你

    在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 目录 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 1.文章中的标题较多,每个单独调整格式太费劲,这里我们用一 ...

  9. YOLOX模型部署Android端-NCNN方法

    YOLOX模型部署Android端-NCNN方法 1.YOLOX代码仓库的下载 2.ONNX模型转换 3.NCNN框架模型转换 4 安装Android Studio 5 准备Android项目文件 6 ...

最新文章

  1. 一些极其简易的自动巡线车模
  2. 在中小型公司建立企业根证书颁发机构 (CA)
  3. 合并多个Word文档
  4. Codepen 每日精选(2018-4-22)
  5. python字典怎么设置_在python中设置字典中的属性
  6. Python编程基础04:输入与输出
  7. 次小生成树 最小度限制生成树
  8. Android开发笔记(三十七)按钮类控件
  9. ZOJ1109_Language of FatMouse(STL/map)
  10. 百度文库下载文档,没财富值,没下载卷也能下载
  11. android 音频压缩 silk,微信音频silk导出多个mp3,合并成一个mp3,压缩大小
  12. 谷歌五笔输入法电脑版_一种比拼音打字更快的输入法,为何却很少有人用
  13. 运维面试官喜欢问的问题
  14. 奔跑中的交银施罗德基金,崛起的新生代基金经理
  15. Java第十一章总结
  16. 推荐系统中的bais系统(二)—Select Bais和Exposure Bias
  17. 无需SVIP,两步实现百度网盘不限速
  18. 罗切斯特大学计算机博士,罗切斯特大学生物博士排名,千万得慎重点看清
  19. 数据挖掘之用户价值分析
  20. MNIST 数据集分类

热门文章

  1. HarmonyOS ScrollView 不滑动的问题
  2. Android textview 只显示一行,多余部分显示.....
  3. Kotlin for 循环使用
  4. 小菜鸟与后台对接接口下来的感受
  5. 2019年4月28日
  6. 机器学习工程师 - Udacity 可视化 CNN
  7. [YY题]HDOJ5288 OO’s Sequence
  8. Hive Metastore 连接报错
  9. Sql存储过程加密和解密
  10. dom vue 加载完 执行_前端面试题——Vue