第十二章:深度学习-图像识别

深度学习-图像识别

人脸定位

  相信你们外出游玩的时候,都不会带上你的牛逼plus诺基亚手机出门,而是带上你的智能手机给自己美美的拍上一张。当你用手机镜头对准人脸的时候,都会出现一个矩形框,如下图所示(前方高能),那么这个技术是怎么做到的呢?

  相机中的人脸定位技术用的是二分类技术。该技术流程如下图所示。

  如上图所示,相机首先会将照片分割成一块块的图像块,一张照片往往会有成千上万的图像块被切割出来。

  然后每一个图像块都会经过人脸分类器去判别是否是人脸。人脸分类器是预先训练好的分类器,类似于我们之前讲的手写数字识别应用程序中的支持向量机分类器。如果人脸分类器预测该图像块为人脸,相机则会在这个图像块中显示出框的位置。

  在人脸定位中,为了解决由于手机离人的距离不同,导致手机上显示的人脸大小不一致的问题。手机在切割图像的时候,并不是只用一种尺寸的图像块切割图像,而是有从小到大很多尺寸的图像块,因此保证了图像块切割图像时能涵盖几乎各种大小的人脸。

  由于相机使用不同尺寸的图像块判别图像块是否为人脸,因此会导致不同尺寸、不同位置的图像块可能同时都被判别为是人脸,因此会有很多重叠框。对于该问题,通常在后期使用后处理融合技术,将这些框融合为一个框。

手工提取特征的图像分类

识图认物

  在我国古代的时候,人们就对识图认物有了一定的认知。《史记》中曾记载:赵高指鹿为马;《艾子杂说》中记载:有人欲以鹘(hú,鹰属猛禽)猎兔而不识鹘,买凫(fú,鸭子)而去,逼凫捉兔,成为笑谈。

  如今千年之后深度学习技术,可以让避免让我们成为识物盲?

传统分类系统的特征提取

  曾经讲到鸢尾花分类的时候,我们给出了分类任务的两个核心步骤:特征提取和特征分类。如下图所示。


  上图我们为了减少麻烦,所以我也直接给出了手工提取特征的图像分类的过程,从图中可以看出在图像分类过程中,我们主要停滞在了特征提取的步骤,我们该如何提取图像的特征,提取什么特征呢?如果要解决上述问题,我们首先需要把自己看成计算机去看图像。

计算机眼中的图像

  图像在计算机中的表示如下图所示。

  如上图所示,如果将一副计算机眼中的图放大,我们可以看到一幅图像在计算机眼中就是一个由数字组成的矩形阵列,即矩阵,也正是如此图像才可以存储在计算机中。对于矩阵内的每一个元素,我们称之为像素;而矩阵的行数和列数,我们称为分辨率。我们经常说的1280×720分辨率,值得就是这张图由1280行、720列的像素组成的。反之,如果我们给出一个数字组成的矩阵,然后将矩阵中的每个元素转换为对应的颜色后,并在电脑屏幕上显示出来,既可以复原出这张图像。

  细心的同学会发现矩阵中的每个元素都是介于0-255之间的整数。对于上图所示的黑白图像,由于只有明暗的区别,因此只需要一个数字就可以表示不同的灰度,通常我们使用0表示最暗的黑色,255表示最亮的白色,所以矩阵的每一个元素都是介于0-255之间的整数。

  如上图所示,现在我们最常看到的是彩色图像,彩色图像由于使用(R,G,B)三个数字表示一个颜色,他表示用红(R),绿(G),蓝(B)三种基本颜色叠加的颜色,并且三种颜色也都是介于0-255之间的整数。由于使用三种基本颜色叠加成颜色的明亮程度,如(255,0,0)表示纯红色、(136,200,255)表示天蓝色,所以一般一张彩色图像,需要使用一个由整数的立方体阵列来表示,这样的立方体阵列我们称之为三阶张量。这个三阶张量的长度与宽度即为图像的分辨率,高度为3。对于黑白图像,他其实是高度为1的三阶张量。

什么是图像特征?

  如今我们已经了解了计算机眼中的图像,但是仅仅了解了图像并没有用。如果现在在你眼前有猫、小鸟和树叶,我们可以想想,我们人类是如何对图片分类的。

  通过上图,我们很容易得出下表,通过“有没有翅膀”和“有没有眼睛”这两个特征对猫、鸟、和树叶分类。如:没有翅膀有眼睛的是猫、有翅膀又有眼睛的是鸟、没有翅膀没有眼睛的是树叶。

特征 树叶
有没有翅膀 没有 没有
有没有眼睛 没有

  由于图像在计算机眼中是一个三阶张量的东西(黑白图像是特殊的三阶张量),所以计算机并不知道图像中的物体有没有翅膀、有没有眼睛。很早之前为了让计算机认识翅膀、认识眼睛,人们通常手工设计各种图像特征,如:设计翅膀图画的颜色、边缘、纹理等性质,然后结合机器学习技术,达到物体识别的目的。

  由于图像在计算机眼中可以表示为三阶张量,从图像中提取特征,即对这个三阶张量进行运算的过程。其中我们最常用的运算是卷积。

