Selective Search算法与演示
星标或者置顶【OpenCV学堂】
干货文章与技术教程第一时间送达
算法详解
在对象检测RCNN模型中使用了SS(Selective Search)进行区域推荐,改进了传统图像检测进行全局开窗检测的高计算消耗,典型的对象检测网络RCNN的结构如下:
其中SS作为一种区域推荐算法作为检测框,它是一种基于图像层次纹理、大小、形状进行分割与合并的算法。SS算法对输入图像的过度分割以后作为算法输入,图示如下:
SS算法进行区域推荐ROI生成会执行如下步骤
对每个分割区域计算外接矩形框,作为区域推荐窗口
对每组相邻的分割区域根据相似性进行合并
不断重复1~2
上述步骤中产生大的ROI区域不断被添加到,图像也从最初的过度分割到完全分割、到最终的完全合并。这种基于不同层次的合并被称为自底向上的分割方法。如下图所示:
相似性计算
颜色相似性
根据两个分割区域的颜色直方图的相似度来进行比较,颜色相似计算直方图方法是把0~255总计256个维度分为25个BIN、对RGB三通道得到25x3=75个维度数值,比较两个分割区域的这两组75个数值,采用直方图交叉来计算直方图相似程度,公式如下:
纹理相似性
纹理本质上是图像的梯度、所以计算图像高斯梯度(基于高斯核)、分为8个方向、每个方向上计算颜色直方图、颜色直方图分为10个BIN这样就得到10x8=80个向量,对于彩色RGB图像得到80x3=240个描述子向量作为纹理特征,比较纹理特征相似度的方法与颜色相似性相同。
大小与形状相似性
根据外界矩形框的面积大小,排序得到前2000个ROI区域作为RCNN的区域推荐框。
OpenCV代码演示
OpenCV在扩展模块图像处理中已经包含了SS算法,可以通过API直接创建SS模型对象,调用其方法实现区域推荐功能,代码演示如下:
import cv2
if __name__ == '__main__':
cv2.setUseOptimized(True);
cv2.setNumThreads(4);
# read image
im = cv2.imread("D:/images/dog.jpg")
# resize image
newHeight = 200
newWidth = int(im.shape[1] * 200 / im.shape[0])
im = cv2.resize(im, (newWidth, newHeight))
cv2.imshow("input", im)
# 创建算法+设置输入图像
ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()
ss.setBaseImage(im)
# 使用SS快速版本
ss.switchToSelectiveSearchFast()
# 执行SS
rects = ss.process()
print('Total Number of Region Proposals: {}'.format(len(rects)))
# 推荐100个ROI
numShowRects = 100
imOut = im.copy()
# 显示前100个区域外接矩形框
for i, rect in enumerate(rects):
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("SS-Demo", imOut)
cv2.waitKey(0)
cv2.destroyAllWindows()
善始者实繁
克终者盖寡
推荐阅读
听说点【好看】会有好运来