基于区域的目标检测

目标检测,即在一幅图里框出某个目标位置.有2个任务.

  • 定位出目标的边界框
  • 识别出边界框内的物体的类别

Sliding-window detectors

一种暴力的目标检测方法就是使用滑动窗口,从左到右,从上到下扫描图片,然后用分类器识别窗口中的目标.为了检测出不同的目标,或者同一目标但大小不同,必须使用不同大小,不同宽高比的滑动窗口.

把滑动窗口框出来的图片块resize(因为很多分类器只接受固定大小的图片输入)后,送给CNN分类器,CNN提取出4096个特征.然后使用SVM做分类,用线性回归做bounding box预测.

伪代码如下

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

提高性能的一个明显的方法就是减少window数量.

Selective Search

相比于暴力搜索,我们使用一种区域建议(region proposal)方法去创建roi(感兴趣区域region of intrest).在selective search(SS)中,我们从将每一个像素作为一个group开始,接下来我们计算每一个group的texture,然后合并最接近的group.为例避免某个区域吞并了其他区域,我们优先合并较小的group,不断的合并各个group直到不能再合并了.如下图:第一行图显示了region是怎么不断地增长的,第二行的蓝色框显示了在不断地合并的过程里,是怎么产生ROI的.

R-CNN

R-CNN采取区域建议方法创建2000个ROI.然后这些区域的图片被送到CNN,提取特征,然后送给全连接层做边界框预测和类别预测

流程如下:

由于有了数量少质量高的ROI,R-CNN相比于暴力的滑动窗口搜索,要快的多,也准确的多.

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

Boundary box regressor

区域建议方法是需要大量算力的.为了加速ROI寻找的过程,我们往往选择一个不需要巨量算力的区域建议方法来创建ROI,再用线性回归器(使用全连接层)对边界框做微调.

Fast R-CNN

R-CNN需要大量的ROI,并且这些ROI很多都是重叠的.所以R-CNN在无论是训练还是推理都很慢.如果我们有2000个建议区域,每一个都要被CNN处理一次,也就是说,对于不同的ROI,特征提取重复了2000次.

换个思路,对整幅图片做特征提取,然后在特征图的基础上做ROI的查找.通过池化层做resize,然后送给全连接层做边界框预测和分类.由于只做了一次特征提取,Fast R-CNN的性能显著提高.

流程如下:

伪代码如下:

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

由于把特征提取这一步抽到了for循环外部,性能大幅提升.相比R-CNN,Fast R-CNN在训练上快了10倍,推理上快了150倍.

Fast R-CNN的一个要点是整个网络(包括特征提取,分类,边界框回归)是端到端的训练,并且采用了multi-task losses(分类loss + 边界框定位loss),提高了准确率.

ROI pooling

由于Fast R-CNN使用全连接层,我们采用ROI池化,把不同size的ROI转换成固定size.

以8*8的特征图转换为2*2为例

  • 左上:CNN得到的原始特征图
  • 右上:叠加蓝色的ROI到特征图上
  • 左下:将ROI分割成目标维度.比如要转换成2*2的,那我们把ROI分成4份,每一份大小近似.
  • 右下:对每一份做max pooling(即选出该部分最大的).得到我们想要的ROI对应的特征图.

然后就可以把这些2*2的特征图送给分类器和线性回归器去做分类和边界框预测了.

Faster R-CNN

Fast R-CNN依赖于区域建议方法,比如selective search.但是,这些算法只能跑在cpu上,速度很慢.在测试中,Fast R-CNN做出一次预测要2.3秒,其中2秒都花在了生成2000个ROI.

feature_maps = process(image)
ROIs = region_proposal(image)         # Expensive!
for ROI in ROIs
    patch = roi_pooling(feature_maps, ROI)
    results = detector2(patch)

在流程上,Faster R-CNN与Fast R-CNN是一致的,只是将得到ROI的方式改为由一个region proposal network(RPN)得到.RPN效率要高的多,每张图生成ROI的时间仅在10ms.

Region proposal network

RPN接受卷积网络输出的特征图作为输入,用如下的ZF网络做区域建议.也可以用其他的网络比如VGG或者ResNet去做更全面的特征提取,代价是速度的下降.ZF网络输出256个值,送到两个全连接层,一个用于预测边界框(boudary box),一个用于预测2个objectness scores.objectness衡量bounding box是否包含一个object.我们可以用一个回归器去计算出一个single objectness score.但是为简单起见,Fast R-CNN使用一个分类器,分类器分出的类别有2种:即包含目标和不包含.

