目标检测之单类别NMS

long time no see!

在目标检测中,常见的是多类别NMS,也就是只对相同类别的boxes来计算IOU;但现实场景中经常遇到同一个物体被识别成2个类别,也就是模型认为它既是类别1也是类别2.这时候通过多类别nms就过滤不掉这种重叠的框。所以就需要进行单类别NMS:即把所有的boxes都认为是一个类别,然后再计算IOU来过滤。

这个函数的三个输入参数分别是:模型检测得到的框(x,y,w,h)、 每个框的得分、nms阈值

python 复制代码
def oneclass_nms(boxes, class_probs, nms_threshold):


    def get_iou(box1, box2):
        """
        计算两个边界框的IOU
        :param box1: 第一个边界框,格式为 [x1, y1, x2, y2]
        :param box2: 第二个边界框,格式为 [x1, y1, x2, y2]
        :return: IOU的值
        """
        x11, y11, x12, y12 = box1
        x21, y21, x22, y22 = box2

        # 计算边界框的交集
        inter_x1 = max(x11, x21)
        inter_y1 = max(y11, y21)
        inter_x2 = min(x12, x22)
        inter_y2 = min(y12, y22)

        # 计算交集面积
        inter_area = max(0, inter_x2 - inter_x1) * max(0, inter_y2 - inter_y1)

        # 计算边界框的总面积
        box1_area = (x12 - x11) * (y12 - y11)
        box2_area = (x22 - x21) * (y22 - y21)

        # 计算并集面积
        union_area = box1_area + box2_area - inter_area

        # 计算IOU
        iou = inter_area / union_area
        return iou

    # 初始化一个空列表来存储保留的边界
    boxes_list = copy.deepcopy(boxes.tolist())
    boxes_list_copy = copy.deepcopy(boxes.tolist())
    box_save = set()

    while boxes_list:
        box_a = boxes_list.pop(0)
        for box_b in boxes_list:
            if get_iou(box_a, box_b) > 0.1:
                box_save.add(boxes_list_copy.index(box_a))

    all_index = set(list(range(len(boxes_list_copy))))
    # 获取all_index中不在keep中的索引
    diff = all_index - box_save
    diff = list(diff)
    diff = sorted(diff, key=lambda x: x)

    return diff

在官方的代码中已经有boxes, class_probs, nms_threshold这三个参数的输出,我们只需把它传入上面的函数就可以了。在官方yolo的基础上修改代码如下(注释掉的是官方原始的代码)

在non_max_suppression这个函数里插入我们的单类别nms函数即可。把官方的nms注释掉换成自定义的nms就OK了

相关推荐
向哆哆4 天前
高精度织物缺陷检测数据集(适用YOLO系列/1000+标注)(已标注+划分/可直接训练)
yolo·目标检测
前网易架构师-高司机4 天前
带标注的驾驶员安全带识别数据集,识别率99.5%,可识别有无系安全带,支持yolo,coco json,pascal voc xml格式
xml·yolo·数据集·交通·安全带
向哆哆4 天前
粉尘环境分类检测千张图数据集(适用YOLO系列)(已标注+划分/可直接训练)
yolo·分类·数据挖掘
琅琊榜首20205 天前
移动端AI挂机新范式:YOLOv8+NCNN实现无Root视觉自动化
人工智能·yolo·自动化
智驱力人工智能5 天前
地铁隧道轨道障碍物实时检测方案 守护城市地下动脉的工程实践 轨道障碍物检测 高铁站区轨道障碍物AI预警 铁路轨道异物识别系统价格
人工智能·算法·yolo·目标检测·计算机视觉·边缘计算
智驱力人工智能5 天前
机场鸟类活动智能监测 守护航空安全的精准工程实践 飞鸟检测 机场鸟击预防AI预警系统方案 机场停机坪鸟类干扰实时监测机场航站楼鸟击预警
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
前端摸鱼匠5 天前
YOLOv8使用 Ultralytics 内置功能简化格式转换:介绍如何使用 yolo mode=data 等相关功能或辅助工具来加速和简化数据格式的准备工作
人工智能·yolo·目标检测·机器学习·目标跟踪·视觉检测
hans汉斯5 天前
《数据挖掘》期刊推介&征稿指南
图像处理·人工智能·算法·yolo·数据挖掘·超分辨率重建·汉斯出版社
卓越软件开发5 天前
毕设全栈开发一条龙:Java/SpringBoot/Vue/ 小程序 / Python / 安卓 / AI 图像识别 人脸检测 车牌识别 YOLO
开发语言·spring boot·python·yolo·小程序·毕业设计·课程设计
向哆哆6 天前
单车/共享单车目标检测数据集(适用YOLO系列)(已标注+划分/可直接训练)
人工智能·yolo·目标检测