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 通道没有的红色特征。