人工智能首页 > 深度学习 > 正文

深度学习:图像分类

2018-07-13 阅读238次

image.png

在这篇短文中,我们介绍一下深度学习在图像识别领域的应用。我们不会涉及深度学习的理论知识,而是和大家简单分享一下深度学习如何将图像分类规范成一个数学问题,图像数据有哪些特点,深度学习又是怎样利用了图像数据的特点。

随着图像采集设备的飞速发展,获得图像类型数据的成本越来越低。大家可以想象一下,自己的手机就完全替代了以前的数码相机,并可以采集图像数据。在第一章数据价值中就已经讨论过,图像是一种数据。

图像是如何被数字来表示的呢?例如下图中,左边展示的是手写阿拉伯数字3的照片,它的像素是28*28,右边就是其数字化表示,对应着一个28*28的矩阵:如果原始图片中的像素是纯黑色,那么在右边的矩阵中取值为0(未打印出来),否则就在矩阵的对应位置填上1。一张彩色的图片,通常由RGB三原色混合而成,故也只需要3张对应大小的矩阵即可数字化表示。计算机就是这样“看到”一张图片的。

图像数据和传统数据有些不同。传统数据里,总可以用一个向量来表示一条观测;而在图像中不得不使用一个矩阵。传统数据中,每一个维度都有其具体明确的含义,例如一辆汽车的自重、油耗、最高时速等,或者人类基因组表达数据中的每个基因;而在图像数据中,每个像素自己似乎不具有什么特殊的含义,往往需要一大片像素点放在一起才有含义,并且把图片中的某一部分平移一些、旋转一下,似乎并不影响图像的含义,但其对应的矩阵会因平移和旋转产生天翻地覆的变化。

首先,小朋友们会看到水果卡片,这是人眼完成的工作。人眼具有很多神奇的机制,机器至今还无法匹敌,但机器自己也有“看见”图片的方法。机器把图片也当作数据。对于小朋友来说,看到了水果图片,会记住水果的一些特征,例如:橙子是橘黄色的;西瓜是外面绿色,里面红色;草莓的表面不光滑等。也就是说,每个水果都具有自己的特征。只要记住了特征,就能容易地分辨出水果。同样地,机器也需要一些特征来区分图片。例如,判断一张图片是不是人的肖像,一定有一些小区域中包含人的眼睛,这些区域的颜色会深一些,而包含皮肤的区域颜色会浅一些。这样处理之后,所有肖像都有一些共同特征(包含眼睛和皮肤),而风景图片则不会有这些特征,这就能让机器成功的区分肖像和风景。因此,机器在做图像分类的时候,常常会将图片分成多个小块,用每个小块中的颜色的直方图来作为输入。

这么做的原因在于认为不同物体的形状颜色都会有所不同,所以在每个小块中,色彩的分布也应该是不同的。那为什么不用原始的像素直接做输入呢?因为原始的像素差异太大了,同样是肖像,相同位置的像素也可能差异很大,分类的困难度也就大大提升。将图片分隔成小格子,看每个格子里面颜色的分布情况,这是人类教给机器的特征。这种方法可以教会机器做图片分类,但是机器的表现并不好,人类很容易区分的图片,机器还会经常犯错误。因此需要检讨这种人类教的特征选择方法。

那么,小朋友们是怎么得知水果特征的呢?有人说,水果的特征都是爸爸妈妈们教给小朋友的。事实可能并非如此,实际生活中,当小朋友们还不能理解颜色和形状的概念的时候,却已经可以分辨出不同的水果。这说明,小朋友可能不需要别人来教他怎么样分别水果,他自己就能总结出区分水果的经验。每个小朋友区分水果的方法都不一样。例如要区分橙子和橘子,可能很难通过一些语言规则说出来,但现实生活中大部分人都能成功区分这两者。

深度学习领域的卷积神经网络(CNN)就是不告诉机器用什么特征来分辨图片,而是给机器看很多很多的训练数据, 让机器自己想办法总结一些特征出来。

