python如何实现非极大值抑制算法

  

python如何实现非极大值抑制算法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

NMS算法在目标检测,目标定位领域有较广泛的应用。

<强>算法原理

非极大值抑制算法(Non-maximum抑制,NMS)的本质是搜索局部极大值,抑制非极大值元素。

<强>算法的作用

当算法对一个目标产生了多个候选框的时候,选择得分<代码> 最高的框,并抑制其他对于改目标的候选框

 python如何实现非极大值抑制算法

<>强适用场景

一幅图中有多个目标(如果只有一个目标,那么直接取分数<代码> 最高的候选框即可)。

<强>算法的输入

算法对一幅图产生的所有的候选框,以及每个框对应的得分<代码> (可以用一个5维数组<代码>依据表示,前4维表示四个角的坐标,第5维表示分数),阈值<代码>打>

<强>算法的输出

正确的候选框组(<代码>侦破>

<强>细节

    <李>起始,设所有的框都没有被抑制,所有框按照得分<代码> 从大到小排序。 <李>从第0个框(分数最高)开始遍历:对于每一个框,如果该框没有被抑制,就将所有与它<代码>借据大于<代码>打> <李>返回没被抑制的框。

<强>参考代码

 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  #快R-CNN
  # 2015微软版权(c)
  #在MIT许可下的(有关详细信息,请参阅许可证)
  #罗斯Girshick写的
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  
  进口numpy np
  cimport numpy为np
  
  cdef内联np。float32_t马克斯(np。float32_t, np。float32_t b):
  返回一个如果一个在其他=b b
  
  cdef内联np。float32_t min (np。float32_t, np。float32_t b):
  返回一个如果一个& lt;其他=b b
  
  def cpu_nms (np.ndarray [np。float32_t ndim=2]相同,np。浮动打):
  cdef np.ndarray (np。float32_t ndim=1] x1=检波器(:0)
  cdef np.ndarray (np。float32_t ndim=1]日元=检波器(:1)
  cdef np.ndarray (np。float32_t ndim=1] x2=检波器(:2)
  cdef np.ndarray (np。float32_t ndim=1] y2=检波器(:3)
  cdef np.ndarray (np。float32_t ndim=1]分数=检波器(:4)
  
  cdef np.ndarray (np。float32_t ndim==1]区域(x2 - x1 + 1) * (y2 - y1 + 1)
  cdef np.ndarray (=scores.argsort np.int_t ndim=1]命令()(::1)
  
  cdef int ndets=dets.shape [0]
  cdef np.ndarray [np.int_t ndim=1]抑制=\
  np.zeros ((ndets), dtype=np.int)
  
  #名义指数
  cdef int _i _j
  #分类指数
  cdef int i, j
  #临时变量盒子我# 39;s(目前正在考虑的盒子)
  cdef np。float32_t ix1、iy1 ix2、iy2 iarea
  #变量计算重叠与盒子j(低得分框)
  cdef np。float32_t民、yy1 xx2 yy2
  cdef np。float32_t w h
  cdef np。float32_t国米,表达
  
  保持=[]
  _i的范围(ndets):
  我=[_i]
  如果抑制[我]==1:
  继续
  keep.append(我)
  ix1=x1[我]
  iy1=y?[我]
  ix2 x2=[我]
  iy2 y2=[我]
  iarea=地区[我]
  _j的范围(_i + 1, ndets):
  j=订单(_j)
  如果抑制[j]==1:
  继续
  民=max (ix1 x1 [j])
  yy1=max (iy1, y1 [j])
  xx2=min (ix2 x2 [j])
  yy2=min (iy2, y2 [j])
  w=max (0.0, xx2 -民+ 1)
  h=max (0.0, yy2 - yy1 + 1)
  国米=w * h
  表达=国米/(iarea +地区[j] -国际米兰)
  如果表达祝辞=打:
  抑制[j]=1
  
  返回保持

看完上述内容,你们掌握python如何实现非极大值抑制算法的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

python如何实现非极大值抑制算法