从零开始训练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

相关推荐
小森林之主3 分钟前
深入正则表达式:核心语法与实战剖析
javascript·python·正则表达式·编程技巧·字符串处理
果丁智能13 分钟前
智慧校园一卡通深度融合方案:基于超级SIM卡的手机碰一碰智能开锁技术落地实践
数据结构·人工智能·python·科技·算法·智能家居·信息与通信
码来的小朋友17 分钟前
[Python] 制作小游戏创意之3D魔方
python·3d·pygame
老徐聊GEO21 分钟前
芜湖Ai搜索获客亲测有效案例分享
人工智能·python
叫我:松哥25 分钟前
基于机器学习和flask的体育健身风险智能分析系统,系统集成DeepSeek、聚类算法、分类算法等,准确率达90%
人工智能·python·神经网络·算法·机器学习·flask·聚类
码云骑士27 分钟前
03-Python可变对象与不可变对象(下)-深浅拷贝的底层真相
开发语言·python
与代码不die不休27 分钟前
RTX5060显卡torch和torch_radon库安装避坑指南(仅linux系统)
linux·图像处理·python·深度学习
砍材农夫27 分钟前
python环境|pip|uv|venv|Conda区别
后端·python·conda·pip·uv
向量引擎28 分钟前
AI API 正在进入“请求生命周期治理”阶段:从模型迁移、Agent 接入到成本与安全排错的工程化方法
java·人工智能·python·aigc·ai编程·ai写作·gpu算力
梦想不只是梦与想30 分钟前
Python 中的线程(Thread)
python·线程·thread