由[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>
由[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>