目标定位
image classification图像分类,解决识别出图像中是否是汽车
classification with localization图像分类并定位,识别出图像中是否有汽车,并且用方框圈出来位置
detection目标检测,图像中有多个车辆或行人等事物,同时用方框圈出来其位置
为了实现图像分类并定位,我们要求神经网络的输出,不仅有softmax的分类结果,还要输出识别结果的位置信息,形成bounding box(bx,by,bh,bw)。bx,by为横纵坐标,bh为图像框高度,bw为图像框宽度
故,我们的输出结果构成了向量y = [pc bx by bh bw c1 c2 c3]。pc表示图像中,是否有我们要识别的物体。也就是当图像中存在类1(pedestrian),类2,类3时,pc=1。c1,c2,c3为物体最后归属于哪一类。
那么也就是当pc=1时(图像中存在我们要检测的物体),后面的bx,by,bh,bw,c1,c2,c3有意义。当pc=0时(图像中不存在我们要检测的物体),后面的数字多少是无所谓的。
所以,我们的损失函数(以平方误差举例),
在y=1时,L(y^, y)=(y1^ - y1)2+(y2^ - y2)2+…+(y8^ - y8)2
y=0时,L(y^,y)= (y1^ - y1)2
特征点检测
我们还可以识别图像中的特征点(landmark),如人的眼角位置。那么也就是左外眼角,左内眼角,右外眼角,右内眼角。分别让神经网络输出为(l1x,l1y);(l2x,l2y);(l3x,l3y);(l4x,l4y)。假如人脸上我们取64个特征点,那么我们可能能检测出人是否微笑,脸型,等等功能。Snapchat APP中,可以给人脸照片上加上帽子,皇冠等功能,其基础就是landmark detection这项技术。
同样,在运动姿态检测中,我们也可将头的位置,肩膀位置,手肘位置……标记为特征点。那么我们就可以检测出一个人的运动姿态。
目标检测
首先将我们的训练集切割成合适的形状。训练集中正例都是我们要识别的汽车。我们可以让训练集的图像中,汽车处在最中间,并且只有汽车。
使用小,中,大的方框,在检测图片上进行滑动操作。
缺点:
对于神经网络来说,每一次滑动都要进行计算。而神经网络的计算成本,要高于其他检测算法。故,这个方法对于计算成本要求很高。
卷积的滑动窗口实现
我们可以使用卷积层来代替全连接层,而达到原来全连接层的功能。
做法:
传统的全连接层,就是把5×5×16的图像节点,展开成1维的向量。即,展开成5×5×16=400的(400,1)维向量。我们可以使用5×5×16的filter,对5×5×16的图像节点进行卷积操作。那么最后得到的节点,同样是1×1×400的图像。在数学中,一个向量(400,1)与1×1×400的图像是等价的。故,我们可以用卷积操作来代替全连接的操作
如果我们将代替全连接层,产生的卷积操作结果。从1×1×400修改成2×2×400,那么在2×2这4个格子中,我们就会发现:左上角的格子,对应了原图中左上角14×14的图像。右下角的格子,对应了原图中右下角14×14的图像。
因为当我们的输入图像为14×14时,我们使用了同样大小的filter,最后会产生1×1的结果。故同样的网络结构与filter大小。当我们把图像进行padding两个像素后,最后产生的2×2的结果。相当于16×16中,取出14×14。
MAX-POOLING的大小为2,这相当于以2的步幅,在原始图像上分次应用神经网络。
故,应用这种方法,相当于代替了原图像滑动窗口,并不停进行卷积操作。滑动窗口时,卷积进行的相同计算,可以被利用。达到14×14的图形框,在原始图像中进行检测的原理。
Bounding Box预测
我们可以看到虽然使用滑动窗口的方法可以检测到汽车。但是,我们最终目的是需要输出汽车的位置方框。由于步幅大小问题,我们的滑动窗口方框,并不一定能完美的覆盖上整个汽车。
YOLO算法的步骤就是:将图像分成9(S×S)个格子,在每个格子中分别进行卷积操作。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。
故9个格子会输出9个向量,最后结果构成3×3×8的输出图像。
我们如何标记红色位置矩形框,对于每个格子我们设定其左上角为坐标系(0,0)点,右下角为坐标系(1,1)点。故我们可以表示出物体中心位置的坐标。如图中其中心点坐标位于第二行第三个格子的(0.4,0.3)的位置。其次我们用跟方框长度的比例,来表示位置矩形框的长和宽。如图中,长度为边长1的0.9倍,那么也就是0.9。宽度为0.5倍。
注意:
由于坐标系,我们的中心点坐标一定小于1。边长的长宽比例,可能大于1。
交并比
当我们需要评价物体识别的效果的时候,即算法标记的方框与实际的方框重合程度。我们可以采用交并比函数(intersection over union),即IoU。
其思想就是用两个图像框的交集 除以 两个图像框的并集。
并集(绿色)
交集(黄色)
我们一般约定loU大于等于0.5时,可以说算法识别正确。
非极大值抑制
当实际使用时,我们经常会遇到算法对于同一个目标识别了多次。即,一辆车,可能有多个不同的位置矩形框。故,我们采用了方法:非极大值抑制(Non-max suppression)
当我们用算法跑19×19个格子时,理论上我们汽车的中心点只有一个。但是实际中,由于是分类算法。可能有多个格子中都识别到了汽车,即多个格子都认为汽车的中心点,属于它们自己的那个格子。所以会产生多个位置的方框。
我们首先让输出结果Pc不在输出0或1,而是可能为汽车类对象的概率。如,方框一可能为汽车的概率为0.9,方框二可能为汽车的概率为0.7,方框三可能为汽车的概率为0.6。
我们让概率最大的矩形(0.9),看做最可靠的检测。其他跟概率最大矩形,有很大重叠率(Iou)的矩形就会被抑制。
我们可以看到左边的汽车其中有方框概率为0.7,右边汽车也有方框概率为0.7。故,Iou大的,即右边汽车0.9的方框与右边汽车0.7的方框有重叠。那么,右边汽车0.7的方框即被抑制。
当然我们也可以直接丢弃掉,被抑制的方框。
算法的步骤:
首先输出每个格子的结果向量
丢弃掉所有概率 <= 0.6的方框
对于剩下的方框
我们找出概率最大的那个方框,作为预测值。
丢弃掉与剩下这个方框重叠率高的方框(IoU>= 0.5)
Anchor Boxes
目前我们的一个格子只能检测出一个对象,为了让我们的一个格子可以检测出多个对象。我们可以采用Anchor Boxes算法。
如下图,我们可以看到一个格子中,女士的中心点和汽车的中心点都处在同一个格子。那么由于女士一般都是高一点的方框,汽车一般都是宽一点的方框。故我们可以定义两种类型的Anchor Box,来表示汽车和女士。那么输出向量也变为两套输出。y^ = [pc bx by bh bw c1 c2 c3 pc bx by bh bw c1 c2 c3]
我们的输出的物体,不光其中心点分配到格子中,还要将物体分配给一个anchor box。也就是我们要看预测的矩形框与两个anchor box的重叠率(IoU)。跟某一个anchor box重叠率高的话,即可以认为识别物体属于某一类。(跟人的anchor box重叠率高,那么其分类矩形框很可能是人)
故,我们输出向量变为3×3×16维
我们可以看到同时有人和车的情况输出的向量,如左边第二个向量所示。而只有汽车,没有行人的情况,如左边第三个向量所示。
Anchor box的缺点:
1.一个格子中有三个物体同时出现,但是我们只设定了两个anchor box。算法无法解决
2.两个物体形状相似(即卡车和汽车的形状相似),导致了anchor box也相似。那么导致算法无法区分。
遇到这些情况,我们需要设定一些默认处理,来避开这些问题。实际中,多个物体出现在同一格子的概率,本身就很小。
对于选定合适的anchor box形状,原来我们采用人工选定形状。在后期的YOLO算法中,我们采用k-means聚类算法,将两类对象形状聚类,用来选择anchor box形状。
YOLO算法
YOLO算法的运行步骤如下:
如果我们有两个anchor boxes,那么对于每一个格子,我们都有两个预测的图像框。
这时,我们抛弃概率低的图像框。得到下图
再运行非极大值抑制,得到最终的预测结果
RPN网络
region proposals候选区域
传统的滑动窗口算法运行效率十分低,消耗大量计算资源。当我们采用卷积操作实现滑动窗口的功能时,我们可以发现在完全没有识别物体的地方。我们完全没有必要进行窗口识别。如,天空和大地的位置,我们没有必要进行大量的滑动窗口识别,会消耗大量计算资源。
所以,我们引入了色块来区分每一个区域。segmentation algorithm分割算法,比如人整体可能相近于一个色块,汽车相近于另外一个色块。我们在每个色块上(可能有2000个色块),进行分类算法。就能减少大量的计算资源。
R-CNN:采用了传统的滑动窗口,实现效果。
Fast R-CNN:加入了卷积操作来改进滑动窗口。提高了效率
Faster R-CNN:对于区域分割过程中,传统的算法采用了聚类来选择区域。Faster R-CNN,使用了神经网络来进行色块选择区域。进一步提高了效率。