cuda第一次计算耗时_nms的cuda实现解析

代码

https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/nms/nms_kernel.cu​github.com

nms是不太好在cuda上实现的,因为nms的计算过程是有依赖关系的,比如A,B,C三个置信度由大到小的检测框,如果IOU(A,B)大于阈值,那么BC的IOU则不必再计算了,由于依赖关系会限制cuda的发挥,因此cuda实现中,所有的box之间的IOU都是需要计算的,不过有的结果是不需要的。

代码中nms的输出是长度为

equation?tex=boxes%5C_num%5Ctimes%5Clceil+%5Cfrac+%7Bboxes%5C_num%7D%7BthreadsPerBlock%7D+%5Crceil 的unsigned long long的数组dev_mask,dev_mask是以每一个box为基准计算出来的所有boxes是否丢弃的结果,本来dev_mask应该是一个
equation?tex=boxes%5C_num%5Ctimes+boxes%5C_num 的bool类型二维数组,其中true代表需要删除,false代表保留,第一行表示以置信度最高的box为基准,和其他box计算的结果;第二行则是以置信度次高的box为基准,和其他box计算的结果。有了dev_mask之后可以通过行间的或运算获得最终的mask结果
bool dev_mask[boxes_num][boxes_num];
// nms kernel ...
bool mask[boxes_num];
for (int i = 0; i < boxes_num; ++i) {
    
  // 如果当前的基准box被删除,则不用计算当前的结果
  if (mask[i]) continue;
  // 前面的不用算,因为都是置信度高于当前基准box的
  for (int j = i + 1; j < boxes_num; ++j) {
    
    mask[boxes_num] |= dev_mask[i][j];
  }
}

作者用unsigned lon

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值