当前位置: 首页 > news >正文

YOLOv5实战:如何一键导出检测框的坐标、类别和置信度到TXT文件(附完整代码)

YOLOv5实战:结构化导出检测结果的工程化解决方案

在计算机视觉项目的实际落地过程中,我们常常需要将模型检测结果以结构化形式保存,用于后续的数据分析、系统集成或模型评估。本文将深入探讨如何通过YOLOv5高效导出检测框的坐标、类别和置信度信息到TXT文件,并提供可直接复用的工程化代码方案。

1. 理解YOLOv5输出数据结构

YOLOv5的检测结果本质上包含三个核心维度信息:

  • 边界框坐标:通常以(x_min, y_min, x_max, y_max)格式表示
  • 类别索引:对应data/yaml文件中定义的类别顺序
  • 置信度分数:模型对当前预测结果的把握程度(0-1之间)

在原始实现中,这些信息被封装在det变量中,每个检测结果以[x1, y1, x2, y2, conf, cls]的形式存在。理解这一数据结构是进行定制化导出的基础。

注意:YOLOv5默认使用归一化坐标(0-1之间),但在实际应用中我们可能需要转换为绝对像素坐标。

2. 核心导出方案设计与实现

2.1 基础导出功能实现

以下代码展示了如何修改YOLOv5的detect.py以实现结构化导出:

def write_detection_results(det, img_shape, txt_path): """ 将检测结果写入TXT文件 :param det: 检测结果张量 [n,6] (xyxy, conf, cls) :param img_shape: 原始图像尺寸 (height, width) :param txt_path: 输出文件路径 """ with open(txt_path, 'a') as f: for *xyxy, conf, cls in reversed(det): # 转换为绝对坐标 x1, y1, x2, y2 = [int(coord) for coord in xyxy] # 格式化写入:类别 置信度 x1 y1 x2 y2 line = f"{int(cls)} {conf:.4f} {x1} {y1} {x2} {y2}\n" f.write(line)

将此函数集成到detect.py的适当位置(通常在绘制检测框之前),并通过以下方式调用:

if save_txt: write_detection_results(det, im0.shape[:2], txt_path)

2.2 高级导出格式定制

根据不同的下游应用需求,我们可以灵活调整输出格式。以下是几种常见变体:

格式类型数据结构适用场景
基础格式cls conf x1 y1 x2 y2简单数据记录
COCO风格cls conf x1 y1 width height兼容COCO评估工具
归一化格式cls conf x_center y_center w hYOLO训练格式

实现COCO风格导出的代码示例:

def write_coco_style(det, txt_path): with open(txt_path, 'a') as f: for *xyxy, conf, cls in reversed(det): x1, y1, x2, y2 = xyxy width = x2 - x1 height = y2 - y1 line = f"{int(cls)} {conf:.4f} {x1} {y1} {width} {height}\n" f.write(line)

3. 工程化增强方案

3.1 多文件批量处理

在实际项目中,我们常需要处理大量图像。以下脚本展示了如何批量处理并保持文件名对应:

import os from pathlib import Path def process_directory(source_dir, output_dir): source_dir = Path(source_dir) output_dir = Path(output_dir) output_dir.mkdir(exist_ok=True) # 获取所有图像文件 image_files = list(source_dir.glob('*.jpg')) + list(source_dir.glob('*.png')) for img_path in image_files: # 运行检测并导出结果 run_detection( weights='yolov5s.pt', source=str(img_path), project=str(output_dir), name='results', save_txt=True ) # 重命名结果文件以匹配原图名 result_file = output_dir / 'results' / 'labels' / f"{img_path.stem}.txt" if result_file.exists(): new_path = output_dir / f"{img_path.stem}_det.txt" result_file.rename(new_path)

3.2 性能优化技巧

处理大规模数据时,IO操作可能成为瓶颈。以下方法可显著提升导出效率:

  • 缓冲写入:累积一定数量的检测结果后批量写入
  • 并行处理:使用多进程处理不同图像
  • 二进制格式:对于极大数据集,考虑使用二进制格式存储

优化后的写入函数示例:

def buffered_write(detections, file_path, buffer_size=100): buffer = [] for det in detections: buffer.append(f"{det['cls']} {det['conf']} {det['x1']} {det['y1']} {det['x2']} {det['y2']}") if len(buffer) >= buffer_size: with open(file_path, 'a') as f: f.write('\n'.join(buffer) + '\n') buffer.clear() if buffer: # 写入剩余数据 with open(file_path, 'a') as f: f.write('\n'.join(buffer) + '\n')

4. 结果分析与可视化

4.1 数据统计与质量检查

导出数据后,我们通常需要进行基本统计分析:

import pandas as pd import matplotlib.pyplot as plt def analyze_results(result_file): # 读取导出的TXT文件 df = pd.read_csv(result_file, sep=' ', names=['class', 'confidence', 'x1', 'y1', 'x2', 'y2']) # 基本统计 print(f"总检测数: {len(df)}") print(f"平均置信度: {df['confidence'].mean():.3f}") # 类别分布可视化 class_counts = df['class'].value_counts() class_counts.plot(kind='bar') plt.title('Class Distribution') plt.xlabel('Class ID') plt.ylabel('Count') plt.show()