卷积运算

  卷积运算目前在图像处理中有着广泛的应用,他如我们熟知的加减乘除一样也是一种数学运算。只是参加卷积运算的是向量、矩阵或三阶张量。

  如上图所示,两个向量的卷积仍然是一个向量。他的计算过程如上图所示:

  1. 我们首先将两个向量的第一个元素对齐,并截去长向量中多于的元素,然后计算这两个维数相同的向量的内积,并将算得的结果作为结果向量的第一个元素。
  2. 我们将短向量向下滑动一个元素,从长向量中截去不能与之对应的元素,并计算内积作为结果向量的第二个元素。
  3. 重复“滑动-截取-计算内积”这个过程,直到短向量的最后一个元素与长向量的最后一个元素对齐为止。

  卷积结果的维数通常比长向量低,因此有时候我们为了使得卷积后的结果向量与原始长向量的长度一直,会在长向量的两端补上一些0.对于如上图所示的长向量$(5,4,3,2,1)$,我们可以将其两端补零变成$(0,5,4,3,2,1,0)$,之后再进行卷积运算,得到结果向量为$(0,22,16,10,0)$。

  通过向量的卷积运算,我们可以定义矩阵的卷积运算,对于两个形状相同的矩阵,他们的内积是每个对应位置的数字相乘之后的和,如下图所示。

  进行向量的卷积时,我们只需要朝着一个方向移动;进行矩阵卷积时,我们通常需要沿着横向和纵向两个方向滑动,如下图所示。

  定义矩阵的卷积之后,类似的也可以定义三阶张量的卷积,如下图所示。进行三阶张量的卷积时,当两个张量的通道数相同时(下图的图像和卷积核都为两通道),滑动操作和矩阵卷积一样,只需要在长和宽两个方向进行,卷积的结果是一个通道数为1的三阶张量。

# 卷积计算
import tensorflow as tf
sess = tf.InteractiveSession()
input_x = tf.constant([
[
[[0., 2.], [8., 0.], [6., 8.], [6., 6.]],
[[1., 9.], [2., 2.], [0., 4.], [8., 8.]],
[[4., 6.], [2., 4.], [3., 2.], [0., 3.]],
[[6., 3.], [4., 1.], [2., 2.], [3., 3.]],
]
], shape=[1, 4, 4, 2])
kernel = tf.constant([
[
[[1.], [0.]], [[0.], [-2.]],
[[0.], [2.]], [[-1.], [0.]]
],
], shape=[2, 2, 2, 1])
conv2d = tf.nn.conv2d(input_x, kernel, strides=[
1, 1, 1, 1], padding='VALID')
(sess.run(conv2d)).reshape(3, 3)
array([[ 16., -4., -6.],
[ 7., -1., -12.],
[ -2., -2., -2.]], dtype=float32)

利用卷积提取图像特征

  卷积运算在图像处理中应用十分广泛,许多图像特征提取的方法都会用到卷积。以灰度图为例,灰度图在计算机的眼中被表示为一个整数的矩阵。如果我们使用一个形状较小的矩阵和这个图像矩阵做卷积运算,就可以得到一个新的矩阵,这个新的矩阵则可以看成是一副新的图像。通过卷积运算得到的新图像有时候比原图更清楚的表示了某些性质,我们就可以把他看成原图像的一个特征。而这里使用的小矩阵称为卷积核。

  通过卷积,我们可以从图像中提取边缘特征,所以在没有边缘的比较平坦的区域(物体内部),图像像素值的变化较小;由于0偏暗、255偏亮,而横向边缘两侧(物体侧边的两侧)的像素差异明显。如下图所示,我们利用了卷积核分别计算了原图像上每个3×3区域内左右像素或上下像素的差值(为了将运算结果以图像的形式展示出来,我们对运算结果取了绝对值)。

  上图我们使用了三列1、0、-1组成的卷积核与原图像进行卷积运算,可以从图像中提取出竖向边缘

  上图我们使用了三行1、0、-1组成的卷积核,从图像中提取出了横向边缘。

基于神经网络的图像分类

传统图像分类系统和深度神经网络

  上一节,我们学会了如何手工设计图像特征,通过手工设计特征的过程可以发现手工设计图像特征是非常慢的,甚至有时候手工设计的图像特征毫无意义,因此导致图像分类的准确率曾经在一段时间内达到瓶颈。

联系管理员微信tutu19192010,注册账号

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 沪ICP备2022009235号 沪公网安备31011802005110号 青浦区尚茂路798弄 联系方式-13697081366