使用 PyTorch 和 OpenCV 实现简单卷积神经网络(CNN)的过程

使用 PyTorch 和 OpenCV 实现简单卷积神经网络(CNN)的过程,如何构建一个简单的卷积神经网络模型,并通过使用预定义的滤波器对灰度图像进行卷积操作和激活函数处理,最终可视化了卷积层和激活层的输出结果。

1.图像处理:

使用 OpenCV 读取图像,并将彩色图像转换为灰度图像。

进行灰度图像的归一化处理,使像素值在 0 到 1 之间。

2.卷积操作:

定义了一个包含卷积层的神经网络模型。

使用预定义的滤波器初始化卷积层的权重。

3.神经网络模型:创建了一个简单的神经网络类 Net,包含一个卷积层,该卷积层使用预定义的滤波器进行初始化,并在前向传播中应用 ReLU 激活函数。

4.可视化:

使用 Matplotlib 展示了原始灰度图像和定义的滤波器。

可视化了卷积层和激活层的输出,展示了图像在卷积操作和激活函数后的变化。

5.PyTorch 张量:

将 NumPy 数组转换为 PyTorch 张量,并将其传递到神经网络模型中进行处理。

python 复制代码
import cv2
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import os
# 设置环境变量以避免 OpenMP 问题
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
# 指定图像文件的路径。
img_path = 'data/udacity_sdc.png'


bgr_img = cv2.imread(img_path)
# 使用 OpenCV 读取图像 ()。将图像从BGR(彩色)转换为灰度。
gray_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)

# 对灰度图像进行归一化,使其像素值在 [0, 1] 范围内。
gray_img = gray_img.astype("float32")/255

# 使用 Matplotlib 显示灰度图像。
plt.imshow(gray_img, cmap='gray')
plt.show()

# 定义一组将在卷积层中使用的过滤器(内核)。创建初始筛选器的变体。
filter_vals = np.array([[-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1]])

print('Filter shape:', filter_vals.shape)

filter_1 = filter_vals
filter_2 = -filter_1
filter_3 = filter_1.T
filter_4 = -filter_3

filters = np.array([filter_1, filter_2, filter_3, filter_4])

print('Filter 1 \n', filter_1)
#  使用 Matplotlib 可视化定义的过滤器。对筛选器中每个元素的值进行注释。
fig = plt.figure(figsize=(10, 5))
for i in range(4):
    ax = fig.add_subplot(1, 4, i+1, xticks=[], yticks=[])
    ax.imshow(filters[i], cmap='gray')
    ax.set_title('Filter %s' % str(i+1))
    width, height = filters[i].shape
    for x in range(width):
        for y in range(height):
            ax.annotate(str(filters[i][x][y]), xy=(y, x),
                        horizontalalignment='center',
                        verticalalignment='center',
                        color='white' if filters[i][x][y] < 0 else 'black')

# 定义一个带有卷积层的简单神经网络类 ()。卷积层的权重使用定义的滤波器进行初始化。
# forward 方法计算卷积层的输出并应用 ReLU 激活函数。
class Net(nn.Module):
    def __init__(self, weight):
        super(Net, self).__init__()
        k_height, k_width = weight.shape[2:]
        self.conv = nn.Conv2d(1, 4, kernel_size=(k_height, k_width), bias=False)
        self.conv.weight = torch.nn.Parameter(weight)

    def forward(self, x):
        conv_x = self.conv(x)
        activated_x = F.relu(conv_x)
        return conv_x, activated_x

# 将过滤器的 NumPy 数组转换为 PyTorch 张量,并使用指定的权重实例化神经网络模型。
weight = torch.from_numpy(filters).unsqueeze(1).type(torch.FloatTensor)
model = Net(weight)

# 打印神经网络模型的架构。
print(model)

def viz_layer(layer, n_filters=4):
    fig = plt.figure(figsize=(20, 20))

    for i in range(n_filters):
        ax = fig.add_subplot(1, n_filters, i+1, xticks=[], yticks=[])
        ax.imshow(np.squeeze(layer[0, i].data.numpy()), cmap='gray')
        ax.set_title('Output %s' % str(i+1))

# 使用 Matplotlib 显示原始灰度图像。
plt.imshow(gray_img, cmap='gray')
plt.show()

# 可视化原始过滤器。
fig = plt.figure(figsize=(12, 6))
fig.subplots_adjust(left=0, right=1.5, bottom=0.8, top=1, hspace=0.05, wspace=0.05)
for i in range(4):
    ax = fig.add_subplot(1, 4, i+1, xticks=[], yticks=[])
    ax.imshow(filters[i], cmap='gray')
    ax.set_title('Filter %s' % str(i+1))

# 将归一化灰度图像转换为具有适当尺寸的 PyTorch 张量,以用于单通道图像。
gray_img_tensor = torch.from_numpy(gray_img).unsqueeze(0).unsqueeze(1)

# 将灰度图像传递到神经网络中,得到卷积层和激活层的输出。
conv_layer, activated_layer = model(gray_img_tensor)

# 可视化卷积层的输出。
viz_layer(conv_layer)

# 可视化激活层的输出。
viz_layer(activated_layer)

plt.show()
相关推荐
yqd6667 小时前
OpenCV
人工智能·opencv·计算机视觉
在水一缸9 小时前
OpenCV 5 深度解析:计算机视觉领域的“五年之变”与跨越式升级
人工智能·opencv·计算机视觉·开源项目·技术升级·opencv 5
Java小白笔记9 小时前
Codex 桌面应用设置功能完全指南
人工智能·opencv·目标检测·机器学习·计算机视觉·数据挖掘·语音识别
西西弗Sisyphus10 小时前
PyTorch 数据加载:Dataset、DataLoader 与 WeightedRandomSampler 解决类别不平衡
pytorch·python
小白学大数据12 小时前
无库无捷径,PyTorch 手写完整 Transformer 大语言模型 LLM
开发语言·pytorch·语言模型·transformer
承渊政道14 小时前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(基于PyTorch卷积层的MNIST分类实战:从卷积直觉到高效卷积设计)
人工智能·pytorch·神经网络·分类·chatglm·卷积·大模型学习
Mister Leon1 天前
视频时序数据处理:CNN+LSTM
cnn·音视频·lstm
想会飞的蒲公英1 天前
一个 PyTorch 模型训练的完整流程
人工智能·pytorch·python
梦想三三1 天前
Flask + PyTorch模型部署实战:从训练权重到API接口完整工程解析(附完整代码)
人工智能·pytorch·python·flask·模型推理·ai 工程化
2601_962851741 天前
计算机毕业设计之基于YOLOV10的低光照目标检测算法研究与实现
大数据·算法·yolo·目标检测·信息可视化·cnn·课程设计