news 2026/9/18 5:46:18

YOLOv5自制数据集全流程指南:从图像采集标注到训练配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5自制数据集全流程指南:从图像采集标注到训练配置

如果你已经跑通了YOLOv5官方仓库的检测Demo,下一步大概率就是琢磨怎么训练自己的模型。而“自己的模型”这个词,翻译过来其实就是一句话:你得先有自己的数据集。我见过太多次这样的场景——有人照着教程把环境配好、权重下载好,然后卡在数据准备这关两三天,图片倒是攒了几百张,但目录结构乱、标注格式错、类别写不对,训练一跑起来全是报错,最后只能灰溜溜回去用官方权重。

这篇文章就把数据集从采集、清洗、标注到配置文件整理的全流程拆开讲清楚。没有玄学,没有跳过关键细节,所有步骤都是我实际跑通过、也在项目里踩过坑之后验证过的方案。你只要跟着做,就能拥有一个结构规范、能直接喂给YOLOv5训练的神经网络数据集。

1. 数据集制作前要先想明白的三件事

1.1 你的目标检测任务到底是检测什么

做数据集之前,第一件事不是拍照下载图片,而是先定义清楚检测目标。这里说的“定义清晰”不是一句“我要检测猫”就完事,而是要细化到类别边界。比如同样是检测“车辆”,你是要检测所有机动车,还是只检测小轿车、卡车、公交车各自分开?你是只关心运动中的车辆,还是静止的也要框出来?这些决策直接决定你后面标注时的判断标准,也会影响模型最终学出来的效果。

我在实际项目里经常遇到的问题是类别定义模糊导致标注前后不一致。比如第一周标注的人把“手机”定义为包括手机壳在内整机,第二周新来的标注员只框屏幕部分,同一个数据集里标注风格混乱,模型训练出来的结果自然一塌糊涂。所以在开始之前,务必先把类别的判定标准写成一份简单的文档,哪怕只有几条规则,也比脑内标准强得多。

还有一个容易踩的坑是类别数量。新手总觉得类别分得越细越厉害,但我见过有人做一个零件缺陷检测,一开始定义了21个类别,其中不少类别之间肉眼都难分辨,最终模型训练出来的精度惨不忍睹。对于第一次训练自制数据集的场景,建议类别控制在5-10个以内,先把整个流程跑通,再考虑细分。

1.2 数据规模要多少才够用

关于数据量这个问题,网上的说法五花八门,有人说每个类别100张就够,有人说至少要1万张。我在实际项目里的经验是:一个相对均衡的单类别检测任务,图片数量起步最好不低于500张,每个类别的实例数不低于1000个;如果你的场景比较简单、目标特征明显(比如检测红色圆球),那300-500张图片也能训练出一个能用的模型。

这里要特别说明一下“实例数”和“图片数”的区别。一张图片里可能有5个目标,这算5个实例,对模型的训练贡献比一张只有一个目标的图片大得多。所以做数据采集的时候,尽量保证每张图片里目标数量不要太少,同时也要避免所有图片都只有同一目标姿态、同一角度,那样模型学到的只是固定模板。

另外一个很多新手忽略的点是测试集不要和训练集有太多相似性。你可以把同一台设备拍出来的连续帧抽出来几十张放进验证集和测试集,但不要所有图片都来自同一个视频序列,否则模型在验证集上的mAP虚高,真正部署到新场景立刻被打回原形。

1.3 环境准备:先把基础版本对齐

数据集的制作虽然不直接依赖深度学习框架,但后面的训练环节和工具链需要环境一致。根据我踩坑的经验,这里有几个版本组合建议你直接照抄。

PyTorch建议使用1.12以上版本,Python建议3.8-3.10,YOLOv5仓库用官方最新的release版本。CUDA方面,如果显卡驱动支持,直接上CUDA 11.7以上版本配套cuDNN,能省掉很多兼容性问题。标注工具LabelImg需要Python环境,安装命令是pip install labelimg,如果在Windows上装完打不开,多半是PyQt的版本冲突,卸载重装PyQt5即可解决。

注意:虽然YOLOv8、YOLOv5、YOLOv3等框架在数据格式上都是同一套YOLO标签体系,但不同版本对数据集目录结构和配置文件的要求略有差异。本文以YOLOv5官方仓库的数据集格式为准,这也是目前兼容性最好、最值得掌握的通用格式。

2. 数据采集:没有高质量原始图片,后面全白搭

2.1 图片来源的合规渠道

