目标定位
简而言之,目标检测的目的就是不仅仅要分别出物体是不是我们要识别的类型,还要做到定位出它所在位置。也就是我们所说的,classification with localization problem。其中也包括有多分类定位与简单检测。
图像分类
通常我们进行图片分类,所使用的方法就是卷积神经网络进行特征提取+Softmax分类的传统架构,当然其中不乏各种能提升效果的变体框架,如Inception、Res、VGG等等。
目标分类与目标定位
那么我们该怎么进行定位工作呢?
同样我们使用最暴力的想法的话,就是让我们训练的模型再额外输出四个值,分别对应图像中四个角的位置。
那我们该如何设置这一系列我们所需要的值为一个训练输出Y?
其中
- Pn代表是否具有物体
- Bx、By、Bh、Bw分别代表如果有物体,其范围如何
- C1,C2,C3 代表该物体属于哪一个类别
若不存在物体,则可以如此表示
最简单的损失函数可以如下设置:
虽然简化,但是确实你可以这么做,不一定非得在分类部分使用对数损失。
特征点检测
如果识别的图片存在某些特殊的你想获取的点,不妨让模型再最后输出部分再输出你所设置为特征点的坐标,同时进行训练。
类似的技术,可以实现AR增强现实与行为姿态检测的任务。
基于滑动窗口的目标检测
一般滑动窗口的方式
在实现基于滑动窗口的目标检测之前,我们还是要训练一个分类器的,然后在其之上进行滑动窗口的检测。
缺点:计算成本过大,特别是加上卷积之后。
卷积的滑动窗口的实现
全连接到卷积的一点小改变,改变的目的就是为了让卷积之后的每一个区域都有一个softmax的结果:
其实,作为四张图片输入和卷积之后的四个区域是有一定关系的,卷积之后再切分可以共享很多计算,使得卷积滑动窗口计算成本大幅度降低。池化参数相当于步长。
如果幸运的话,你就能够找到想要的区域。而且只用进行一次卷积操作。
Bounding Box 预测
YOLO算法初探
将整张图片分为多个部分,比如在这里是九个部分,九个部分都是用上面介绍的图像检测算法。
这样我们会得到一个3X3X8的输出,这就是我们最终用来训练的东西。
当然在真实使用的时候,网格可能精细得多。
好处在于,九个格子都是共用一套神经网络,所以训练起来方便很多!
另外还提到如何确定某个格子内框框的表示问题,在这儿只是给出一个行之有效的方式。
左上和右下分别表示为(0,0)、(1,1),中间橙色点为X,Y的坐标定位,H、W则使用比例尺表示。
交并比(IoU)
如何判断网络运行得好还是坏呢,那就是交并比函数。
简单来说就是交集和并集的比率。一般约定0.5为一个能够接受的值。
非极大值抑制(Nms)
在19X19的网格网络中,很多区域都会认为他们自己内部包含了我们要检测的目标物,那么我们如何使用这些标签呢,如何确定一个重点?
举个简单例子,在下面这块区域中,有多个重叠,概率值比较高的区域判定其中包含我们需要检测的物体,我们其中值最大的选用其范围,所有和这个最大边界框有很高iou值的其他边界框都会被抑制,如果我们直接删除这些边界框,就得到了另一个结果。
算法细节上,我们通过通过得到的19X19X5(只做汽车识别的话)的区域给定一个概率阈值,然后判断剩下区域的概率值和IOU值进行遍历过滤,最终会得到我们想要的结果的。
Anchor Boxes
如果想检测出多个不同的物体,我们就需要使用Anchor Box这个概念。
比如现在我们有这样一个3X3的图片分割。如果两个我们要检测的物体重叠的太厉害,根据我们上面定义的输出其实是无法解决的。
通过anchor box 我们将输出分别绑定了不同的anchor box,输出不同的值。
具体而言,之前我们输出的八个值,比如该图我们得到的结果会是3X3X8的样子。而现在我们要根据不同类别形状对应按个anchor box的IOU值更高,将其分配到不同的区域之中去。这样我们得到的就是3X3X16的输出。举个例子:
当然有些情况还是处理不好,比如两个检测的物体还是重叠的……那场面就很很尴尬,需要引入其他方式来解决这个问题。
anchor box 很多人都是手工来定义的,YOLO中其实给了比较好的做法。
当然也有自动选择anchor box的算法。
YOLO
现在我们要将上面所涉及的所有东西组合成我们要使用的YOLO算法。
依旧老生常谈,3X3转化为3X3X2X8,在使用两个anchor box+3个类别需要识别的情况下。
然后运行nms的过程。首先得到识别结果,然后抛弃概率值低的,最后进行非极大值抑制
老铁,没毛病!
候选区域(Region Proposal)
非常具有影响力的研究,之后可能会单独写博文
R-CNN
克服了传统滑动窗口在没有必要检测区域浪费时间的问题,只选择某些window。
思想是运行图像分割技术,获得色块,然后在不同色块上运行CNN。
R-CNN演变史
R-CNN
用某些算法获得候选区域,然后对每个候选区域跑一下分类器,每个区域输出一个标签,并输出一个边界框。R-CNN并不会完全信任这个边界框,它自己也会输出一个边界框。获得更加精确的结果。
缺点就是,也很慢……
Fast-RCNN
使用了卷积滑动,就如之前所说,卷积之后的滑动窗口进行R-CNN。
缺点就是,还是不够快……因为获取候选区域的部分还是很缓慢。
Faster-RCNN
卷积网络而不是传统分割方法获取候选区域。
他们都比YOLO要慢