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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/809656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零学算法274

274.H 指数 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#x…

Web程序设计-实验01 HTML与CSS基础

【实验主题】 影视详情页设计 【实验任务】 1、浏览并分析多个影视详情页面&#xff08;详见参考资源&#xff0c;建议自行搜索更多影视网站&#xff09;的主要元素构成和版面设计&#xff0c;借鉴并构思预期效果。 2、新建 index.html文件&#xff0c;合理运用HTML标记编写…

计算机网络——MAC地址和IP地址

目录 前言 引入 MAC地址与IP地址 IP地址和MAC地址是什么&#xff1f;如何起作用的&#xff1f; MAC地址如何表示与确定网卡在网络中的确定位置&#xff1f; DHCP协议自动帮我们配置 操作系统是如何知道对方的MAC地址的&#xff1f; 前言 本博客是博主用于复习计算机网络…

【回溯】Leetcode 17. 电话号码的字母组合【中等】

电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 **输入&#xff1a;**digits “23” 输出&am…

uniapp登录拦截白名单使用

1、创建uni.promisify.adaptor.js文件 // 根目录新建 uni.promisify.adaptor.js // 路由白名单 const list [/, /pages/stroke/stroke]; //创建路由拦截&#xff0c;这里只判断一般跳转 uni.addInterceptor(switchTab, {invoke(res) {console.log(res);//存在token就跳转if (…

LLM大语言模型助力DataEase小助手,新增气泡地图,DataEase开源数据可视化分析平台v2.5.0发布

2024年4月8日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.5.0版本。 这一版本的功能升级包括&#xff1a;新增DataEase小助手支持&#xff0c;通过结合智能算法和LLM&#xff08;即Large Language Model&#xff0c;大语言模型&#xff09;能力&#xff0c;DataEas…

【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【回溯】2023C-找到它【欧弟算法】全网注释最详细分类最全的华为OD真题题解

有LeetCode算法/华为OD考试扣扣交流群可加 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出 示例二输入输出 解题思路状态更新和回滚写在横向遍历for循环内的…

M语言前景

M语言作为一种编程语言&#xff0c;其前景可能受到多个因素的影响&#xff0c;包括其应用领域、社区支持、市场需求等。目前&#xff0c;M语言在多个领域都有应用&#xff0c;如智能机器人开发、语音识别系统、图像处理技术、大数据分析、云计算等&#xff0c;这显示出其多功能…

使用Python进行网站爬虫和数据分析

在网络数据的获取和分析过程中&#xff0c;网站爬虫技术是一种常见且有效的手段。本文将介绍如何使用Python编程语言&#xff0c;结合常用的爬虫库和数据分析工具&#xff0c;实现对网站数据的抓取和分析。 1. 准备工作 在开始之前&#xff0c;确保您已经安装了Python解释器&a…

智能加湿器中应用的数字温度传感芯片

随着经济的发展和人民生活水平的提高&#xff0c;人们对生活质量和健康的要求愈来愈高。空气加湿器就是这样慢慢的走进全球的很多家庭当中&#xff0c;成为干燥地区家庭不可缺少的一种小型家电产品。空气加湿器在我国仍属于新兴产物&#xff0c;加大对空气加湿器的研究与开发的…

【how2j练习题】HTML DOM部分阶段练习

练习1 <!-- 验证账号是否已经存在 那么就在js使用简单的验证规则&#xff1a; 如果账号是以a或者A开头的&#xff0c;那么就提示已经存在了。 --> <!-- 1.需要一个输入框和一个按钮 2.按钮上绑上一个事件。 3.编写事件&#xff0c;并输出答案 --><html><…

服务器感染了.rmallox勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 随着网络技术的发展&#xff0c;勒索病毒已经成为当今数字时代的一大威胁。近期出现的.rmallox勒索病毒更是引发了广泛关注。本文将深入探讨.rmallox勒索病毒的特点&#xff0c;并提供一系列应对这一威胁的高效策略。如果受感染的数据确实有恢复的价值与必要…

如何打造高度柔性动态的智能仓储物流解决方案?

近年来&#xff0c;仓储物流行业步入自动化系统集成时代&#xff0c;以货架为存储主体的方式逐步发展成为了自动化储方式&#xff0c;核心设备也由货架转变为机器人货架&#xff0c;形成系统集成物流存储体系。河北沃克根据客户需求精准发力&#xff0c;推出了新一代海格里斯智…

TSINGSEE青犀边缘计算AI智能分析网关V4客流统计算法的配置步骤及使用

TSINGSEE青犀AI智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为、烟火等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常见的…

十六、计算机视觉-Scharr算子 和 Laplacian算子

文章目录 一、Scharr算子二、Laplacian算子 一、Scharr算子 Scharr算子和Sobel算子原理都一样&#xff0c;它是由Scharr在2002年提出的一种改进的Sobel算子。Scharr算子的优点在于它相对于Sobel算子有更好的旋转不变性和更小的边缘响应误差。 我们看下Scharr算子的水平卷积核&…

SpringBoot + Redisson 限流

Aspect Component public class LimitInterceptor {Autowiredprivate RedissonClient redissonClient;Value("${stnet.api.limit}")private boolean limit;/***配置织入点***/Pointcut("annotation(com.st.microservice.plugin.sso.annotation.Limit)")pub…

MySQL:主键,事件,索引的基础用法(10)

主键 指定某个字段作为主键&#xff0c;这个字段内容无法为空&#xff0c;而且他的内容不能重复作为唯一的标识 主键还有自增和非自增&#xff0c;比如你创建了一个表&#xff0c;你设置了自增&#xff0c;他就会按编号依次自动加一 我创建了一个名为tarro的数据库&#xff…

2813: 【算法思想】【双指针】无重复最长子串

题目描述 给定一个字符串&#xff0c;找出不含有重复字符的 最长子串 的长度。&#xff08;注意&#xff1a;必须是一个子串&#xff0c;不是子序列&#xff09; 输入 一个字符串 输出 最长子串 的长度 示例&#xff1a; 给定 "abcabcbb" &#xff0c;没有重复字…

element-ui使用记录

element-ui的组件名就是类名 样式穿透&#xff08;用来修改没有类名的子组件样式&#xff09; 例如修改头部具名插槽的样式&#xff08;但是无法定位该元素&#xff09; 查看最后生成的html结构中对应的结构&#xff08;这里的头部有类名&#xff0c;可以直接对该类名进行样…

C语言—每日选择题—Day69

第一题 1、以下程序的输出结果是&#xff08; &#xff09; int main() {char arr[2][4];strcpy (arr[0],"you");strcpy (arr[1],"me");arr[0][3]&;printf("%s \n",arr);return 0; } A: you&me B: you C: me D: err 答案及解析 A 这里重…