🚀 使用 YOLO 格式的交通标志数据集:下载与标准化重组全流程(含 Python 和 Bash 脚本)

在本专栏的第一篇文章里,我会从头到尾记录我是如何下载并整理 Kaggle 上的一个 YOLO 格式交通标志识别数据集的。

主要内容包括:

✅ 使用 Python 代码通过 kagglehub 下载数据集
✅ 分析解压后的文件结构
✅ 编写 Bash 脚本将图像和标签拆分为标准 YOLO 训练目录


📌 背景

在 YOLO 的常用实践里,推荐的数据集目录结构是下面这种:

dataset/
  images/
    train/
    val/
    test/
  labels/
    train/
    val/
    test/

也就是说,图片和标签是分开的,而且按数据集划分(train、val、test)分别放到对应子目录中。

但是很多 Kaggle 上发布的数据集,文件并没有按这种格式来分好,往往是所有图片和标签文件混在一个目录里。为了能直接用于 YOLOv5/YOLOv8 等 Ultralytics 框架训练,我们通常需要先“标准化整理”一遍。

本教程就演示了如何完成这个预处理。

✅ 1️⃣ 使用 Python 下载 Kaggle 数据集

我们要下载的是这个数据集:

🗂️ Kaggle 地址:
👉 Traffic Signs Dataset in YOLO Format

这个数据集已经是 YOLO 格式的标注(每张图片对应一个 .txt 标签文件),但目录中图像和标签是混在一起的


🔹 安装工具

这里我用的是 kagglehub 这个包,比官方 kaggle CLI 更简单。安装方法:

pip install kagglehub

⚠️ 你需要提前把你的 Kaggle API Token 文件放在:

~/.kaggle/kaggle.json

🔹 Python 示例代码

以下是下载到当前工作目录的完整脚本:

import kagglehub
import os

# 1. 选择下载路径
download_path = os.getcwd()

# 2. 确保目标目录存在
os.makedirs(download_path, exist_ok=True)

# 3. 下载数据
path = kagglehub.dataset_download("valentynsichkar/traffic-signs-dataset-in-yolo-format")

# 4. 可选:移动到目标路径
os.rename(path, os.path.join(download_path, os.path.basename(path)))

print("✅ 下载完成!路径:", os.path.join(download_path, os.path.basename(path)))

运行完后,你会得到一个解压好的文件夹,一般是Kaggle默认的 1、2、3、4


✅ 2️⃣ 数据集内容分析

下载后目录大致长这样:

4/
  ts/ts/
    00000.jpg
    00000.txt
    00001.jpg
    00001.txt
    ...

特点是:

  • 所有图像和标签在一个目录里(ts/
  • 每张图片都有同名的 .txt 文件作为标签

📌 而 YOLOv8 官方推荐格式是:

dataset/
  images/train/*.jpg
  images/val/*.jpg
  labels/train/*.txt
  labels/val/*.txt

所以我们需要完成的工作是:

随机拆分成训练集和验证集(此处设为80/20)
分别放到 images 和 labels 的子目录里


✅ 3️⃣ 类别标签(classes.names)

你在 Kaggle 页面可以看到只有 4 个类别,它的 classes.names 内容是:

prohibitory
danger
mandatory
other

在后续 YOLO 配置里也要写清楚这个类别映射。


✅ 4️⃣ 目标标准结构

我们想要把原始数据转成这个结构:

traffic-signs-dataset-standard/
  images/
    train/
      *.jpg
    val/
      *.jpg
  labels/
    train/
      *.txt
    val/
      *.txt

✅ 5️⃣ Bash 脚本实现

为了方便重用,我写了一个 Bash 脚本,可以一键完成以下功能

✅ 读取所有图片基名
✅ 随机打乱
✅ 按比例(默认 80/20)拆分成训练和验证
✅ 自动复制到标准目录结构


🔹 脚本内容

创建文件并粘贴:

touch prepare_yolo_dataset.sh
#!/bin/bash

# 源目录
SRC_DIR="./4/ts/ts"

# 输出目录
DST_DIR="./traffic"

# 创建输出目录
mkdir -p "$DST_DIR/images/train"
mkdir -p "$DST_DIR/images/val"
mkdir -p "$DST_DIR/labels/train"
mkdir -p "$DST_DIR/labels/val"

# 收集所有图片的基名(不含扩展名)
mapfile -t FILE_BASENAMES < <(find "$SRC_DIR" -type f -name "*.jpg" | xargs -n1 basename | sed 's/\.jpg//' | shuf)

# 计算数量
TOTAL=${#FILE_BASENAMES[@]}
TRAIN_COUNT=$(( TOTAL * 80 / 100 ))

echo "总文件数: $TOTAL"
echo "训练集数量: $TRAIN_COUNT"
echo "验证集数量: $(( TOTAL - TRAIN_COUNT ))"

# 循环划分
for i in "${!FILE_BASENAMES[@]}"; do
  BASE="${FILE_BASENAMES[$i]}"

  if [ "$i" -lt "$TRAIN_COUNT" ]; then
    SPLIT="train"
  else
    SPLIT="val"
  fi

  # 复制图片
  cp "$SRC_DIR/$BASE.jpg" "$DST_DIR/images/$SPLIT/"
  # 复制标签
  cp "$SRC_DIR/$BASE.txt" "$DST_DIR/labels/$SPLIT/"
done

echo "✅ 数据集整理和划分完成!输出目录: $DST_DIR"

🔹 使用方法

1️⃣ 给脚本加执行权限:

chmod +x prepare_yolo_dataset.sh

2️⃣ 运行脚本:

./prepare_yolo_dataset.sh

执行完后,就能得到标准的目录结构:

traffic-signs-dataset-standard/
  images/
    train/*.jpg
    val/*.jpg
  labels/
    train/*.txt
    val/*.txt

✅ 6️⃣ 小贴士

🔹 如果想调整训练/验证划分比例,只需要改脚本里这行:

TRAIN_COUNT=$(( TOTAL * 80 / 100 ))

比如改成 70/30:

TRAIN_COUNT=$(( TOTAL * 70 / 100 ))

✅ 7️⃣ YOLO data.yaml 示例

整理好目录后,Ultralytics 的 YOLOv8 需要一个 data.yaml 文件,例如:

path: ./traffic

train: images/train
val: images/val

names:
  0: prohibitory
  1: danger
  2: mandatory
  3: other

⚡ 注意 names 里一定要和 Kaggle 的 classes.names 保持一致。


❤️ 总结

在本篇博客中,包含:

✅ 这个交通标志数据集的特点(4个类别,YOLO格式标签)
✅ 如何用 Python 代码快速下载数据
✅ 如何用 Bash 脚本随机划分训练和验证集
✅ 如何整理成 YOLOv8 所推荐的标准目录结构


🔜 下一篇预告
✨ 第二篇: YOLOv8项目实战|交通标志数据集裁剪与标准化全流程

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