总结各种物体检测算法

第一,覆盖所有基于区域的目标检测算法,包括:Fast RCNN, Faster-RCNN, Mask RCNN, R-FCN, FPN.

第二, 介绍SSD算法(single shoot detectors)

第三,介绍所有算法的表现和实现细节。

Part1 我们从基于区域的物体检测器中学到了什么?Part2 我们从SSD中学习到什么?Part3如何选择设计思路以及目标检测趋势

首先介绍滑动窗口检测器 sliding-windows detectors,(在基于anchor机制的RPN网络中使用滑动窗口和此处的滑动窗口作用不一样,后面会介绍)

最先使用物体检测器时,是使用暴力遍历所有方块(这些方块就是靠滑动窗口从左到右,从上到下使用分类算法判断这个窗口内的东西是不是我们想要的内容)。为了检测各种距离下的不同物体类型,我们使用不同大小的窗口和不同比率。

每滑动一次分出这部分的patch块,我们变形每个块到固定大小再输入到多个分类器。然而,我们训练不同的分类器来处理变形的图像是不会影响分类精度的。变形的图像块输入到CNN网络中来提取4096个特征图。然后使用SVM(one vs all)来识别类别以及使用另外的线性回归器来收紧bounding box.

伪代码:

for window in windows:
    patch = get_patch(image, window)
    results = detector(patch)

再介绍一下windows框框选择的算法:selective search(SS)

代替了原始暴力方法,我们使用一种提议区域方法 (SS) 来生成感兴趣区域(regions of interest ROI). 在SS方法中,开始时我们以每个独立的像素作为自己的组,然后,计算每个组的纹理并结合两个最相近的像素到一个组。但为了避免出现平凡解(只有一个区域),我们首先更倾向于首先聚集更小的组。我们一直合并这些小组直到该合并的小组都合并完了,在下面第二行的蓝色矩形框展示了处理过程中产生的所有可能的ROI 区域。绿色方框是我们想要检测的目标物体。


RCNN:

鼻祖RCNN,利用提议区域方法来生成大约2000个ROI。这些区域变形到规定大小图像并“喂到”训练好的CNN网络中。得到图像的feature maps后连接到全连接层来分类物体,并缩小其boundary box(by regressor)。




ROIs = region_proposal(image)
for ROI in ROIs:
    patch = get_patch(image, ROI)
    results = detectors(patch)

Boundary box Regressor:

区域提议方法是密集计算型(很明显看出来每张图片要提出2000个区域再输入到CNN中,在分类、回归,计算量太大),为了加速过程,我们经常挑一些计算不复杂的区域提议方法来生成ROI ,然后输入到一个线性回归模型(使用全连接层,全连接层也就是线性回归模型Wx + b)来进一步限定boundary box.

Fast RCNN

原RCNN需要很多的提议来更精确,但是其中有很多是重叠的。RCNN在训练和推断过程中都是很慢,当我们有2000个提议时每个提议区域块都需要单独地输出到CNN网络,也就是我们重复2000次特征提取过程。

在CNN中的特征图表示在更加密集的空间中的空间特征。我们思考能不能使用feature map来代替原图检测物体呢?



这就是Fast RCNN的创新点:不去从每个图像块中提取特征,而是使用一个特征提取器(一个CNN网络)来为整个图像提取特征。然后我们在特征图上应用区域提议方法。例如FastRCNN 选择从VGG16架构的conv5得到的featuremap中,来生成ROI区域,然后结合对应的特征图来构成物体检测的块。我们将生成的块变形到规定大小,使用ROIpooling 操作并将块输入到全连接网络用来分类和定位。



伪代码如下:

feature_maps = process(image):
ROIs = region_proposal(feature_maps)
for ROI in ROIs:
    patch = roi_pooling(feature_maps, ROI)
    results = detector(patch)

FastRCNN 使用多任务损失(multi-task loss)来计算总损失。

