【OpenCV 4开发详解】深度神经网络应用实例

本文介绍了如何使用OpenCV 4的dnn::readNet()函数加载深度学习模型,如googlenet,并展示了如何进行图像识别。通过调整图像尺寸、输入网络并获取预测结果,展示了一个利用预训练模型识别图像中物体的例子。
摘要由CSDN通过智能技术生成
本文首发于 “小白学视觉”微信公众号,欢迎关注公众号
本文作者为小白,版权归 人民邮电出版社发行所有,禁止转载,侵权必究!

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

随着深度神经网络的发展,OpenCV中已经有独立的模块专门用于实现各种深度学习的相关算法。本节中将以介绍如何使用OpenCV 4中的相关函数实现深度学习算法,重点介绍示例程序和处理效果,目的是为了增加读者对深度学习在图像处理中的应用的了解,提高读者对图像处理的兴趣。

加载深度学习模型

深度学习中最重要的部分就是对模型的训练,模型训练完成后就可以使用模型对新数据进行处理,例如识别图像中的物体、对图像中的人脸进行识别等。由于训练模型既耗费时间又容易失败,因此在实际使用过程中可以直接已有的模型,没必要每次都重新训练模型。OpenCV 4中提供了dnn::readNet()函数用于加载已经训练完成的模型,该函数的函数原型在代码清单12-17中给出。

代码清单12-17 dnn::readNet()函数原型
1.	Net cv::dnn::readNet(const String &  model,
2.	                     const String &  config = "",
3.	                     const String &  framework = "" 
4.	                     )
  • model:模型文件名称。
  • config:配置文件名称。
  • framework:框架种类。

该函数可以加载已经完成训练的深度学习网络模型,返回一个Net类型的变量。函数第一个参数是模型文件的名称,文件以二进制的形式保存着网络模型中权重系数。不同框架的模型具有不同的扩展名,该函数能够加载的框架、框架文件扩展名以及框架的网站在表12-7给出。函数第二个参数是网络模型的配置文件,不同框架的模型具有不同的扩展名,具体内容也在表12-7给出,参数默认值表示不需要读取配置文件。最后一个参数是框架的种类,该函数可以根据文件的格式判断框架的种类,但是也可以通过第三个参数显示的给出框架的种类,参数默认值为空,表示根据文件格式判断框架种类。

表12-7 深度学习框架网站与模型和配置文件格式
框架种类 模型文件格式 配置文件格式 框架官网
Caffe *.caffemodel *.prototxt http://caffe.berkeleyvision.org/
TensorFlow *.pb *.pbtxt https://www.tensorflow.org/
Torch *.t7 *.net http://torch.ch/
Darknet *.weights *.cfg https://pjreddie.com/darknet/
DLDT *.bin *.xml https://software.intel.com/openvino-toolkit

dnn::readNet()函数返回的Net类型是一个神经网络模型的类,OpenCV 4在Net类中提供了多个函数用于处理神经网络的模型,例如得到网络的层数、每层网络的权重、通过网络预测结果等,在表12-8给出了常用函数的含义及其使用方式。

表12-8 Net类中常用函数的含义及其使用方式
函数名称 含义及使用方式
empty() 判断模型是否为空,不需要输入参数,模型为空返回true,否则返回false。
getLayerNames() 得到每层网络的名称,不需要输入参数,返回值为vector类型变量
getLayerId() 得到某层网络的ID,输入参数为网络的名称,返回值为int类型变量
getLayer() 得到指向具指定ID或名称的网络层的指针,输入参数为网络层ID,返回值为Ptr类型变量。
forward() 执行前向传输,输入参数为需要输出的网络层的名称,返回值为Mat类型数据。
setInput() 设置网络新的输入数据,具体参数在代码清单12-18中给出。
代码清单12-18 setInput()函数原型
1.	void cv::dnn::Net::setInput(InputArray  blob,
2.	                                  const String &  name = "",
3.	                                  double  scalefactor = 1.0,
4.	                                  const Scalar &  mean = Scalar() 
5.	                                  )
  • blob:新的输入数据,数据类型为CV_32F或CV_8U。
  • name:输入网络层的名称。
  • scalefactor:可选的标准化比例
  • mean:可选的减数数值。

该函数可以重新设置网络的输入值,函数第一个参数为新的输入数据,数据类型必须是CV_32F或CV_8U。第二个参数是输入网络层的名称,该参数可以使用默认值。第三个参数是可选的标准化比例,默认值为1。第四个参数是可选的减数数值,默认值为Scalar(),表示缺省该参数。

加载模型后可以通过Net类中的相关函数获取模型中的信息,代码清单12-19中给出利用dnn::readNet()函数加载以有模型,并获取模型中网络信息的示例程序。程序中加载的模型是谷歌提供的caffe框架的googlenet模型,模型文件名为bvlc_googlenet.caffemodel,配置文件名为bvlc_googlenet.prototxt。这两个文件在本书资源的data文件夹中。程序输出了每层网络的ID、名称以及类型,结果在图12-11中给出。

代码清单12-19 myRendNet.cpp加载深度神经网络模型
1.	#include <opencv2/opencv.hpp>
2.	#include <iostream>
3.	
4.	using namespace cv;
5.	using namespace cv::dnn;
6.	using namespace std
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学视觉

您的赞赏是我们坚持下去的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值