深度神经网络加载 Caffe 框架模型

介绍

在本教程中,您将学习如何使用来自 Caffe 模型库的 GoogLeNet 训练网络opencv_dnn模块进行图像分类。

我们将在下图中演示此示例的结果。

space_shuttle.jpg

暴风雪号航天飞机

源代码

我们将使用示例应用程序中的片段,可以在此处下载。

​
#include < fstream>
#include < sstream>
#include < iostream>
#include < opencv2/dnn.hpp>
#include < opencv2/imgproc.hpp>
#include < opencv2/highgui.hpp>
#include“common.hpp”
std::string 键 =
“{ 帮助 h | |打印帮助消息。}"
“{ @alias | |用于从 models.yml 文件中提取预处理参数的模型别名。}"
“{ 动物园 |模型.yml |带有预处理参数的文件的可选路径 }”
“{ 输入 i | |输入图像或视频文件的路径。跳过此参数以从相机捕获帧。
“{ initial_width |0 |通过初始调整大小到特定宽度来预处理输入图像。
“{ initial_height |0 |通过初始调整大小到特定高度来预处理输入图像。
“{ std |0.0 0.0 0.0 |通过除以标准差对输入图像进行预处理。
“{ 裁剪 |假 |通过中心裁剪对输入图像进行预处理。
“{ 框架 f | |模型的原始框架的可选名称。如果未设置,则自动检测它。}"
“{ 需要Softmax |假 |使用 Softmax 对网络的输出进行后处理。
“{ 类 | |包含类名称的文本文件的可选路径。}"
“{ 后端 |0 |选择计算后端之一:”
“0:自动(默认),”
“1:卤化物语(http://halide-lang.org/), ”
“2:英特尔的深度学习推理引擎(https://software.intel.com/openvino-toolkit),
“3:OpenCV的实现,”
“4:VKCOM,”
“5:CUDA,”
“6:WebNN }”
“{ 目标 |0 |选择目标计算设备之一:”
“0:CPU 目标(默认)、”
“1:OpenCL,”
“2:OpenCL fp16(半浮点精度), ”
“3:VPU,”
“4:Vulkan,”
“6:CUDA,”
“7:CUDA fp16(半浮点预处理)}”;
使用命名空间 CV;
使用命名空间 DNN;
std::vector<std::string> 类;
int main(int argc, char** argv)
{
CommandLineParser 解析器(argc, argv, keys);
const std::string modelName = parser.get<String>(“@alias”);
const std::string zooFile = parser.get<String>(“zoo”);
键 += genPreprocArguments(modelName, zooFile);
解析器 = CommandLineParser(argc, argv, keys);
parser.about(“使用此脚本使用 OpenCV 运行分类深度学习网络。);
if (argc == 1 || parser.has(“帮助”))
{
解析器.printMessage();
返回 0;
}
int rszWidth = 解析器.get<int>(“initial_width”);
int rszHeight = 解析器.get<int>(“initial_height”);
浮点比例 = parser.get<float>(“scale”);
标量均值 = parser.get<Scalar>(“mean”);
标量标准 = parser.get<标量>(“标准”);
布尔交换RB = 解析器.get<布尔>(“rgb”);
bool 裁剪 = parser.get<bool>(“crop”);
int inpWidth = 解析器.get<int>(“宽度”);
int inpHeight = 解析器.get<int>(“高度”);
字符串模型 = findFile(parser.get<String>(“model”));
字符串配置 = findFile(parser.get<String>(“config”));
字符串框架 = parser.get<String>(“framework”);
int backendId = parser.get<int>(“后端”);
int targetId = 解析器.get<int>(“目标”);
bool needSoftmax = 解析器.get<bool>(“needSoftmax”);
std::cout<<“mean: ”<<mean<<std::endl;
std::cout<<“std: ”<<std<<std::endl;
打开带有类名称的文件。
if (parser.has(“类”))
{
std::string 文件 = parser.get<String>(“类”);
标准::ifstream ifs(file.c_str());
如果 (!ifs.is_open())
CV_Error(错误::StsError,“文件”+文件+“未找到”);
std::string 行;
而 (std::getline(ifs, line))
{
classes.push_back(线);
}
}
如果 (!parser.check())
{
解析器.printErrors();
返回 1;
}
CV_Assert(!model.empty());
Net net = readNet(model, config, framework);
net.setPreferableBackend(backendId);
net.setPreferableTarget(目标Id);
创建窗口
static const std::string kWinName = “OpenCV中的深度学习图像分类”;
namedWindow (kWinName, WINDOW_NORMAL);
VideoCapture 帽;
if (parser.has(“输入”))
帽。open(parser.get<String>(“输入”));
还
帽。打开(0);
处理帧。
垫框,斑点;
而 (waitKey(1) < 0)
{
帽>>框架;
如果 (frame.empty())
{
等待键();
破;
}
if (rszWidth != 0 && rszHeight != 0)
{
resize(frame, frame, Size(rszWidth, rszHeight));
}
blobFromImage(frame, blob, scale, Size(inpWidth, inpHeight), mean, swapRB, crop);
检查 std 值。
if (std.val[0] != 0.0 && std.val[1] != 0.0 && std.val[2] != 0.0)
{
将 blob 除以 std。
除法(blob, std, blob);
}
net.setInput(blob);
双t_sum = 0.0;
双T;
int 类 Id;
双重置信度;
cv::TickMeter 时间记录器;
timeRecorder。重置();
垫子概率 = net.forward();
双T1;
timeRecorder。开始();
prob = net.forward();
timeRecorder。停();
t1 = 时间记录器。getTimeMilli();
timeRecorder。重置();
for(int i = 0; i < 200; i++) {
timeRecorder。开始();
prob = net.forward();
timeRecorder。停();
点类IdPoint;
minMaxLoc(prob.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
classId = classIdPoint。倍;
放置效率信息。
std::vector<double> layersTimes;
double freq = getTickFrequency() / 1000;
t = net.getPerfProfile(layersTimes) / freq;
t_sum += 吨;
}
如果 (needSoftmax == true)
{
浮点数 maxProb = 0.0;
浮点和 = 0.0;
垫子 softmaxProb;
maxProb = *std::max_element(prob.begin<float>(), prob.end<float>());
cv::exp(prob-maxProb, softmaxProb);
sum = (float)cv::sum(softmaxProb)[0];
softmaxProb /= 总和;
点类IdPoint;
minMaxLoc(softmaxProb.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
classId = classIdPoint。倍;
}
std::string label = format(“1轮推理时间:%.2f ms”, t1);
std::string label2 = format(“200 轮的平均时间:%.2f ms”, timeRecorder.getTimeMilli()/200);
putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0));
putText(frame, label2, Point(0, 35), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0));
打印预测的类。
label = format(“%s: %.4f”, (classes.empty() ?format(“类 #%d”, classId).c_str() :
类[classId].c_str()),
信心);
putText(frame, label, Point(0, 55), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0));
imshow(kWinName, 帧);
}
返回 0;
}
​

解释

  1. 首先,下载GoogLeNet模型文件:bvlc_googlenet.prototxt和bvlc_googlenet.caffemodel

    此外,您还需要包含ILSVRC2012类名称的文件:classification_classes_ILSVRC2012.txt。

    将这些文件放入此程序示例的工作目录中。

  2. 使用 .prototxt 和 .caffemodel 文件的路径读取和初始化网络
    Net net = readNet(model, config, framework);
    net.setPreferableBackend(backendId);
    net.setPreferableTarget(目标Id);
    如果其中一个文件或具有扩展名或 .这样,函数 cv::d nn::readNet 可以自动检测模型的格式。frameworkmodelconfig.caffemodel.prototxt
  3. 读取输入图像并转换为 blob,GoogleNet 可接受

    VideoCapture 帽;
    if (parser.has(“输入”))
    帽。open(parser.get<String>(“输入”));
    cap.open(0);

    cv::VideoCapture 可以加载图像和视频。

    bIobfromimage(frame, blob, scale, Size(inpWidth, inpHeight), mean, swapRB, crop);
    检查 std 值。
    if (std.val[0] != 0.0 && std.val[1] != 0.0 && std.val[2] != 0.0)
    {
    将 blob 除以 std。
    除法(blob, std, blob);
    }

    在使用 cv::d nn::blobFromImage 函数对每个蓝色、绿色和红色通道进行必要的预处理(如调整大小和均值减法)后,我们将图像转换为具有形状的 4 维斑点(所谓的批处理)。1x3x224x224(-104, -117, -123)

  4. 将 blob 传递到网络
    net.setInput(blob);
  5. 向前传球
    双t_sum = 0.0;
    双T;
    int 类 Id;
    双重置信度;
    cv::TickMeter 时间记录器;
    timeRecorder。重置();
    垫子概率 = net.forward();
    T1;
    timeRecorder。开始();
    prob = net.forward();
    timeRecorder。停();
    t1 = 时间记录器。getTimeMilli();
    timeRecorder。重置();
    forint i = 0; i < 200; i++) {
    在前向传递期间,将计算每个网络层的输出,但在此示例中,我们只需要最后一层的输出。
  6. 确定最佳班级
    点类IdPoint;
    minMaxLoc(prob.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
    classId = classIdPoint.x;
    我们将网络的输出(包含 1000 个ILSVRC2012图像类中每个类的概率)放入 blob 中。并在此中找到具有最大值的元素的索引。此索引对应于图像的类。prob
  7. 从命令行运行示例
    ./example_dnn_classification --model=bvlc_googlenet.caffemodel --config=bvlc_googlenet.prototxt --width=224 --height=224 --classes=classification_classes_ILSVRC2012.txt --input=space_shuttle.jpg --mean=“104 117 123”
    对于我们的图像,我们得到了超过 99% 的确定性对类的预测。space shuttle

   在线教程

  • 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程
  • 人工智能入门 – 人工智能基础学习。Peter Norvig举办的课程
  • EdX 人工智能 – 此课程讲授人工智能计算机系统设计的基本概念和技术。
  • 人工智能中的计划 – 计划是人工智能系统的基础部分之一。在这个课程中,你将会学习到让机器人执行一系列动作所需要的基本算法。
  • 机器人人工智能 – 这个课程将会教授你实现人工智能的基本方法,包括:概率推算,计划和搜索,本地化,跟踪和控制,全部都是围绕有关机器人设计。
  • 机器学习 – 有指导和无指导情况下的基本机器学习算法
  • 机器学习中的神经网络 – 智能神经网络上的算法和实践经验
  • 斯坦福统计学习

有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

请添加图片描述

人工智能书籍

  • OpenCV(中文版).(布拉德斯基等)
  • OpenCV+3计算机视觉++Python语言实现+第二版
  • OpenCV3编程入门 毛星云编著
  • 数字图像处理_第三版
  • 人工智能:一种现代的方法
  • 深度学习面试宝典
  • 深度学习之PyTorch物体检测实战
  • 吴恩达DeepLearning.ai中文版笔记
  • 计算机视觉中的多视图几何
  • PyTorch-官方推荐教程-英文版
  • 《神经网络与深度学习》(邱锡鹏-20191121)

  • 在这里插入图片描述

第一阶段:零基础入门(3-6个月)

新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

第二阶段:基础进阶(3-6个月)

熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

第三阶段:工作应用

这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。

 有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双目模组 - IMSEE SDK的配置实践:含Opencv的详细编译配置

IMSEE 的环境要求: CMake(3.0以上)(需要支持vs2019) Visual Studio 2019 opencv3.3.1 IMSEE-SDK 官网参考: Windows 源码安装 — IMSEE SDK 1.4.2 文档 (imsee-sdk-docs.readthedocs.io) 【案】按照IMSEE的建议进行安装: 1 Windows 安装: 1.1 环境准备: 1.1.1 CMake:in…

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测 目录 多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序…

springboot整合Sa-Token实现登录认证和权限校验(万字长文)

目前在国内的后端开发中&#xff0c;常用的安全框架有spring security、shiro。现在&#xff0c;介绍一款由国人开发的安全框架Sa-Token。这个框架完全由国人开发&#xff0c;所提供的Api文档和一些设置都是比较符合国人的开发习惯的&#xff0c;本次就来介绍一下如何在spring …

Multisim14.0仿真(四十五)AC220V转DC12V稳压电源设计

一、仿真原理图&#xff1a; 二、运行效果&#xff1a;

【Vue】组件间通信的7种方法(全)

目录 组件之前的通信方法 1. props/$emit 2.parent/children 3.ref 4.v-model 5.sync 6.attrs,attrs,attrs,listeners 7.provide/inject 7.eventBus 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可…

机器学习系列——(九)决策树

简介 决策树作为机器学习的一种经典算法&#xff0c;在数据挖掘、分类和回归等任务中广泛应用。本文将详细介绍机器学习中的决策树算法&#xff0c;包括其原理、构建过程和应用场景。 原理 决策树是一种基于树状结构的监督学习算法&#xff0c;它通过构建一棵树来对数据进行分…

【Rust】——基础Hello_world

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

DBeaver添加阿里maven镜像

1、点击数据库->驱动管理器 2、选择任意数据库&#xff0c;点击编辑按钮 3、点击下载/更新(D) 4、点击下载配置 5、点击添加 6、添加阿里云地址 http://maven.aliyun.com/nexus/content/groups/public/ 7、将阿里云地址移动到首位并点击"应用并关闭"

笔记---容斥原理

AcWing,890.能被整除的数 给定一个整数 n n n 和 m m m 个不同的质数 p 1 , p 2 , … , p m p_{1},p_{2},…,p_{m} p1​,p2​,…,pm​。 请你求出 1 ∼ n 1∼n 1∼n 中能被 p 1 , p 2 , … , p m p_{1},p_{2},…,p_{m} p1​,p2​,…,pm​ 中的至少一个数整除的整数有多少…

【项目日记(八)】第三层: 页缓存的具体实现(下)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…

LangChain 81 LangGraph 从入门到精通三

LangChain系列文章 LangChain 60 深入理解LangChain 表达式语言23 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 61 深入理解LangChain 表达式语言24 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 62 深入理解Lang…

低版本MATLAB打开高版本Simulink文件的方法

打开simulink&#xff0c;依次点击“建模”、“环境”、“simulink预设项”&#xff0c;如图所示&#xff1a; 然后在弹出的窗口中&#xff0c;点击“模型文件”&#xff0c;并取消勾选“不要加载用更新版本的simulink创建的模型”&#xff0c;接着点击“应用”即可。如图所示&…

EAK厚膜功率电阻成功在eVTOL大量使用

eVTOL操作的特点是更高的放电曲线&#xff0c;特别是在起飞和着陆期间。 “传统上&#xff0c;电池要么被设计成提供大量能量&#xff0c;要么被设计成高功率&#xff0c;”Cuberg创始人兼首席执行官Richard Wang说。“对于eVTOL电池来说&#xff0c;在能量和功率之间保持良好…

情人节适合送哪些礼物?2024年情人节送礼指南大推荐!

情人节即将来临&#xff0c;这是一年一度表达爱意的时刻。在这个特殊的日子里&#xff0c;送上一份精心挑选的礼物&#xff0c;将会让爱意更加深刻。但是&#xff0c;肯定会有朋友会困惑于选择哪种礼物能够最好地表达您的心意。不用担心&#xff0c;今天小编就为大家精心准备了…

JDK17中的密封类sealed和permits使用指南:什么是Java中的sealed和permits?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

FPGA项目(16)——基于FPGA的音乐演奏电路

1.设计要求 能在实验箱上&#xff0c;循环播放一段音乐。&#xff08;需要源码的直接看最后一节&#xff09; 2.设计原理 组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需要的两个基本要素&#xff0c;问题是如何来获取这两个要素所对应的数值以及通过纯硬件…

界面控件DevExpress ASP.NET Spreadsheet组件 - 轻松集成电子表格功能!(一)

DevExpress ASP. NET Spreadsheet组件允许您轻松地将电子表格功能合并到任意ASP. NET应用程序&#xff0c;它可以加载、转换和保存工作簿到XLS-XLSx二进制文件格式&#xff0c;还可以导出和导入XLSX、CSV和TXT文件。 P.S&#xff1a;DevExpress ASP.NET Web Forms Controls拥有…

课时13:变量基础_变量场景

2.1.1 变量场景 学习目标 这一节&#xff0c; 我们从 数据存储、变量场景、小结 三个方面来学习。 数据存储 数据存储 所谓的数据存储&#xff0c;我们从三方面来理解这句话&#xff1a;1、数据保存到哪里 -- 各种媒介&#xff0c;CPU、内存、磁盘、磁带、网盘...2、数据保…

06:原生云K8S解密|K8S集群安装部署|K8S网络插件

原生云K8S解密&#xff5c;K8S集群安装部署&#xff5c;K8S网络插件 K8SK8S集群架构图解 K8S部署仓库初始化kube-master安装计算节点的安装token管理 配置flannel网络&#xff08;master主机操作&#xff09; K8S 有大量夸主机的容器需要管理&#xff0c;快速部署应用&#xff…

河西走廊潜在蒸散发时空格局变化与气象因素的关系_马亚丽_2023

河西走廊潜在蒸散发时空格局变化与气象因素的关系_马亚丽_2023 摘要关键词 1 数据与方法1.1 数据来源1.2 变化趋势分析1.3 定性分析方法1.3.1 主成分分析1.3.2 相关系数1.3.3 通径分析 1.4 定量分析方法1.4.1 敏感系数1.4.2 贡献率计算 2 结果与分析2.1 ET0多年变化特征2.1.1 E…