卷积神经网络在图像识别领域无限风光,通过一张图片,算法可以知道图片上的物体是什么,着实令人震惊,但是很多人和我一样,对于其背后的原理,都非常好奇,卷积神经网络是如何进行图像识别的呢?
如果你的英文主够好的话,可以阅读这篇论文:
Visualizing and Understanding Convolutional Networks
猫应该长成什么样子
看过女神李飞飞的ImageNet演讲的人,都对于下面两张图片印象深刻。
原文请阅读:
ImageNet缔造者:让冰冷的机器读懂照片背后的故事
(从薛定谔开始,猫就一直被各种科学家拿出来说事情,当然汪星人也时不时出镜)
人类是如何识别猫咪的?借用知乎的一个回答:
现在假设要做一个图像的分类问题,比如辨别一个图像里是否有一只猫,我们可以先判断是否有猫的头,猫的尾巴,猫的身子等等,如果这些特征都具备,那么我就判定这应该是一只猫。当然,如果图像是下面这样一只老实本分的猫咪,则一切都好办了。
但是喵星人不但品种不同,颜色繁多,各种销魂的动作也层出不穷,所以,机器识别猫还是很困难的。
这样,我们必须要让机器知道,猫,到底应该长成什么样子。
想象中的图形识别原理
第一次考虑怎么处理这个问题,一个很自然的想法浮想在脑海里面:
将所有猫咪的图片放在一起,提取出猫咪的共同特征,做成一个识别猫的模型。然后对于每张图片,使用模型,看一下是猫的概率为多少。但是如果真的这样做的话,可能每种物体都必须要有一个专门的模型了,这样可能是不行的,计算量可能也是一个问题。特别对于扭曲的猫,这样子的例子非常难处理,我们不太可能穷举出所有猫的正常和非正常形态。(毛色,眼神,是否有物体和猫进行交互)
当然,可以考虑,将猫进行分解,就如知乎网友所说,猫头,猫尾巴,猫爪子,独立进行识别。这样不管猫怎么扭曲,都无所谓了。当然,如果你是资深猫奴,你可以很高兴的说出猫的组成特征,但是,这样本质上还是加入了太多的领域专家的干涉。如果要识别大型粒子加速器,这个是不是要请物理学家参与呢?所以,机器应该完全屏蔽领域知识才可以做到泛用。
CNN学到了什么?
特征(Representation)。把原始图像看做一个维度是像素×通道的向量,经过各种复杂的CNN结构,其实只不过成了另一个向量。这个向量所在的空间也许有更好的线性可分性,也许是相似样本的“距离”更近,原始的数据经过变换到了这里之后,就是特征。
图像处理矩阵
虽然不是科班出身,但是以前或多或少看过一些图像处理的书籍。
一般的图像处理都是通过矩阵操作完成的。
- 位置和形状 : 例如图像的拉伸,缩放,旋转(当然可以是各种效果的组合)。
- 颜色: 灰度调整,透明度,滤镜
具体的颜色矩阵文章:
C++图像处理 -- 颜色矩阵变换
其实我认为卷积核这个概念,应该是从图像处理矩阵这个概念来的。通过不同的图像处理矩阵,可以突出图像的某些特征,屏蔽掉某些细节。
处理后的图片,屏蔽了颜色,突出了轮廓特征。(猫的轮廓特征保留下来了,颜色特征暂时消失了)
不同卷积核得到的不同的feature map
当然,实际处理的时候,可能使用的卷积核可能更加复杂。不过,如果真的看一下卷积核的工作方式,一般来说,卷积用来进行特征的提取,而不是进行图像的预处理的(或者说,是将图像针对特征进行压缩的一个过程)。
主流图像识别
上面所说的都大半是猜测,无论如何也应该看一下真实的算法到底是怎么样的。图像识别上最有名气的算法大概就是Inception模型。整个算法的架构大概是这样的,深度也是叹为观止。(当前ResNet神经网络已经152层了,计算量相当相当相当可怕)
原始图像经过了深深的流水线之后,最后在Softmax层进行分类。这个过程中到底发生了什么事情,图像在Softmax层变成了什么,这个可能是所有人都关心的问题。本文也想通过长期的研究,能或多或少搞清楚里面的奥秘。这个过程应该是极其艰苦的,非常困难的。但是对于机器学习的思考却非常有帮助。