介绍下ROI pooling,和max/ average pooling的性质类似,目的是降维,便于管理,减少网络参数和运算次数(间接控制过拟合),是网络对输入图像的微小变换、失真、和平移更鲁棒(因为取的是最大值或者平均值),还能得到尺度不变的图像(无论物体在图像的哪个地方都可以检测)

但是ROI pooling主要是为了变形那些ROI区域到一个固定大小块。

具体流程(将8*8的feature map转换到2*2大小):下面四张图右上角表示我们使用ROI(蓝色)感兴趣的框框框定featuremap.

左下:我们分离ROI区域到目标维度。例如想要2*2 的目标区域,我们将ROI划分成4个小节具有相同或相似的大小。

右下:找到每个小节上最大的值放入到目标块上,就得到了我们变形的特征图。


总结:fast RCNN的贡献在于将原来分散的模块,统一到一个网络当中,并使用图像输入到CNN的特征图来提取特征块,网络只需要训练一次,推断也很快,并使用ROI pooling得到目标大小的块。 

接下来就是Faster RCNN:

Fast RCNN 的主要缺点还是在于需要一个外部的区域提议算法类似SS。然而,这些算法在CPU上很慢,在测试时FastRcnn处理每张图片需要2.3秒,其中2秒都是用来生成2000个ROI。

那么Faster RCNN就是为了避免这个问题而应运而生, Faster 和Fast的结构几乎一致,除了Faster使用一个内部网络RPN来代替原来的SS区域提议方法。RPN在生成ROI时比ss快10ms。其实也没快多少(所以还有继续做文章,例如简历一个稀疏表达方法,来约束众多的提议区域,还有使用NMS非极大值抑制)。




RPN网络以卷积网络的特征图输出作为输入。使用3*3filters在特征图上滑动来生成不可知类别的提议,使用一个类似ZF网络的卷积网络。其他网络如VGG or ResNet 可以被用来更全面的特征提取。ZF网络输出256个值,并将其输入到两个分离的全连接层来预测一个boundary box 和2个物体打分。这个物体打分衡量这个box中是否包含物体(前景和背景)。我们可以使用一个回归器来计算单个物体分数但是太简单了,Faster使用一个分类器具有两个可能的类别:一个是有物体,一个没有物体(背景类别)。


对特征图上每个定位,RPN生成K个猜测,因此RPN输出4*K个坐标(包括左下角的xy, 还有框框的height,width)还有2*k(前景和背景类别)的打分在每个定位上。

下面图例显示了8*8的特征图,使用3*3的卷积核,输出总共8*8*3(k = 3)个ROI感兴趣区域。右边的图显示了在每个定位上生成的3中提议。


我们得到3个猜测并且允许之后更精确我们的猜想。当我们只需要一个是正确的时候,若初始的猜测很不一样的话我们将更好的抛弃。因此Faster 不能生成随机的boundary box 提议。而是去预测一个抵消补偿offset(不是很懂???)deltaX, deltaY, 和一些参考的box的左上角相关 称为anchors(这个也不是很懂,我经常看到的是一群点,先做个聚类,聚类中心称为anchor,图像中的anchor是个啥,还需要看看源码去,留坑),但是这些补偿值的约束下,我们猜测一定程度上和anchor相关。


为了预测每个位置的k个预测,我们需要k个锚点,其锚点在每个位置的中心。每个预测关联这一个特定的锚点,但不同的定位共享相同的锚点形状。


这些锚点都是很仔细的预筛选后,所以他们多种多样的,覆盖了实际生活中不同尺度和比例的物体形状。这个知道初始训练使用更好的猜测并允许每个预测在一个特定形状中确定下来。这种策略使得训练更稳定和简单。

Faster使用很多锚点。部署了9个锚点框:3中不同尺度,三种不同比率。ZF网络提取256特征,每个位置使用9个锚点,生成2*9个物体打分和4*9的坐标。



其实Anchor也称为先验或者是默认的boundary boxes。


发布了38 篇原创文章 · 获赞 12 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览