【NMS】|提高效率

https://zhuanlan.zhihu.com/p/157900024

NMS由于顺序处理的原因,运算效率较为低下。在笔者的实际项目中,NMS往往能占模型计算总时间的40%甚至更多,极大影响了模型的效率。经过笔者一段时间的调研,关于提升NMS运算速度的方法,在这里也将结合代码进行阶段性总结。

所参考的代码库列举如下:

  1. Faster RCNN pytorch (rbg大神) 的 CUDA NMS https://github.com/rbgirshick/py-faster-rcnn

  2. YOLACT团队提出的Fast NMS https://github.com/dbolya/yolact

  3. CIoU团队提出的Cluster NMS https://github.com/Zzh-tju/CIoU

  4. SOLOv2团队提出的Matrix NMS https://github.com/WXinlong/SOLO

  5. Torchvision封装的免编译CUDA NMS

1 fast nms

假如一张图片中有 n个检测框,。检测框集合事先会按照得分降序排列,得到如下这个IoU矩阵X:
在这里插入图片描述

Fast NMS首先对X使用pytorch的triu函数进行上三角化,得到了一个对角线元素及下三角元素都为0的IoU矩阵X。

在这里插入图片描述
接着X执行按列取最大值操作,得到一维张量b,bi表示第i个框与前面i-1个框重复的最大iou值。

最后使用NMS阈值,论文取0.5,对 b 二值化。

元素小于NMS阈值的是保留的框,≥NMS阈值的是冗余框。例如

1代表保留,0代表抑制。
在这里插入图片描述

def fast_nms(self, boxes, scores, NMS_threshold:float=0.5):
    '''
    Arguments:
        boxes (Tensor[N, 4])
        scores (Tensor[N, 1])
    Returns:
        Fast NMS results
    '''
    scores, idx = scores.sort(1, descending=True)
    boxes = boxes[idx]   # 对框按得分降序排列
    iou = box_iou(boxes, boxes)  # IoU矩阵
    iou.triu_(diagonal=1)  # 上三角化
    keep = iou.max(dim=0)[0] < NMS_threshold  # 列最大值向量,二值化

    return boxes[keep], scores[keep]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值