R-CNN之前的准备:Efficient Graph-Based Image Segmentation

来源:互联网 发布:网络 神曲 编辑:程序博客网 时间:2024/05/21 06:50
R-CNN大致分为两个步骤,一个是使用提出检测建议(detection proposals)的算法,另一个是使用神经网络对这些检测建议进行分类和融合。在R-CNN中用到的提出检测建议的算法是选择性搜索算法(selective search),这个算法分为两个大步骤,一个是使用图像分割算法把图像分为许多的小区域,另一个是对这些区域按照一定的准则进行融合形成更大的区域,并对这些区域生成相应的包围矩形(bounding boxes),即为最后的检测建议。选择性搜索算法第一步需要一个图像分割算法,更为具体的在论文中用到的就是这里将要介绍的Efficient Graph- Based Image Segmentation。 
      这篇文章是R-CNN的作者Ross Girshick的导师Pedro F. Felzenszwalb在图像分割领域做的一项工作,我们这里学习这篇文章是因为在R-CNN中用到的selective search算法中用到了这个分割算法作为基础。这篇论文的思想是把图像看作为一个图(graph),图中的节点就是图像中的像素,而权重就是相邻像素之间的差异性。然后通过贪心算法不断融合差异性小的像素或者区域为一个区域,将图最后划分为数个区域(regions或者是components),从而完成对图像的分割。 
      作者首先提出了如何衡量两个区域之间存在边界的证据(evidengce)的判断标准(predicate),随后在这个判断标准下提出了一种图像分割的算法,尽管这种算法采用了贪心的策略,但是它还是能够考虑到全局特征,产生出令人满意的分割结果。该算法的一个重要的性质是它能够在变化平缓的区域中保留住细节,而在变化剧烈的区域中忽略细节直接将其融合为一个区域。 
      让G=(V,E)成为一个无向图(graph),其中V是图像(图像指的是图片,图指的是一种数据结构)中的每一个像素构成的顶点集合,E是V中连接相邻的顶点的边构成的边的集合,E中的每一个边edge(vi,vj)都有一个对应的权重w((vi,vj)),这个权重衡量的是vi和vj节点的差异性。衡量这种差异性的方法有很多,比如可以用两个节点之间的距离来表达这种差异性,或者用两个节点所代表的像素的颜色的差异来表达这种差异性。在基于图的图像分割方法中,对一个图的分割S表示的意思是将顶点集合V分割为许多组件(components),S中的每一个component都对应于新的图G’=(V,E’)中的一个连接上的component。(注意graph中的component就对应于图片中的region) 
      我们可以思考一件很直观的事情,两个区域之所以成为两个区域,而没有融合成为一个区域,是不是就是意味着这个区域内部元素的差异性要小于两个区域之间的差异性呢?换言之,如果区域之间的差异性比区域内部的差异性还要小的话,那实际上这两个区域就应该融合成为一个区域,因为比它们差异性大的都成为了一个区域了,那这两个区域也应该成为一个区域才对。这便是作者提出的判断两个区域是否应该融合为一个区域的标准,也是这篇文章的一个重要的思想。 
       接下来便是要从数学上定义什么叫做一个区域内部的差异性以及两个区域之间的差异性了。 
       我们定义区域内部的差异性(internal di®erence of a component)为将这个区域构造成一个最小生成树后权重最大的那条边的权重,见下式: 
这里写图片描述 
      随后定义了区域之间的差异性(difference between two components)是指两个分割区域之间顶点相互连接的最小边的权值,见下式: 
这里写图片描述 
      如果两个分割部分之间没有边连接,定义 Dif(C1,C2) = ∞ 
      在判断两个区域是否应该融合为一个区域的时候,即是需要判断两个区域之间的差异性是否大于这两个区域内部的差异性,如果大于,则保持现状为两个区域,反之则把这两个区域进行融合。用数学上定义为下式: 
这里写图片描述 
      可以看到这里有一个MInt,它表示了两个区域各自的差异性加上一个阈值后的最小的那个差异性,数学上定义为下式: 
这里写图片描述 
      其中 
这里写图片描述 
      |C|表示的是这个区域中像素的个数,k是一个参数,它控制的是生成的分割区域的面积大小,当k越大的时候,生成的分割区域的数量越少,每一个区域的面积越大,因为当k很大的时候,当两个区域的面积很小的时候MInt会比较大,会导致两个区域之间的差异性趋向于小于区域内部的差异性,会导致这两个区域融合为一个区域,从而使得最后的分割区域比较大,因为融合得比较多。 
      有了以上的判断标准之后,我们便可以正式描述这个图像分割算法,其分为以下几个步骤: 
这里写图片描述 
中文译文为: 
0. 对于图G的所有边,按照权值进行排序(升序) 
1. 1. S[0]是一个原始分割,相当于每个顶点当做是一个分割区域 
2. q = 1,2,…,m 重复3的操作(m为边的条数,也就是每次处理一条边) 
3. 根据上次S[q-1]的构建。选择一条边oq(vi,vj),如果vi和vj在分割的互不相交的区域中,比较这条边的权 值与这两个分割区域之间的最小分割内部差MInt,如果w(oq(vi,vj)) <= MInt,那么合并这两个区域,其他区域不变;如果否,什么都不做。 
4. 最后得到的就是所求的分割S = S[m] 
      至此算法便结束了,接下来论文具体实现了两种算法:基于Grid Graphs的和基于Nearest Neighber Graphs的方法。两者的区别在于graph中节点和边的选取方式的不同:GG方法将图像中的每个元素视为一个节点,只要两个像素相邻,则认为其对应的节点之间有边连接(一般来说,每个节点有8条边)。边的权重值为对应两个节点的像素值差值的绝对值。(细节方面,1预处理过程使用σ=0.8的高斯函数来对图像进行平滑以减少噪声。2当图像为三通道图像时,将算法应用于全部三个通道,只有当三个通道全部给出合并区域的建议时才合并区域。3文章中使用的k值,当图片是128*128时k=150,当图片是320*240时k=300,即k值大概与图片尺寸成正比)。NNG方法先将图像的每个像素映射到特征空间形成图的节点,然后利用特征空间中的距离选取与其距离最近的点作为他们的邻居(有多种方法来选择邻居节点,即可以选择与其最近的k个邻居点,也可以选择与其距离不超过d的所有点作为邻居点),连接邻居点的边权重为两个对应节点在特征空间内的距离。结果说明,NNG算法比GG算法在保证算法第一条性质的效果上要更好一些。 
      前面提到过k的值可以控制生成的分割区域的数量和大小,下面依次给出k=10,100,1000的时候对于同一张图片的分割结果以便有一个直观的感受: 
原图:这里写图片描述 
k=10: 这里写图片描述 
k=100:这里写图片描述 
k=1000:这里写图片描述 
代码我已经上传至csdn上了,地址为http://download.csdn.net/detail/xbcreal/9908383