代码
https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/nms/nms_kernel.cugithub.comnms是不太好在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](https://i-blog.csdnimg.cn/blog_migrate/9a0e924a347f3e0849967f5d4d852217.png)
![equation?tex=boxes%5C_num%5Ctimes+boxes%5C_num](https://i-blog.csdnimg.cn/blog_migrate/64c3d81912ea44ef7beb700d85fc5402.png)
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