基于区域的目标检测

目标检测,即在一幅图里框出某个目标位置.有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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppfwy.html