卷积神经网络 — 目标检测
图片检测的三个问题:
(1)分类问题:区分图片是汽车亦或是其它;
(2)目标定位:判断是否是汽车并确定其位置;
(3)目标检测:源图中有多个不同的物体,分析确定该物体是什么并确定位置。
(1)目标分类与定位
如图1所示。Softmax后面可以有多个输出,其输出结果是各项目标的可能性。
定位最关键的就是输出图中红圈的中心点的坐标(bx,by),然后就是它的宽bw和高bh。通常以图片的左上角坐标为(0,0),右下角为(1,1)。
图1
(2)定义目标标签y
我们的代价函数可以如下式所示:
我们可以知道,当处于第一行状态时,我们需要关注神经网络对所有输出值的准确度;而当第二行状态时,只需要关注对于背景的准确度。
经过神经网络后输出一个n×1的矩阵。这里我们假设检测车、行人、摩托车。那么这个矩阵可以如图2所示:
图2
每一个参数的含义都已经在图中表示出来了。注意,若PC=0,则后面的参数无论取何值都无意义。
(3)特征点检测
特征点检测,顾名思义,就是根据图片上的特征点的坐标实现对目特征的识别和定位。就像图3中女性的眼角,运动员的动作姿势等,都可以成为被标记的特征点。
图3
(4)目标检测
实现目标检测,就是采用定义一个小窗口,然后就像推拉门一样滑动来进行检测。
训练模型:
图4
将训练集的图片切割成一个一个小图片,然后对其进行标记:若有汽车,标记为1;若无汽车,标记为0。
滑动窗口检测:
首先选定一个特定大小的框,被称为窗口,将窗口放到图片上进行预测。如图5所示,图中三张图片分别应用了3种不同尺寸的窗口。不同尺寸的窗口有什么优缺点呢?选用尺寸较大的窗口,优点是减少了数据量,但是缺点是检测的准确率下降;对于尺寸较小的窗口来说,优点是检测的准确率得到提升,但是数据量却变得十分庞大。
然后以固定的步幅长度来滑动该窗口,遍历图像的各个区域,对窗内的各个小图输入模型进行预测。
这之后,需要继续选取一个更大的窗口,然后再重复遍历图像每个区域的动作,以对是否有车进行预测。
图5
卷积层代替全连接层:
如图6所示,对于图中上侧的部分来说,它是使用了两个400个节点的全连接层,然后通过Softmax输出了分类的概率等等信息。但是实际上,利用1×1的卷积核,如该图下半部分所示,也可以实现类似的结果。这一点的原理在前面已经讲过,在此不再累述。
图6
滑动窗口的卷积实现:
如图7所示:
图7
我们可以使用上面已经训练好的模型,应该注意到,虽然图片中使用的是平面图,但是实际上它是一个三维的。我们输入一个16×16×3的图片,在图中蓝色代表滑动窗口。在这里,我们设置步长为2,然后分别于卷积核进行卷积运算,最后得到了4个10×10×16的特征图。由于在滑动的过程中必然存在大量的重叠,因此在下一层的特征图中也是存在大量重叠。在第二部分中,实际上我们是利用增加了一个padding进行处理,具体的过程和第一部分类似。
那么由此可知,滑动窗口在整幅图片上进行滑动卷积的操作过程,就等同于在该图片上直接进行卷积运算的过程。所以卷积层实现滑动窗口的这个过程,我们不需要把输入图片分割成四个子集分别执行前向传播,而是把他们作为一张图片输入到卷积神经网络中进行计算,其中的重叠部分(公共区域)可以共享大量的计算。
2. Bounding Box预测(YOLO算法)
前面的讨论一直在理想情况下,实际上我们不能输出最精准的边界框(Bounding Box)。
这个时候我们可以使用YOLO算法。下面开始介绍YOLO算法。
图8
l 在整个图片上加较为精细的网格,将图片分为n×n的小方格;
l 然后利用前述的图像分类和定位,将其分别应用在这些小方格之中;
l 对每一个小方格定义训练标签yi(标签内容如前图2所示);
l 将这些小方格的标签合并在一起,最终输出Y,它的大小为n×n×8。
通过观察不同位置的输出值,我们就能知道这些位置中是否存在目标物体,然后也能由存在物体的输出向量得到目标物体的更加精准的边界框。
注意:
(1)将对象分配到一个格子的过程是:观察对象的中点,将该对象分配到其中点所在的格子中,(即使对象横跨多个格子,也只分配到中点所在的格子中,其他格子记为无该对象,即标记为“0”);
(2)YOLO显式地输出边界框,使得其可以具有任意宽高比,并且能输出更精确的坐标,不受滑动窗口算法滑动步幅大小的限制;
(3)YOLO是一次卷积实现,并不是在n×n网格上进行n2次运算,而是单次卷积实现,算法实现效率高,运行速度快,可以实现实时识别。
我们做以下约定:
对于每个网格,以左上角为(0,0),以右下角为(1,1);
中点bx、by表示坐标值,在0~1之间;
宽高bh、bw表示比例值,存在>1的情况。
3. 交并比(LOU)与非最大值抑制(NMS)
(1)交并比
如图9所示,所谓交并比指的是图中橘黄色部分比上绿色部分。这个参数是用来衡量目标检测算法是否运作良好。一般情况下,当LOU≥0.5的时候,说明检测正确。
图9
(2)非最大值抑制
该方法解决了相同的物体被重复检测的问题。
算法思想:
l 在对n×n个网格进行目标检测算法后,每个网格输出的Pc为一个0~1的值,表示有车的概率大小。其中会有多个网格内存在高概率;
l 得到对同一个对象的多次检测,也就是在一个对象上有多个具有重叠的不同的边界框;
非最大值抑制对多种检测结果进行清理:选取最大Pc的边界框,对所有其他与该边界框具有高交并比或高重叠的边界框进行抑制;
l 逐一审视剩下的边界框,寻找最高的Pc值边界框,重复上面的步骤。
l 非最大值抑制,也就是说抑制那些不是最大值,却比较接近最大值的边界框。
算法步骤:
(1)对于图片每个网格预测输出矩阵:yi=[Pc bx by bh bw],其中Pc表示有对象的概率;
(2)抛弃Pc⩽0.6的边界框;
(3)对剩余的边界框(while):选取最大Pc值的边界框,作为预测输出边界框;抛弃和选取的边界框IoU⩾0.5IoU⩾0.5的剩余的边界框。
图10
4. Anchor box
到目前为止,我们已经完成了我们想要完成的任务。但是这存在一个问题,即目前我们只能检测一个对象,这很显然是不够的。那怎样才能检测多个对象呢?这里我们可以使用Anchor box。
重叠目标:
图11
对于重叠的目标,这些目标的中点有可能会落在同一个网格中,对于我们之前定义的输出只能得到一个目标的输出。
而Anchor box 则是预先定义多个不同形状的Anchor box,我们需要把预测目标对应地和各个Anchor box 关联起来,所以我们重新定义目标向量:yi=[Pc bx by bh bw c1 c2 c3 Pc bx by bh bw c1 c2 c3。。。]。用这样的多目标向量分别对应不同的Anchor box,从而检测出多个重叠的目标。
总结:
l 之前的算法:在训练图像中的每一个目标被分配一个包含目标重点的格子,输出大小。(Each object in training image is assigned to grid cell that contains that object’s midpoint.)
l 使用2个Anchor boxes: 每一个训练图像中的目标都被分配包含对象中点的网格单元格和具有最高IoU的网格单元格的锚点框。(Each object in training image is assigned to grid cell that contains object’s midpoint and anchor box for the grid cell with highest IoU.)
更多内容参见: Redmon et al., 2015, You Only Look Once: Unified real-time object detection