一、项目背景
本文档记录了完整的YOLO目标检测模型训练流程,从数据准备、格式转换、环境配置到最终训练的全过程。我们将训练一个专门检测手机的YOLO模型。
最终成果
- ✅ 91张标注图片,91个手机检测标签
- ✅ 单类别检测模型(phone)
- ✅ 可直接用于推理的
.pt模型文件
二、环境准备
2.1 Docker容器环境
bash
# 查看运行的容器
docker ps
关键容器:
yolo-service:Ultralytics YOLO容器,包含训练环境- 其他辅助容器(可停止以释放资源)
bash
# 停止无关容器
docker stop docker-plugin_daemon-1 docker-sandbox-1
docker stop docker-worker-1 docker-worker_beat-1 docker-api-1 docker-web-1 docker-weaviate-1 docker-ssrf_proxy-1
2.2 检查YOLO环境
bash
# 验证YOLO命令可用
docker exec yolo-service yolo detect train --help
2.3 查看现有数据结构
bash
# 查看容器内数据集目录
docker exec yolo-service ls -la /ultralytics/yolo_data/
输出示例:
drwxrwxrwx 1 root root 4096 May 12 08:44 .
drwxr-xr-x 1 root root 4096 Apr 1 02:19 ..
-rwxrwxrwx 1 root root 6202154 Mar 19 03:25 best.pt
-rwxrwxrwx 1 root root 282 Mar 24 07:32 data.yaml
drwxrwxrwx 1 root root 4096 Mar 19 02:41 images
drwxrwxrwx 1 root root 4096 Mar 24 07:32 labels
drwxrwxrwx 1 root root 4096 Mar 17 05:15 runs
三、数据准备
3.1 原始数据来源
数据位于本地路径:
C:\Users\Administrator\Documents\xwechat_files\wxid_8lnc504n1yut22_8ac6\msg\file\2026-05\call\call\
包含:
- 大量
.jpg图片(Image1.jpg ~ Image244.jpg) 打电话.json(COCO格式标注文件).thumbnail缩略图文件夹
3.2 数据统计
powershell
# 统计图片数量
Get-ChildItem "C:\Users\Administrator\Documents\xwechat_files\wxid_8lnc504n1yut22_8ac6\msg\file\2026-05\call\call\*.jpg" | Measure-Object
3.3 创建工作目录
powershell
mkdir D:\yolo_phone_dataset
cd D:\yolo_phone_dataset
四、格式转换(COCO → YOLO)
4.1 安装依赖
powershell
pip install Pillow
4.2 转换脚本
创建 convert_json_to_yolo.py:
python
import json
import os
from PIL import Image
import shutil
# 路径配置
json_path = r"C:\Users\Administrator\Documents\xwechat_files\wxid_8lnc504n1yut22_8ac6\msg\file\2026-05\call\call\打电话.json"
image_dir = r"C:\Users\Administrator\Documents\xwechat_files\wxid_8lnc504n1yut22_8ac6\msg\file\2026-05\call\call"
output_dir = r"D:\yolo_phone_dataset"
# 创建输出目录
os.makedirs(os.path.join(output_dir, "images", "train"), exist_ok=True)
os.makedirs(os.path.join(output_dir, "labels", "train"), exist_ok=True)
# 读取JSON
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 创建映射
image_id_to_filename = {img['id']: img['file_name'] for img in data['images']}
annotations_by_image = {}
for ann in data['annotations']:
img_id = ann['image_id']
annotations_by_image.setdefault(img_id, []).append(ann)
print(f"找到 {len(data['images'])} 张图片,{len(data['annotations'])} 个标注")
# 转换每个图片
for img_id, filename in image_id_to_filename.items():
img_path = os.path.join(image_dir, filename)
if not os.path.exists(img_path):
print(f"跳过 {filename}:文件不存在")
continue
# 获取图片尺寸
with Image.open(img_path) as img:
img_width, img_height = img.size
# 生成YOLO标签
label_path = os.path.join(output_dir, "labels", "train", filename.replace('.jpg', '.txt'))
with open(label_path, 'w') as f:
for ann in annotations_by_image.get(img_id, []):
x, y, w, h = ann['bbox'] # COCO格式
# 转换为YOLO格式(归一化)
x_center = (x + w/2) / img_width
y_center = (y + h/2) / img_height
width = w / img_width
height = h / img_height
f.write(f"0 {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")
# 复制图片
shutil.copy2(img_path, os.path.join(output_dir, "images", "train", filename))
print(f"处理完成: {filename}")
print("转换完成!")
4.3 执行转换
powershell
python convert_json_to_yolo.py
输出:
找到 91 张图片,91 个标注
处理完成: Image10 (3).jpg
...
转换完成!
4.4 验证转换结果
powershell
# 统计标签数量
Get-ChildItem D:\yolo_phone_dataset\labels\train\ | Measure-Object -Line
# 输出:91
# 查看标签内容示例
Get-Content "D:\yolo_phone_dataset\labels\train\Image10 (3).txt"
# 输出:0 0.604492 0.265625 0.036328 0.103472
标签格式说明:
- 第1列:类别ID(0 = phone)
- 第2-5列:归一化的中心坐标和宽高
五、上传数据到Docker容器
5.1 复制图片和标签
powershell
# 复制图片
docker cp D:\yolo_phone_dataset\images\train\. yolo-service:/ultralytics/yolo_data/images/train/
# 复制标签
docker cp D:\yolo_phone_dataset\labels\train\. yolo-service:/ultralytics/yolo_data/labels/train/
5.2 验证上传
powershell
docker exec yolo-service ls /ultralytics/yolo_data/images/train/ | Measure-Object -Line
docker exec yolo-service ls /ultralytics/yolo_data/labels/train/ | Measure-Object -Line
输出均为 91,确认数据完整。
六、配置文件修改
6.1 更新 data.yaml
bash
docker exec yolo-service bash -c "cat > /ultralytics/yolo_data/data.yaml << 'EOF'
path: /ultralytics/yolo_data
train: images/train
val: images/train
nc: 1
names:
0: phone
EOF"
6.2 验证配置
bash
docker exec yolo-service cat /ultralytics/yolo_data/data.yaml
输出:
yaml
path: /ultralytics/yolo_data
train: images/train
val: images/train
nc: 1
names:
0: phone
七、开始训练
7.1 检查GPU可用性
bash
docker exec yolo-service python -c "import torch; print(torch.cuda.is_available())"
如果返回 False,使用CPU训练。
7.2 执行训练(CPU模式)
bash
docker exec yolo-service yolo detect train \
model=/ultralytics/yolo_data/best.pt \
data=/ultralytics/yolo_data/data.yaml \
epochs=50 \
batch=8 \
imgsz=320 \
device=cpu \
project=/ultralytics/yolo_data/runs/detect \
name=phone_train \
exist_ok=True \
pretrained=False \
val=False
7.3 训练参数说明
| 参数 | 值 | 说明 |
|---|---|---|
model |
best.pt | 基础模型(可选,从头训练可不指定) |
epochs |
50 | 训练轮数 |
batch |
8 | 批次大小 |
imgsz |
320 | 输入图像尺寸 |
device |
cpu | 计算设备(cpu/cuda) |
project |
/ultralytics/yolo_data/runs/detect | 输出目录 |
name |
phone_train | 实验名称 |
val |
False | 跳过验证(加快训练) |
7.4 GPU不可用时的解决方案
如果遇到以下错误:
ValueError: Invalid CUDA 'device=0' requested.
torch.cuda.is_available(): False
解决方案:
- 使用
device=cpu参数 - 或安装GPU版本的容器(需要NVIDIA Docker运行时)
八、监控训练过程
8.1 训练输出解读
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
1/50 0.35G 1.245 0.876 1.123 91 320
2/50 0.35G 1.123 0.765 1.045 91 320
...
50/50 0.35G 0.234 0.123 0.456 91 320
8.2 查看实时日志
bash
docker logs -f yolo-service
九、训练结果
9.1 模型保存位置
训练完成后,模型保存在:
/ultralytics/yolo_data/runs/detect/phone_train/weights/best.pt
9.2 导出模型到本地
powershell
docker cp yolo-service:/ultralytics/yolo_data/runs/detect/phone_train/weights/best.pt D:\yolo_phone_dataset\phone_model.pt
9.3 验证模型
bash
docker exec yolo-service yolo detect predict \
model=/ultralytics/yolo_data/runs/detect/phone_train/weights/best.pt \
source=/ultralytics/yolo_data/images/train/Image10\ \(3\).jpg \
device=cpu
十、常见问题与解决方案
10.1 文件名包含空格
问题:PowerShell处理带空格的文件名报错
解决:使用双引号包裹
powershell
Get-Content "文件名 带空格.txt"
10.2 CUDA不可用
问题 :torch.cuda.is_available(): False
原因:
- 容器没有GPU访问权限
- 未安装NVIDIA Container Toolkit
解决:
- 临时方案:使用
device=cpu - 永久方案:安装NVIDIA Docker运行时
10.3 标签格式错误
验证标签格式:
bash
docker exec yolo-service head -5 /ultralytics/yolo_data/labels/train/*.txt
正确格式示例:
0 0.604492 0.265625 0.036328 0.103472
十一、总结
11.1 完成的工作
- ✅ 从微信备份中提取了91张带标注的图片
- ✅ 将COCO格式标注转换为YOLO格式
- ✅ 上传数据到Docker容器
- ✅ 配置单类别检测(phone)
- ✅ 启动YOLO训练
- ✅ 导出训练好的模型
11.2 关键命令速查
bash
# 数据上传
docker cp <本地路径> yolo-service:<容器路径>
# 开始训练
docker exec yolo-service yolo detect train model=<模型> data=<配置> epochs=<轮数>
# 模型导出
docker cp yolo-service:<容器模型路径> <本地路径>
# 模型推理
docker exec yolo-service yolo detect predict model=<模型> source=<图片>
11.3 下一步优化建议
- 增加更多训练数据(当前91张略少)
- 使用GPU加速训练
- 添加验证集评估模型性能
- 调整超参数(学习率、数据增强等)
- 部署为API服务
附录:完整文件结构
D:\yolo_phone_dataset\
├── images\
│ └── train\
│ ├── Image10 (3).jpg
│ ├── Image12 (3).jpg
│ └── ... (91张图片)
├── labels\
│ └── train\
│ ├── Image10 (3).txt
│ ├── Image12 (3).txt
│ └── ... (91个标签)
├── convert_json_to_yolo.py
└── phone_model.pt (训练后导出)
博客版本 :v1.0
更新日期 :2026-05-21
适用环境:Docker + Ultralytics YOLO