从零开始训练YOLO手机检测模型:完整实战教程

一、项目背景

本文档记录了完整的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

解决方案

  1. 使用 device=cpu 参数
  2. 或安装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 完成的工作

  1. ✅ 从微信备份中提取了91张带标注的图片
  2. ✅ 将COCO格式标注转换为YOLO格式
  3. ✅ 上传数据到Docker容器
  4. ✅ 配置单类别检测(phone)
  5. ✅ 启动YOLO训练
  6. ✅ 导出训练好的模型

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

相关推荐
快乐的哈士奇11 小时前
对话框打字机效果:Vur + Java/Python 实现
java·开发语言·python
malog_11 小时前
PyTorch图像数据加载实战指南
图像处理·人工智能·pytorch·python
博.闻广见11 小时前
AI_Python基础-4.标准库与IO
开发语言·python
程序猿编码11 小时前
大模型的“文字障眼法“:FlipAttack 文本反转越狱技术全解析
linux·python·ai·大模型
晚烛11 小时前
CANN 数据流与内存优化:L1/L2 缓存机制与计算重叠深度解析
人工智能·python·缓存
xiao5kou4chang6kai411 小时前
如何用Python处理气象海洋数据?台风数据爬取、SST的EOF分析、WRF剖面图绘制
python·气象·台风·wrf·海洋
Reload.11 小时前
CZ航司,shopping JS逆向 acw_sc__v2
开发语言·javascript·python·网络爬虫·ecmascript
码界筑梦坊11 小时前
130-基于Python的体育用品销售数据可视化分析系统
开发语言·python·信息可视化·flask·毕业设计
码界筑梦坊11 小时前
131-基于Flask的美国新泽西州自动售货机销售数据可视化分析系统
开发语言·python·信息可视化·数据分析·flask·毕业设计