非最大抑制(NMS)

非极大值抑制(NMS)

      非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

代码如下

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. function pick = nms(boxes, overlap)  
  2.    
  3. % pick = nms(boxes,overlap)  
  4. % Non-maximumsuppression.  
  5. % Greedily selecthigh-scoring detections and skip detections  
  6. % that are significantlycovered by a previously selected detection.  
  7.    
  8. % boxes = boxes';  
  9.    
  10. if isempty(boxes)  
  11.     pick = [];  
  12. else  
  13.     x1 = boxes(:,1);  
  14.     y1 = boxes(:,2);  
  15.     x2 = boxes(:,3);  
  16.     y2 = boxes(:,4);  
  17. %     x1 = boxes(:,1);  
  18. %     y1 = boxes(:,2);  
  19. %     x2 = boxes(:,2);  
  20. %     y2 = boxes(:,4);  
  21.     s = boxes(:,end);  
  22.     area = (x2-x1+1) .* (y2-y1+1);%Çó³öËùÓÐÃæ»ý  
  23.      
  24.     [vals, I] = sort(s);  
  25.     pick = [];  
  26.     while ~isempty(I)  
  27.         last = length(I);  
  28.         i = I(last);  
  29.         pick = [pick; i];  
  30.         suppress = [last];  
  31.         for pos = 1:last-1  
  32.             j = I(pos);  
  33.             xx1 = max(x1(i), x1(j));  
  34.             yy1 = max(y1(i), y1(j));  
  35.             xx2 = min(x2(i), x2(j));  
  36.             yy2 = min(y2(i), y2(j));  
  37.             w = xx2-xx1+1;  
  38.             h = yy2-yy1+1;  
  39.             if w > 0 && h > 0  
  40.                 % compute overlap  
  41.                 o = w * h / min(area(i),area(j));  
  42. %                 o = w/area(j);  
  43.                 if o > overlap  
  44.                     suppress = [suppress; pos];  
  45.                 end  
  46.             end  
  47.         end  
  48.         I(suppress) = [];  
  49.     end  
  50. end  

 

      输入的窗口的位置和分数,以及窗口面积交叉是多大比例进行抑制。boxes应当是N*5的矩阵,一行代表着一个窗口,包括[x,y,width,height ,score ],overlap是介于0~1的实数。输出的是局部分数最大的窗口序号序列。

     程序解读:首先计算出所有窗口的面积,对所有窗口的分数进行从小到大排序取出最高分数的序号。循环计算1到次高分数窗口与最高分数窗口的交叉面积与两者间最小面积的比例,若超过overlap那么把这一窗口抑制了。交叉面积怎么计算呢?如下图对应于程序

       

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. xx1 = max(x1(i), x1(j));  
  2. yy1 = max(y1(i), y1(j));  
  3. xx2 = min(x2(i), x2(j));  
  4. yy2 = min(y2(i), y2(j));  
  5. w = xx2-xx1+1;  
  6. h = yy2-yy1+1;  
  7. if w > 0 && h > 0  
  8.     % compute overlap  
  9.     o = w * h / min(area(i),area(j));    
  10.      if o > overlap  
  11.         suppress = [suppress; pos];  
  12.     end  
  13. end  

图像边缘检测非极大值抑制求解释

06-09

请看这段代码rn// 如果当前象素的梯度幅度为 0,则不是边界点rnif(pnMag[nPos] == 0 )rnrnpUncheckRst[nPos] = 0 ;rnrnelsernrndTmp = pnMag[nPos] ;rngx = pnGradX[nPos] ; // 水平方向偏导数rngy = pnGradY[nPos] ; // 垂直方向偏导数rnif (abs(gy) > abs(gx))rnrnweight = fabs(gx)/fabs(gy); // 计算插值的比例rng2 = pnMag[nPos-imageWidth] ;rng4 = pnMag[nPos+imageWidth] ;rn// 如果两个方向的偏导数的符号相同rn// C 是当前象素,与 g1-g4 的位置关系为:rn// g1 g2rn// Crn// g4 g3rnif (gx*gy > 0)rnrng1 = pnMag[nPos-imageWidth-1] ;rng3 = pnMag[nPos+imageWidth+1] ;rnrn// 如果两个方向的偏导数的符号相反rn// C 是当前象素,与 g1-g4 的位置关系为:rn// g2 g1rn// Crn// g3 g4rnelsernrng1 = pnMag[nPos-imageWidth+1] ;rng3 = pnMag[nPos+imageWidth-1] ;rnrnrnelsernrnweight = fabs(gy)/fabs(gx);rng2 = pnMag[nPos+1] ;rng4 = pnMag[nPos-1] ;rn// 如果两个方向的偏导数的符号相同rn// C 是当前象素,与 g1-g4 的位置关系为:rn// g3rn// g4 C g2rn// g1rnif (gx*gy > 0)rnrng1 = pnMag[nPos+imageWidth+1] ;rng3 = pnMag[nPos-imageWidth-1] ;rnrn// 如果两个方向的偏导数的符号相反rn// C 是当前象素,与 g1-g4 的位置关系为:rn// g1rn// g4 C g2rn// g3rnelsernrng1 = pnMag[nPos-imageWidth+1] ;rng3 = pnMag[nPos+imageWidth-1] ;rnrnrn// 下面利用 g1-g4 对梯度进行插值rnrndTmp1 = weight*g1 + (1-weight)*g2 ;rndTmp2 = weight*g3 + (1-weight)*g4 ;rn// 当前象素的梯度是局部的最大值rn// 该点可能是个边界点rnif(dTmp>=dTmp1 && dTmp>=dTmp2)rnrnpUncheckRst[nPos] = 128 ;rnrnelsernrn// 不可能是边界点rnpUncheckRst[nPos] = 0 ;rnrnrnrnrnrnrn小弟有以下几个问题:(1) 插值是何意?为啥取g1,g2为一组,g3,g4为一组计算插值?rn (2) 原理上是比较3*3矩阵内相邻像素点是不是最大值,他为何比较g1,g2,g3,g4就完事了rn (3) 为何要分X,Y方向导数谁大两种情况比较

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试