pytorch结合opencv对图片进行卷积和池化操作

1.概述

卷积在 pytorch 中的卷积操作通常用 torch.nn.Conv2d()实现,这种形式对于输入的要求都是:

  1. 首先需要输入是一个 torch.autograd.Variable() 的类型,但是现在Variable() 和tensor类型合并了,所以输入为tensor类型即可;
  2. 输入大小是 (batch, channel, H, W),其中 batch 表示输入的一批数据的数目,第二个是输入的通道数,一般一张彩色的图片是 3,灰度图是 1,而卷积网络过程中的通道数比较大,会出现几十到几百的通道数,H 和 W 表示输入图片的高度和宽度
  3. 注意卷积核的shape要和输入图像的shape值相同

2.整体流程:

  1. 利用cv2读取灰度图
  2. 将图片转换成numpy.ndarray格式,且dtype=‘float32’
  3. 转成tensor格式,并且reshape成 (batch,channal,h,w)形式
  4. 卷积,激活函数,池化(注:sobel_kernel 要和img一个shape)

3.具体实现

import numpy as np
import torch
from torch import nn
import torch.nn.functional as F
import cv2

'''
流程:
1.利用cv2读取灰度图
2.将图片转换成numpy.ndarray格式,且dtype='float32'
3.转成tensor格式,并且reshape成 (batch,channal,h,w)形式
4.卷积,激活函数,池化(注:sobel_kernel 要和img一个shape)
'''

im=cv2.imread("./contours.png",0) # 读入一张灰度图的图片   466*619
im = np.array(im, dtype='float32') # 将其转换为一个矩阵

im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))  # torch.Size([1, 1, 466, 619])

conv1 = nn.Conv2d(1, 1, 3, bias=False) # 定义卷积

sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') # 定义轮廓检测算子  3*3
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出   3*3=1*1*3*3
conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值,假如不赋值,会自动赋予一个kernel_size=3的卷积核

edge1 = conv1(im)   # 进行卷积
# edge1 = edge1.data.squeeze().numpy() # 将输出转换为图片的格式,(464, 617),<class 'tuple'>,为了方便展示图片

x=F.relu(edge1)   #加入一层激活函数

# 最大池化层
pool1 = nn.MaxPool2d(2, 2)
x = pool1(x)       #加入一层池化
#print(x.data)   # torch.Size([1, 1, 232, 308])  tensor

x = x.data.squeeze().numpy()  # (232, 308)  numpy
#print(x.shape)#输出大小


cv2.imshow('img',x)
cv2.waitKey(0)

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
手势识别是一种计算机视觉技术,通过识别人类手部动作和手指姿势来实现交互。目前,使用CNN(卷积神经网络)和OpenCV是一种常见的手势识别方法。 CNN是一种结构化的深度学习网络,特别适用于图像处理任务。它可以自动从大量的图像数据中学习特征,并用于分类和识别。在手势识别中,可以使用CNN来学习和识别不同手势的特征。 OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和分析功能。它支持图像的读取、预处理、特征提取等操作,并且可以与CNN结合使用。 实现手势识别的基本步骤如下: 1. 数据收集:收集手势图像数据集,包括不同手势的正负样本。 2. 数据预处理:使用OpenCV对图像数据进行预处理,包括调整图像大小、灰度化等操作,以便于后续的特征提取和训练。 3. 特征提取:使用CNN模型对预处理后的图像进行特征提取。CNN会自动学习图像中的特征,如边缘、纹理等,并将其表示为高维特征向量。 4. 训练模型:将提取的特征向量与手势标签一起作为训练数据,使用CNN进行模型训练。可以使用深度学习框架如TensorFlow或PyTorch进行模型训练。 5. 手势识别:使用训练好的CNN模型对新的手势图像进行识别。将图像输入CNN模型,通过前向传播得到输出结果,即手势的类别标签。 通过CNN和OpenCV进行手势识别可以实现较高的准确率和鲁棒性。随着深度学习技术的不断发展,手势识别的应用领域也在不断扩展,如智能家居、虚拟现实等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happylife_mini

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值