我是靠谱客的博主 超帅毛巾,最近开发中收集的这篇文章主要介绍【opencv3.4.1在DNN模块中使用googlenet模型】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    在OpenCV3.3版本发布中把DNN模块从扩展模块移到了OpenCV正式发布模块中,当前DNN模块最早来自Tiny-dnn,可以加载预先训练好的Caffe模型数据,OpenCV做了近一步扩展支持所有主流的深度学习框架训练生成与导出模型数据加载。

按照官方介绍

支持以下框架

  • Caffe 1
  • TensorFlow
  • Torch/PyTorch

首先我们需要下载训练好的googlenet权重模型bvlc_googlenet .caffemodel(二进制文件),模型下载地址为

http://dl.caffe.berkeleyvision.org/

然后导入模型描述文件,地址为C:opencvopencvsourcessamplesdatadnn


#include<opencv2opencv.hpp>
#include<vector>
#include<string>

using namespace cv;
using namespace dnn;
using namespace std;

String model_file = "bvlc_googlenet.caffemodel";
String model_txtfile = "bvlc_googlenet.prototxt";
String labels_file = "synset_words.txt";

vector<String>readLabels();



int main(int arc, char** argv) {

	Mat src = imread("5.jpg");
	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src);

	//读取模型的类别(文本)
	vector<String> labels = readLabels();


	//读取google_net的模型和描述文件
	Net net = readNetFromCaffe(model_txtfile, model_file);
	if (net.empty()) {

		printf("read caffee model data failuren");

		return -1;

	}

	//将图像转为google_net网络输入的对象,由描述文件可知,图像尺寸统一为224*224
	Mat inputBlob = blobFromImage(src, 1.0, Size(224, 224), Scalar(104, 117, 123));
	//进行前向传播,由描述文件可知,第一层用了10个卷积层,提取图像10种不同的特征
	Mat prob;
      
	for (int i = 0; i < 10; i++) {
		net.setInput(inputBlob, "data");
		prob = net.forward("prob");//最后一层的输出为“prob”
	}


	//输出
//得到的概率值为1行1000列的
	Mat promat = prob.reshape(1, 1);
	Point classLoc;
	double classProb;
	minMaxLoc(promat, NULL, &classProb, NULL, &classLoc);
	printf("current image classification: %s,probablity %fn", labels.at(classLoc.x).c_str(), classProb);

	putText(src, labels.at(classLoc.x), Point(20, 20), FONT_HERSHEY_COMPLEX, 1.0, Scalar(0, 0, 255), 2);

	imshow("output", src);

	waitKey(0);

	return 0;

}



//读取模型的类别(文本)

vector<String>readLabels() {
	vector<String>classNames;
	ifstream fp(labels_file);//打开文件
	if (!fp.is_open()) {//文件没打开
		printf("could not open the file ");
		exit(-1);
	}

	string name;

	while (!fp.eof()) {//文件没读到结尾
		getline(fp, name);//得到每一行,放到name中
		if (name.length()) {//非空行
			classNames.push_back(name.substr(name.find(' ') + 1));//
		}
	}

	fp.close();
	return classNames;

}

输出:

 

 

 

参考博客:https://blog.csdn.net/shakevincent/article/details/52946499

最后

以上就是超帅毛巾为你收集整理的【opencv3.4.1在DNN模块中使用googlenet模型】的全部内容,希望文章能够帮你解决【opencv3.4.1在DNN模块中使用googlenet模型】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部