本文是Deep Learning Specialization系列课程的第4课《Convolutional Neural Networks》中Object Localization部分的学习笔记。
主要是在图像分类的基础上,今一定定位出对象的位置并输出,已完成图像识别。具体包含:
- 对象定位的输出
- 特征点检测
- 滑动窗口检测及其卷积运算
- YOLO算法
- IoU
- Non-max Suppress
- Anchor box
- R-CNN算法
1 对象定位
前面我们学习的数字识别、猫识别等都属于计算机视觉中的图像分类,即只需识别出图像中有什么。
在图像分类的基础上,我们更进一步,把图像中对象的位置也标记出来,这就是对象定位(Object Localization),即识别出图像中有什么并且在什么位置。
下面先以简单的例子开始,在下面的图像识别中,包含两类输出:
- 分类,比如是车、行人、摩托车还是背景
- 位置,对象矩形的中心点坐标X、Y,矩形的高度、宽度
这里的位置需要做一些说明,其实以图像左上角为(0, 0),右下角为(1, 1)。在确定位置时,则是以对象所在图像中的比例标示出来。下图中车的中心坐标为(0.5, 0.7),高度为0.3,宽度为0.4。
在上面的例子中,其最后的输出是包含8个参数,其中第一个参数是判断图像中是否包含所需物体,这与前面学习到的分类一样。
后面的输出则分别是位置和具体的分类。
这里是非常重要的,如果为0,那么后面的7个参数具体是什么就不用关心了。在计算损失函数时,
- 若为1,
- 若为0,
Landmark Detection
Landmark Detection是把一些重要的特征点给识别定位出来。比如说通过识别身体上的各个关节来进行人体姿态的识别,或者通过识别眼角点或者脸部的特征点来进行眼睛或脸部识别来加上头冠等。这里的输出就不是一个点的位置了,而是很多特征点的位置。
2 对象识别
下面来学习一下如何来实现对象识别。
滑动窗口检测
用一些图像作为训练数据,以卷积运算来进行图像的分类,再把该结果应用在要要识别的图像中。
先是选取一定大小的矩形,来通过卷积运算的方法遍历整个图像,若有发现对应的物体即标记出来。之后再用不同尺寸的矩形继续对图像进行遍历以识别并标记出物体。这种方法称为划动窗口检测(Sliding Windows Detection)。该方法比较简单、易于理解,但是该方法由于是通过不同尺寸的矩形独自的进行运算,整个过程需要进行大量的运算,效率非常低。
滑动窗口的卷积运算
那么,如何通过卷积运算的方式来实现滑动窗口检测呢?我们可以把全连接层转换为卷积层(可以通过1*1的滤波来实现)。
比如说,训练时卷积运算使用的是包含3个通道的14x14图像,经过卷积运算后,得到的是一个1x1的卷积层。
❓下面是一个难点,后续还需继续来学习。❓
此时假设测试图像是包含3个通道的16x16图像,然后用训练时的14x14图像来进行识别,假如步长为2,那么需要移动14x14图像四次来完成检测,这里我们可以发现这4次检测中有非常大的重叠。对测试图像进行卷积运算,最终将其变为2x2的输出层,此时左上角仍是对应原14x14图像对应的区域,这里进行的4个区域的运算都是共用一个卷积运算。
相对普通滑动窗口一个区域一个区域的计算,对滑动窗口的卷积运算是对整个输入图像进行计算。
3 包围盒的确定
YOLO算法
在实际情况中,物体的形状是不同的,并且可能包围盒并不能很好的与物体匹配上。因此,我们就需要考虑如何让这个包围盒更准确些。这里引入YOLO (You Only Look Once) 算法,该算法是Joseph Redmon等人2015年于《You Only Look Once: Unified, Real-Time Object Detection》提出的。
YOLO算法是把输入图像划分为不同的格网,然后以每个格网为单元来来识别对象。
比如下图是把输入图像划分为9个格网,分别计算每个格网的输出y,包含预测值,矩形位置和大小,以及物体的分类等8个参数。这里输入是的图像,经过卷积运算和池化运算,输出的是的卷积层。
这里物体包围盒的位置依旧是以格网为基准,即每个格网的左上角为(0, 0),右下角为(1, 1),xy永远是在0-1之间的。但是包围盒的宽度和高度就不同了,它可以超出当前的格网。
IoU
包围盒与物体所在的实际位置不会那么精确,那么我们怎么来进行位置识别精度的评价呢?这里需要引入一个IoU (Intersection over Union) 的概念,即预测的包围盒与实际的矩形框的交集与并集的比例,一般如果IoU大于0.5(这是人为定的一个指标)则说明精度是符合要求的。
Non-max suppress
当我们选用更密的格网时,比如说的格网,会发现很多格网都会包含所要识别对象,此时就要做一个选择了,这里比较简单,即选择IoU最大的包围盒。
具体的算法是:
- 计算每个格网的输出,这里是,位置、尺寸和分类
- 舍掉的格网
- 然后从剩下的格网中选择值最大的格网作为预测值
- 将上下的的格网也丢弃❓
Anchor box
前面讲到的都是格网中有一个对象的情况,假如想要检测在一个格网中的多个对象呢?此时就需要用到Anchor box。
针对要检测的对象,根据其已有的形状来定义Anchor box,并将其作为y输出。这里除了需要知道包围盒的中心点位置外,还需要通过计算形状与Anchor box的IoU来最后的结果。
最后将上面的训练、预测和应用non-max方法合起来就是YOLO算法的实现。
R-CNN
在YOLO之外,还有一个效率更高的计算方法,叫做R-CNN。在对象检测时,先把明显没有对象的地方找出来,然后在进行卷积运算时只对有可能包含物体对象的区域进行计算。
该方法是由Ross Girshick等人2013年在《Rich feature hierarchies for accurate object detection and semantic segmentation》中提出的。