Localization and Object Detection

xiaoxiao2021-02-28  85

Localization

思路1:看作回归问题

首先考虑单个物体的检测,对单个物体的分类来说,已经很清楚了,在网络的最后一层加上softmax层或者multi-svm即可。对于检测问题,我们需要获得矩形边框的位置,一个简单的思路是将这个问题看作回归问题(x, y, w, h),所以很简单将分类问题的最终一层换为regression即可。 其基本思路是: (1)训练一个分类网络(Alex net, VGG net等) (2)在网络的最后一层附加上一个regression层 (3)用SGD和L2 loss训练regression层的参数 (4)在测试阶段同时得到物体所属的类别以及box的4个参数 而对于多个物体的检测也是类似,只是regression层输出的个数为K*4

思路2:滑动窗口

比较有名的是overfeat 将全连接层换为卷积层,更加有效

Object Detection

物体检测的难点在于不清楚图片中物体的个数,如果物体个数很多,利用localization的方法无疑是不可行的。

图片大小缩放

分为个向同性缩放和个向异性缩放,其中个向异性缩放指不管图像是否扭曲,直接将图形变换到适当的大小;但由于图形扭曲后可能会对识别精度有影响,故考虑其他两种思路:a、先扩充后裁剪。即直接在原始图片中,将bounding box扩充成正方形,然后再进行裁剪。若已经延伸到原始图片的边界则用bounding box中颜色均值进行补充;b、先裁剪后扩充。先把bounding box裁剪出来,然后再用bounding box中颜色的均值进行填充成正方形。在C-RNN的文献中作者经过试验,当padding=16采用个向异性缩放时效果最好

重叠度IOU

对于bounding box的定位精度,有一个很重要的概念: 因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。 它定义了两个bounding box的重叠度,即为两个区域的并集除以交集

非极大值抑制NMS

非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。 (1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值; (2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。 (3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。 就这样一直重复,找到所有被保留下来的矩形框。

非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

R-CNN

首先,想到的一个思路是把图片分成很多小框框,然后再来检测这些小框框属于哪一类就好了。这种方法叫做R-CNN方法,其主要思路是: (1)用某种算法(用的较多的是Selective Search)将图片划分为region proposal,一般约2000个。 (2)利用大量样本数据训练(或者下载)一个网络(如imagenet的数据) (3)将输出层的单元个数变为N(N个物体)+1(背景),进行fine tuning。并将RPI标记为正负样本。正负样本的定义是,若IOU大于0.5则为正样本,否则为负样本。 (4)约2K个RPI(region proposal interest)的大小不一,这样就没法放入到训练后的CNN中(输入大小是固定的),采用个向同性缩放和个向异性缩放两种图形变换的思路,将图形的大小固定为CNN的输入大小。将每个RPI放入到训练过的CNN中提取特征。 (5)利用SVM对每一个RPI的特征进行分类(为何用SVM,CNN的softmax分类器不行吗?CNN对bounding box的要求相对比较宽松,即只要稍微包含物体就行了。而SVM的要求严格,更符合我们的需求。同时,由于样本数量少,CNN容易过拟合,而SVM比较适合小样本的训练)此时,正负样本的定义有别于CNN,作者试验当IOU小于0.3时将其标位负样本 (6)对于每一类,用线性回归对边框进行微调

测试阶段: 1、使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制(NMS)去除相交的多余的框。再对这些框进行canny边缘检测,就可以得到bounding-box(then B-BoxRegression)。

2、(非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到这一类的结果(然后继续进行下一个分类)。作者提到花费在region propasals和提取特征的时间是13s/张-GPU和53s/张-CPU,可以看出时间还是很长的,不能够达到及时性。

R-CNN的主要问题: a、测试时间长,需要将每一个PRI放入CNN b、SVM分类器和回归器都是后面新添加,与CNN没有直接联系。从CNN中提取的特征的变化并不能影响到它们。 c、训练流程很复杂

fast R-CNN

针对R-CNN的三个问题,解决思路是: 1、针对问题a,可以采用共享的卷积层 2、针对问题b、c,可以训练整个端对端的网络 采用共享卷积层的一个问题是怎么保证卷积层输出的问题,由于PRI大小不一。作者提供的思路是将区域划分为hXw的网格,然后做max pooling这样就可以保证了卷积层输出不一致的问题。

faster R-CNN

fast R-CNN虽然相比R-CNN提升不少,但是Selective Search依然饱受诟病,faster R-CNN对此进行了改进,通过插入RPN层来获取region proposal

YOLO

faster R-cnn很快了,但现实中可能需要实时的Object Detection,YOLO是you only look for once,是一个实时的系统

附录: Object Detection code links: R-CNN (Cafffe + MATLAB): https://github.com/rbgirshick/rcnn Probably don’t use this; too slow Fast R-CNN (Caffe + MATLAB): https://github.com/rbgirshick/fast-rcnn Faster R-CNN (Caffe + MATLAB): https://github.com/ShaoqingRen/faster_rcnn (Caffe + Python): https://github.com/rbgirshick/py-faster-rcnn YOLO http://pjreddie.com/darknet/yolo/

转载请注明原文地址: https://www.6miu.com/read-48019.html

最新回复(0)