学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为1974,预计阅读5分钟

前言

很早就想学习深度学习了,因为平时都是自学,业余时间也有限,看过几个pyTorch的入门,都是一些碎片化的东西,始终串不起来。最近也是正好赶的疫情,出差少了,也是在B站看pyTorch视频时有评论说刘二大人的《pyTorch深度学习实践》讲的好,整个教程看下来后,确实是深入浅出,感觉就是宛然打通自己任督二脉,算是入门了。

pyTorch入门,最重要的还是需要真正用起来,OpenCV中DNN模块就是用来推理的,所以这篇就是专门做一个最简单的例子来验证效果,文章最后有源码的Github地址。

# 实现方式
1 pyTorch训练数据
2 将pyTorch训练好的数据模型转出为onnx的文件
3 使用C++ OpenCV DNN实现推理

配置环境

操作系统:Windows 11 Home

pyTorch相关:Miniconda + pyTorch1.12.1(cpu) + python3.9.12,IDE用的是Visual Studio Code

OpenCV相关:OpenCV 4.5.1 + C++,IDE用的是Visual Studio 2022

原来环境装的是Anaconda全家桶,需要的资源空间大,而Miniconda是最小的conda安装环境,所以这里推荐还是用Miniconda。具体的环境配置及安装方式,网上挺多的,包括视频也有,可以自行搜索一下。

平时办公外接大屏显示器,现在由于工作原因,现在出差较多,为了解决使用大屏的需求,同时出差携带方便,所以换了折叠屏的笔记本,由原来的ASUS灵耀X DUO换成了ASUS 灵耀X Fold,相应的原来还有独立显卡,现在也只能是集成显卡,pyTorch也装的是CPU版本。上几张两个笔记本对比图

代码实现

微卡智享

做一个最简单的训练及推理,那我们就不用图像,就是一个简单的运算,如下图:

上图中红框代表我要的训练集,我们一眼就可以看出,实现的效果就是输入值乘2得到输出结果,下面两条4.0和100.0用于推理出结果,得到的也应该是8.0和200.0

pyTorch训练

01

定义训练集

导入torch包后,我们直接定义输入的x_data为【1,2,3】,输出的结果y_data为【2,4,6】,输入结果打印如下:

02

定义训练的网络模型及损失函数和优化器

训练模型也非常简单,只有Linear全链接层一层,并且在前馈forward函数中没有用到激活函数,直接输出了。损失函数用的MSE,优化器SGD,其中学习率参数设置的0.02(lr=0.02)

03

训练模型

关于训练,主要就是四个步骤:

  1. forward(前馈)

  2. loss(计算损失函数)

  3. backward(反向传播)

  4. step(优化迭代)

上面我们设置了训练次数为1000次,每100次打印一下loss,最后输出权重值,训练的结果如下:

04

验证测试及输出onnx模型

训练完成后,我们来验证测试结果,分输入了4,8,10,15四个值,打印结果如下:

上图中可以看到,预测的结果完全准确,接下来我们就将训练的这个模型导出onnx文件用于OpenCV的推理。

  1. 将model模型改为eval(),是设置为推理模式。

  2. 定义一个输入的参数模型dummy_input

  3. 设置输出、输出的参数名称input和output,还有onnx的文件名称

  4. 用torch.onnx.export进行导出,其中verbose=True是将会输出被导出的轨迹的调试描述

成功后当前目录下会生成一个test.onnx的模型文件,这样pyTorch训练的模型这块就完成了,接下来就是看看如果用OpenCV的DNN进行推理。

C++ OpenCV推理

C++ OpenCV DNN推理这块代码也很简单,主要就是定义了dnn::Net,然后指定到onnx模型文件的目录,使用readNetfromOnnx加载模型文件。

输入的参数还是用OpenCV的Mat,因为只输入一个参数,所以这里定义的就是1X1,数据类型输入是float的类型,所以定义的也是CV_32F,将Mat传入到输入参数里,net.setInput(Mat值,输入参数名),第二个参数与我们导出的参数名相同,再通过net.forward(输出参数名)得到返回的结果。

代码中我们输入的为1024,所以预测的结果为2048,完全正确,这样一个最简单的pyTorch训练模型转出onnx,然后用C++ OpenCV推理的Demo就完成了。

微卡智享

源码地址

https://github.com/Vaccae/OpenCVDemoCpp.git

点击阅读原文可以看到“码云”的代码地址

往期精彩回顾

Kotlin在协程中使用Select表达式选择最快结果

C++ OpenCV手动截取图像做透视变换

使用OpenCV做个简单的颜色提取器