下面将详细介绍机器怎么“自己总结一些特征出来”。这部分内容技术细节比较多,对这方面不感兴趣的读者可以跳过,只需要理解,深度学习方法可以让机器根据数据自动估计出一些特征,这些特征可以是均值、方差、直方图,甚至是任意的一种线性组合。


深度学习之卷积神经网络


回想一下上文提到的基于小块图片中直方图的人脸识别方法。为什么要做直方图?因为要总结一小块图片的像素信息,像素层面的表现不稳定,但一块区域的直方图(或者其他统计量)是稳定的,这是一种总结概括。为什么要分小块?因为对整个图片的总结概括(直方图)太强了,可能会导致人脸和某种风景画的直方图长得一样。那么问题来了,既不能过度总结概括,又不能不总结概括,那到什么程度最好呢?再者说,可以用直方图来总结概括,为什么不用方差来总结概括?为什么不用狗熊®统计量来总结概括?为什么不用直方图+方差+狗熊®统计量一起总结概括呢?

直方图是一种特定的统计量,方差也是,这种统计量是自己确定的。为什么直方图能帮助做图像分类,而方差不能呢?因为这是经过大量实践后的结论。那数据能不能直接告诉机器应该用什么统计量好呢?下面引出卷积的概念。


卷积


简单地说,卷积与分块看直方图差不多,卷积就是看每一块的加权和,这个加权和的权重是一组参数,是根据数据学习出来的。例如,下面这幅图展示了怎样做卷积(加权和)。这里考察的小块是3*3大小,数据说了,中间3*3矩阵这种加权方法最好,这个3*3的矩阵就叫做卷积核,原始图片的3*3的小块与卷积核对应位置相乘,最后再相加就得到了一个实数,用这个实数总结原始图片3*3的小块的信息。例如下图,对于原始数据左上角的3*3小块,对它的概括总结就是-8。移动这个3*3的观察窗口(卷积核),就可以得到一个新的矩阵,它是做了一步总结概括之后的矩阵。

有的读者可能会想,这么一种奇葩的总结概括的方法可靠吗?它为啥会比直方图还好呢?单独一种总结概括可能确实没有直方图总结的好,不过,同样的事情做100次,用100种不同的卷积核,可以得到100个角度的总结概括,实验结果表明,这种卷积的方法比绝大多数人为设计的方法都要好。例如,经过下图中间的卷积核计算出来的总结概括的图片(左图)实际上就是原图(右图)的轮廓。

一种特定的卷积核可以计算出图片的轮廓,另一种卷积核能够计算出图像的明暗程度,有了足够多的卷积核,就能形成对原始图片的各种各样的概括。下图展示了某个CNN的96种卷积核的可视化。从中发现,前面的卷积核的形状都是一些线条,实际上,这些卷积核都在捕捉原始图片中不同走向的线条。后面的卷积核是彩色的,这些卷积核在捕捉图像中的颜色信息。需要注意的是,这些卷积核都是通过数据学习出来的,不是人为设定的。

直方图方法中,做一次总结就直接变成向量做分类了。在深度学习中,还要做得更“深入”。从上图可以发现,对于一种卷积核,就能生成一幅总结概括后的“图像”,如果一个像素一个像素地移动卷积核,不考虑边缘因素,这幅卷积核处理过的图像和原来图像一样大。100种卷积核就有了100幅处理过的图像,这100副卷积核处理过的图像,叫做深度学习中的一层。对于每一张新图,还可以继续用10种新的卷积核来处理,就有了第二层,这一层一共有100*10 = 1000种总结概括的图片。还可以有第三层,第四层……

这就是最最最基本的深度学习(深层卷积网络)处理图像数据的思想,它还有很多技巧用来提高表现,例如对数据的归一化处理,激活函数的选择,池化层(pooling)的加入,dropout技术的加入,还包括例如ResNet等大型精心设计的网络结构等。


卷积神经网络总结


深度学习做图片分类有什么要求呢?第一,深度学习要有足够的图片。也就是说,要看到各种各样的水果,水果的种类要多,每种水果的图片也要多,需要不同角度,不同光照,不止要看到水果外形,还要看水果切开是什么样。

