近年来,基于深度学习的目标检测算法大火,其实现方式主要分为:
-
两阶(two-stage):先用启发式方法(例如,selective search)或者CNN网络(RPN)生成候选框(Region Proposal),然后用CNN网络在候选框上做分类(获得类别)与回归(获得位置)。典型代表算法有:R-CNN系列算法。
-
一阶(one-stage):只用一个CNN网络直接预测不同目标的类别与位置。典型代表算法有:YOLO系列算法,SSD系列算法。
本文主要介绍在RCNN和Fast RCNN算法中用于生成候选框的Selective Search 算法,虽然后来的Faster RCNN算法 RPN 来代替了 Fast RCNN 中的SS算法,但SS算法依旧值得学习!
1. 运行SS算法,可视化算法的输入输出。
SS算法,输入是一张图片,输出是候选框,为了直观了解SS的效果,请先运行基于OpenCV实现的SS算法演示程序:ss_demo.py
import cv2, time
# Read image
img = cv2.imread("cat.jpg")
# Selective Search Algorithm.
# Step1. Create Selective Search Segmentation Object using default parameters
ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()
# Step2. Set input image on which we will run segmentation
ss.setBaseImage(img)
# Step3. Set switchToSelectiveSearchFast() or switchToSelectiveSearchQuality()
#ss.switchToSelectiveSearchFast()
ss.switchToSelectiveSearchQuality()
# Step4. Run selective search on the image
start_time = time.time()
region_proposals = ss.process()
elapsed_time = time.time() - start_time
print(f"Number of Region Proposals: {len(region_proposals)}; Elapsed time:{elapsed_time:0.3f}ms.")
# Visualize the region proposals
numShowRects = 50 # number of region proposals to show
# Itereate over all the region proposals
for i, rect in enumerate(region_proposals):
# draw rectangle for region proposal till numShowRects
if (i < numShowRects):
x, y, w, h = rect
cv2.rectangle(img, (int(x-w/2), int(y-h/2)), (int(x+w/2), int(y+h/2)), (0, 255, 0), 1, cv2.LINE_AA)
else:
break
cv2.imshow("Selective Search Demo", img)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果如下:2. SS算法生成候选框的依据
在Selective Search for Object Recognition论文中,作者提出了类聚像素点的思路,依据: 颜色相似(Color Similarity),文理相似(Texture Similarity),形状兼容(Shape Compatibility)等,得出一个总相似率(Final Similarity)。依据总相似率来对像素点分组,输出的候选框为一组像素点的外接矩形。
这也是OpenCV提供switchToSelectiveSearchFast() 和 switchToSelectiveSearchQuality()选项的依据。
3. 总结:
Selective Search 算法是一种计算速度快,精度高的生成候选框算法。OpenCV已有成熟实现方式,可以直接使用。下一篇文章,我们将继续分享更高效的候选框生成方式:RPN(Region Proposal Network)。