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

【合适新人】预测图片教程——如何随机抽取验证集图片进行可视化推理!(附完整代码)

前言

相信很多正在使用 YOLO 的小伙伴都遇到过这样一个场景:模型辛辛苦苦训练完了,看着终端里打印出来的 mAP、Precision、Recall 等指标,虽然知道模型效果还不错,但心里总有点不踏实。“它在真实图片上的表现到底怎么样?”

为了直观地看到效果,我们通常会使用 predict 模式,但它要么需要指定单张图片,要么需要指定一个文件夹。如果我们想快速、随机地检查一下模型在验证集(val set)上的整体表现,而不是枯燥地看指标,该怎么办呢?

本文将手把手教你编写一个 Python 脚本,它能自动读取你数据集的 .yaml 配置文件,找到验证集路径,并从中随机抽取100张图片进行推理,最后将带有标注框的结果图保存在指定文件夹。让你对模型效果一目了然!

在这里插入图片描述
(这是一张示例效果图,你可以替换成自己的预测结果图)

准备工作
在开始之前,请确保你已经准备好了以下环境:

Python 环境:建议 Python 3.8 或更高版本。

ultralytics 库:已经成功安装。如果没有,请执行 pip install ultralytics。

一个训练好的 YOLOv8 模型:也就是你的 .pt 权重文件,例如 best.pt。

一个标准 YOLOv8 格式的数据集:包含 train、val 文件夹以及一个指向它们的 .yaml 配置文件。

核心代码
话不多说,直接上代码。这是我们今天的主角,一个功能强大且易于理解的脚本。

建议:将下面的代码保存为 predict_val_random.py 文件,并放置在你的 ultralytics-main 项目根目录下(和 train.py, val.py 平级)。