数据集的素材来源,我建议优先这四种渠道:公开数据集、自行采集拍摄、视频抽帧、合作方提供。公开数据集方面,VOC、COCO、Open Images这些都有海量标注好的图片,但问题在于它们覆盖的场景和你的任务不一定匹配,通常需要自己筛选。自行拍摄最可靠,尤其是做工业检测、特定场景识别的项目,自己拍能完全控制光照、角度、距离。视频抽帧适合动态场景,比如交通监控中的车辆检测,从视频里抽取不同帧可以得到大量带有多样性的图片。

这里必须特别提醒版权问题。很多人喜欢直接从搜索引擎批量下载图片,这在商业项目里风险很高。我见过有团队因为用了某图片库的图片做模型训练数据,最后被版权方找上门要求赔偿。如果是个人学习用途,搜索下载问题不大,但涉及商业落地,建议只用公开数据集、自己拍摄或明确授权来源。

还有一个被很多人忽视的渠道是开源数据集平台,比如Kaggle、Roboflow Universe、OpenDataLab。在这些平台搜索你的目标类别,往往能直接找到别人整理好的数据集,省去大量采集和标注时间。Roboflow Universe甚至支持直接导出成YOLOv5格式,格式转换这一步都省了。

2.2 数据清洗的筛选标准

图片采集回来之后,并不是全部都能用。我定义了一套清洗筛选标准,你可以直接参考。

第一,模糊图片直接丢弃。判断标准很简单,把图片放大到100%看细节,如果目标边缘轮廓看不清,就属于模糊图片。第二,目标被严重遮挡并且超过一半面积的,建议丢弃。但如果遮挡情况在你实际应用场景中很常见(比如检测货架上的商品被其他商品部分遮住),那就要特意保留一部分遮挡样本,提升模型的鲁棒性。第三,重复度太高的图片要精简。连续视频帧里抽出的图片,如果目标位置、大小变化极小,只保留每隔10-20帧的样本就够了。第四,光线条件严重失衡的图片要尽量均衡化。如果训练集全是室内灯光,测试时放到室外阳光直射场景,效果大概率不佳。

清洗完的数据,我习惯按类别做一次数量统计。如果某个类别图片数量明显少于其他类别,需要针对性地补充采集。类别不平衡的问题,追加数据比任何数据增强手段都有效,这一点后面还会细说。

2.3 图片命名与基础整理

命名规范这件事看着小,实际影响很大。YOLOv5训练时用的图片文件名会直接作为标签文件的基础名,如果同一批次图片里既有001.jpg又有1.jpg,后续做数据划分或排查问题时特别容易混。我推荐的命名格式是:项目缩写+场景编号+序号,例如helmet_office_001.jpghelmet_street_002.jpg。这样既能保证全局唯一,又能在排查问题时快速定位图片来源场景。

图片格式统一建议用.jpg,因为JPEG压缩对检测任务的影响较小,且文件体积小。如果你的原始素材是PNG或BMP,批量转换一下就好。分辨率方面,YOLOv5默认输入是640x640,建议原始图片最短边不低于640像素。但也不要追求超高分辨率,如果原图是4K级别,直接喂进训练会让IO开销大幅增加,训练速度变慢,通常压缩到最长边2000像素左右即可。

3. 标注环节:数据集的灵魂所在

3.1 标注工具怎么选

标注工具是数据制作环节的重头戏。我试过不少工具,简单分享一下选择心得。

LabelImg是最经典的开源标注工具,支持YOLO格式和VOC格式导出,界面简洁,单人标注完全够用。它的缺点是功能比较基础,没有智能辅助。Label Studio功能强大得多,支持图像、文本、音频等多种类型标注,支持多人协作和自动标注,配置稍微复杂一些。X-AnyLabeling是国产工具,支持YOLOv5模型辅助自动标注,适合你已经有一个预训练模型、需要快速标注大批量数据的场景。

如果你只是个人或小团队做几百张图的数据集,无脑选LabelImg就对了,最稳定、最容易上手。设置里记得把标注格式改为YOLO,标注会自动保存为txt文件。标注前还要确认classes.txt文件中的类别名称,必须和你的配置文件保持完全一致。

工具名称适合规模协作支持自动标注上手难度
LabelImg少量到中等
Label Studio中等到大量部分
X-AnyLabeling大量
Roboflow标注器中等到大量

3.2 YOLO标签格式的核心要点

YOLO格式的标签文件是与图片同名的txt文件,每行代表一个目标,格式是:类别ID、中心点x坐标、中心点y坐标、目标宽度、目标高度。这里有个最容易翻车的地方:坐标值全都是归一化后的相对值。也就是说,x坐标是目标的中心点在整张图中的横向位置比例,取值范围0~1,宽高同理是目标占整张图的比例。

