“ 此篇介绍如何使用C++加载OpenCV DNN模块库来调用深度神经网络模型以及一些应用”
目前,深度神经网络广泛应用于用于图像处理的各个领域,OpenCV4丰富了DNN模块,增加了与深度神经网络相关的函数及比较前沿的算法,以下就此展开描述:
>注意:此篇不对如何训练出深度神经网络模型做出概述!后续会单独出文说明。
以下,围绕对深度神经网络模型的应用。
软硬件环境:
Ubuntu20.04
OpenCV4.5.1
Cmake3.18.5
01
—
加载深度神经网络模型
1、函数说明
读取深度学习模型函数:
Net cv::dnn::readNet(const String & model,const String & config="",const String & framework="")
model:模型文件名;
config:配置文件名;
framework:框架种类;
框架种类 | 模型文件格式 | 配置文件格式 |
Caffe | *.caffemodel | *.prototxt |
TensorFlow | *.pb | *.pbtxt |
Torch | *.t7 | *.net | -- |
Darknet | *.weights | *.cfg |
DLDT | *.bin | *.xml |
深度学习模型参数:
empty():判断模型是否为空,不需要输入参数,模型为空返回true,否则false;
getLayerNames():得到每层网络的名称,不需要输入参数,返回值为vector类型变量;
getLayerId():得到每层网络的ID,输入参数为网络名称,返回值为int类型变量;
getLayer():得到指向指定ID或名称的网络层的指针,输入参数为网络层ID,返回值为Ptr类型变量;
forward():执行前向传输,输入参数为需要输出的网络层的名称,返回值为Mat类型数据;
setInput():设置网络新的输入数据;
向网络层中添加数据:
void cv::dnn::Net::setInput(InputArray blob,const String & name="",double scalefactor=1.0,const Scalar & mean=Scalar())
blob:新的输入数据,类型为CV_32F或CV_8U;
name:输入网络层的名称;
scalefactor:可选的标准化比例;
mean:可选的减数数值;
2、编写代码
1、编写main.cpp:
#include
#include
using namespace cv;
using namespace std;
using namespace cv::dnn;
int main()
{
string model="/home/zja/Downloads/bvlc_googlenet.caffemodel";
string config="/home/zja/Downloads/bvlc_googlenet.prototxt";
Net net=dnn::readNet(model,config);
if(net.empty())
{
cout<<"请确认输入了模型文件"<<endl;
return -1;
}
//获取各层信息
vector layerNames=net.getLayerNames();
for(unsigned long i=0;i
{
//读取每层网络的ID
int ID=net.getLayerId(layerNames[i]);
//读取每层网络信息
Ptr layer=net.getLayer(ID);
//输出网络信息
cout<<"网络层数:"<"网络名称:"&l