【目标检测】计算YOLOv5/7/8/9的TP, FP, FN, Recall和Precision

2024-04-09 08:12

本文主要是介绍【目标检测】计算YOLOv5/7/8/9的TP, FP, FN, Recall和Precision,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 设定IoU和Conf阈值

2. 保存推理结果的txt文件

3. 计算TP, FP, FN

import osclasses = {0: "class 1",1: "class 2"}def iou(box1, box2):box1_x1 = box1[0] - box1[2] / 2box1_y1 = box1[1] - box1[3] / 2box1_x2 = box1[0] + box1[2] / 2box1_y2 = box1[1] + box1[3] / 2box2_x1 = box2[0] - box2[2] / 2box2_y1 = box2[1] - box2[3] / 2box2_x2 = box2[0] + box2[2] / 2box2_y2 = box2[1] + box2[3] / 2inter_x1 = max(box1_x1, box2_x1)inter_y1 = max(box1_y1, box2_y1)inter_x2 = min(box1_x2, box2_x2)inter_y2 = min(box1_y2, box2_y2)inter_area = max(inter_x2 - inter_x1, 0) * max(inter_y2 - inter_y1, 0)box1_area = (box1_x2 - box1_x1) * (box1_y2 - box1_y1)box2_area = (box2_x2 - box2_x1) * (box2_y2 - box2_y1)union_area = box1_area + box2_area - inter_areaiou = inter_area / union_area if union_area > 0 else 0return ioudef read_boxes(file_path):boxes = []confidences = []with open(file_path, 'r') as f:for line in f:parts = line.strip().split()if len(parts) == 6:category = int(parts[0])box = [float(part) for part in parts[1:5]]confidence = float(parts[5])boxes.append((category, box))confidences.append((category, confidence))elif len(parts) == 5:category = int(parts[0])box = [float(part) for part in parts[1:5]]boxes.append((category, box))return boxes, confidencesdef evaluate_folder(annotation_dir, result_dir):stats = {}for annot_file in os.listdir(annotation_dir):annot_path = os.path.join(annotation_dir, annot_file)result_path = os.path.join(result_dir, annot_file)annot_boxes, _ = read_boxes(annot_path)  # 标注不需要置信度result_boxes, result_confidences = read_boxes(result_path) if os.path.exists(result_path) else ([], [])for category, _ in annot_boxes:if category not in stats:stats[category] = {'annotated': 0, 'predicted': 0, 'tp': 0, 'fp': 0, 'fn': 0, 'confidences': []}stats[category]['annotated'] += 1for category, result_box in result_boxes:if category not in stats:stats[category] = {'annotated': 0, 'predicted': 0, 'tp': 0, 'fp': 0, 'fn': 0, 'confidences': []}stats[category]['predicted'] += 1ious = [iou(result_box, box) for cat, box in annot_boxes if cat == category]if max(ious, default=0) >= 0.5:stats[category]['tp'] += 1else:stats[category]['fp'] += 1for category, confidence in result_confidences:stats[category]['confidences'].append(confidence)for category, annot_box in annot_boxes:ious = [iou(annot_box, box) for cat, box in result_boxes if cat == category]if max(ious, default=0) < 0.5:stats[category]['fn'] += 1for category, data in stats.items():confidences = data['confidences']data['min_conf'] = min(confidences, default=0)data['max_conf'] = max(confidences, default=0)data['ave_conf'] = sum(confidences) / len(confidences) if confidences else 0data['precision'] = data['tp'] / (data['tp'] + data['fp']) if data['tp'] + data['fp'] > 0 else 0data['recall'] = data['tp'] / (data['tp'] + data['fn']) if data['tp'] + data['fn'] > 0 else 0del data['confidences']  # 为了清晰,删除置信度列表return stats# path
annotation_dir = 'labels/test'
result_dir = 'runs/detect/exp/labels'# calculate TP, FP, FN
stats = evaluate_folder(annotation_dir, result_dir)
print("index | class | Instance | Detection | TP | FP | FN | Precision | Recall | Min Conf | Max Conf | Ave Conf")
for category, data in sorted(stats.items()):print(f"{category} | {classes[category]} | {data['annotated']} | {data['predicted']} | {data['tp']} | {data['fp']} | {data['fn']} | {data['precision']:.2f} | {data['recall']:.2f} | {data['min_conf']:.2f} | {data['max_conf']:.2f} | {data['ave_conf']:.2f}")

这篇关于【目标检测】计算YOLOv5/7/8/9的TP, FP, FN, Recall和Precision的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/887620

相关文章

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学