在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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92#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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复