4.2 结果可视化验证

为确保导出数据的准确性,建议实现简单的可视化验证:

import cv2 def visualize_detections(image_path, result_path): image = cv2.imread(image_path) with open(result_path) as f: for line in f: cls, conf, x1, y1, x2, y2 = map(float, line.strip().split()) # 绘制边界框 cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0,255,0), 2) # 添加标签 label = f"{int(cls)} {conf:.2f}" cv2.putText(image, label, (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) cv2.imshow('Verification', image) cv2.waitKey(0)

5. 高级应用场景

5.1 与数据库集成

对于需要长期存储和分析的场景,可将结果直接导入数据库:

import sqlite3 def save_to_database(result_file, db_path): conn = sqlite3.connect(db_path) cursor = conn.cursor() # 创建表 cursor.execute(''' CREATE TABLE IF NOT EXISTS detections ( id INTEGER PRIMARY KEY AUTOINCREMENT, image_name TEXT, class INTEGER, confidence REAL, x1 INTEGER, y1 INTEGER, x2 INTEGER, y2 INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) ''') # 导入数据 with open(result_file) as f: for line in f: cls, conf, x1, y1, x2, y2 = line.strip().split() cursor.execute( "INSERT INTO detections (image_name, class, confidence, x1, y1, x2, y2) " "VALUES (?, ?, ?, ?, ?, ?, ?)", (Path(result_file).stem, cls, conf, x1, y1, x2, y2) ) conn.commit() conn.close()

5.2 自动化报告生成

结合检测结果生成PDF报告:

from fpdf import FPDF def generate_report(result_file, output_pdf): pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) # 添加标题 pdf.cell(200, 10, txt="Detection Results Report", ln=1, align='C') # 添加统计信息 with open(result_file) as f: lines = f.readlines() pdf.cell(200, 10, txt=f"Total Detections: {len(lines)}", ln=1) # 添加样本数据 pdf.cell(200, 10, txt="Sample Detections:", ln=1) for line in lines[:10]: # 显示前10个检测结果 pdf.cell(200, 10, txt=line.strip(), ln=1) pdf.output(output_pdf)

在实际项目中,这种结构化导出方案显著提升了后续处理效率。一个典型的应用场景是将检测结果导入到GIS系统进行空间分析,此时精确的坐标信息和规范的格式至关重要。

http://www.jsqmd.com/news/823877/

相关文章:

  • 从BIOS自检到图形桌面:用一张流程图和命令复盘Linux(CentOS 7)开机八大步骤
  • VirtualMonitor虚拟显示器:软件定义多屏工作空间的终极解决方案
  • 从飞思卡尔智能车大赛看嵌入式系统开发:感知、决策与控制实战
  • 面向金融文本的事件抽取与风险传导建模,当AI读懂金融“潜台词”:事件抽取与风险传导建模如何预判下一场风暴?
  • 不止于配置:用Eigen和Qt Quick 3D做个旋转立方体,实战理解线性代数
  • 什么是大模型:概念、分类与当前主流模型全梳理
  • 从录音到文字,2026年这5款免费录音转文字软件怎么选
  • 【linux学习】linux基本指令02
  • 如何通过LizzieYzy围棋AI分析工具在30天内实现棋力突破:从入门到实战的完整指南
  • 2026最新Xshell-8.0安装教程(官方免费正版,无需破解)
  • 基于Monaco Editor与AI大模型构建Web版智能代码编辑器的实践
  • 个人 AI 记忆系统:我的构想与三个落地方向
  • 跨平台B站视频下载:BilibiliDown完整使用指南
  • 仅限档案学研究者获取:NotebookLM定制提示词库V2.3(含17个NARA/中国第一历史档案馆认证模板)
  • 性价比高的AI应用厂家
  • 终极免费NCM转换指南:3分钟解锁你的网易云音乐
  • 终极指南:如何用免费开源软件FanControl完全掌控你的电脑风扇
  • 「PKUWC2018」Slay the Spire
  • LVGL字体优化实战:如何将中文字库放到外部SPI Flash并动态加载(节省内部RAM)
  • @Autowired 和 @Resource 的区别
  • 国产CPU与自研Wi-Fi 6芯片协同,构建自主可控高速无线连接方案
  • 贪心——划分字母区间
  • COLMAP重建翻车了?NeRF数据预处理中相机位姿估计的3个常见陷阱与调试技巧
  • AI专著生成工具评测:快速产出20万字专著,哪款最值得用?
  • 从Web空间到邮件服务器:Linux磁盘配额quota的3个真实生产环境应用案例详解
  • Source Han Serif CN:7款免费开源字体如何重塑你的中文排版体验
  • C语言条件编译:从语法到工程实践的高级应用指南
  • 它正在定义云安全的AI时代?深度拆解快快云安全AI大模型凭啥突围
  • 2026年智能电话外呼机器人厂家优质推荐榜亲测结果
  • 使用Taotoken的API Key管理功能实现安全的访问控制与审计