引言
近年来,图像识别和人脸识别已经逐步进入我们的生活。今天我们就来聊聊图像识别的技术–卷积神经网络(CNN)
一、图像识别
图像识别是指让计算机通过学习识别出图像的内容或者内容所属种类,比如识别图像中有没有汽车,识别图像中的人是谁等等。
1.1 图像的计算机表示
图像是通过一个个像素组成的,图像有宽和高,比如宽度 200 像素,高度 100 像素。
每个像素都有颜色,如果是灰色图像,只需要描述其灰色深度即可,比如 233,我们说用一个通道来表示。
如果是彩色图像,一般用 RGB 三元组颜色,也就是每个像素的颜色表述为 R,G,B 三种不同的深度,比如 {R: 100, G: 200, B: 80},我们说需要三个通道来表示。
所以表示一张图像需要三个信息:
- 宽:W
- 高:H
- 通道:C
通道的理解:彩色图像可以想象成三张同样宽和高但颜色分别为 R,G,B 的图像的层叠,所以通道是 3,而灰度图像只需要一个灰度通道。
1.2 图像识别的难点
我们已经学过深度神经网络(DNN), 那是否可以用深度神经网络识别图像呢?理论上是可以的,但是运算速度慢,效果不太理想,主要是图像识别有一些难点。
- 难点一:数据维度过多,内存压力大
- 一张宽和高都是 64 个像素的小图像维度数:64*64*3 = 12288
- 一张宽和高都是 1000 个像素的小图像维度数:1000*1000*3 = 3000000
- 如果隐藏层有 1000 个节点,那么 W 矩阵的维度就是(1000, 3000000)
- 要学习的参数太多,计算机内存压力太大
- 难点二:如何快速识别图像描述的特征
- 人眼看图像可以很容易看到图像内容的线条、轮廓并过滤无关信息
- 如何让计算机有目的的识别线条和轮廓并过滤无关信息
二、卷积神经网络
面对图像识别的困难, 科学家们经过不懈努力。研究出了有效解决图像识别这两个难点的算法–卷积神经网络(CNN)
卷积神经网络的核心有个:卷积 和 池化。
其中卷积解决识别线条、轮廓和局部特征的问题,池化解决图像维度过多的问题。
2.1 卷积:识别图像局部特征
卷积运算是将图像通过卷积核运算识别出另一张图像的过程。
卷积层可以有目的的学习线条、轮廓和局部特征, 解决难题二。
2.1.1 卷积核与卷积运算
- 卷积核(kernal): 一个 (f*f) 的矩阵,又称为过滤器(filter)
- 卷积核的计算:卷积核每次覆盖图像的一个区域,对应元素相乘再加和作为输出,卷积核依次遍历图像的每个区域生成的输出组成一张新的图像
如果原图像大小为 (n, n), 卷积核大小为 (f, f), 则卷积后图像大小为 (n-f+1, n-f+1)
( n , n ) ∗ ( f , f ) = ( n − f + 1 , n − f + 1 ) (n,n) * (f,f) = (n-f+1,n-f+1) (n,n)∗(f,f)=(n−f+1,n−f+1)
2.1.2 Padding
我们发现,卷积之后图像变小了,如果想保持图像不变,可以像下图那样在原始图像周围填充 0,每侧扩充 p = f − 1 2 p = \frac{f-1}{2} p=2