参考路径:目标检测RCNN系列的候选区选择算法——selective search(原理+Python实现)_macan_dct的博客-优快云博客
作用:实际上就是在原图尽可能快,尽可能好的生成框选目标的候选框,避免使用穷举法导致的计算量过大的问题
策略: 遍历所有的尺度,但不同于暴力穷举,首先得到小尺度的候选区域,然后一次次合并得到大的候选区域
方案: 解决纹理问题使用,使用颜色特征;解决颜色特征不行的问题,使用纹理特征;解决尺度问题,使用候选区域的面积和互补性
具体操作思想大致如下:
(1)selective search首先使用 Felzenswalb图像分割算法将图像分割成多个不同的块,每一个块代表分割算法得到的一个类,根据每个块的横纵坐标的最大值和最小值来初步产生一个候选区
import cv2
import numpy as np
from skimage import io as sio
from skimage.segmentation import felzenszwalb
import matplotlib.pyplot as plt
if __name__ == '__main__':
sigma = 0.9
kernel = 3
K, min_size = 500, 10
image = sio.imread(r"D:\personal\model_and_code\dataset\VOCdevkit\VOC2012\JPEGImages\2007_000129.jpg")
# skimage自带的felzenszwalb算法
seg1 = felzenszwalb(image, scale=K, sigma=sigma, min_size=min_size)
fig = plt.figure()
a = fig.add_subplot(121)
plt.imshow(image)
a.set_title("image")
a = fig.add_subplot(122)
plt.imshow(seg1)
a.set_title("seg1")
plt.show()

分割得到的每一类分割结果都会有像素位置的横坐标的左侧最小值min_x、纵坐标的左侧最小值min_y、横坐标的右侧最大值max_x、纵坐标的右侧最大值max_y,即[min_x, min_y, max_x, max_y]作为当前分割结果的候选区(框)
# pass 1: 根据分割类别,找到分割结果的每个类别像素位置的左上坐标和右下坐标
for y, i in enumerate(img):
for x, (r, g, b, l) in enumerate(i):
# initialize a new region
if l not in R:
R[l] = {
"min_x": 0xffff, "min_y": 0xffff,
"max_x": 0, "max_y": 0, "labels": [l]}
# bounding box
if R[l]["min_x"] > x:
R[l]["min_x"] = x
if R[l]["min_y"] > y:
R[l]["min_y"] = y
if R[l]["max_x"] < x:
R[l]["max_x"] = x

SelectiveSearch通过Felzenswalb图像分割算法生成候选区域,结合颜色、纹理和尺度信息减少计算量。它使用LBP计算局部梯度,HSV空间计算颜色直方图,然后根据相似性合并重叠区域,生成用于RCNN等目标检测模型的候选框。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



