三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

保姆级避坑指南:在Linux服务器上用MobaXterm搞定CCPD车牌数据集到YOLOv5的完整转换流程

保姆级避坑指南:在Linux服务器上用MobaXterm搞定CCPD车牌数据集到YOLOv5的完整转换流程

保姆级避坑指南:在Linux服务器上用MobaXterm搞定CCPD车牌数据集到YOLOv5的完整转换流程

当你第一次拿到CCPD数据集和YOLOv5代码时,可能会觉得"这不就是几个脚本跑一下的事吗?"——直到你在Linux服务器上遇到第一个路径错误。作为过来人,我整理了这份避坑指南,帮你避开那些浪费时间的陷阱。

1. 环境准备与工具配置

在开始之前,确保你的工具链已经就绪。MobaXterm作为Windows连接Linux服务器的神器,比传统SSH工具更适合文件传输和可视化操作。以下是必须检查的环境清单:

  • MobaXterm版本:建议使用2022或更新版本,旧版可能存在X11转发兼容性问题
  • Python环境:
    python3 --version # 确认版本≥3.8 pip list | grep torch # 检查torch是否安装
  • 存储空间:
    df -h # 确认至少有30GB可用空间

注意:服务器上的Python环境最好使用conda管理,避免权限问题。如果遇到Permission denied错误,可以尝试:

conda create -n yolov5 python=3.8 conda activate yolov5

2. CCPD数据集处理全流程

2.1 数据集下载与解压

CCPD数据集通常以压缩包形式提供,这里有个容易踩坑的点:不要在Windows本地解压后再上传。直接通过MobaXterm的SFTP功能上传压缩包到服务器,然后用Linux命令解压:

# 创建专用目录(避免权限问题) mkdir -p ~/datasets/ccpd tar -xvf CCPD2019.tar -C ~/datasets/ccpd

解压后检查文件数量:

ls ~/datasets/ccpd | wc -l # 正常应有约30万张图片

2.2 目录结构规范化

YOLOv5对数据集目录结构有严格要求,建议按以下结构组织:

ccpd/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 └── labels/ ├── train/ # 训练集标签 └── val/ # 验证集标签

创建目录结构的快速命令:

mkdir -p ~/datasets/ccpd/{images,labels}/{train,val}

2.3 数据集分割与格式转换

这是最容易出错的环节。CCPD的图片命名包含车牌位置信息,需要提取并转换为YOLO格式的txt标签文件。我改良过的转换脚本如下:

import os import cv2 import random def convert_ccpd_to_yolo(img_path, label_dir): filename = os.path.basename(img_path) parts = filename.split('-') bbox_info = parts[2].split('_') # 解析边界框坐标 lt, rb = bbox_info[0], bbox_info[1] lx, ly = lt.split('&') rx, ry = rb.split('&') # 读取图片获取尺寸 img = cv2.imread(img_path) if img is None: return False h, w = img.shape[:2] # 计算YOLO格式的归一化坐标 x_center = (float(lx) + float(rx)) / 2 / w y_center = (float(ly) + float(ry)) / 2 / h width = (float(rx) - float(lx)) / w height = (float(ry) - float(ly)) / h # 写入标签文件 label_path = os.path.join(label_dir, os.path.splitext(filename)[0] + '.txt') with open(label_path, 'w') as f: f.write(f"0 {x_center} {y_center} {width} {height}") return True # 使用示例 src_image = "/path/to/ccpd/image.jpg" dst_label_dir = "/path/to/labels/train/" convert_ccpd_to_yolo(src_image, dst_label_dir)

3. YOLOv5训练配置技巧

3.1 数据集YAML文件配置

在yolov5/data目录下创建ccpd.yaml,常见错误是路径格式问题:

# ccpd.yaml 正确示例 train: /home/user/datasets/ccpd/images/train val: /home/user/datasets/ccpd/images/val nc: 1 # 类别数(车牌检测通常为1) names: ['license_plate'] # 类别名称

重要提示:路径必须使用绝对路径,相对路径在训练时可能导致找不到文件

3.2 训练参数优化

对于车牌检测任务,推荐修改默认训练参数:

参数名默认值推荐值说明
--img-size640640保持默认即可
--batch-size1632根据GPU内存调整
--epochs300100车牌检测收敛较快
--optimizerSGDAdam更适合小数据集

启动训练的命令示例:

python train.py --data ccpd.yaml --cfg yolov5s.yaml --weights yolov5s.pt --batch-size 32 --epochs 100

4. 常见问题排查指南

4.1 路径相关错误

  • 症状:FileNotFoundError或NoneType错误
  • 解决方案:
    1. 使用os.path.exists()检查路径
    2. 确保所有路径使用Linux格式(正斜杠/)
    3. 检查文件权限:
      ls -l /path/to/file chmod 644 /path/to/file # 必要时修改权限

4.2 内存不足问题

当处理大量图片时可能遇到内存错误,可以:

  1. 使用生成器分批处理:
    def batch_process(image_paths, batch_size=1000): for i in range(0, len(image_paths), batch_size): batch = image_paths[i:i+batch_size] # 处理批次...
  2. 增加服务器swap空间:
    sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

4.3 可视化技巧

通过MobaXterm的X11转发功能,可以直接在本地显示服务器上的TensorBoard:

  1. 在MobaXterm中启用X11转发(Settings -> Configuration -> X11)
  2. 启动TensorBoard:
    tensorboard --logdir runs/train --port 6006 --bind_all
  3. 在本地浏览器访问http://localhost:6006

5. 效率提升实战技巧

5.1 并行处理加速

使用GNU parallel加速文件处理:

# 安装parallel sudo apt-get install parallel # 并行运行转换脚本 find ~/datasets/ccpd/images/train -name "*.jpg" | parallel -j 8 python convert.py {}

5.2 自动化脚本示例

完整的处理流程可以封装成shell脚本:

#!/bin/bash # 1. 解压数据集 tar -xvf CCPD2019.tar -C ~/datasets/ccpd # 2. 创建目录结构 mkdir -p ~/datasets/ccpd/{images,labels}/{train,val} # 3. 分割数据集 python split_dataset.py --input ~/datasets/ccpd --output ~/datasets/ccpd --ratio 0.8 0.1 0.1 # 4. 转换标签格式 python convert_labels.py --image-dir ~/datasets/ccpd/images/train --label-dir ~/datasets/ccpd/labels/train python convert_labels.py --image-dir ~/datasets/ccpd/images/val --label-dir ~/datasets/ccpd/labels/val # 5. 检查数据完整性 python verify_dataset.py --data ~/datasets/ccpd

5.3 模型训练监控

使用py-spy实时监控训练过程:

# 安装py-spy pip install py-spy # 监控训练进程 py-spy top --pid $(pgrep -f "python train.py")

这些技巧在实际项目中帮我节省了大量时间,特别是在处理数十万张图片时,合理的并行化能让处理时间从小时级降到分钟级。记得在处理完成后验证数据集完整性,一个简单的检查脚本能避免后续训练时的各种诡异错误。

← 返回列表