深度学习-神经网络模型

深度学习-神经网络模型

白糖 Lv2

恭喜你发现宝藏了,先收藏,在慢慢看吧,看完后相信你会有很大收获。

本文章中若有读者已知内容,可自行阅读其他对自己有帮助的内容部分。

一、写在前面

如果让你设计一个可以识别图像的神经网络,你会怎么做?
我之前问过自己这个问题,思来想去,我的答案是:我可能不知道如何下手,梦还没开始就结束了。
于是,我有了一个大胆的想法。接下来,我会从头开始,聊聊一个图像识别网络是怎么工作的,每一步算法的原理,以及相关的背景知识。
你可能会想,看懂这些需要什么知识呢?其实不需要太深奥的数学知识。我会尽可能把每一步写的通俗易懂,这个过程中我也会搜集一些资料,
也是一个不断完善自己知识体系的过程。文中聊得网络,就是大家都比较熟悉的,被玩烂的、作为各大AI芯片厂商性能标杆的Resnet50。
个人水平有限,文中如有错误,欢迎联系我指正。

二、从像素说起

要实现图像识别,最离不开的,就是像素。
其实我们都知道,图像是由像素组成的。实际上,神经网络计算,算的就是像素之间的关系,以及这些关系背后可能隐藏的图片信息。相机摄像头像素2000万,拍出来的照片肯定比像素1000万的要清晰我们更容易看到图片中的物体是什么。
这是为什么?因为像素越多,像素之间的关系(色彩,轮廓)越丰富,我们所能看到的信息就越多,自然而然获取到的信息就多。

图片
图片

一张1080p的图片,我们可以更容易辨别出图像中的物体是山还是水。这是因为更多的像素会给眼睛更丰富的图片细节
但是,你有没有发现,当我们去看一张图片时,我们绝对不是盯着某一个像素或某几个像素看,而是看了整个图像的大部分区域,或者说,大部分像素!
因为只有看到了大部分的图片,才能知道图中是座山。正所谓,聚沙成山!绝不是少了一粒沙,山就不是山,多了一粒沙,就变成了山。

像素局部性

图片
图片

上图哆啦A梦,虽然不是很清晰,像素点数也很少,但一眼望去,依然可以分清是哆啦A梦,甚至,用手捂住一半的图像,依然可以。
这是因为人眼对于图像信息的识别,是建立在对像素局部性分析的基础上的。
所谓局部性,通俗点说,就是眼睛或大脑会将相邻的像素或大片的像素连接起来分析,从而组合成嘴巴,然后是耳朵,最后是哆啦A梦。
神经网络识别图片大致就是这样的原理,它模拟的,就是人们看到图片之后的信息处理过程。
当我们盯着一个图片看时,我们首先会获取到图片的细节特征。比如哆啦A梦红色的大嘴巴。但是如果仅仅盯着大嘴巴,又反而让人有一种“只缘身在此山中”的感觉,看不到图片的全貌。
因此还需要看一下图像的轮廓。于是,我们的眼睛看图片大致有以下两个过程:
瞳孔放大,盯着某一处细节(如大嘴巴)看
瞳孔缩小,模糊的看一张图片的大致轮廓
两个过程获取的信息叠加。
Bingo,看清楚了,是哆啦A梦!那么神经网络是否可以模拟这种瞳孔放大、缩小的方式呢?
很幸运,可以!
那就是卷积算法。

卷积

图片
图片

卷积的计算示意图
卷积核的设计,就可以很直观的模拟这种获取图片信息的方法。
人们通过调整卷积核的大小,来达到瞳孔张开、缩小的目的。并且大量的实验和论文表明,卷积这一针对图像局部性识别的算法,可以非常有效的模拟人眼识别物体的过程。关于卷积算法以及卷积核的设计原理,后面会专门来讲,因为卷积这一算法,在图像处理领域,太重要了。
我们现在继续沿着像素这一话题讲下去。

色彩分量RGB

回到像素这一话题,你有没有想过,为什么一张图片会是彩色的。 学过摄影的小明同学可能这时会回答:因为图片是由RGB三种颜色来表示的,每个像素实际是不同的R/G/B分量的叠加,混合起来,就表示成了不同的颜色。 回答正确。

图片
图片

三张分别表示R/G/B分量的图片,合成一张彩色图片
对于上面一张RGB的图,我们人眼可以很直观的看到红色和蓝色,可以察觉到一张图片的色彩和轮廓。
那么,如果让计算机来处理图片,他又是如何知道色彩和轮廓的呢?
其实对于计算机来说,一张图片只是一堆数据,计算机是无法知道这堆数据代表的是什么。这就需要人为的给这堆数据一种表示方法,让计算机知道,哦,这1/3的数据是红色分量,这1/3的是蓝色分量,这些数据(像素)组合起来,可能代表的是个“帽子”。
怎么做呢?通过设计数据在计算机中的存储方式来解决。
数据在计算机的存储中,最常见的存储方式是连续存储的。比如C语言,定义一个数组,那么数组在内存中的位置是连续的。
int data[10] = {0,1,2,3,4,5,6,7,8,9};
内存怎么理解,它就是一排连着的门牌号的公寓宿舍。门牌号为101里面住着的,是data的第一个数据0。门牌号102里面住着的,是data的第二个数据1,…,以此类推。