对特征图中的每一个位置,RPN做出k个猜测.所以RPN输出4*k个坐标,2*k个score.如下表示对一个8*8的特征图,用3*3的filter,最终得到8*8*3个ROI.

后面我们将继续微调我们的猜测.由于我们需要有一个正确的猜测,我们初始化的猜测最好有不同的shape,不同的size.所以,Faster R-CNN不是随机乱猜的边界框,它预测相对于我们称之为anchors的参考框(reference box)左上角的偏移.我们限定偏移的大小,这样我们最终预测出的bounding box依然是与anchors类似的.

为了每个位置能够得到k个预测,每个位置需要k个anchor.每一个预测都与一个特定的anchor有关.不同的位置共享同样的anchor shape.

这些anchors不是瞎选的,要尽可能地覆盖到real-life objects,并且要尽量有合理的尺度和宽高比.这样可以使得每次的prediction更准确.这个策略使得训练的早期可以更容易更稳定.

Faster R-CNN uses far more anchors. It deploys 9 anchor boxes: 3 different scales at 3 different aspect ratio. Using 9 anchors per location, it generates 2 × 9 objectness scores and 4 × 9 coordinates per location.

Performance for R-CNN methods

Region-base Fully Convolutional Networks (R-FCN)

假设一下我们只有一个检测脸部中右眼的feature map,我们可以用它来定位整张脸吗?答案是肯定的,因为右眼位于面部的左上角,所以我们可以用来定位整张脸.

如果我们有其他专门用于检测左眼、鼻子或嘴巴的特征图,我们可以将这些结果结合起来,更好地定位人脸.

在Faster R-CNN中,我们最终会将整幅图片的feature map切成相应的roi对应的feature map,再送给多个全连接层去做预测.有2000个ROI的时候,这一步的代价是很高昂的.

feature_maps = process(image)
ROIs = region_proposal(feature_maps)
for ROI in ROIs
    patch = roi_pooling(feature_maps, ROI)
    class_scores, box = detector(patch)         # Expensive!
    class_probabilities = softmax(class_scores)

R-FCN通过减少每一个roi的处理时间提速.下面是伪代码

feature_maps = process(image)
ROIs = region_proposal(feature_maps)
score_maps = compute_score_map(feature_maps)
for ROI in ROIs
    V = region_roi_pool(score_maps, ROI)
    class_scores, box = average(V)                   # Much simpler!
    class_probabilities = softmax(class_scores)

考虑一个5*5的feature map,其中蓝色部分的feature构成了我们想要检测的object.我们将蓝色部分划分为3*3的区域.现在我们可以创建一个新的feature map,仅仅用来检测object的top left corner(TL).如下:

由于我们将object分成了9个部分,我们从整幅图的feature map中得到9个feature map,每一个feature map负责检测object的相应区域.这些feature map我们称之为position-sensitive score maps,因为每个map都只detect(scores)一个object的子区域.

假设下图的红色虚线框是ROI.我们将其划分成3*3的区域,然后考虑每个区域包含目标的对应位置的可能性.例如,top-left ROI区域包含左眼的可能.我们把结果存储在一个3*3的vote array里.比如,vote_array[0][0]存储了一个score,表示我们是否发现了目标的top-left region.

这个依据score map和ROI得到vote array的过程称之为position-sensitive ROI-pool.这个过程和前文提过的ROI pool很类似.

计算出所有的值以后,取平均,就得到了class score.

假设我们有C种目标待检测.我们扩展为C+1种,即包含一种class for the background(non-object).每一种目标都有自己的3*3个score map.所以一共有(C+1)*3*3个score maps.使用这些score maps我们可以为每一个类别都算出一个class score.然后用softmax可以计算出每一个类别的class probability.

整体流程如下,下图中k=3.

R-FCN的一个示例

原文link:https://medium.com/@jonathan_hui/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9

原文地址:https://www.cnblogs.com/sdu20112013/p/11022480.html

时间: 2024-10-13 16:09:10

基于区域的目标检测的相关文章

目标检测Anchor-free分支:基于关键点的目标检测

目标检测Anchor-free分支:基于关键点的目标检测(最新网络全面超越YOLOv3) https://blog.csdn.net/qiu931110/article/details/89430747 目标检测领域最近有个较新的方向:基于关键点进行目标物体检测.该策略的代表算法为:CornerNet和CenterNet.由于本人工作特性,对网络的实时性要求比较高,因此多用YoLov3及其变体.而就在今天下午得知,基于CornerNet改进的CornerNet-Squeeze网络居然在实时性和精

