OpenCV DNN模块官方教程(一)加载Caffe模型做图像分类
时间:2022-07-25
本文章向大家介绍OpenCV DNN模块官方教程(一)加载Caffe模型做图像分类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
OpenCV DNN模块官方教程地址如下,可以查看各个对应的使用方法。
https://docs.opencv.org/4.4.0/d2/d58/tutorial_table_of_content_dnn.html
OpenCV DNN模块官方文档分上面七个部分讲解,后续将选取其中部分在Windows平台做讲解讲解演示。
第一个部分:加载Caffe框架的模型。在本实例中,您将学习使用Caffe Model Zoo中用GoogLeNet训练的用于图像分类的模型来进行图像分类。
去掉一些命令行的代码,将核心代码提取如下,并做简单介绍与演示:
#include "pch.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
using namespace std;
using namespace cv;
using namespace dnn;
std::vector<std::string> classes;
int main(int argc, char** argv)
{
String model = "./bvlc_googlenet.caffemodel";
String config = "./bvlc_googlenet.prototxt";
String classesFile = "./classification_classes_ILSVRC2012.txt";
int backendId = 0;
int targetId = 0;
CV_Assert(!model.empty());
std::string file = classesFile;
std::ifstream ifs(file.c_str());
if (!ifs.is_open())
CV_Error(Error::StsError, "File " + file + " not found");
std::string line;
while (std::getline(ifs, line))
{
classes.push_back(line);
}
Net net = readNet(model, config);
static const std::string kWinName = "Deep learning image classification in OpenCV";
namedWindow(kWinName, WINDOW_NORMAL);
Mat img = imread("./test.jpg");
Mat blob;
float scale = 1.0;
Scalar mean = Scalar(104, 117, 123);
bool swapRB = true;
blobFromImage(img, blob, scale, Size(224, 224), mean, swapRB, false);
net.setInput(blob);
Mat prob = net.forward();
Point classIdPoint;
double confidence;
minMaxLoc(prob.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
int classId = classIdPoint.x;
// Put efficiency information.
std::vector<double> layersTimes;
double freq = getTickFrequency() / 1000;
double t = net.getPerfProfile(layersTimes) / freq;
std::string label = format("Inference time: %.2f ms", t);
putText(img, label, Point(0, 20), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(255, 0, 0), 2);
// Print predicted class.
label = format("%s: %.4f", (classes.empty() ? format("Class #%d", classId).c_str() :
classes[classId].c_str()),
confidence);
cout << "label: " << classes[classId].c_str() << endl;
putText(img, label, Point(0, 45), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(255, 0, 0), 2);
imshow(kWinName, img);
waitKey(0);
return 0;
}
使用方法与说明:
(1) 首先,下载GoogleNet模型文件和ILSVRC2012类名称文件并放入工作目录
bvlc_googlenet.prototxt、bvlc_googlenet.caffemodel、
classification_classes_ILSVRC2012.txt
(2) 使用.prototxt和.caffemodel文件的路径读取和初始化网络
Net net = readNet(model, config, framework);
framework参数可以跳过,DNN模块可以根据model和config自动识别:
Net net = readNet(model, config);
(3) 读取输入图像并将其转换为GoogleNet可接受的Blob
blobFromImage(img, blob, scale, Size(224, 224), mean, swapRB, false);
(4) 将Blob传递到网络
net.setInput(blob);
(5) 向前传递
Mat prob = net.forward();
(6) 确定最佳类别
Point classIdPoint;
double confidence;
minMaxLoc(prob.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
int classId = classIdPoint.x;
(7) 设置对应参数和文件路径运行测试,如下是测试效果(运行时间+类别):
- SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)
- 不到百行代码实现,类似iPhone的滑块开关
- 《深入理解Java虚拟机》(一)Java虚拟机发展史
- Servlet是如何实现MVC的?
- 基础篇章:关于 React Native 的props,state,style的讲解
- 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略
- 一个类似于进度和打卡进度的自定义view
- 《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
- 第七章:Shiro的Session管理——深入浅出学Shiro细粒度权限开发框架
- 《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
- Knockout.js是什么?
- 简单方法检测远端用户的反病毒软件
- 使用 JS 构建跨平台的原生应用(一):React Native for Android 初探
- 基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法