举个具体例子:一张640x640的图片里,有一个bbox框左上角坐标是(160, 320),右下角坐标是(320, 480)。那么目标的左上角x=160,左上角y=320,宽度=160,高度=160,中心点x=(160+320)/2=240,中心点y=(320+480)/2=400。归一化之后,中心点x=240/640=0.375,中心点y=400/640=0.625,宽高都是160/640=0.25。所以标签内容是1 0.375 0.625 0.25 0.25,其中开头的1是类别ID。

我第一次手动改标签的时候就吃过亏,以为坐标是像素值直接除以640就行,结果类别ID从0开始没对应上,训练出来的模型类名全乱了。所以每次做完数据集,都建议写个脚本随机抽几张图,把标注框重新绘制到图上检查一遍,这一步能拦下大部分低级错误。

3.3 边界框绘制技巧和团队协作规范

标注时最重要的原则是:边界框要紧贴目标主体,不要留大量空白,也不要切掉目标关键特征。以检测人为例,框应该刚好包含人的头部、躯干和腿,手伸出去时可以适当被截断,但框的主体不能丢失。对于车辆检测,边界框应该包含车身的完整轮廓,后视镜、保险杠这些边缘细节都要包含在框内。

对于密集目标场景,比如检测货架上的商品或者人群中的脸,标注的策略是宁可多框也不要漏框。一个目标实在看不清边界时,可以按可识别范围来框,不要因为目标太小而放弃标注。YOLOv5对小目标本身就不够友好,如果标注阶段再漏掉一批小目标,模型对小目标的召回率会进一步恶化。

多人协作标注时,我强烈建议分批完成。先由一个人标注30张,把标注结果截图发到群里让所有人参照统一标准,再全量铺开。标注完成后,还要有一个质检环节:随机抽取20%的标注结果,检查边界框是否贴合、是否有错漏。这一步容易被省略,但对最终模型效果影响极大。

4. 数据集目录结构与配置文件参数深度解析

4.1 标准目录结构参考

YOLOv5对数据集的目录结构要求很明确,直接按下面这个模板整理即可:

dataset/ ├── images/ │ ├── train/ │ │ ├── example_001.jpg │ │ ├── example_002.jpg │ │ └── ... │ └── val/ │ ├── example_101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── example_001.txt │ │ ├── example_002.txt │ │ └── ... │ └── val/ │ ├── example_101.txt │ └── ... ├── train.txt ├── val.txt └── dataset.yaml

图片和标签文件的基名必须一一对应,图片在images/train,同名标签就必须在labels/traintrain.txtval.txt里存的是每张训练图片的绝对路径或相对路径,YOLOv5会通过这些文件来索引图片。如果目录结构不对,训练时最常见的报错是找不到图片或者labels文件为空,这两个问题我后面在常见问题部分会详细讲排查方法。

4.2 dataset.yaml配置逐项精讲

dataset.yaml是整个数据集配置的核心,内容非常简单但容易出错:

path: /home/user/dataset # 数据集根目录绝对路径 train: images/train # 训练图片相对路径 val: images/val # 验证图片相对路径 nc: 2 # 类别数量 names: ['helmet', 'person'] # 类别名称列表

这里有几个细节要特别提醒。path可以用绝对路径,也可以留空然后让train和val写成相对路径,但务必注意YOLOv5读取路径的拼接逻辑:如果你在根目录/home/user/yolov5下执行训练命令,path设置的路径最终会与train字段拼接成完整路径。我遇到过有人在训练时把这个配置从服务器迁移到本地,path路径没改,报错找不到图片。另外nc必须是数字,names列表的长度必须等于nc的值,顺序要保持和标注时的类别ID一致。

提示:在训练脚本里,--data参数指定你编写的yaml文件路径。如果训练时遇到AssertionError: train: No labels in ...,就是路径拼接或目录结构出了问题。检查时优先跑一遍后面的路径与标签验证脚本,比瞎猜高效得多。

4.3 数据划分策略与脚本实操

训练集、验证集、测试集的划分比例一般用80%、10%、10%或者90%、10%。对于数据集制作入门阶段,我最推荐的做法是把80%作为训练集、10%作为验证集、10%作为测试集。但YOLOv5的官方用于验证的只有trainval两个目录,测试集等模型训完之后最后一并评估效果。下面这个Python脚本可以在划分时自动同步移动图片和标签文件:

import os import random import shutil random.seed(42) source_images = '/path/to/all_images' source_labels = '/path/to/all_labels' dest_train_img = '/path/to/dataset/images/train' dest_val_img = '/path/to/dataset/images/val' dest_train_label = '/path/to/dataset/labels/train' dest_val_label = '/path/to/dataset/labels/val' # 收集所有图片名(不含扩展名) img_list = [f for f in os.listdir(source_images) if f.endswith('.jpg')] random.shuffle(img_list) # 按比例划分 split = int(len(img_list) * 0.8) train_files = img_list[:split] val_files = img_list[split:] def move_file_group(file_list, dest_img_dir, dest_label_dir): for fname in file_list: base = os.path.splitext(fname)[0] src_img = os.path.join(source_images, fname) src_lbl = os.path.join(source_labels, base + '.txt') if os.path.exists(src_lbl): shutil.move(src_img, os.path.join(dest_img_dir, fname)) shutil.move(src_lbl, os.path.join(dest_label_dir, base + '.txt')) else: print(f'Warning: {base}.txt not found') move_file_group(train_files, dest_train_img, dest_train_label) move_file_group(val_files, dest_val_img, dest_val_label) print(f'Done. Train: {len(train_files)}, Val: {len(val_files)}')

运行前记得把路径替换成你自己的目录。这个脚本有一个健全性检查——如果出现图片没有对应的标签文件,会打印警告,帮助及时发现问题。

5. 数据增强与训练参数:尽量榨干小数据集的价值

5.1 YOLOv5内置增强策略解读

YOLOv5在训练时会在线做数据增强,也就是说你的原始图片会被实时随机变换后再喂给模型。这些增强策略配置在模型目录下的hyp.scratch.yaml文件中,默认已经打开了一系列非常有用的手段。

Mosaic增强是其中比较核心的一个,它会把4张图片随机拼接成一张图。这张拼接图的尺寸是原图的两倍,最终再随机裁剪回640x640。好处是把不同图片的场景和目标混合在一起,模型被迫学习更丰富的上下文信息,同时由于图片数量变多,相当于训练集被扩展了。对于小数据集来说,Mosaic的效果立竿见影。Copy-paste增强会从一张图中随机剪切目标粘贴到另一张图上,增加了目标与背景的组合多样性。随机仿射变换包括旋转(degrees)、平移(translate)、缩放(scale)、错切(shear)、透视变换(perspective),这些都能让模型适应目标的不同形变。HSV颜色变换则在色调、饱和度、亮度维度上做随机扰动,增强模型对光照变化的鲁棒性。

5.2 什么时候需要额外做离线增强

在线增强虽然强大,但有一些特殊情况需要额外做离线数据处理。比如类别极度不均衡时——某个类别样本极少,只靠在线增强对单个样本的变换,提升有限,此时可以先把该类别图片复制、旋转、翻转、调整亮度、加噪声后生成一批离线增强样本,再混入训练集。

另一种情况是场景语义差异过大。比如要检测出土文物,训练集里大多是博物馆灯光下拍摄的实物图,实际部署却可能是户外黄土背景下拍的照片。这种情况下,仅靠在线增强解决不了本质问题,建议收集一批目标场景的背景图,使用图像合成的方式生成更多训练样本。这已经属于数据合成领域了,原理仍然是基于真实物体的粘贴合成。

注意:YOLOv5默认开启了Mosaic增强,这会在训练开始时将每个batch的图片拼接成4合1的大图,如果你的设备显存较小,可以考虑将mosaic参数设置为一个低于1的概率值或直接关闭,来减少显存占用。

6. 常见问题与排查技巧实录

6.1 训练时报错“Can't find labels”或“No labels”

这个报错几乎是所有第一次训练自制数据集的人都会遇到的。排查路径按优先级应该这样做:先确认labels目录是否存在,并且和images目录的类别对应;再检查标签文件名是否与图片名完全一致,包括大小写和后缀;最后检查标签文件内容是否为空,有些标注工具保存的时候容易生成空txt文件。

一个快速校验方法是在项目目录下运行Python脚本,遍历所有标签文件打印内容,看是否包含规范的五个数字。如果出现0行文件,说明标注环节出了问题,需要回到标注阶段重新处理。

6.2 验证集mAP很高但实际图片检测效果差

这种情况很可能是数据集划分有问题。最常见的错误是同一个目标的连续帧图片同时出现在了训练集和验证集中,导致模型在验证集上看起来精度很高,但真实场景表现一般。规避办法是划分数据时按场景、视频序列或拍摄时间分组,确保同一个目标的相近图片不会被随机分到两个集合中,例如可以用十连抽的视频帧做一次整体归属于训练集还是验证集的判断。