图片
图片

哈利波特的女贞路4号,内存也是类似于门牌号规则,数据就像人一样,存储在以地址为标识的一个个的内存地址上(房子)
只不过,在计算机存储器中,没有门牌号,有的都是地址。这个时候,计算机根本就不关心数据是啥,计算机用到的时候,就把数据从内存对应的地址中取出来用。

计算机是如何取像素数据的

人们为数据存储设计一种格式,告诉计算机,这堆数据大概是什么样的。只有这样,通过这种约定的方式,计算机才能正确的取到R分量或者B分量。 对于一张图片来说,最常见的两个参数是长和宽,一般用H(height) 和W(width) 来表示,那么RGB三个分量,看作是3个通道(channel),一般用 C 来表示。 如此一来,一张长宽分别是224像素*224像素的RGB图像,就可以用 HWC = [224, 224, 3]来表示。两张类似的图片就用 NHWC = [2, 224, 224, 3]表示,其中N代表图片张数。

图片
图片

一张图片的抽象数据表示
友好的数据表示方法,可以减少大量的计算复杂度。
虽然这样表示不太利于人们的直观理解,但是计算机处理这种数据是十分方便的。在目前主流的深度学习框架中,对于图片的数据格式,基本都支持了NHWC或NCHW这种数据摆放格式。说到底,都是为了更高效地进行图片数据的处理和运算。

总结一下

这一章,从像素说起,说到了像素具有局部连接性的,人眼识别图像也是通过获取像素的局部连接性信息来完成的。 幸运的是,卷积这一算法,可以很好的模拟这一过程。最后,为了使计算机更高效的处理图片数据,引出NHWC的图片数据表示方法,所以,之后我们说图片,不仅仅局限于图片的长和宽,还多了一个维度信息,那就是channel。

加餐

熟悉OpenCV或者计算机视觉,数字图像处理的同学,可能对于下面的RGB分量中的大神很熟悉。没错,在很多的教程中,这位女神不止一次的出场。 Lena

图片
图片

这位女士名叫Lena。
电气电子工程师学会图像处理汇刊(IEEE Transactions on Image Processing)主编曾在1996年1月出版的一期中解释道,Lena的流行,因为她是一张好的测试图片,其中包含了很多细节,平滑区域,阴影和纹理。

三、图像的色彩空间

上一章从像素开始,聊到了RGB 这一常见的色彩空间模型。
之所以还想继续聊聊RGB 以及另一种色彩空间模型-YUV ,不是说想要以后去学摄影,学学如何需要调节色度、曝光和饱和度啥的。
而是在图像识别的深度学习任务中,RGB以及YUV这些概念,总是会时不时的出现一下,让枯燥无味且高度抽象的深度学习算法,突然之间,变得具体一些,光鲜一些。

RGB

Red,Green,Blue(RGB)是我们最常见的图像表示方法。这个非常好理解,三原色的融合,几乎可以构造出所有需要的颜色。三张RGB分量图片的融合,就可以构成一幅色彩斑斓的图片。 原图与R G B 三个分量图片

图片
图片

平时我们说,分辨率为1920*1080的图片,它代表的是在长宽两个方向上,有 1920 * 1080 个像素,但是,在色彩这个方向上,还有 3 个通道(channel),也就是RGB,往往被我们忽略。
我们看到的一个像素点的颜色,在计算系统中,并不是简单的由一个数值来表示的,而是由RGB三个分量的三个数值来表示的。
一个像素点的 RGB 表示

图片
图片

因此,想要计算一张1920*1080的图片的大小,或者说计算这张图片在计算机内存中所占用的大小时,不能仅仅用图片的长度乘以宽度这么算,还需要考虑通道数。

数值表示和图片大小计算

我们可能用过画图这一软件来调过颜色。 通过简单的设置红色,绿色,蓝色的数值,就可以在调色板中得到一个颜色。有没有注意到,无论红色,还是绿色,还是蓝色,其表示的数值都没有超过255。 为什么?因为像素值,在计算机语言中,是用一个 int8 的数据来表示的。而 int8,指的是 8bit 无符号整数,其能表示的范围就是 0 - 255。 说到这,我们就可以算一算,一张1920 * 1080 的RGB图像,在计算机的表示中,到底占多少的内存? 很简单,长宽方向上每个像素由 3 个通道组成,每个通道由一个 8 bit 的数值表示,一个 8 bit 数值代表一个字节(Byte)。 因此,一张1920 * 1080的 RGB 图像,占计算机存储大小为1920* 1080 * 3 * 1 Bytes = 6075 KB = 5.9 MB5.9 MB 的内存占用! 大么?和目前动辄几个G的手机内存相比,不算大。 小么?和边缘侧图像识别终端内存,比如摄像头里的嵌入式芯片内存相比,又不算小。 更何况在公路违法拍照的摄像头场景下,在车流量很大的时候,需要实时处理的图片,可远远不止一张! 那怎么办?有没有办法可以在进行图像处理时,减少图片的数据量,从而减少图片大小和内存占用呢? 有,YUV就是其中一种办法。

