1 概述

  本文牵涉的概念是候选区域(Region Proposal ),用于物体检测算法的输入。无论是机器学习算法还是深度学习算法,候选区域都有用武之地。

2 物体检测和物体识别

  物体识别是要分辨出图片中有什么物体,输入是图片,输出是类别标签和概率。物体检测算法不仅要检测图片中有什么物体,还要输出物体的外框(x, y, width, height)来定位物体的位置。

物体检测的核心就是物体识别。

  为了定位物体,我们需要选择一些子区域并在子区域上运行物体识别算法。物体的位置就是物体识别算法返回最高概率的子区域内。

  产生候选子区域的最直接的方法就是滑窗法,但是这种办法效率比较低,一般使用‘候选区域’算法,而择性搜索(Selective Search)就是最流行的候选区域产生算法之一(个人理解:这个最流行可能是针对论文那两年说的,现在深度学习都是使用网络产生候选区域,不用算法生成了)。

2.1 滑窗法

  在滑窗方案中,我们要使用一个小窗口遍历搜索整张图片,在每个位置上对滑窗内的图片做物体识别算法。不仅要搜索不同的位置,还要遍历不同的大小,工作量可想而知。问题还没完,对于人脸和人体这种长宽比基本固定的物体还好,对于长宽不固定的物体,搜索起来简直就是噩梦,计算量直接飙升。

2.2 候选区域(Region Proposal)算法

  滑窗法的问题可以使用候选区域产生算法解决。这些算法输入整张图片,然后输出可能有物体的候选区域位置,这些候选区域可以有噪声或者重叠,或者和物体的重合度不是很好,这都不要紧,只要这些区域里有一个和实际物体的位置足够接近就行。因为不好的候选区域会被物体识别算法过滤掉。

  候选区域算法用分割不同区域的办法来识别潜在的物体。在分割的时候,我们要合并那些在某些方面(如颜色、纹理)类似的小区域。相比滑窗法在不同位置和大小的穷举,候选区域算法将像素分配到少数的分割区域中。所以最终候选区域算法产生的数量比滑窗法少的多,从而大大减少运行物体识别算法的次数。同时候选区域算法所选定的范围天然兼顾了不同的大小和长宽比。

  候选区域算法比较重要的特征就是要有较高的召回率。我们要通过这种方法保证拥有物体的区域就在候选区域列表里。所以我们不介意有很多区域什么都有,这都没关系,物体检测算法会过滤掉他们,虽然会浪费一点时间。

目前已有不少成熟的后续区域产生算法:

  • Objectness
  • Constrained Parametric Min-Cuts for Automatic Object Segmentation
  • Category Independent Object Proposals
  • Randomized Prim
  • Selective Search

由于Selective Search又快召回率又高,这个方法是最常用的。说了这么多,终于牵出本文的主角了。

2.3 物体检测之选择性搜索(Selective Search)

  选择性搜索算法用于为物体检测算法提供候选区域,它速度快,召回率高。选择性搜索算法需要先使用《Efficient Graph-Based Image Segmentation》论文里的方法产生初始的分割区域,然后使用相似度计算方法合并一些小的区域。 下列两张图分别是原图和原始分割图:

  我们不能使用原始分割图的区域作为候选区域,原因如下:

  1. 大部分物体在原始分割图里都被分为多个区域
  2. 原始分割图无法体现物体之间的遮挡和包含。

  如果我们试图通过进一步合并相邻的区域来解决第一个问题,我们最终会得到一个包含两个对象的分段区域。我们不要需要完美的的分割区域,我们只想要和实际物体高度重合的区域就行了。选择性搜索算法使用《Efficient Graph-Based Image Segmentation》论文里的方法产生初始的分割区域作为输入,通过下面的步骤进行合并:

  1. 首先将所有分割区域的外框加到候选区域列表中
  2. 基于相似度合并一些区域
  3. 将合并后的分割区域作为一个整体,跳到步骤1

  通过不停的迭代,候选区域列表中的区域越来越大。可以说,我们通过自底向下的方法创建了越来越大的候选区域。表示效果如下:

相似度

  选择性搜索算法如何计算两个区域的像素度的呢? 主要是通过以下四个方面:颜色、纹理、大小和形状交叠 ,最终的相似度是这四个值取不同的权重相加

效果

  opencv实现了选择性搜索算法,可以给出上千个根据有物体的可能性降序排列的候选区域。下图是画出了前面200~250个候选区域的效果。一般来说。1000~1200个候选区域基本能胜任物体检测的任务了。 
python代码实现

#!/usr/bin/env python

import cv2

if __name__ == '__main__':

    # speed-up using multithreads
