卷积神经网络对图片的简单处理

本文介绍了深度学习中多输入、多输出通道及批量操作的概念,并通过PaddlePaddle库展示了如何利用卷积核进行图像处理,包括简单的黑白边界检测、图像中物体边缘检测和图像均值模糊。示例代码详细解释了卷积操作如何影响图像特征的提取和变换。
部署运行你感兴趣的模型镜像

多输入通道、多输出通道和批量操作是处理复杂关系和深度学习时不可避免地操作:

多输入-->多输出-->批量操作  这样的关系可以有所逻辑。

多输入通道影响到卷积核的数目,令卷积核的三维层面的数目于输入通道三维层面的数目保持一致。

多输出通道影响到卷积核的数目,令卷积核的四维层面的数目于输出通道的数目保持一致。

上述两种情景不会对最后的卷积求和有影响,但是批量操作会有,因为批量操作对输入通道的四维数目做出了改变。

Paddel规定的API:

通过对卷积核的不同选取,我们可以达到不同的目的,卷积核是我们要操作的行为的体现,彰显着行为的目的。比如我们想边沿化图片,那我们就可以使用锐化卷积核,并令和为0获取更强的边缘化能力。

 简单的黑白边界检测:

import matplotlib.pyplot as plt
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
%matplotlib inline

w = np.array([1, 0, -1], dtype='float32') # 初始权重输入, 卷积核是我们要操作的行为的体现,彰显着行为的目的
w = w.reshape([1, 1, 1, 3]) # 转变为paddel库API规定的数据维度
# 卷积算子规定,API规定的模式输入
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
       weight_attr=paddle.ParamAttr(
          initializer=Assign(value=w)))

# 定义要区分的图片
img = np.ones([50,50], dtype='float32')
img[:, 30:] = 0.  # 分片操作规定前30列为0
x = img.reshape([1,1,50,50]) 
x = paddle.to_tensor(x)  # 转变为tensor
y = conv(x)
out = y.numpy() # 转变为ndarray
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()
print(conv.weight)
print(conv.bias)

 

 图像中物体边缘检测:

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
img = Image.open('./work/tianan.jfif')

w = np.array([[-1,-1,-1], [-1,8,-1], [-1,-1,-1]], dtype='float32')/8  # 设置卷积核参数, 这里采用锐化卷积核并令总和为零获得较强的边沿化能力
w = w.reshape([1, 1, 3, 3])
# 图片以RGB三通道输入,输入通道数是3,将卷积核的形状从[1,1,3,3]调整为[1,3,3,3]  API规定
w = np.repeat(w, 3, axis=1)
# 创建边沿化算子
conv = Conv2D(in_channels=3, out_channels=1, kernel_size=[3, 3], 
            weight_attr=paddle.ParamAttr(
              initializer=Assign(value=w)))
    
# 将读入的图片转化为float32类型的numpy.ndarray
x = np.array(img).astype('float32')
# 图片读入成ndarry时,形状是[H, W, 3],
# 将通道这一维度调整到最前面
x = np.transpose(x, (2,0,1))
# 将数据形状调整为API格式 
x = x.reshape(1, 3, img.height, img.width)
x = paddle.to_tensor(x)
y = conv(x)
out = y.numpy()
plt.figure(figsize=(20, 10))
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img)
f = plt.subplot(122)
f.set_title('output feature map', fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()

 

图像均值模糊:

import paddle
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
# 读入图片并转成numpy.ndarray
# 换成灰度图
img = Image.open('./work/tianan.jfif').convert('L')
img = np.array(img)

# 创建初始化参数
w = np.ones([1, 1, 5, 5], dtype = 'float32')/25  # 5*5的卷积核中每个值均为1
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[5, 5], 
        weight_attr=paddle.ParamAttr(
         initializer=Assign(value=w)))
x = img.astype('float32')
x = x.reshape(1,1,img.shape[0], img.shape[1])
x = paddle.to_tensor(x)
y = conv(x)
out = y.numpy()

plt.figure(figsize=(20, 12))
f = plt.subplot(121)
f.set_title('input image')
plt.imshow(img, cmap='gray')

f = plt.subplot(122)
f.set_title('output feature map')
out = out.squeeze()
plt.imshow(out, cmap='gray')