import argparse
import random
import os
from ultralytics import YOLO
import warnings
from glob import glob
import yaml# 忽略不必要的警告信息
warnings.filterwarnings('ignore')def main(opt):"""主函数,执行模型加载、图像采样和预测任务。"""print("🚀 开始执行预测任务...")# 1. 初始化 YOLO 模型print(f"⌛ 正在加载模型权重: {opt.weights}")model = YOLO(opt.weights)print("✅ 模型加载成功!")# 2. 从 data.yaml 文件中获取并解析验证集路径print(f"🔍 正在读取数据集配置文件: {opt.data_path}")try:with open(opt.data_path, 'r', encoding='utf-8') as f:data_cfg = yaml.safe_load(f)# --- 核心修正部分:正确解析 YAML 路径 ---yaml_dir = os.path.dirname(opt.data_path)# 步骤 A: 获取并解析数据集根目录(通常是 'path' 键)# 如果 'path' 键不存在,则默认为 yaml 文件所在的目录dataset_root = data_cfg.get('path', '')if not os.path.isabs(dataset_root):# 将相对于 yaml 的路径转换为绝对路径dataset_root = os.path.abspath(os.path.join(yaml_dir, dataset_root))# 步骤 B: 获取验证集相对路径('val' 键)val_relative_path = data_cfg.get('val')if not val_relative_path:print(f"❌ 在 {opt.data_path} 中未找到 'val' 键值。")return# 步骤 C: 组合成最终的绝对路径val_path = os.path.join(dataset_root, val_relative_path)# --- 修正结束 ---except Exception as e:print(f"❌ 读取或解析 YAML 文件失败: {e}")returnprint(f"✅ 成功解析到最终验证集路径: {val_path}")# 检查最终路径是否存在if not os.path.exists(val_path):print(f"❌ 致命错误:计算出的最终验证集路径不存在!")print(f"   请检查您的 '{opt.data_path}' 文件中的 'path' 和 'val' 配置是否正确。")return# 3. 收集所有验证集图片路径img_formats = ('*.jpg', '*.jpeg', '*.png', '*.bmp', '*.gif')all_images = []if os.path.isdir(val_path):for fmt in img_formats:all_images.extend(glob(os.path.join(val_path, fmt)))# 支持 COCO 风格的 txt 文件列表elif os.path.isfile(val_path) and val_path.endswith('.txt'):print("ℹ️ 检测到验证集路径为 txt 文件,正在读取图片列表...")with open(val_path, 'r') as f:txt_dir = os.path.dirname(val_path)all_images = [os.path.join(txt_dir, line.strip()) for line in f.readlines() if line.strip()]else:# 这个错误理论上不会再触发,因为前面已经用 os.path.exists 检查过了print(f"❌ 验证集路径格式不支持: {val_path}")returnif not all_images:print("❌ 在指定路径下未找到任何图片文件!请检查文件夹是否为空或txt文件内容是否正确。")returnprint(f"✅ 成功找到 {len(all_images)} 张验证集图片。")# 4. 从所有图片中随机抽取 100 张num_to_sample = min(100, len(all_images))print(f"🎲 正在随机抽取 {num_to_sample} 张图片进行预测...")sample_images = random.sample(all_images, num_to_sample)# 5. 逐张进行推理并保存结果图output_dir = os.path.join(opt.project, opt.name)print(f"🖼️ 开始逐张预测,结果将保存至: {output_dir}")for i, img_path in enumerate(sample_images):print(f"   -> 正在处理第 {i+1}/{num_to_sample} 张图片: {os.path.basename(img_path)}")model.predict(source=img_path,imgsz=opt.img_size,device=opt.device,save=True,project=opt.project,name=opt.name,exist_ok=True,save_txt=False,save_conf=False,verbose=False)print("\n🎉 全部预测完成!")print(f"✅ 成功预测并保存了 {len(sample_images)} 张图片。")print(f"👉 请在以下目录查看结果: {output_dir}")if __name__ == "__main__":parser = argparse.ArgumentParser(description="对验证集中的随机100张图片进行YOLOv8预测")parser.add_argument('--weights', type=str, required=True, help='模型权重文件的路径 (.pt 文件)')parser.add_argument('--data_path', type=str, required=True, help='数据集的 .yaml 配置文件路径')parser.add_argument('--img_size', type=int, default=640, help='输入网络模型的图片尺寸')parser.add_argument('--device', type=str, default='0', help='运行设备,例如 "cpu" 或 "0", "0,1"')parser.add_argument('--project', type=str, default='runs/detect', help='保存结果的项目根目录')parser.add_argument('--name', type=str, default='random_100_predict', help='本次预测任务的实验名称')opt = parser.parse_args()main(opt)####

本文 Python 脚本,它能自动读取你数据集的 .yaml 配置文件,找到验证集路径,并从中随机抽取100张图片进行推理,最后将带有标注框的结果图保存在指定文件夹。让你对模型效果一目了然!

使用教程

使用这个脚本非常简单,只需要一个命令即可搞定!

第 1 步:理解命令行参数
脚本通过 argparse 库接收几个参数,其中两个是必须的:

–weights (必填): 你的模型权重文件路径。

–data_path (必填): 你的数据集配置文件 .yaml 的路径。

–img_size: 推理时输入的图片尺寸,默认为 640。

–device: 使用哪个设备,‘cpu’ 或者 GPU 编号 ‘0’,默认为 ‘0’。

–project: 保存结果的根目录,默认为 runs/detect。

–name: 本次预测任务的名称,结果会保存在 project/name 目录下,默认为 random_100_predict。

第 2 步:执行命令
打开你的终端,确保路径位于 ultralytics-main 目录下。然后根据你的实际文件路径,执行以下命令。

这里我们使用文章开头提到的路径作为示例:

python predict_val_random.py --weights /root/lanyun-tmp/ultralytics-main/runs/train/exp8/weights/best.pt --data_path /root/lanyun-tmp/ultralytics-main/ultralytics/people1.yaml

请务必将上面的路径替换成你自己的实际路径!

第 3 步:查看结果
命令执行后,你会看到类似下面的日志输出:

🚀 开始执行预测任务… ⌛ 正在加载模型权重: /path/to/your/best.pt ✅ 模型加载成功! 🔍
正在读取数据集配置文件: /path/to/your/people1.yaml ✅ 成功解析到最终验证集路径:
/path/to/your/datasets/people/images/val ✅ 成功找到 1234 张验证集图片。 🎲 正在随机抽取
100 张图片进行预测… 🖼️ 开始逐张预测,结果将保存至: runs/detect/random_100_predict ->
正在处理第 1/100 张图片: image_001.jpg -> 正在处理第 2/100 张图片: image_056.jpg
… -> 正在处理第 100/100 张图片: image_987.jpg

🎉 全部预测完成! ✅ 成功预测并保存了 100 张图片。 👉 请在以下目录查看结果:
runs/detect/random_100_predict

任务完成后,你就可以在项目目录下的 runs/detect/random_100_predict 文件夹中找到所有带有预测框的结果图了!

总结
通过这个简单的脚本,我们实现了一个非常实用的功能,它打通了模型训练和效果验证之间“最后的可视化一公里”。它不仅能帮你快速抽查模型在验证集上的实际表现,而且代码逻辑清晰,非常适合新手学习 argparse、glob、yaml 等库的综合使用。

希望这篇教程能对你有所帮助!如果你觉得文章不错,别忘了点赞、收藏、加关注哦!有任何问题,也欢迎在评论区留言交流。

http://www.dtcms.com/a/351789.html

相关文章:

  • DigitalOcean GPU 选型指南(三):中端AI GPU性价比之王 RTX 4000 Ada、A4000、A5000
  • 无人机航拍数据集|第33期 无人机树冠目标检测YOLO数据集5842张yolov11/yolov8/yolov5可训练
  • 【HZ-T536开发板免费体验】无需死记 Linux 命令!用 CangjieMagic 在 HZ-T536 开发板上搭建 MCP 服务器,自然语言轻松控板
  • Java大厂面试全真模拟:从Spring Boot到微服务架构实战
  • 文本转语音TTS工具合集(下)
  • 【强化学习】区分理解: 时序差分(TD)、蒙特卡洛(MC)、动态规划(DP)
  • 计算机底层硬件实现及运行原理通俗书籍推荐
  • 记一次MySQL数据库的操作练习
  • 把 AI 塞进「空调遥控器」——基于 MEMS 温湿阵列的 1 分钟极速房间热场扫描
  • 如何获取当前页面html元素的外层容器元素
  • vscode或者cursor配置使用Prettier - Code formatter来格式化微信小程序wxss/wxs/wxml文件
  • Vue Flow 设计大模型工作流 - 自定义大模型节点
  • 基于XiaothinkT6语言模型的文本相似度计算:轻量方案实现文本匹配与去重
  • 乳腺癌数据集支持向量机实践学习总结
  • 2025最新的软件测试热点面试题(答案+解析)
  • OnlyOffice 渲染时间获取指南
  • from中烟科技翼支付 面试题2
  • 项目集升级:顶部导览优化、字段自定义、路线图双模式、阶段图掌控、甘特图升级、工作量优化、仪表盘权限清晰
  • 用大语言模型提升语音翻译:一种全新的端到端方法
  • vue2+elementui 表格单元格增加背景色,根据每列数据的大小 颜色依次变浅显示2
  • 「大模型学习」(15)Prompt Tuning → P-Tuning v1 → P-Tuning v2
  • (论文速读)Prompt Depth Anything:让深度估计进入“提示时代“
  • 6.5 el-tree 组件
  • 用大语言模型实现语音到语音翻译的新方法:Scheduled Interleaved Speech-Text Training
  • Research相关的面试(个人)
  • 云服务器的作用
  • yggjs_rbutton React按钮组件v1.0.0 API 参考文档
  • linux、window java程序导出pdf\word、excel文字字体显示异常、字体样式不一样
  • 【lucene】spancontainingquery
  • 8月26日