超简单的pyTorch训练-onnx模型-C++ OpenCV DNN推理(附源码地址)相关推荐

  1. 【Python】超简单的华容道小游戏制作+保姆级讲解(附源码)

    前言 华容道游戏是一个历史悠久的经典游戏,玩法就是将已经打乱的数字重新调整顺序,使其成为正序排列 正好昨天一个朋友的python老师留下了这道华容道的题目,今天就来学习一下吧 注意!!! 以下内容不包 ...

  2. pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4239字,预计阅读12分钟 前言 前面几篇文章实现了pyTorch训练模型,然后在Windows平台用C++ OpenCV D ...

  3. Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)

    文章目录 一.TCP通信示例图 二.TCP使用前的准备 三.自定义TCP通信类的两种方法 四.源码(含注释) TCP Server CTcpServer.h CTcpServer.cpp TCP Cl ...

  4. 基于卷积神经网络的句子分类模型【经典卷积分类附源码链接】

    https://www.toutiao.com/a6680124799831769603/ 基于卷积神经网络的句子分类模型 题目: Convolutional Neural Networks for ...

  5. C#.net开发基于WinForm的简单图书馆系统(附源码地址)

    C#.net开发基于WinForm的简单图书馆系统,采用了三层架构,CS模式,数据库用sql server,代码可用来学习和参考 github链接:https://github.com/CodeZno ...

  6. 【Pygame小游戏】这款经典的炸弹人超能游戏上线,你爱了嘛?(附源码)

    前言

  7. 【超详细】SpringBoot与Shiro整合-权限管理实战实操(附源码地址)

    一.搭建SpringBoot开发环境 1. 安装好开发软件和Maven等 开发工具:Spring Tool Suite(TST) Maven :3.3.9 jdk:1.8 2. 创建springboo ...

  8. 还愁不能解密MD5值?简单代码就能实现md5加密解密,内附源码,亲测可用

    众所周知,md5本身是不可逆的,但我们可以使用以下代码中提供的接口进行解密啊!我试了下成功率是非常的高!8位以内的纯数字的md5值都可以解密. php代码 <?php $MiWen = &quo ...

  9. 实现简单迷宫小游戏(几行代码)-免费附源码

    本次实现的思路 就是需要打印一个迷宫通道  然后通过wasd来控制物体移动 我们通过 实现 打印 空格 进行实现将一开始的小球 消失 操作 使用函数 getch这个录入一个字符 并且 这个录入的字符不 ...

最新文章

  1. 刚进园子,广州的冬天像夏天
  2. fileoutputstream 转 byte数组_Java:如何实现文件与数组的相互转换?
  3. umi不输出html文件,部署 - UmiJS 中文文档
  4. codeforces 480B B. Long Jumps(贪心)
  5. LeetCode177 第N高的薪水
  6. You have mail in /var/spool/mail/root
  7. 嵩天-Python语言程序设计程序题--第三周:基本数据类型
  8. 无法找到或创建字体'SansSerif'.某些字符可能无法正确显示或打印。
  9. 如何用控制台启动一个wcf服务
  10. 机器学习6/100天-Logistic实践
  11. 【less-1】基于SQLI的SQL字符型报错注入
  12. 头脑王者源码微信答题小程序pk知识问答源码介绍
  13. excel 基于RFM模型、帕累托分析的用户画像项目实战
  14. 奥克兰大学计算机科学与技术,奥克兰大学计算机科学专业怎么样?成为IT达人就靠它...
  15. 安卓手机优化,修改build.prop
  16. 【安全牛学习笔记】cookie安全问题
  17. 数据分析,把握商机 关键词采集工具助你挖掘潜在客户
  18. 适用于任何设备的屏幕共享应用程序 – Mirroring360
  19. 记录微机大作业-----流水灯
  20. 【游戏开发实战】Unity使用ShaderGraph制作一个Loading水球(能量球 | UI | 2D | 特效 | URP)

热门文章

  1. 5种阿里常用代码检测推荐 | 阿里巴巴DevOps实践指南
  2. 【R语言】实验五 综合应用
  3. linux 加路由 网络不可达,无法添加静态路由:SIOADDRT:网络不可达
  4. vm怎么装vim_安装nginx报-bash: vm: command not found..错误提示vim文本编辑器命令没有安装...
  5. 以亲身经历解读经典的定律或法则
  6. 孙鑫VC++深入详解第三章学习笔记
  7. 6-3 计算Fibonacci数列每一项时所需的递归调用次数 (10 分)
  8. JZOJ1383. 奇怪的问题 (2017.8B组)
  9. 如何用电脑制作Excel表格
  10. 数据挖掘期末复习速成大法 华南农业大学