用于对象检测的OpenCV选择性搜索,是否可以代替YOLOV3算法

选择性搜索

前期很多文章我们讲述了如何使用OpenCV来进行对象的检测,哪里我们主要使用了图片检测的不同算法,包括Fast-RCNN ,YOLOV3等等,不同的检测算法使用不同的图片检测,最著名的当属卷积神经网络

我们主要使用的图片检测机制:

图像金字塔创建了输入图像的多尺度表示,使我们能够检测多种尺度/尺寸的物体:

图片金字塔检测

滑动窗口与图像金字塔的每一层上进行操作,从左到右,由上到下方,从而使我们能够定位其中在图像中的需要定位的对象,以上过程是漫长的,特别对配置较差的电脑来说,这样的处理机制无疑增加了负担

什么是OpenCV选择性搜索

“选择性搜索”试图将超像素合并在一起,以找到可能包含对象的图像区域

选择性搜索基于五个关键的相似度以分层方式合并超像素:

  1. 颜色相似度:为图像的每个通道计算25bit直方图,将它们连接在一起,并获得25×3 = 75-d的最终描述符。任何两个区域的颜色相似度通过直方图相交距离来计算
  2. 纹理相似度:对于纹理,“选择性搜索”以每通道8个方向提取高斯导数(假定为3通道图像)。这些方向用于计算每个通道的10 bin直方图,生成8x10x3 = 240-d的最终纹理描述。为了计算任意两个区域之间的纹理相似度,再次使用直方图相交。
  3. 大小相似度:选择性搜索使用的大小相似度度量标准更倾向于将较小区域进行分组,而不是将其分组。通过强制较小的区域尽早合并,我们可以防止大量区域吞噬所有较小的区域。
  4. 形状相似性/兼容性: “选择性搜索”中形状相似性背后的思想是它们应该彼此兼容。如果两个区域彼此“适合”,则它们被认为是“兼容的”
  5. 综合相似度度量:综合相似度是颜色相似度,纹理相似度,大小相似度和形状相似度/兼容性的线性组合。

下图显示了应用这些层次相似性度量的选择性搜索的结果:

选择性搜索结果

基于以上理论,opencv 设置了2种不同的对象选择性搜索算法:

																																																		ss.switchToSelectiveSearchFast()
switchToSelectiveSearchQuality()

顾名思义,快速检测对象搜索算法牺牲了质量,但是大大提高了效率,这个在我们日常的对象检测上完全足够,质量检测对象搜索算法则是应用在对每个细节要分析到位,必然需要消耗大量的计算时间

选择性搜索代码实现

import random
import cv2
image = cv2.imread("1.jpg")
ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()
ss.setBaseImage(image)
ss.switchToSelectiveSearchFast()
#ss.switchToSelectiveSearchQuality()
rects = ss.process()

首先利用
cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()初始化一个选择性搜索算法

ss.setBaseImage(image)加入图片检测


ss.switchToSelectiveSearchFast()利用快速选择性搜索

rects = ss.process()进行图片的选择性搜索

以上几行代码便可以进行图片的选择性搜索,结果存放在rects,里面保存了图像检测的边框坐标

代码截图

for i in range(0, len(rects), 100):
	output = image.copy()
	for (x, y, w, h) in rects[i:i + 100]:
		color = [random.randint(0, 255) for j in range(0, 3)]
		cv2.rectangle(output, (x, y), (x + w, y + h), color, 2)
	cv2.imshow("Output", output)
	key = cv2.waitKey(0) & 0xFF
	if key == ord("q"):
		break

我们遍历所有图片检测的结果,里面保存了图片检测的边框坐标,利用坐标文件,我们画出选择性搜索的图片检测边框,以便显示

代码截图

我们可以看到OpenCV选择性搜索检测出图片可能对象存在的区域,这里特别需要注意,OpenCV选择性搜索选择区域,而不是类标签,OpenCV选择性搜索知道这里有需要检测的对象,但OpenCV选择性搜索并不知道这个区域是什么,很多人错误地认为“选择性搜索” 取代了整个对象检测框架,例如HOG + Linear SVM,R-CNN,yolov3等等,这里小伙伴们需要理解一下,但是我们完全可以使用OpenCV选择性搜索来进行图片的检测,把图片的边框给到SVM,R-CNN,yolov3等检测算法,进行进行图片的对象检测,这样便可以加速图片检测的速度(我们后期分享)

总结一下OpenCV选择性搜索

OpenCV选择性搜索生成可能包含对象的图像区域。然而,选择搜索不具有任何标签选择性搜索的目的是取代穷举的使用图像金字塔和滑动窗口检查,避免计算量大,效率低下通过使用OpenCV选择性搜索,我们可以更有效地检查可能包含对象的图像区域,然后将这些区域边框传递到SVM,CNN, yolov3等进行图片的最终分类。