opencv-python加载pytorch训练好的onnx格式线性回归模型

2023-05-16

    opencv是一个开源的图形库,有针对java,c++,python的库依赖,它本身对模型训练支持的不好,但是可以加载其他框架训练的模型来进行预测。

    这里举一个最简单的线性回归的例子,使用深度学习框架pytorch训练模型,最后保存模型为onnx格式。最后使用opencv-python库来进行加载预测。

    这里准备的线性回归模型数据如下:

x_datay_data
12
24
36
4

?

8?
10?
15?

    直观的看,这里其实就是一个 y = 2x的线性方程。但是机器学习里面,它是通过不断迭代的方式求得最终的系数,w,b的值。 

    本文使用过的python库版本:

  •     torch:1.13.0
  •     opencv-python: 4.5.5
  •     numpy 1.24.2
  •     python: 3.10

    show me the code:

import torch

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])


class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)


model = LinearModel()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=0.02)

for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    if epoch % 100 == 0:
        print(epoch + 1, loss)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

print('w = {}'.format(model.linear.weight.item()))
print('b = {}'.format(model.linear.bias.item()))

x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred(4.0) = ', y_test.data)

x_test = torch.Tensor([[8.0]])
y_test = model(x_test)
print('y_pred(8.0) = ', y_test.data)

x_test = torch.Tensor([[10.0]])
y_test = model(x_test)
print('y_pred(10.0) = ', y_test.data)

x_test = torch.Tensor([[15.0]])
y_test = model(x_test)
print('y_pred(15.0) = ', y_test.data)

model.eval()
dummy_input = torch.randn(1, 1)
input_name = ["input"]
output_name = ["output"]
onnx_name = "test.onnx"
torch.onnx.export(
    model,
    dummy_input,
    onnx_name,
    verbose=True,
    input_names=input_name,
    output_names=output_name
)

    运行,打印信息如下:

 

    这里重点关注线性回归系数,w = 1.99,b = 1.31。这里的w其实很接近2,毕竟是计算机算出来的,这里没有明确表示使用梯度下降算法,但是实际上在训练那部分,确实使用的是梯度下降法。

for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    if epoch % 100 == 0:
        print(epoch + 1, loss)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    最后,通过这个回归系数预测,符合预期。 

    算法最终会将模型保存在本地项目路径下的test.onnx文件中。

  //

    上面算是模型准备好了,下面我们通过opencv-python来加载这个模型,并预测:

from cv2 import dnn
import numpy as np

net = dnn.readNetFromONNX("test.onnx")
matblob = np.full((1, 1), 1024, dtype=np.int32)
net.setInput(matblob)
print('input = {}'.format(matblob))
output = net.forward()
print('output = {}'.format(output))

    这里,matblob其实就是一个Mat,但是在opencv-python里面,它可以通过numpy来创建,这里在网上的都是通过读取一个图片来生成matblob对象,我个人觉着我们这里很明确,就是需要指定一个数字1024,我们通过np.full() 来设置cols,rows,type,value就成功创建了这个输入Mat对象。

    运行这个代码,我们期望得到的是2048,实际结果如下所示:

    其实和2048很接近了,这是python代码的结果。如果使用opencv-c++来编码,代码基本类似。我没有去试c++,主要是这个模型就是通过python代码实现并生成的,而且opencv有python依赖库,所以就想着直接用python实现了,没必要再去研究opencv-c++的实现了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv-python加载pytorch训练好的onnx格式线性回归模型 的相关文章

