选择性搜索(Selective Search)算法

R-CNN和Fast R-CNN中的选择性搜索算法

R-CNN和Fast R-CNN算法结构

在R-CNN的选择性搜算(Selective Search)算法

在Fast R-CNN的选择性搜算(Selective Search))算法

问题来源

选择性搜算(Selective Search)算法

简述

选择性搜算(Selective Search)算法思路

选择性搜算(Selective Search))算法应用场景

代码

OUTPUT

R-CNN和Fast R-CNN算法结构

在R-CNN的选择性搜算(Selective Search)算法

SelectiveSearch在R-CNN中的位置

一张图像中通过选择性搜算(Selective Search)算法生成1K-2K的候选区域;

对每个候选区域都使用深度神经网络VGG16提取特征;

使用SVM对每一个特征图进行分类,判断是否属于该类别;

使用回归器进一步修正候选框位置

在Fast R-CNN的选择性搜算(Selective Search))算法

SelectiveSearch在FasterR-CNN中的位置

一张图像中通过选择性搜算(Selective Search)算法生成1K-2K的候选区域;

将图像输入到深度神经网络VGG16中,得到相应的特征图,将SS算法生成的候选框投影到特征图上相应的特征矩阵;

将每个特征矩阵通过ROI Pooling层缩放到7*7大小特征图,并将特征图展平通过一全连接层得到预测结果;

问题来源

!! 在R-CNN和Fast R-CNN目标检测网络中都用到了选择性搜算(Selective Search)算法,使用该算法获得候选区域,用于后续的网络训练,去分类、回归矫正得到目标的类别和位置,故此选择性搜算(Selective Search)算法是比较重要的,在学习过程中也引起了好奇心。而在一些R-CNN和Fast R-CNN网络的解析中往往忽略了对选择性搜算(Selective Search)算法的讲解,故此有了此篇文章

选择性搜算(Selective Search)算法

简述

!! 在传统的计算机视觉做目标检测时,为定位到目标的具体位置,通常将图像分成许多子块(subregions/patchs),然后把子块作为输入,送入到目标识别模型中。分子块的最直接的方法是滑动窗口法(sliding window approach),及:按子块的大小在整幅图像上穷举所有的子图像块,算法数据量非常大。和滑动窗口相对的是另一类基于区域(region proposal)的方法。候选区域算法用分割不同区域的办法来识别潜在的物体。在分割的时候,要合并那些在某些方面(如颜色、纹理、尺寸、交叠)类似的小区域。相比滑窗法在不同位置和大小的穷举,候选区域算法将像素分配到少数的分割区域中。所以最终候选区域算法产生的数量比滑窗法少的多,从而大大减少运行物体识别算法的次数。而且候选区域算法所选定的范围天然兼顾了不同的大小和长宽比。

选择性搜算(Selective Search)算法来源于一片名为《Selective Search for Object Recognition》的论文,selective search 算法首先需要一个基于像素的图像分割。这里用的是 Felzenszwalb and Huttenlocher 算法 (因为是当时速度最快的算法,而且是公开的),得到一个 oversegmented 的图像分割。

选择性搜算(Selective Search)算法思路

!! 假设现在图像上有n个预分割的区域,表示为R={R1, R2, ..., Rn}, 计算每个region与它相邻region(注意是相邻的区域)的相似度,这样会得到一个n*n的相似度矩阵(同一个区域之间和一个区域与不相邻区域之间的相似度可设为NaN),从矩阵中找出最大相似度值对应的两个区域,将这两个区域合二为一,这时候图像上还剩下n-1个区域; 重复上面的过程(只需要计算新的区域与它相邻区域的新相似度,其他的不用重复计算),重复一次,区域的总数目就少1,知道最后所有的区域都合并称为了同一个区域(即此过程进行了n-1次,区域总数目最后变成了1).

算法流程

!!

通过不断的迭代以上步骤,可以将提取到的区域进行合并,合并结果如下图所示:

相似度计算

分析了不同颜色空间各通道的特点,有利于在面对实际任务时确定解决问题的方向。SS算法里面相似度度量的几种方法:

颜色相似度

纹理相似度

尺寸相似度

填充相似度

纹理相似度(texture similarity)

采用方差为1的高斯分布在8个方向做梯度统计,然后将统计结果(尺寸与区域大小一致)以bins=10计算直方图。直方图区间数为8310=240(使用RGB色彩空间).

颜色相似度(color similarity)

将色彩空间转为HSV,每个通道下以bins=25计算直方图,这样每个区域的颜色直方图有25*3=75个区间。对直方图除以区域尺寸做归一化后使用下式计算相似度:

尺寸相似度(size similarity)

!! 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域。例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。

交叠相似度(shape compatibility measure)
最终的相似度

选择性搜算(Selective Search))算法应用场景

在很多算法中会用到选择性搜算(Selective Search))算法,通过选择性搜算(Selective Search))算法得到区域推荐,提取区域的空间金字塔的多样特征,组合成一个特征向量,然后训练SVM或者全连接层去分类。

欢迎关注:【未来现相】微信公众号!!!

代码

importsys importcv2 #读取照片,这里要根据具体情况设置路径 im=cv2.imread("./img/pexels-august-de-richelieu-4262010.jpg") print(im.shape) #重置图片大小,高设置为400,保持高、宽比例 newHeight=400 newWidth=int(im.shape[1]*400/im.shape[0]) im=cv2.resize(im,(newWidth,newHeight)) #创建SelectiveSearchSegmentation对象 ss=cv2.ximgproc.segmentation.createSelectiveSearchSegmentation() #添加待处理的图片 ss.setBaseImage(im) #可以选择快速但是低recall的方式 #这里的 recall 指的是选择出来的 region 是否包含了所有应该包含的区域。recall 越高越好 #ss.switchToSelectiveSearchFast() #也可以选择慢速但是高recall的方式 ss.switchToSelectiveSearchQuality() #进行region划分,输出得到的region数目 rects=ss.process() print(TotalNumberofRegionProposals:{}.format(len(rects))) #设定要显示的region数目 numShowRects=100 #可以通过按键逐步增加或者减少显示的region数目 increment=50 whileTrue: #不要在原图上画boundingbox,而是复制一个新图 imOut=im.copy() #遍历regions fori,rectinenumerate(rects): #通过boundingbox显示出指定数量的region if(i<numShowRects): x,y,w,h=rect#boundingbox左上角坐标x,y,以及box的宽和高 cv2.rectangle(imOut,(x,y),(x+w,y+h),(0,255,0),1)#绿色box,线宽为1 else: break #显示图片+bbox cv2.imshow("Output",imOut) #接收按键输入 k=cv2.waitKey(0)&0xFF #“m”键ispressed ifk==109: #增加显示的bbox数目 numShowRects+=increment #“l”键ispressed elifk==108andnumShowRects>increment: #减少显示的bbox数目 numShowRects-=increment #“q”键ispressed elifk==113: break #closeimageshowwindow cv2.destroyAllWindows()

OUTPUT

!!

选择性搜索(Selective Search)算法来源于网络由小明云采集,如果触犯您的利益,请联系站长删除此文链接:https://687267.com/10860.html
THE END
分享
二维码
打赏
< <上一篇
下一篇>>