SelectiveSearch算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zizi7/article/details/70274050

由[Uijlings J R R在2012年的IJCV][1]上提出。 方法以[P. F. Felzenszwalb在2004年的IJCV发表的基于图的图像分割][2]为基础,考虑色彩、纹理和尺寸的相似度,输出所有可能目标的位置,为后续的目标识别提供基础。


算法分析

算法使用[图像分割方法][2]对图像做初始分割,提出分层分组方法(图1)对分割的结果做筛选和归并,最终输出所有可能位置。

分层分组算法

step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空

相似度计算

考虑了颜色、纹理、尺寸和空间交叠这4个参数

颜色相似度

将色彩空间转为HSV,每个通道下以bins=25计算直方图,这样每个区域的颜色直方图有25*3=75个区间。
对直方图除以区域尺寸做归一化后使用下式计算相似度
这里写图片描述
可以看到,就是简单的取每个区间最小的值累加。(可以这么理解:假设两个直方图波峰和波谷高度重合,那么计算下来的值比较大;反之如果波峰和波谷错开的,那么累加的值一定比较小。因此这里提前归一化很重要)

纹理相似度

论文采用方差为1的高斯分布在8个方向做梯度统计,然后将统计结果(尺寸与区域大小一致)以bins=10计算直方图。直方图区间数为8*3*10=240(使用RGB色彩空间)。

下节的python实现代码中将基于高斯的梯度统计换成更简单的LBP方法

接下来与颜色相似度类似,通过累加每个直方图区间最小值计算相似度

空间交叠相似度

两个区域交叠越大相似度越高

def _sim_fill(r1, r2, imsize):
    """
        calculate the fill similarity over the image
    """
    bbsize = (
        (max(r1["max_x"], r2["max_x"]) - min(r1["min_x"], r2["min_x"]))
        * (max(r1["max_y"], r2["max_y"]) - min(r1["min_y"], r2["min_y"]))
    )
    return 1.0 - (bbsize - r1["size"] - r2["size"]) / imsize
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

算法实现

作者给出的代码为matlab版本,其中一些模块是加密的
博文《Selective Search for Object Recognition》给出了C++的实现
AlpacaDB在github给出了python的实现,结构清晰,推荐
这里写图片描述
            图2. python版本实现结果


[1]: Uijlings J R R, Sande K E A V D, Gevers T, et al. Selective Search for Object Recognition[J]. International Journal of Computer Vision, 2013, 104(2):154-171.
[2]: P. F. Felzenszwalb and D. P.Huttenlocher. Efficient Graph-Based Image Segmentation. IJCV, 59:167–181, 2004.

                    <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-8e8a9d81f4.css" rel="stylesheet">
            </div>
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zizi7/article/details/70274050

由[Uijlings J R R在2012年的IJCV][1]上提出。 方法以[P. F. Felzenszwalb在2004年的IJCV发表的基于图的图像分割][2]为基础,考虑色彩、纹理和尺寸的相似度,输出所有可能目标的位置,为后续的目标识别提供基础。


算法分析

算法使用[图像分割方法][2]对图像做初始分割,提出分层分组方法(图1)对分割的结果做筛选和归并,最终输出所有可能位置。

分层分组算法

step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空

相似度计算

考虑了颜色、纹理、尺寸和空间交叠这4个参数

颜色相似度

将色彩空间转为HSV,每个通道下以bins=25计算直方图,这样每个区域的颜色直方图有25*3=75个区间。
对直方图除以区域尺寸做归一化后使用下式计算相似度
这里写图片描述
可以看到,就是简单的取每个区间最小的值累加。(可以这么理解:假设两个直方图波峰和波谷高度重合,那么计算下来的值比较大;反之如果波峰和波谷错开的,那么累加的值一定比较小。因此这里提前归一化很重要)

纹理相似度

论文采用方差为1的高斯分布在8个方向做梯度统计,然后将统计结果(尺寸与区域大小一致)以bins=10计算直方图。直方图区间数为8*3*10=240(使用RGB色彩空间)。

下节的python实现代码中将基于高斯的梯度统计换成更简单的LBP方法

接下来与颜色相似度类似,通过累加每个直方图区间最小值计算相似度

空间交叠相似度

两个区域交叠越大相似度越高

def _sim_fill(r1, r2, imsize):
    """
        calculate the fill similarity over the image
    """
    bbsize = (
        (max(r1["max_x"], r2["max_x"]) - min(r1["min_x"], r2["min_x"]))
        * (max(r1["max_y"], r2["max_y"]) - min(r1["min_y"], r2["min_y"]))
    )
    return 1.0 - (bbsize - r1["size"] - r2["size"]) / imsize
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

算法实现

作者给出的代码为matlab版本,其中一些模块是加密的
博文《Selective Search for Object Recognition》给出了C++的实现
AlpacaDB在github给出了python的实现,结构清晰,推荐
这里写图片描述
            图2. python版本实现结果


[1]: Uijlings J R R, Sande K E A V D, Gevers T, et al. Selective Search for Object Recognition[J]. International Journal of Computer Vision, 2013, 104(2):154-171.
[2]: P. F. Felzenszwalb and D. P.Huttenlocher. Efficient Graph-Based Image Segmentation. IJCV, 59:167–181, 2004.

                    <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-8e8a9d81f4.css" rel="stylesheet">
            </div>

猜你喜欢

转载自blog.csdn.net/qq_28241239/article/details/82657687