随机推荐

  • snakeyaml自定义pojo写入yml文件时属性字段排序问题

    snakeyaml采用LinkedHashMap保存对象 xff0c 最后写入yml文件的时候 xff0c 可以按照存入的顺序写入yml xff0c 如果采用自定义pojo xff0c 虽然可以写入yml xff0c 但是属性默认是按照字母
  • microsoft store打开加载失败,显示检查连接

    如题所示 xff0c 微软商店 microsoft store打开 xff0c 页面显示空白 xff0c 提示检查连接 xff0c 如下所示 xff1a 这种问题其实是网络设置不正确 xff0c 我们通过控制面板打开 网络和Internet
  • SpringBoot配置静态资源访问办法

    SpringBoot如果是web项目 xff0c 其实默认静态资源是放在resources static 目录下的 这个静态资源其实隐含了一个配置就是spring mvc static path pattern xff0c 如下所示 xff
  • Java服务导致CPU爆表异常排查

    一 前言 之前的博客有提到过面对Tomcat部署的java服务出现内存溢出该如何定位 xff0c 今天来记录下Tomcat部署的java服务出现CPU爆表的事故该如何定位 二 正文 针对Linux系统在处理CPU爆满时会有相关指令可以一步到
  • win10+python3.6+cuda9+pytorch1.1.0安装

    为了让torch可以使用显卡GPU加速 xff0c 需要安装对应版本的cudatoolkit和pytorch 这里我的nvidia显卡驱动是9 1版本 xff0c 只能安装cudatoolkit9 一般支持gpu加速的显卡大部分都是英伟达n
  • vmware虚拟机与树莓派4B安装ubuntu1804 + ros遇到的问题

    如题所示 xff0c 本人在虚拟机上安装ubuntu1804 xff0c 可以很容易安装 xff0c 并且更换系统apt源和ros源 xff0c 然后安装ros xff0c 非常顺利 xff0c 但是在树莓派4B上安装raspiberry系
  • python中Flask项目启动静态资源访问问题

    flask项目启动 xff0c 会监听默认的5000端口 xff0c 这个时候 xff0c 在项目根路径下有一个默认的文件夹static xff0c 是用来存放静态资源的 xff0c 我们启动项目 xff0c 可以直接访问这个目录里面的静态
  • java混淆框架proguard结合springboot项目混淆打包

    java项目一般是打包成jar运行或者作为依赖给第三方使用的 xff0c 有的时候 xff0c 可能不想被别人反编译 xff0c 于是就对关键部分进行混淆 xff0c 让代码变得普通人看不懂的地步 xff0c 很多关键字和变量都是用单个字母
  • java中Runtime.exec()可能带来的命令注入安全问题的解决办法

    我们在使用Runtime getRuntime exec 的时候 xff0c 可以指定一个命令或者脚本 xff0c 让它执行 xff0c 类似于调用系统指令来进行完成一项任务 但是这个方法如果有安全检查 xff0c 它会被报出一个Comma
  • springboot自帶线程池ThreadPoolTaskExecutor使用

    不管是阿里 xff0c 还是华为java开发手册 xff0c 都会有一条建议 xff0c 就是让开发者不要使用Executors去创建线程池 xff0c 而是使用构造函数ThreadPoolExecutor的方式来创建 xff0c 并设置合
  • windows下postgresql安装timescaledb

    timescaledb是一个时序数据库 xff0c 可以创建超表hypertable 它并不是一个独立的数据库 xff0c 它依赖于postgresql xff0c 目前相当于postgresql的一个插件或者扩展 要安装timescale
  • windows下sonarqube+sonar-runner安装记录

    sonarqube是一套代码质量管理工具系统 xff0c sonar runner是一个静态扫描代码的工具 xff0c 它可以把扫描的结果交给sonarqube来管理 这里安装的sonarqube版本比较老旧5 1 2 xff0c 因为我安
  • windows上nacos源码编译安装

    nacos是阿里巴巴旗下的一款类似dubbo的微服务注册与发现中心 xff0c 现在很多地方都在使用这个新的框架作为微服务注册中心 nacos本质还是一个rpc框架 xff0c 但是它更强大 xff0c 它还支持配置管理 这里来学习naco
  • java通过URLClassLoader类加载器加载外部jar

    相信在实际工作中 xff0c 大家可能会遇到这种需求 xff0c 这个jar是外部的 xff0c 并没有添加到项目依赖中 xff0c 只能通过类加载器加载并调用相关方法 这种jar加载 xff0c 其实也简单 xff0c 我们通过普通的UR
  • Java服务调用系统指令、Bat脚本记录

    一 前言 在项目推进过程中偶尔会涉及到调用其它组件或脚本的需求 xff0c 本文重点介绍Java服务调用Bat脚本 系统指令 二 调用Bat脚本 根据需求生成BAT脚本内容文本 xff0c 通过文件流写入到新建的BAT文件中 xff0c 然
  • 蓝桥杯单片机开发板-数码管静态显示

    本次的博客会详细的讲解每一部分的代码 首先放本博客所涉及到的电路结构 上图为M74HC573的所控制的数码管显示电路 下图为74HC138的片选电路 电路的逻辑为 通过74HC138来控制74HC02与非门进行逻辑控制 通过74HC02的输
  • 目标检测框架yolov5环境搭建

    目前 xff0c 目标检测框架中 xff0c yolov5 是很火的 xff0c 它基于pytorch框架 xff0c 集成opencv等框架 xff0c 项目地址 xff1a https github com ultralytics yo
  • java中使用easyexcel框架自定义格式写入excel

    一般的excel示例 xff0c 都是写入列表数据到excel xff0c 格式上有表头 xff0c 内容使用List集合来填充 今天遇到的需求有点不一样 xff0c 它也是需要写入excel xff0c 但是开头的内容并不是列表 xff0
  • easyexcel内容追加与单元格合并

    这里的需求是 xff0c 如果表格不存在 xff0c 则新建表格 xff0c 并填入数据 xff0c 如果表格存在 xff0c 那么就追加内容 xff0c 并且支持单元格合并 内容追加 xff0c 需要分两种方式插入 xff0c 第一种就是
  • opencv-python加载pytorch训练好的onnx格式线性回归模型

    opencv是一个开源的图形库 xff0c 有针对java c 43 43 python的库依赖 xff0c 它本身对模型训练支持的不好 xff0c 但是可以加载其他框架训练的模型来进行预测 这里举一个最简单的线性回归的例子 xff0c 使