cv2.setUseOptimized( True );
cv2.setNumThreads( 4 ); # read image
im = cv2.imread( 'test.jpg' )
# resize image
newHeight = 200
newWidth = int( im.shape[1] * 200 / im.shape[0] )
im = cv2.resize( im, (newWidth, newHeight) ) # create Selective Search Segmentation Object using default parameters
ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation() # set input image on which we will run segmentation
ss.setBaseImage( im ) if 1:
# Switch to fast but low recall Selective Search method
ss.switchToSelectiveSearchFast()
else:
# Switch to high recall but slow Selective Search method
ss.switchToSelectiveSearchQuality() # run selective search segmentation on input image
rects = ss.process()
print( 'Total Number of Region Proposals: {}'.format( len( rects ) ) ) # number of region proposals to show
numShowRects = 100
# increment to increase/decrease total number
# of reason proposals to be shown
increment = 50 while True:
# create a copy of original image
imOut = im.copy() # itereate over all the region proposals
for i, rect in enumerate( rects ):
# draw rectangle for region proposal till numShowRects
if (i < numShowRects):
x, y, w, h = rect
cv2.rectangle( imOut, (x, y), (x + w, y + h), (0, 255, 0), 1, cv2.LINE_AA )
else:
break # show output
cv2.imshow( "Output", imOut ) # record key press
k = cv2.waitKey( 0 ) & 0xFF # m is pressed
if k == 109:
# increase total number of rectangles to show by increment
numShowRects += increment
# l is pressed
elif k == 108 and numShowRects > increment:
# decrease total number of rectangles to show by increment
numShowRects -= increment
# q is pressed
elif k == 113:
break
# close image show window
cv2.destroyAllWindows()

selective search

结果如下所示:

效果不是很好,现在都是用深度!!!

参考:yuanlulu

选择性搜索(Selective Search)的更多相关文章

  1. 第三十三节,目标检测之选择性搜索-Selective Search

    在基于深度学习的目标检测算法的综述 那一节中我们提到基于区域提名的目标检测中广泛使用的选择性搜索算法.并且该算法后来被应用到了R-CNN,SPP-Net,Fast R-CNN中.因此我认为还是有研究的 ...

  2. 目标检测之选择性搜索-Selective Search

    一.滑动窗口检测器 一种用于目标检测的暴力方法就是从左到右,从上到下滑动窗口,利用分类识别目标.为了在不同观察距离处检测不同的目标类型,我们可以使用不同大小和宽高比的窗口 得到窗口内的图片送入分类器, ...

  3. 目标检测中的选择性搜索-selective search-没弄

    https://blog.csdn.net/small_munich/article/details/79595257 https://www.cnblogs.com/zyly/p/9259392.h ...

  4. Selective Search for Object Recognition 论文笔记【图片目标分割】

    这篇笔记,仅仅是对选择性算法介绍一下原理性知识,不对公式进行推倒. 前言: 这篇论文介绍的是,如果快速的找到的可能是物体目标的区域,不像使用传统的滑动窗口来暴力进行区域识别.这里是使用算法从多个维度对 ...

  5. 选择性搜索(SS)算法

    一.目标检测和目标识别 目标识别(object recognition)是要指明一张图像中包含哪类目标.输入是图像,输出是图像中的目标属于的类别(class probability).目标检测是识别出 ...

  6. R-CNN目标检测的selective search(SS算法)

    候选框确定算法 对于候选框的位置确定问题,简单粗暴的方法就是穷举或者说滑动窗口法,但是这必然是不科学的,因为时间和计算成本太高,直观的优化就是假设同一种物体其在图像邻域内有比较近似的特征(例如颜色.纹 ...

  7. Selective Search for Object Recognition

    http://blog.csdn.net/charwing/article/details/27180421 Selective Search for Object Recognition 是J.R. ...

  8. RCNN,Fast RCNN,Faster RCNN 的前生今世:(1) Selective Search

    Selective Search for Object Recoginition 这篇论文是J.R.R. Uijlings发表在2012 IJCV上的一篇文章,主要介绍了选择性搜索(Selective ...

  9. 【计算机视觉】Selective Search for Object Recognition论文阅读3

    Selective Search for Object Recoginition surgewong@gmail.com http://blog.csdn.net/surgewong       在前 ...

随机推荐

  1. BZOJ4358:permu

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  2. Python 函数之迭代器和生成器

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可 ...

  3. WPF案例:如何设计历史记录查看UI

    (CSDN博客目前不支持外链, 只能纯文字) 设计WPF的UI,一般遵循下面的步骤: 1.首先分析数据结构 2.根据数据结构选择合理控件 3.定制外观 具体对于历史记录查看UI, 我们可以得知: 1. ...

  4. c++11之二: 类成员变量初始化

    在C++11中, 1.允许非静态成员变量的初始化有多种形式:初始化列表; 使用等号=或花括号{}进行就地的初始化. 可以为同一成员变量既声明就地的列表初始化,又在初始化列表中进行初始化,只不过初始化列 ...

  5. 如果有多个集合的迭代处理情况【使用MAP】

    在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了foreach功能,该功能比较强大,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内.它也允许你指 ...

  6. SPI驱动框架-1(DM8127 Linux2.6.37为例)

    一.驱动程序结构 1.platform_device 文件:/arch/arm/mach-omap2/device.c static struct omap2_mcspi_platform_confi ...

  7. Java-API-Package:javax.http.servlet

    ylbtech-Java-API-Package:javax.http.servlet 1.返回顶部 1. Package javax.servlet.http This chapter descri ...

  8. Java-API:java.util百科

    ylbtech-Java-API:java.util百科 包含集合框架.遗留的 collection 类.事件模型.日期和时间设施.国际化和各种实用工具类(字符串标记生成器.随机数生成器和位数组.日期 ...

  9. 生产者与消费者--demo1---bai

    import java.util.ArrayList; import java.util.List; import java.util.Random; //自定义类,描述仓库 public class ...

  10. 如何判断python的数据类型,用type函数

    用 type 函数 In [29]:  type(dataset) Out[29]: list 查询list的行数 In [38]: len(dataset) In [39]: Out[38]: 36 ...