内部草稿:数据尚未通过现有检查,生成内部草稿,等待核查。

先把要解决的问题说清楚
照片里的目标在哪、有多少,能让电脑自动找出来吗? 做课程项目或毕业设计时,可以先把问题缩小到一个能验证的小任务,再逐步补充复杂功能。
这篇教程要完成的结果是:输入图片,输出标有预测框的图片和按类别汇总的目标数量。
只检测已有标注所定义的目标。标签语义不清时保留编号;计数是模型预测,需要人工核对。
为了把操作讲清楚,下面用"燕麦数据集"作为演示案例。数据集是练习材料;你最终要交付的是能运行的操作过程和自己核对过的结果。
开始前,准备好这些东西
- 一台 Windows 电脑。本文先用 CPU,不要求先配好显卡。
- Python 3.12 的 64 位版本;第一次安装依赖和下载模型需要联网。
- 数据压缩包
v4-coco.zip,以及本文配套代码压缩包。数据包和代码附件是两份文件,不要混淆。 - 一个有足够空间的工作目录。图像训练库通常还需要数 GB 空间,不能只按数据压缩包大小预留空间。
本文的操作都在 PowerShell 中执行。代码块里一行是一条命令,按顺序复制执行;不复制三行反引号,不复制屏幕上的 PS C:\...> 提示符。上一条命令返回提示符后再执行下一条。
第 1 步:建立项目目录,把文件放对位置
按 Win + E 打开文件资源管理器,在地址栏输入 C:\。新建文件夹,命名为 dataset_project。如果已有同名项目,可改用其他目录,并统一修改本文中的路径。
先解压代码附件,把下面三个 .py 文件直接放在该文件夹中,再复制数据 ZIP。数据 ZIP 暂时不手动解压,后面的脚本会读取它。
bash
C:\dataset_project\
├── v4-coco.zip
├── dataset_tools.py
├── run_model.py
└── table_demo.py
在资源管理器"查看 → 显示"中启用"文件扩展名"。确认脚本名是 dataset_tools.py,不是 dataset_tools.py.txt。在该文件夹地址栏输入 powershell 并回车,随后执行:
bash
Set-Location 'C:\dataset_project'
Get-Location
Get-ChildItem -Name
**成功标志:**当前位置是项目目录,文件列表中能直接看到上面四个文件。如果看到的只有一个同名子文件夹,说明附件多套了一层,把脚本移到项目根目录再继续。
第 2 步:安装 Python,建立独立环境
如果尚未安装,打开 Python Windows 下载页,选择提供 Windows 64 位安装程序的 Python 3.12 版本。安装时启用 Python Launcher,并勾选添加到 PATH 的选项。安装完成后,关闭原 PowerShell 窗口,再从项目目录重新打开。
先检查版本:
bash
py -3.12 --version
**成功标志:**输出 Python 3.12.x。若显示找不到 py 或对应版本,先检查安装及 Launcher,暂时不要继续装训练库。
建立只供本项目使用的环境,再安装图片读取库:
bash
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install pillow
.\.venv\Scripts\python.exe -c "import sys; from PIL import Image; print(sys.executable); print('基础环境可用')"
**成功标志:**输出路径指向 dataset_project\.venv\Scripts\python.exe,随后显示"基础环境可用"。.venv 是项目环境,后面的命令都直接调用它,不需要执行激活脚本。
第 3 步:检查演示材料,明确到底使用哪些文件
本次生成教程时,从压缩包读取到的信息如下:
|------------|--------------------------|
| 项目 | 本次文件检查 |
| 数据名称 | 燕麦数据集 |
| 实测结构 | COCO 目标检测 |
| 压缩包 | 51.92 MiB |
| 压缩包内文件 | 660 |
| 本教程选定图片数 | 655 |
| 检测框记录数 | 2735 |
| 实际出现的类别编号数 | 2 |
| 原包划分 | test:15;train:600;val:40 |
执行检查命令:
bash
.\.venv\Scripts\python.exe dataset_tools.py inspect --zip 'v4-coco.zip'
Get-Content -LiteralPath '.\inspection.json' -Encoding UTF8
**成功标志:**生成 inspection.json,kind 为 coco,本次选定图片数为 655。文件中的 warnings 是需要核对的事项,不要直接忽略:
- 结构可读取仍需核对标签或字段的真实含义。
本稿完成的是文件检查;除非另有实测记录,以下训练步骤尚未在这套数据上完成,不能把教程步骤写成已有实验成绩。
第 4 步:核对标签,再生成训练副本
本例使用矩形框标注。框告诉模型目标的位置和类别;缺少类别名称映射时保留编号,不凭图片猜测编号含义。
执行:
bash
.\.venv\Scripts\python.exe dataset_tools.py prepare --zip 'v4-coco.zip' --out prepared
Get-Content -LiteralPath '.\prepared\preparation.json' -Encoding UTF8
Get-Content -LiteralPath '.\prepared\class_mapping.json' -Encoding UTF8
Start-Process '.\prepared\samples.html'
**成功标志:**出现 prepared 目录,浏览器打开样例页。这里的红色框来自原有标注,不是模型预测。先看标签是否合理,有问题就回到原文件核对。
图片在 images 下,框标签在 labels 下,data.yaml 告诉模型到哪里找数据;COCO 标注会转换成 YOLO 框格式。
三个集合各有用途:train 用于学习,val 用于选择模型和观察调参效果,test 留到方案确定后最终评分。原包已有完整划分时沿用;没有时采用可重复的约 80%/10%/10% 教学划分。具体数量看 preparation.json,不是所有数据都正好整除。
split_manifest.json 记录原文件、准备后的文件名和所属集合。像素完全相同的图片保持在同一集合;相似照片、同场景和增强版本仍需单独核查。只做了随机教学划分时,不宣称实验已满足严格论文评测要求。
遇到"输出目录已存在"时,先查看已有结果;确实要重新准备,可以改成 --out prepared_v2,并把后续命令的 --data、--source、--class-map 对应路径一起改掉。
第 5 步:安装训练库,确认电脑能加载它
继续在同一个 PowerShell、同一个项目目录执行:
bash
.\.venv\Scripts\python.exe -m pip install torch==2.14.1 torchvision==0.29.1 --index-url https://download.pytorch.org/whl/cpu
.\.venv\Scripts\python.exe -m pip install ultralytics==8.4.170
.\.venv\Scripts\python.exe -c "import torch, ultralytics; print('训练环境可用'); print('CUDA:', torch.cuda.is_available())"
.\.venv\Scripts\python.exe -m pip freeze > requirements-installed.txt
**成功标志:**输出"训练环境可用"。这里安装的是 CPU 版本,CUDA: False 正常,不需要为此重新安装显卡驱动。requirements-installed.txt 保存本机实际安装的版本。
安装失败时,先看最后一段报错:磁盘空间不足就先释放空间;连接超时就检查网络后重试;提示某个包缺失时,仍用上面这条 .venv 内的 Python 安装,不换成另一套 Python。
第 6 步:只训练一轮,先验证整条链路
bash
.\.venv\Scripts\python.exe run_model.py train --task detect --data 'prepared/data.yaml' --model yolo26n.pt --epochs 1 --imgsz 320 --batch 4 --device cpu --name smoke
Test-Path '.\runs\smoke\weights\best.pt'
第一次运行会下载模型权重;下载完成后才进入训练。终端中的轮次推进和损失值是运行信息,不是程序报错。返回 PowerShell 提示符后,第二条命令应输出 True。
参数含义:--task detect 指定目标检测,--data 指向准备好的数据,--epochs 1 只训练一轮,--imgsz 320 指定输入尺寸,--batch 4 每批处理 4 张,--device cpu 使用 CPU,--name smoke 把本次结果放进 runs/smoke。
**这一轮只用来确认脚本、数据和保存路径正常。**如果失败,先修复,不直接增加训练轮数。检测模型与分类模型不同,不使用带 -cls 后缀的分类权重。
第 7 步:建立一份独立的入门实验
一轮跑通后,再执行:
bash
.\.venv\Scripts\python.exe run_model.py train --task detect --data 'prepared/data.yaml' --model yolo26n.pt --epochs 30 --imgsz 320 --batch 4 --device cpu --name baseline
Test-Path '.\runs\baseline\weights\best.pt'
Start-Process '.\runs\baseline'
**成功标志:**训练结束且权重存在,输出文件夹内能找到 weights/best.pt 和 results.csv。best.pt 是按验证表现保留的权重,last.pt 是最后一轮权重。
30 轮是入门实验设置,不保证已经最优。电脑性能、图片尺寸和数量都会影响耗时。内存不足可改 --batch 1;每次改变实验方案时换一个 --name,例如 baseline_batch1,后面的模型路径也同步修改。
第 8 步:用没参与训练的图片评估
先检查独立测试数据是否存在:
bash
Test-Path 'prepared/images/test'
输出 True 且目录内确有图片后,再执行下面的命令。如果原包只有训练和验证集,需要先制定独立评估方案;不把验证集改个名字充当测试集。
bash
.\.venv\Scripts\python.exe run_model.py test --task detect --data 'prepared/data.yaml' --model runs/baseline/weights/best.pt --imgsz 320 --batch 4 --name test_baseline
Get-Content -LiteralPath '.\runs\test_baseline\metrics.json' -Encoding UTF8
成功标志: metrics.json 保存了本次真实数值。主要看 mAP50 和 mAP50--95,它们衡量检测框与标注的匹配表现,不能写成整张图片分类准确率。
不要复制别人的数值填进报告,也不要根据测试分数反复挑参数;调参使用验证集,测试集用于最终检查。
第 9 步:打开预测结果,看它到底认对了什么
bash
.\.venv\Scripts\python.exe run_model.py predict --task detect --model runs/baseline/weights/best.pt --source 'prepared/images/test' --class-map prepared/class_mapping.json --imgsz 320 --name predictions
Start-Process '.\runs\predictions\predictions.html'
Get-Content -LiteralPath '.\runs\predictions\predictions.json' -Encoding UTF8
**成功标志:**浏览器显示预测图片和检测框、按类别汇总的数量,JSON 中能找到每张图片的输出。predicted_counts 是模型预测数量,不是人工标注的真实数量。置信度 0.9 不代表整个模型有 90% 的准确率。
再试一张自己准备的图片:在项目目录新建 my_images,放入一张实际 JPG 图片,命名为 demo.jpg。不要通过只改扩展名把其他格式冒充 JPG。然后执行:
bash
.\.venv\Scripts\python.exe run_model.py predict --task detect --model runs/baseline/weights/best.pt --source my_images/demo.jpg --class-map prepared/class_mapping.json --imgsz 320 --name my_photo
Start-Process '.\runs\my_photo\predictions.html'
新照片中若没有检测到目标,先确认模型路径,再检查图像场景和置信度。降低阈值可能增加误检,不能把"框变多了"当成效果变好。
最后,把它整理成可展示的课程项目或毕设实验
不要只交一张结果截图。把下面几部分串起来,读者才能检查你的工作:
|---------|----------------------------|
| 报告部分 | 具体要写什么 |
| 要解决的问题 | 用户输入什么,程序应该输出什么,适用范围是什么 |
| 演示材料 | 实际使用多少文件,选了哪些目录,为什么不使用其他部分 |
| 操作过程 | 环境版本、关键命令、输出文件位置和检查结果 |
| 实验或分析结果 | 自己运行得到的数字和图片,未运行的部分明确标注 |
| 错误分析 | 至少一个不理想的例子、可能原因和下一步验证方法 |
| 局限 | 样本数量、划分方式、标签可靠性和真实场景差异 |
作为毕业设计时,还需按照学校要求明确研究问题、对比方法和评价方式。跑通本教程属于起点,不能直接等同于完成整个毕业设计。
卡住时,按报错现象处理
|-----------------------|-----------------------------------------------------------------|
| 现象 | 先做的具体检查 |
| py 找不到 | 确认 Python Launcher 已安装,关闭终端后从项目目录重新打开 |
| can't open file | 执行 Get-Location 和 Get-ChildItem -Name,确认当前目录、文件名和扩展名 |
| No module named ... | 用同一条 .\.venv\Scripts\python.exe -m pip install ... 安装提示缺少的包 |
| 安装时连接超时 | 核对网络,再重试当前安装命令,不因此删除数据或重做已成功步骤 |
| No space left 或磁盘不足 | 检查项目盘与系统盘空间,清理后重试;增加请求次数不能解决空间问题 |
| 标签检查没有通过 | 看错误指出的路径、类别或坐标,核对原文件,不随意删标签凑通过 |
| 输出目录已存在 | 先看已有结果;重跑用新的 --out 或 --name,后续引用路径同步改掉 |
| 分类结果是 class_0 | 查看 prepared/class_mapping.json;预测报告中的 source_label 会给出原目录名称 |
| 内存不足 | 将 --batch 4 改为 --batch 1,用新实验名重跑 |
| 只有一个结果截图 | 同时保存 JSON、环境版本和划分记录,不能只根据图片判断模型表现 |
技术用法可对照 Ultralytics 分类说明、分类目录格式 和 检测任务说明。这些是代码使用说明,文中的数据数量以本次实际检查为准。
数据与附件
本文为内部教学草稿。数据尚未通过现有检查,生成内部草稿,等待核查。