还有一个容易被忽视的原因是标注框不一致。比如同一对象在训练集中被标注得过宽,在验证集中则框得较紧,这也会导致mAP异常。

6.3 训练loss不降或数值怪异

如果是loss直接发散或者训练初期loss就是nan,优先检查学习率和batch_size。对于小数据集,推荐初始学习率0.01,batch_size尽量设为16或8,如果显卡显存有限,适当下调batch_size,并配合调低Mosaic合一图的比例来降低显存压力。如果loss在300轮迭代之后还在0.1以上震荡,大概率是数据集本身有问题——例如标签坐标归一化时算错,或者类别ID与类别名称对应错位。

6.4 检测时类别标签错乱

这个问题的根源往往是标注类别ID顺序与dataset.yaml里的names列表顺序不一致。比如标注软件里第一类就是ID为0的类别,但在yaml中names数组的第一个元素却写成了另一类别名,那么模型预测出来的类别自然就乱了。解决办法是在开始标注前就确定好names顺序,后续不要再改动,如果确实要改,必须重新生成标签。

常见报错可能原因排查思路
Can't find labels目录结构错误或文件命名不匹配检查images/labels文件前缀是否完全一致
No labels in train标签文件为空或标注未保存成功用脚本统计每个txt的行数
loss=nan学习率过大、显存不足或标签数值异常缩小lr、降低batch_size、检查标签范围
验证集mAP虚高数据划分不严谨按场景/时段划分而非随机采样
类别错乱names顺序与标签ID不匹配统一类别定义后重新标注或重编码

最后分享一点我的个人体会

数据集制作这件事,真的就是那句话:有多少标注功夫,就有多少模型效果。你可以在网络结构和训练技巧上做很多优化,但最后都会回归到数据质量这个根本上。我一开始做数据集的时候也走过不少弯路,比如花了整整一个周末去搜集整理图片,结果因为标注规范不统一,训练出来的模型基本上只能把自己“记住”的几个样本检测出来,换个场景立刻失灵。

后来我把标注质检也看成一个必做流程,每个数据集交付前都要随机抽查一批图片的标注框是否正确。虽然看似多花了一些时间,但节省下来的调试时间远远更多。如果你也是第一次做自己的数据集,建议留足耐心,从一个小而精的样本集开始,先把完整流程跑通,再考虑扩大数据规模。记住,一次高质量的小数据集带来的收益,远远大于胡乱拼凑的大数据集。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 5:45:10

登录注册全链路拆解:从表单校验到JWT安全加固

登录注册这功能,乍一看无非就是两个表单配两个接口,但真要在生产环境里把它做扎实,中间藏的细节能写满好几页。我做全栈开发这几年,见过太多项目在账号体系上翻车,有些是上线第一天就被脚本刷注册,有些是用…

作者头像 李华
网站建设 2026/9/18 5:44:53

AI小说创作系统:动态技能组合与进化引擎实践

1. 项目概述:当小说创作遇上AI进化力去年帮朋友调试小说生成脚本时,我发现一个有趣现象:大多数AI写作工具在生成3-5个章节后就会陷入重复套路。这促使我尝试用Agent技术构建一个真正具备进化能力的创作系统——它不仅能写故事,还能…

作者头像 李华
网站建设 2026/9/18 5:41:21

Security-101 应用安全核心概念(AppSec Key Concepts)深度指南

Security-101 应用安全核心概念(AppSec Key Concepts)深度指南 【免费下载链接】Security-101 8 Lessons, Kick-start Your Cybersecurity Learning. 项目地址: https://gitcode.com/GitHub_Trending/se/Security-101 应用安全(AppSec…

作者头像 李华
网站建设 2026/9/18 5:39:53

React Native鸿蒙深度链接适配与优化实战

1. React Native鸿蒙深度链接适配实战:从原理到推送跳转优化作为一名在React Native跨平台开发领域深耕多年的开发者,我深刻理解在OpenHarmony平台上实现深度链接(Deep Linking)的痛点。不同于Android和iOS相对成熟的生态&#xf…

作者头像 李华
网站建设 2026/9/18 5:36:41

知漫剧实测:AI漫画动态化生成短剧全流程解析与效率对比

1. 认识知漫剧:把“漫画图”变成“剧”的AI生产线1.1 知漫剧到底是什么先解释清楚一件事:知漫剧不是传统意义上的视频剪辑软件,也不是单纯的角色扮演聊天工具。它本质上是把“静态漫画/图片变成动态短剧”的AI生产管线,核心链路是…

作者头像 李华