没有足够的数据,深度学习就不可能有让人满意的表现,例如,人们不能通过上面的图片来预测下面这张图是什么水果,因为数据集中没有这种水果的被标记好的训练数据。

介绍完了深度学习中的明星选手CNN的简单原理,再来看看它在实际应用中的案例。

深度学习图形分类

小朋友认识水果以后可以吃,机器认识图片能够做什么呢?用处有很多,例如无人驾驶需要认出其他汽车来,手机拍照需要圈出人脸来。这里分享一个应用场景:搜索引擎的搜图功能。之前,在搜索引擎中搜索图片都是依赖网页中图片附近的文字,但通过文字来匹配图片可能很不精确。例如,在百度搜索关键词“太阳”,会搜到下面这幅图片。这是一幅少儿漫画,图片的周围出现了“太阳公公早”。

如果可以对搜集到的图片进行分类,为图片打上标签,那么搜索结果的质量就会大大提高,搜索太阳就应当出现真正的太阳图片。(当然由于计算资源的限制,这一点不大可能再短期内完成,理想的状态是:当搜索引擎爬虫看到了没见过的图片,就对其做一个分类,这样的搜索引擎就会更加智能。)

这个过程说白了就是要对图片作出正确的分类。如何通过CNN完成这个任务呢?这里定义因变量Y为图像所属的类别,自变量X为大量带有标记的图像,使用的模型是卷积神经网络。

CIFAR-10

我们最后再来简单看看深度学习的应用,看看深度学习可以智能到什么程度。用深度学习处理实际问题时,往往需要极其庞大的运算资源以及相当长的等待时间(几天到十几天都是正常的)。所以,人们在研究学习时,常常使用一些标准的比较小的数据集。这里展示CNN在CIFAR-10数据集中的表现。CIFAR-10是由Hinton的两个大弟子Alex Krizhevsky、Ilya Sutskever收集的一个用于普适物体识别的数据集。Hinton相当于深度学习领域的武林盟主级别的人物、深度学习的先驱、号令四方的大BOSS。所以CIFAR-10也非常非常流行。下面看看这到底是什么数据。

CIFAR-10有60000张图片,10个类别,每个类别6000张,包括飞机和鸟,猫和狗,船和卡车,鹿和马等等,CIFAR-10的一些例子如下。其实,CIFAR-10的图片尺寸非常小,只有32*32像素,这是什么概念呢?微信聊天表情的小黄脸是50*50像素的,CIFAR-10的图片比微信表情的图片还要小。为什么要用这么小的图片呢?因为CNN是逐个像素来处理的,这么小的图片也有1024*3个输入数据(因为色彩三原色)。现在的手机动辄几千万像素,这样高清晰的图片是神经网络处理不了的,必须要做下采样,也就是将图片的清晰度变低。

训练深度学习网络可以理解成让计算机不断尝试深度学习网络的参数,也就是神经网络的卷积核的参数。神经网络的参数可能有一百万个以上。训练的过程就是每一步微微调整一下参数,看看损失函数的值有没有降低。上图每一个Generation就是电脑调整了一下参数。调整的方法就是梯度下降,以及各种各样的梯度下降。训练过程会持续几个小时,一般等到测试集的准确率不再上升了,基本就可以停止训练了。训练模型可以让识别的准确率最终达到75%左右。模型会犯一些什么错误呢?例如:指鹿为马,把狗的头部照片当成青蛙,把鸟的头部当成青蛙。

简单的CNN可以做一些改进,CIFAR-10可以达到85%甚至90%以上的准确率。人类在这个图像分类数据集上的准确率大概是94%。深度学习在整个图像识别的领域已经很接近人类的表现了,在一部分领域如人脸识别甚至表现的比人还好。当被标记的训练数据足够多,就能构建一个不错的图像分类数据集,从而帮助改善搜索引擎的搜索结果了。


随意打赏
WeixinPathErWeiMaHtml
ZhifubaoPathErWeiMaHtml