plt.show()

 

您可能感兴趣的与本文相关的镜像

PaddlePaddle-v3.3

PaddlePaddle-v3.3

PaddlePaddle

PaddlePaddle是由百度自主研发的深度学习平台,自 2016 年开源以来已广泛应用于工业界。作为一个全面的深度学习生态系统,它提供了核心框架、模型库、开发工具包等完整解决方案。目前已服务超过 2185 万开发者,67 万企业,产生了 110 万个模型

### CNN处理彩色图像的原理 在卷积神经网络(CNN)中,处理彩色图像的核心在于如何将图像结构与多通道信息输入到网络中,并通过一系列操作提取有用的特征。彩色图像通常由红、绿、蓝三个颜色通道组成(即RGB),每个通道都可以视为一个二维矩阵,分别表示该颜色的强度分布。因此,一张彩色图像在计算机中的存储形式是一个三维张量(Height × Width × Channels),其中通道数为3。 #### 输入层的设计 当将彩色图像输入到卷积神经网络时,输入层会直接接受这种三维格式的数据。例如,一张28×28像素的彩色图片会被转换成形状为(28, 28, 3)的张量。这种设计保留了图像的空间结构和颜色信息,使得后续的卷积操作能够有效捕捉局部特征[^3]。 #### 卷积操作 卷积是CNN的核心操作之一,它通过滑动一个小窗口(称为卷积核或滤波器)在输入数据上进行局部计算,从而提取特征。对于彩色图像来说,卷积核同样具有深度(等于图像的通道数),因此针对RGB三通道的卷积核会同时对每个通道进行加权求和,然后将结果相加以生成输出的一个通道。为了进一步提取更多类型的特征,通常会使用多个不同的卷积核来产生多通道的输出(即特征图)。 #### 非线性激活函数 卷积操作的结果通常会经过非线性激活函数(如ReLU)。这一步骤引入了非线性特性,使网络能够学习更复杂的模式。例如,ReLU函数定义为$f(x)=max(0,x)$,它会抑制负值并保留正值,有助于增强模型的表现力[^1]。 #### 池化操作 池化(Pooling)用于降低特征图的空间尺寸(高度和宽度),从而减少参数数量并控制过拟合。常见的池化方法包括最大池化(Max Pooling)和平均池化(Average Pooling)。例如,在一个2×2窗口中应用最大池化,仅保留窗口内的最大值作为输出。这种方法能够保持特征的位置不变性[^2]。 #### 网络堆叠 卷积层和池化层可以根据需求多次堆叠,以逐步提取更高层次的抽象特征。最终的特征图会通过全连接层(Fully Connected Layer)进行分类或其他任务。全连接层将所有特征组合起来,形成最终的输出(如图像类别)。 ### 示例代码 以下是一个基于PyTorch框架实现的简单CNN示例,用于处理彩色图像: ```python import torch import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() # 定义卷积层 self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1) self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1) # 定义池化层 self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0) # 定义全连接层 self.fc1 = nn.Linear(32 * 7 * 7, 128) self.fc2 = nn.Linear(128, 10) # 假设输出为10个类别 # 定义激活函数 self.relu = nn.ReLU() def forward(self, x): # 前向传播 x = self.pool(self.relu(self.conv1(x))) x = self.pool(self.relu(self.conv2(x))) # 展平操作 x = x.view(-1, 32 * 7 * 7) # 全连接层 x = self.relu(self.fc1(x)) x = self.fc2(x) return x # 实例化网络 model = SimpleCNN() print(model) ``` #### 关键点说明 - **输入维度**:由于处理的是彩色图像,`in_channels=3`指定输入为三通道。 - **卷积核设计**:每一层卷积核的深度必须与输入的通道数匹配(如第一层卷积核深度为3),而输出通道数可以自定义。 - **展平操作**:在进入全连接层之前,需要将特征图展平为一维向量。 - **输出设计**:假设最后的输出为10个类别,最后一层全连接层的输出节点数设置为10。 ### 总结 卷积神经网络通过卷积、池化和非线性激活函数等操作,能够高效地处理彩色图像。其核心优势在于保留了图像的空间结构,并能自动提取多层次的特征。这些特性使得CNN在图像识别、目标检测等领域表现卓越。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值