当前位置: 首页 > news >正文

【深度学习实战】从零构建数据集标签:手把手生成训练与验证清单

1. 为什么需要训练清单文件

当你从GitHub克隆一个深度学习项目准备复现时,第一个拦路虎往往就是数据集处理。我见过太多新手卡在这一步:明明下载了数据集,却不知道如何让模型正确读取。这就像买了一堆食材却不知道菜谱,空有数据却无法训练。

train.txt和val.txt这两个看似简单的文本文件,实际上是模型训练的"导航地图"。它们记录了所有训练集和验证集图片的路径信息,让模型知道去哪里找数据。没有这两个文件,就像让出租车司机去接人却不给地址一样荒谬。

我处理过的服装分类数据集就是个典型例子。原始数据按照类别存放在不同文件夹里:

data/ ├── train/ │ ├── downjacket/ │ ├── flareskirt/ │ └── ... └── val/ ├── downjacket/ └── ...

这种结构虽然直观,但PyTorch等框架无法直接识别。手动创建清单文件又太耗时,特别是当你有4000张图片时。这就是为什么我们需要自动化脚本——它能把几小时的手工活变成几秒钟的自动处理。

2. 数据集目录结构设计

好的目录结构是成功的一半。经过多个项目实践,我总结出一个黄金法则:保持一致性、可扩展性和可移植性。下面是我推荐的目录布局:

project_root/ ├── data/ │ ├── myself/ # 自定义数据集 │ │ ├── train/ # 训练集 │ │ │ ├── class1/ # 类别文件夹 │ │ │ └── class2/ │ │ └── val/ # 验证集 │ │ ├── class1/ │ │ └── class2/ ├── examples/ │ └── myself/ │ ├── create_filelist.sh # 生成脚本 │ ├── train.txt # 输出文件 │ └── val.txt

