003:如何理解 CNN 中的 RGB 图像和通道?

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。

合集完整版请参考这里

在灰度图一节的最后,给出了一个由彩色图片转成灰度图的示例,并且通过 color_image.mode获取了图片的格式:彩色图片获取到的格式为 RGBA,灰度图为L。

这一节介绍一下 RGB 图片以及通道的概念。

通道

通道这个概念,在深度学习中很重要,并且极为重要。

举个例子:在很多时候,对AI神经网络中的一些算法做工程化实现,或者做性能优化,除了关注算法本身之外,还会关注数据存储格式。一般在 pytorch 中(一个AI模型框架),数据的存储格式 NCHW, C指代的就是通道(channel), 如此一来,对于需要在通道维度做归一化(如 reduce)的算法,是很不友好的。

因为数据在通道维度不连续,导致取到完整的通道维度信息要跨越很大的地址范围,CPU 或其他 xPU 对于这类的数据寻址性能都是很差的,至少要比连续寻址差。此时就需要对通道维度做其他的变换。

以上举了在实际中会遇到的一类问题:通道维度数据在存储器中摆放不连续导致某些算法运算性能不好,这里暂时了解即可,无需深究,涉及到的内容会在专栏后面有详述。

本节的目的只有一个:只需要了解通道这个概念是什么就行了。

先看下 RGB 图像
你可能知道,色彩通常由红色(Red,R)、绿色(Green, G)、蓝色(Blue, B)三种基本颜色组成,这种颜色表示方式被称为彩色 RGB 模型。

在这个模型中,每个像素的颜色由这三种基本颜色组合而成。因此,一个图像在二维平面上看似只有一个像素,实际是由三个不同颜色(不同通道)的像素混合组成。

这里的 R/G/B 三种颜色,就认为是彩色图片的三个通道,如下图所示。
在这里插入图片描述

(一张彩色RGB图片按照通道维度(C)堆叠)

来调一下颜色

通过调整红、绿、蓝三个通道的值,你可以混合出各种颜色。

和灰度图一样,在 RGB 模型中,每个通道的颜色也是用三个数值(0-255 范围内的整数)来表示,分别代表红、绿、蓝三个通道的强度。

你可以使用计算机的画图软件轻松的模拟调色的过程:例如,红色和绿色通道同时存在会产生黄色。
在这里插入图片描述

而红色和蓝色通道同时存在则会呈现洋红色。
在这里插入图片描述

如果3种颜色都有,则为白色。

在这里插入图片描述

RGB 分量

彩色图片有 RGB 三个通道,如果将三张分别为红色通道、绿色通道、蓝色通道的图片进行融合,那么就可以构成一幅色彩斑斓的图片。同样的,也可以通过一定的方法,将三个通道的分量图像分别提取出来进行展示。

下图左侧是一张彩色原图,后面是分别提取的每个通道的分量绘制而成的图片:将原图的绿色/红色/蓝色通道分量都提取出来了。
在这里插入图片描述

RGB 图像在计算机中的占用大小

日常情况下,你可能会认为,分辨率为 1920 x 1080 的图片,代表在图片的长、宽两个方向上有 1920 x 1080 个像素。

但是,在学习了本节的彩色 RGB 模型之后,你需要知道:一张彩色图像,除了长宽方向之外还存一个方向,那就是通道方向。

也就是说,彩色图像应该用三维数据来表示,而不是二维。

举个例子,一张 3 通道的 RGB 图像,长和宽分别为 1920 x 1280 个像素,需要表示该图像的形状为 1920 x 1280 x 3(或者用 [1920, 1280, 3] 的方式来表示)。当然也可以表示为 3 x 1920 x 1280([3, 1920, 1280]) 来表示,这两种表示方法取决你把通道数放在长和宽的前面还是后面。

一张 1920 * 1280 的 RGB 图片, 在计算机存储时所需要的数据大小为:

1920 x 1280 x 3 x 1 Bytes = 7MB,也就是大约 7M 的数据量。

在实际存储时,受到图片压缩算法的影响,在计算机磁盘中看到的图片大小可能会小于这个数值,但是不影响通过这种方法来估算图片在计算机中的内存占用。

通道的意义

在后面深度学习章节中,我会经常提到通道的概念。

基于计算机视觉的AI神经网络在进行模型推理时,无论是卷积算法还是其他算法,计算的绝大部分是图像特征图中通道的关系。

特征图是一种神经网络中间层输出的图,其通道数有多有少,多则几千,少则几十。在特征图中,一个通道中的数据就可以粗略的认为代表了原始图像中的一个特征。

假设某一层特征图只有两个通道,那么将这两个通道的特征可视化之后,可能呈现出来的分别是“轮廓”特征,或者“嘴巴”的特征。

回到RGB的图像,因为 RGB 图像有 3 个通道,如果把彩色图片当做特征图的话,那就可以说 RGB 图片有 3 个特征通道。

每个通道或多或少的保留着原始图像的某些细节和轮廓特征,就像上面的三张分量图片一样,当然最主要的特征便是颜色:比如 R 通道,有着 B 通道没有的红色特征。

### 卷积神经网络中的输入通道输出通道 #### 输入通道的定义与功能 在卷积神经网络中,输入通道是指输入数据的不同维度或特征平面。对于图像数据而言,输入通道通常代表不同的颜色通道。例如,在RGB彩色图像中,输入通道数量为3,分别对应红色、绿色蓝色三个通道[^3]。如果输入是一张灰度图,则只有一个输入通道。 输入通道的主要功能是从原始数据中提取基础信息。这些信息通过多个过滤器(Filters/Kernels)进一步处理,从而捕捉到局部的空间模式,比如边缘、纹理或其他低级视觉特征。 #### 输出通道的定义与功能 输出通道是由卷积操作产生的新特征映射集合。每个输出通道由一个独特的滤波器生成,该滤波器负责检测某种特定类型的特征。因此,输出通道的数量等于所使用的滤波器数量。例如,如果有6个不同的滤波器应用于输入数据,则会产生6个对应的输出通道。 输出通道的功能在于逐步抽象并提炼更高层次的信息。随着网络层数加深,早期层可能专注于简单的几何形状识别,而后期层则能够捕获更加复杂的语义概念,如物体部分或者整体对象类别。 #### 实现示例 (基于 PyTorch 的 CNN 架构) 以下是利用 PyTorch 创建简单 CNN 模型的一个例子: ```python import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() # 假设输入图片大小为 28x28 并且有单个灰度通道作为输入 self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5) # 这里设置 in_channels=1 表明我们接受的是单一灰阶图像;out_channels=6 则意味着我们将创建六个新的特征地图 self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.fc = nn.Linear(6 * 12 * 12, 10) def forward(self, x): x = self.pool(torch.relu(self.conv1(x))) x = x.view(-1, 6 * 12 * 12) x = self.fc(x) return x ``` 在这个模型中,`nn.Conv2d` 层指定了 `in_channels`=1 `out_channels`=6,这表明我们的输入是一个具有单个通道的数据流,并期望得到六种不同特性的响应。 --- ### 总结 - **输入通道** 是指输入数据本身的多维特性,常见于 RGB 图像中的红绿蓝三原色或是其他形式的多频谱信号。 - **输出通道** 数量取决于应用了多少个独特滤镜来分析输入资料,每一个都会贡献一个新的视角给下一层学习过程使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

董董灿是个攻城狮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值