实战小项目之基于yolo的目标检测web api实现

上个月,对微服务及web service有了一些想法,看了一本app后台开发及运维的书,主要是一些概念性的东西,对service有了一些基本了解.互联网最开始的构架多是cs构架,浏览器兴起以后,变成了bs,最近几年,随着移动互联网的兴起,cs构架再次火了起来,有了一个新的概念,web service. 最近两天,想结合自己这段时间学的东西,实现一个cs构架的service接口.说一下大体流程,client上传图片到http服务器,http后台使用yolo进行图片的检测,之后将检测结果封装成jso

基于深度学习的目标检测研究进展

前言 开始本文内容之前,我们先来看一下上边左侧的这张图,从图中你看到了什么物体?他们在什么位置?这还不简单,图中有一个猫和一个人,具体的位置就是上图右侧图像两个边框(bounding-box)所在的位置.其实刚刚的这个过程就是目标检测,目标检测就是"给定一张图像或者视频帧,找出其中所有目标的位置,并给出每个目标的具体类别". 目标检测对于人来说是再简单不过的任务,但是对于计算机来说,它看到的是一些值为0~255的数组,因而很难直接得到图像中有人或者猫这种高层语义概念,也不清楚目标出现在

目标检测梳理:基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN(转)

基于深度学习的目标检测技术演进:R-CNN.Fast R-CNN.Faster R-CNN(转) 原文链接:https://www.cnblogs.com/skyfsm/p/6806246.html object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题可不是那么容易解决的,物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方

openCV目标检测学习笔记(一)

最近在研究一些基于openCV的目标检测算法,由浅入深,今天是第一天. 首先网上下载了一份较简单的来对视频中运动物体进行二值显示的代码进行学习,以下是我的理解,初学者会犯一些错希望大家予以指正. #include<cv.h>#include "cxcore.h"#include<highgui.h> int main(int argc,unsigned char* argv[]) { CvCapture* capture = cvCreateFileCaptur

目标检测与跟踪的研究热点以及发展趋势

目标检测与跟踪的研究热点以及发展趋势: 1) 场景信息与目标状态的融合 场景信息包含了丰富的环境上下文信息, 对场景信息进行分析及充分利用, 能够有效地获取场景的先验知识, 降低复杂的背景环境以及场景中与目标相似的物体的干扰; 同样地, 对目标的准确描述有助于提升检测与跟踪算法的准确性与鲁棒性. 总之,尝试研究结合背景信息和前景目标信息的分析方法,融合场景信息与目标状态, 将有助于提高算法的实用性能. 2) 多维度. 多层级信息融合 为了提高对运动目标表观描述的准确度与可信性, 现有的检测与跟踪

分类、目标检测、语义分割、实例分割的区别

计算机视觉的任务很多,有图像分类.目标检测.语义分割.实例分割和全景分割等,那它们的区别是什么呢? 1.Image Classification(图像分类) 图像分类(下图左)就是对图像判断出所属的分类,比如在学习分类中数据集有人(person).羊(sheep).狗(dog)和猫(cat)四种,图像分类要求给定一个图片输出图片里含有哪些分类,比如下图的例子是含有person.sheep和dog三种. 2.Object detection(目标检测) 目标检测(上图右)简单来说就是图片里面有什么

航空遥感图像(Aerial Images)目标检测数据集汇总

常规目标检测数据集有很多,现在前沿的目标检测算法(如Faster R-CNN, Yolo, SSD, Mask R-CNN等)基本都是在这些常规数据集上实验的,但是,基于常规数据集训练的分类器,在航空遥感图像上的检测效果并不好,主要原因是航空遥感图像有其特殊性: 1,尺度多样性,航空遥感图像从几百米到近万米的拍摄高度都有,且地面目标即使是同类目标也大小不一,如港口的轮船大的有300多米,小的也只有数十米: 2,视角特殊性,航空遥感图像的视角基本都是高空俯视,但常规数据集大部分还是地面水平视角,所

基于深度学习的目标检测

普通的深度学习监督算法主要是用来做分类,如图1(1)所示,分类的目标是要识别出图中所示是一只猫.而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)竞赛以及实际的应用中,还包括目标定位和目标检测等任务.其中目标定位是不仅仅要识别出来是什么物体(即分类),而且还要预测物体的位置,位置一般用边框(bounding box)标记,如图1(2)所示.而目标检测实质是多目标的定位,即要在图片中定位多个目标物体,包括分类和定位.比如对图1(3