经过几个月的努力,小白终于完成了市面上第一本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给出,参数默认值表示不需要读取配置文件。最后一个参数是框架的种类,该函数可以根据文件的格式判断框架的种类,但是也可以通过第三个参数显示的给出框架的种类,参数默认值为空,表示根据文件格式判断框架种类。
框架种类 | 模型文件格式 | 配置文件格式 | 框架官网 |
---|---|---|---|
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给出了常用函数的含义及其使用方式。
函数名称 | 含义及使用方式 |
---|---|
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