【目标检测】计算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

相关文章

计算绕原点旋转某角度后的点的坐标

问题: A点(x, y)按顺时针旋转 theta 角度后点的坐标为A1点(x1,y1)  ,求x1 y1坐标用(x,y)和 theta 来表示 方法一: 设 OA 向量和x轴的角度为 alpha , 那么顺时针转过 theta后 ,OA1 向量和x轴的角度为 (alpha - theta) 。 使用圆的参数方程来表示点坐标。A的坐标可以表示为: \[\left\{ {\begin{ar

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

【云计算 复习】第1节 云计算概述和 GFS + chunk

一、云计算概述 1.云计算的商业模式 (1)软件即服务(SaaS) 有些景区给游客提供烧烤场地,游客需要自己挖坑或者砌烧烤台,然后买肉、串串、烧烤。 (2)平台即服务(PaaS) 有些景区给游客提供烧烤场地,同时搭建好烧烤台,游客只需要自己带食材和调料、串串、烧烤。 (3)基础设施即服务(IaaS) 有些景区给游客提供烧烤场地,同时搭建好烧烤台,还有专门的厨师来烧烤,用户不需要关心前面的所有

3月份目标——刷完乙级真题

https://www.patest.cn/contests/pat-b-practisePAT (Basic Level) Practice (中文) 标号标题通过提交通过率1001害死人不偿命的(3n+1)猜想 (15)31858792260.41002写出这个数 (20)21702664840.331003我要通过!(20)11071447060.251004成绩排名 (20)159644

基于深度学习的轮廓检测

基于深度学习的轮廓检测 轮廓检测是计算机视觉中的一项关键任务,旨在识别图像中物体的边界或轮廓。传统的轮廓检测方法如Canny边缘检测和Sobel算子依赖于梯度计算和阈值分割。而基于深度学习的方法通过训练神经网络来自动学习图像中的轮廓特征,能够在复杂背景和噪声条件下实现更精确和鲁棒的检测效果。 深度学习在轮廓检测中的优势 自动特征提取:深度学习模型能够自动从数据中学习多层次的特征表示,而不需要

自动驾驶---Perception之Lidar点云3D检测

1 背景         Lidar点云技术的出现是基于摄影测量技术的发展、计算机及高新技术的推动以及全球定位系统和惯性导航系统的发展,使得通过激光束获取高精度的三维数据成为可能。随着技术的不断进步和应用领域的拓展,Lidar点云技术将在测绘、遥感、环境监测、机器人等领域发挥越来越重要的作用。         目前全球范围内纯视觉方案的车企主要包括特斯拉和集越,在达到同等性能的前提下,纯视觉方

什么是dB?dBm、dBc、dBi、dBd怎么计算,有什么区别?

什么是dB?dBm、dBc、dBi、dBd怎么计算,有什么区别? 引言 在电子工程、通信和音频领域,dB(分贝)是一个常见的术语。许多人刚接触时可能会感到困惑,因为它不仅仅是一个简单的单位,还有多种不同的形式,如dBm、dBc、dBi和dBd。这篇文章将详细解释这些概念,并介绍如何计算它们,帮助初学者更好地理解和应用。 什么是dB? dB,即分贝,是一种表示两个数值比值的对数单位。分贝的基

YOLOv9摄像头或视频实时检测

1、下载yolov9的项目 地址:YOLOv9 2、使用下面代码进行检测 import torchimport cv2from models.experimental import attempt_loadfrom utils.general import non_max_suppression, scale_boxesfrom utils.plots import plot_o

C# Onnx Yolov5 水果识别,人员识别,物品识别 人工智能

目录 先上效果 来电废话,但实用 网络成功案例实践易失败的原因 万物检测涉及技术  下载合集 关键代码 全部代码 实操vs2022安装关键 YOLO V5核心库编译 编写自己识别软件 更新相关依赖 标注字库文件 测试效果 名词解释YOLO 名词解释ONNX 源码 直播教学和作者 先上效果 来电废话,但实用 为何照做网络成功案例仍失败?软件与男

Java内存泄漏检测和分析介绍

在Java中,内存泄漏检测和分析是一个重要的任务,可以通过以下几种方式进行:   1. 使用VisualVM VisualVM是一个可视化工具,可以监控、分析Java应用程序的内存消耗。它可以显示堆内存、垃圾收集、线程等信息,并且可以对内存泄漏进行分析。 2. 使用Eclipse Memory Analyzer Eclipse Memory Analyzer(MAT)是一个强大的工具,可