YUV

YUV是将亮度信息和颜色信息进行编码的一种颜色空间表示方法。和RGB类似,YUV 也使用3个字母维度来表示颜色。为了简单点,我们暂时将这3个值称为Y,U和V。(事实上,YUV的称呼很多,比如Y'CbCr,也很细节,这里不多描述,我们只要知道它是另外一种表示颜色的方法就可以。) Y 代表亮度,U 代表色彩度,V代表饱和度。 原图

图片
图片

仅有Y分量也就是亮度,黑白图片

图片
图片

仅有U分量,只有色度

图片
图片

仅有V分量,只有饱和度

图片
图片

上面的几张图片,除了原图之外,我们可能更加倾向于使用只有Y分量的图片,也就是那张黑白图像。
因为即使没有色彩,但是它的轮廓以及明亮程度,也足以让我们分辨出图片中的物体。其视觉效果远远好于其他两个分量的图片。相反,只有色度和饱和度的图片,反而变得模糊不堪。
这就是问题所在!人眼对于亮度具有更高的敏感度,而对色度和饱和度反而显得迟钝一些。
说到这,有没发现什么?既然人眼对于色度和饱和度的反应不敏感,那就没有必要把所有的色度和饱和度信息都放在图片里了啊。
举个例子,色度和饱和度我隔一个像素放一个,剩下的像素没有饱和度,不就可以了么。没错,是可以,而且效果很好。
这就是YUV的不同编码。

图片
图片

YUV422编码
实际上,YUV的编码方式有很多种,比如YUV444, YUV422等。
大致意思就是,保留全部的Y分量(人眼最敏感的亮度分量),但是只保留部分的U/V分量(人眼不敏感),以此来减少图片的占用,但又不失重要信息。
还记得上面的19201080的RGB图片的内存占用么,为5.9MB。如果用YUV444的编码,结果也同样是5.9MB,因为YUV444也是全采样,所有的亮度、色度、饱和度信息都保留了。而如果采用YUV422的编码,相当于U分量减少一半,V分量减少一半。
那么最终的图片占用大小就变成了1920
1080 * (1 + 0.5 + 0.5) Bytes = 4050KB = 3.9MB
只有3.9MB,减少了1/3的内存占用!是不是好很多?更多关于YUV的编码知识,有兴趣的同学可以Google。如果不做相关课题,可以不用深究。
我们只需要知道,YUV这一色彩编码方法,在保留亮度这一人眼最敏感信息的基础上,通过降低其他人眼不太需要的信息,可以来达到降低图片大小的目的。
就足够了!

YUV编码的用途

原始图片,channel数代表的是RGB通道,可以理解为原始图片具有的三个特征。 可在深度学习网络中,随着网络深度的增加,图片的channel数会不断的增大。就拿Resnet50这个网络来说,最后面的一层图片,channel数已经增大到了2048。这时channel代表的信息,早已不再是RGB这种基础的特征了。而是通过了大量的神经网络训练,代表了图片的多种分类特征,比如是猫的特征还是狗的特征。 这个后面会详细说。 YUV这种编码方法,可以用在图片的上下采样中。通过降低或增加通道数,实现图片的上下采样,以此来实现图片的增大或减少,但又不损失太多我们希望保留的信息。

总结一下

这章聊了聊RGB、YUV 两种颜色空间,以及YUV可能的用途和它的优势。 为什么聊这么多关于图片的东西,因为在深度学习处理图像的任务中,图片是原材料。正所谓知己知彼,百战不殆。 了解了图片这一深度学习的原材料之后,我们就可以更加高效的来完成图片数据的处理和分析。就可以开始图像识别的算法之旅了!

加餐

公元663年,唐代诗人王勃游历南昌,登滕王阁而做序,大笔一挥,豪气万丈。 当时的王勃,傲立在滕王阁楼顶时,看到的应该是怎样的一副壮美图景,才使得中国文坛留下了一句千古绝唱。

潦水尽而寒潭清, 烟光凝而暮山紫。

当时的王勃,应该怎么也不会想到,1000年后的今天,聪明华夏后人,将"暮山紫"这一颜色进行了编码。从此,暮山紫,不只存在于人们的想象中,而是精确地存在了计算机里。

图片
图片

暮山紫-RGB:163 171 214 |

参考文章

后续内容 -> 初识卷积
知乎

本人时间精力能力有限,也是刚开始学习这方面内容,准备参赛

文中一些表述难免有疏漏,若有错误请联系我进行更正,谢谢

QQ Email邮箱:1795847863@qq.com

  • Title: 深度学习-神经网络模型
  • Author: 白糖
  • Created at : 2023-05-25 20:17:12
  • Updated at : 2024-07-08 10:10:53
  • Link: https://zhsugar.github.io/2023/05/25/深度学习-神经网络模型/
  • License: All Rights Reserved © 白糖
Comments
On this page
深度学习-神经网络模型