关键细节

  1. 使用全英文路径,避免中文和空格(比如用downjacket而不是"羽绒服")
  2. 图片命名建议采用类别_序号.后缀格式(如downjacket_001.jpg
  3. 验证集比例通常占20%-30%,我的服装数据集就是按这个比例划分的

注意:在Linux环境下,路径区分大小写。曾经有个项目因为把Tshirt写成tshirt导致脚本报错,排查了整整两小时!

3. Shell脚本编写实战

现在来到核心部分——编写自动化脚本。别被"Shell脚本"吓到,其实它就像一份烹饪步骤说明。下面是我优化后的脚本,比原始版本更健壮:

#!/bin/bash # 配置路径(根据实际修改) DATA_DIR="../data/myself" # 数据集路径 OUTPUT_DIR="." # 输出目录 echo "正在生成train.txt..." rm -f $OUTPUT_DIR/train.txt # 清理旧文件 # 遍历所有训练集类别 for class_dir in $DATA_DIR/train/*; do if [ -d "$class_dir" ]; then find "$class_dir" -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" >> $OUTPUT_DIR/train.txt fi done echo "正在生成val.txt..." rm -f $OUTPUT_DIR/val.txt # 遍历所有验证集类别 for class_dir in $DATA_DIR/val/*; do if [ -d "$class_dir" ]; then find "$class_dir" -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" >> $OUTPUT_DIR/val.txt fi done echo "文件列表生成完成!"

改进亮点

  1. 使用循环语句替代硬编码路径,适应任意类别数量
  2. 支持多种图片格式(jpg/jpeg/png)
  3. 相对路径设计,增强可移植性
  4. 添加执行状态提示,更友好

常见问题处理:

  • 如果遇到Permission denied错误,先给脚本添加执行权限:
    chmod +x create_filelist.sh
  • 路径中包含空格时,要用引号包裹变量(如"$class_dir"

4. 高级技巧与错误排查

在实际项目中,我积累了一些血泪经验,能帮你少走弯路:

路径处理陷阱

  • 绝对路径 vs 相对路径:建议在脚本内统一转换为绝对路径
    REAL_PATH=$(realpath "$class_dir") echo "$REAL_PATH" >> train.txt
  • Windows和Linux路径差异:如果在Windows开发,注意反斜杠转换
    sed -i 's/\\/\//g' train.txt # 将\替换为/

数据校验技巧: 生成文件后,建议用这些命令检查:

wc -l train.txt # 统计行数(图片总数) head -n 5 train.txt # 查看前5行路径是否正确 grep " " train.txt # 检查是否包含空格路径

性能优化: 当处理超大规模数据集(10万+图片)时:

  1. 使用parallel命令加速:
    parallel -j 8 find {} -name "*.jpg" ::: $DATA_DIR/train/* >> train.txt
  2. 添加进度显示:
    find "$class_dir" -name "*.jpg" | pv -l >> train.txt

一个真实案例:有次处理50万张商品图片时,原始脚本跑了20分钟。加入并行处理后,时间缩短到3分钟——这就是自动化脚本的价值!

5. 与深度学习框架集成

生成的文件列表最终要用于模型训练。以PyTorch为例,通常有两种使用方式:

方式一:自定义Dataset类

from torch.utils.data import Dataset class ImageDataset(Dataset): def __init__(self, file_list): self.file_list = [] with open(file_list) as f: for line in f: self.file_list.append(line.strip()) def __getitem__(self, idx): img_path = self.file_list[idx] # 添加图像加载和预处理代码 return image, label

方式二:使用框架内置工具如PyTorch的ImageFolder,但需要调整目录结构:

data/ ├── class1/ │ ├── img1.jpg │ └── img2.jpg └── class2/ ├── img3.jpg └── img4.jpg

重要提示:如果使用绝对路径,当把项目迁移到其他机器时,需要更新路径。建议在训练代码中添加路径前缀配置项。

我曾经遇到一个坑:团队协作时,同事的路径是/home/user/data,而我的是/Users/name/data,导致脚本报错。后来我们统一改用相对路径,问题迎刃而解。

6. 扩展应用场景

这个技术不仅限于图像分类,经过简单改造可以用于:

  1. 多标签分类:在每行路径后添加标签
    /path/to/img1.jpg 0,1,5 /path/to/img2.jpg 3,7
  2. 目标检测:关联标注文件路径
    find "$class_dir" -name "*.jpg" | while read img; do echo "$img ${img%.*}.xml" >> train.txt done
  3. 跨模态数据:同时处理图像和文本
    find images/ -name "*.jpg" | while read img; do text="${img/images/texts}.txt" echo "$img $text" >> multimodal.txt done

在智能硬件项目中,我还用类似方法处理过传感器时序数据。原理相通,只是文件扩展名从.jpg变成了.csv

http://www.jsqmd.com/news/816132/

相关文章:

  • 基于STM32CubeMx与FreeRTOS:从零构建多任务LED控制系统的移植实践
  • 从专利数据看中国半导体产业:从数量增长到质量竞争
  • 智能车辆局部路径规划与运动控制【附代码】
  • 全球销量第一,3000+台!美光速造领跑齿科金属3D打印
  • 原生JavaScript+Tailwind CSS构建现代化任务清单应用
  • CommonJS 与 ESM 的模块规范
  • 解决跨平台表情符号显示不一致的Noto Emoji架构设计与性能优化
  • 在VS Code中集成Cppcheck与MISRA-C:打造实时嵌入式代码质量守护
  • 基于Go的ChatGPT共享服务扩展:快速搭建企业级AI应用平台
  • 今天给大家介绍一个Vue 的网站组件库
  • Midjourney 120胶片风格失效诊断手册(颗粒失真/色温漂移/动态压缩异常全解)
  • 免费获取A股行情数据的终极Python解决方案:MOOTDX完整指南
  • PyGPT:聚合多模型与RAG的桌面AI助手,打造本地化智能工作流
  • React + TypeScript + Vite 构建 Bento 网格生成器:从拖拽交互到 Canvas 导出
  • 重卡充电桩怎么挑选?2026年五大品牌测评 - 科技焦点
  • AnyKernel3实战指南:三步打造Android内核自动化部署方案
  • 从仿真到代码:基于Simulink的双向交错CCM图腾柱PFC系统建模与MBD实践
  • AntiDupl.NET:完全指南 - 智能图片去重工具高效清理重复图片实战教程
  • 对于指定车模组别,我是希望能够自制
  • NotebookLM视觉提示工程终极手册:12类prompt模板+37个真实Notebook案例(含GitHub可运行源码)
  • 如何用novel-downloader构建个人数字图书馆:小说下载器完全指南
  • 保姆级教程:用迪文DMG80480C070_03WTC串口屏的RAM变量和描述指针,实现动态UI交互
  • 如何加速下载与捕获视频:Xtreme Download Manager 完全指南
  • 3分钟掌握NCM解密:Windows图形化工具完全指南
  • 2026年5月塑料托盘厂家推荐指南:防潮塑料托盘,双面塑料托盘,出口专用塑料托盘,货架塑料托盘公司优选! - 品牌鉴赏师
  • GT-SUITE浮动许可利用率低:软件许可浪费,回收再分配
  • CircuitPython嵌入式开发实战:从引脚访问到IPv6网络通信
  • 用STM32F407给GC9A01圆形屏做个触摸画板:CST816D驱动避坑与坐标处理实战
  • 3分钟极简教程:免费开源视频下载插件VideoDownloadHelper完全指南
  • ElevenLabs非正式语音合成全链路拆解(情绪权重矩阵×声学特征映射表×实时pitch抖动算法)