ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLO疲劳驾驶目标检测数据集:三种标签格式与划分脚本,拿来就能训

YOLO疲劳驾驶目标检测数据集:三种标签格式与划分脚本,拿来就能训 简介在计算机视觉工程中目标检测模型的训练效果不仅取决于网络结构更依赖于高质量的数据集与规范的标签格式。YOLO作为主流实时检测框架其数据组织方式直接影响训练流程的复杂度。本文从目标检测数据集的通用概念出发解析VOC、COCO、YOLO三种标注格式的结构差异与转换要点结合疲劳驾驶场景下的真实样本介绍如何通过划分脚本快速拆分训练/验证/测试集并给出Linux与Windows双环境下基于ultralytics的完整训练方案。同时覆盖坐标归一化、类别映射、随机种子、预训练权重加载等关键细节帮助算法工程师与入门者避开常见陷阱高效跑通从数据准备到模型部署的完整链路自然收敛到YOLO疲劳驾驶数据集的工程实践。1. YOLO疲劳驾驶目标检测数据集三格式标签与划分脚本拿过来就能训练做目标检测的人最烦的不是模型跑不起来而是手里的数据没法直接用。YOLO疲劳驾驶目标检测数据集是我拆过的包里最省事的一类1000张真实驾驶场景图片标注框质量高VOCxml、COCOjson、YOLOtxt三种格式直接分好了还带三个划分脚本和Linux/Windows双环境训练教程。它解决的是从“有图”到“能开训”之间的衔接问题——不用自己写转换器不用手动分训练集适合想快速验证检测流程的入门者也适合需要疲劳驾驶数据做预研的算法工程师。如果你正卡在“收集一堆图片但不知道标签怎么对齐”这一步这份资源能直接带你跑通第一轮训练。下载下来之后把路径改成本机的目录紧接着就能开始跑划分和训练。2. 认识数据集三种标注格式的内部结构与选择边界2.1 疲劳驾驶场景里1000张图意味着什么疲劳驾驶检测属于小目标、强遮挡、光照变化大的场景。1000张图乍看不算多但数据集的价值不在数量而在负样本覆盖和标注一致性。真实驾驶场景里司机头部姿态变化、墨镜遮挡、夜间红外补光、车窗反光这些都会让模型在部署时产生误检。这个包里的图片选取了不同光线和角度的疲劳状态打哈欠、闭眼、低头都有覆盖直接用LabelImg标注标注框贴边紧没有大面积空白框。对于YOLO系列目标检测器来说1000张图足够跑通完整流程先验证模型选型和训练管线后续再按需补数据。另外资源包把这些图片对应的标签分成了voc、coco、yolo三个目录而不是让用户自己转格式。这一点很实用因为不同训练框架的入口数据格式不兼容ultralytics的YOLOv8/YOLO11读txt老一些的Faster R-CNN读VOC的xmlCOCO格式则便于做评估和与detectron2等工具对接。我第一次拿到同类数据时光是写xml转txt的脚本就折腾了一天还因为坐标归一化没做对训练出来的框全偏到图像右上角。所以这套数据集把这一步省掉新人能更快看到模型效果。2.2 VOC、COCO、YOLO三种标签格式逐项拆解三种格式的本质差异是坐标表示方式和文件组织方式。VOC格式是一个图片对应一个xml标签块以object为单位框坐标是绝对像素的xmin、ymin、xmax、ymaxCOCO格式是一个大json保存所有图片和标注通过image_id关联目标框用[x, y, width, height]表示同样是绝对像素坐标YOLO格式则是每张图片一个txt每行一个目标包含类别编号和归一化后的中心点x、中心点y、框宽、框高所有值都在0到1之间。下表把三者的核心差异列在一起方便训练前核对。格式扩展名核心组成坐标方式典型读取方式VOC.xmlannotation/object/name、bndboxxmin/ymin/xmax/ymax 绝对像素ElementTree解析xmlCOCO.jsonimages、annotations、categories[x, y, w, h] 绝对像素pycocotoolsYOLO.txtclass, x_center, y_center, w, h归一化到0~1open直接读文本三种格式拿到的第一步最好都能打开抽一眼。VOC的xml长这样annotation filenameimg_0001.jpg/filename object namedrowsy/name bndbox xmin120/xmin ymin80/ymin xmax260/xmax ymax210/ymax /bndbox /object /annotationCOCO的json里对应的一条annotation是这个样子{id: 1, image_id: 1, category_id: 1, bbox: [120, 80, 140, 130], area: 18200}YOLO的txt则只有一行0 0.198 0.423 0.214 0.355这里要特别留意COCO的categories。用LabelImg标注后如果导出成COCO很多工具的默认行为是把背景也算作一个类别导致类别编号从1开始而不是从0开始。而YOLO的txt要求类别编号从0开始。如果这两个编号对不齐模型训练时会出现“标签错位”检测头学到的类别和实际标注完全错开轻则mAP很低重则loss不收敛。因此我建议在开训前先分别打开一个json和一个txt人工核对第一行的类别编号是不是同一个语义。这个包里三种格式存放在不同文件夹下每张图片对应的xml、json、txt都能一一对上省去了常见的“找图对标签”环节。如果你后续要新增自己的图片最稳妥的方式是统一用YOLO的txt格式维护一套“原始标签”需要时再通过脚本转成VOC/COCO避免三处改动不同步。2.3 训练前先核对标签框归一化与类别映射拿到数据后别急着开训。我会先跑一段Python脚本统计train目录下yolo标签的类别分布确认类别数量、图片尺寸和归一化坐标是否越界。下面这段是常用的检查逻辑import os label_dir labels/train cls_counter {} invalid 0 for fn in os.listdir(label_dir): if not fn.endswith(.txt): continue with open(os.path.join(label_dir, fn)) as f: for line in f: parts line.strip().split() if len(parts) ! 5: invalid 1 continue cls int(parts[0]) xc, yc, w, h map(float, parts[1:]) if cls not in cls_counter: cls_counter[cls] 0 cls_counter[cls] 1 if xc 0 or xc 1 or yc 0 or yc 1 or w 0 or h 1: invalid 1 print(类别分布:, cls_counter) print(非法行数:, invalid)逻辑说明这个脚本只读yolo标签按行解析类别和归一化坐标非法行包括字段数不足5个、类别编号异常、坐标超出0到1范围。参数上label_dir指向你实际的标签路径如果图片本身是1920×1080但某些标注框坐标转归一化时除错了分母w会大于1训练时会报dataset错误。常见做法是把这个脚本放到资源包根目录改一下label_dir路径直接跑统计结果里类别分布如果只有0说明数据只有“疲劳”一个类别此时yaml文件里的nc1names[drowsy]即可如果还有“正常”类类别编号要按txt里的顺序写。这里想提醒一句不要盲信已有的yaml文件。YOLO训练框架会读取你指定的data.yaml里面的names列表顺序必须和txt里class编号完全一致。换句话要是有两个类别但names把0、1写反了模型依然能训但验证阶段的分类报告会全部错乱。这也是我“拿到任何数据集先跑统计脚本”这个习惯的由来。如果不想走转换流程也可以在LabelImg里直接切换输出格式。LabelImg界面左侧有一个“PascalVOC”按钮点击后会变成“YOLO”模式此时再保存就是txtCOCO格式则需要借助labelme2coco这类工具批量转换。不过已经有三份现成标签的话没必要再重新标一遍。2.4 资源包内的“非代码”文件四个HTML教程为什么值得看这个包里除了数据集还有几个HTML教程包含YOLO环境搭建Linux/Windows两个版本、YOLO训练教程根据案例修改训练自己的数据集、Ubuntu安装教程。很多下载者只看中图片和标签忽略这些文档其实它们是针对YOLO系列目标检测新手写的比网上零散笔记要连贯。Linux版教程从装Ubuntu开始讲一直讲到用conda建环境、装依赖Windows版教程会专门讲路径分隔符和CUDA版本不匹配的问题。训练教程里给了如何把默认的coco训练改成自己的单类别数据明确哪些文件要改data.yaml里的nc、names以及训练命令里的model和data。对于0基础的人来说照着HTML里的命令一步步粘贴比反复查博客要省不少时间。HTML教程里还有几个容易被忽略的细节一是它对虚拟环境的推荐作者建议用Python 3.8以上版本但我实测3.10兼容性更好二是它提醒Windows用户不要用中文路径这一点在后续踩坑章节也会讲到三是它提到如果pip install ultralytics很慢可以用国内镜像源。把这些文档当说明书看能少走很多弯路。3. 划分脚本实操把数据集拆成训练/验证/测试集并生成ImageSets3.1 三个脚本分别解决什么资源包里放了三个划分脚本命名很直接一个同时生成训练集、验证集、测试集一个只生成训练集和验证集另一个把图片和标签路径生成成VOC风格的ImageSets/Main/trainval.txt。三个脚本的设计角度不一样用哪个取决于你的实验目标。只做训练和验证推荐“训练集、验证集划分脚本”因为它会把全部图片按比例拆成两份通常7:3或8:2训练循环中不再有单独保留的测试集如果想把一部分数据留到最终评估用“训练集、验证集、测试集划分脚本”常见比例8:1:1如果你接的是老的目标检测代码期望从ImageSets/Main下读取train.txt、val.txt来组织训练那需要第三个脚本生成这些txt文件而不是直接复制图片。这三个脚本内部逻辑很相似扫描指定目录下的所有jpg/png用随机数或者hash排序切分随后把图片和对应标签一起写入新文件夹同时生成一个train_list.txt记录划分结果。我一般会先打开脚本确认两个地方一是random.seed有没有固定二是图片目录和标签目录的路径是否写死成了绝对路径。如果脚本里写的是作者本机的路径你需要在运行前改成自己的目录。3.2 典型用法与输出目录以“训练集、验证集、测试集划分脚本”为例常见做法是在脚本顶部看到以下路径配置image_dir images label_dir labels output_dir split_output train_ratio 0.8 val_ratio 0.1 test_ratio 0.1 seed 42运行方式是python split_train_val_test.py脚本会先在output_dir下创建train、val、test三个子目录再分别创建images和labels两层结构。比如split_output/train/images/xxx.jpg和split_output/train/labels/xxx.txt一一对应。生成完毕后终端会打印每个子集的图片数量。参数说明train_ratio和val_ratio必须都是0到1之间的小数test_ratio用1 - train_ratio - val_ratio计算三者相加尽量等于1seed是随机种子固定后每次运行结果一致方便复现实验。建议把它设成42别不设否则每次跑出来的划分都不同后面想复现实验结果就很折腾。如果只想训练和验证不保留测试集把test_ratio改成0val_ratio设成0.1或0.2即可。但要注意脚本是按图片名找同名标签的如果你的图片扩展名不统一比如混着.jpg和.JPG脚本可能找不到标签造成划分出的train里有图无标签。我踩过这个坑后面在避坑章节会细讲。输出目录还有一个细节很多YOLO框架默认从datasets目录下读取数据因此可以把output_dir直接设为D:/datasets/drowsy然后在data.yaml里写成path: D:/datasets/drowsy。这样就不需要修改训练脚本的默认搜索路径。3.3 随机种子与类别均衡前面提到固定随机种子这不仅是可复现性的要求也是判断脚本是否靠谱的关键。有些脚本会直接用os.listdir的返回顺序配合random.shuffle做划分这看起来没问题但listdir顺序由文件系统决定不同环境下结果不一致且当目录里还有cache文件时会把无关文件也划分进去。更稳的写法是先过滤出图片后缀再用random.Random(seed).shuffle。类别均衡是另一个容易被忽略的点。1000张图里如果打哈欠样本明显少于闭眼样本随机划分出来的验证集可能只包含“闭眼”而完全不含“打哈欠”最终验证mAP波动很大。判断方法是先按类别分布统计每张图然后在划分前保证每个类别在train/val/test中的比例接近总体比例。一个简单做法是按图片的主类别分组在每个组内做划分再把各组结果合并。资源包里的脚本没有强制做分层抽样所以当你对结果不放心时我建议多跑几次不同seed观察验证集类别分布稳定后再开始训练。另外生成train_list.txt的那个脚本trainval.txt、train.txt、val.txt分别存放不带扩展名的图片名。老版VOC训练代码会拿这些文件名去指定目录找图找xml所以如果你用的是Faster R-CNN那套训练流程用第三个脚本比复制图片更好省磁盘空间也不会出现同一个数据在多个目录里留存多份的问题。3.4 ImageSets文本与train_list.txt的配合方式如果你拿到的是一个纯YOLO训练包通常只需要images/train和labels/train两个目录不需要ImageSets。但换到mmdetection或者老版YOLOv3时训练入口会要求提供两个文件列表。第三个脚本生成的文件长这样trainval img_0001 img_0002 img_0003 ...这些文件放在ImageSets/Main下面训练脚本会读取每个不带扩展名的文件名再拼上实际路径。此时注意图片和标签必须在同一目录命名否则训练过程会报“No labels found”或者漏读。如果想同时满足YOLO和VOC两套流程可以在划分完成后复制一份train.txt内容放到另一个项目目录避免后续实验互相干扰。4. 从零训练Linux与Windows双环境下的YOLO环境搭建与训练4.1 Linux环境搭建Ubuntuultralytics资源包里的Linux版环境搭建教程以Ubuntu为主。YOLO系列训练常用ultralytics这个Python包命令很统一。我自己的习惯是先装NVIDIA驱动和CUDA再用conda建虚拟环境避免依赖冲突。步骤大致如下conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple参数说明这里的-n yolo是虚拟环境名称python3.10是版本不要用3.7太老也不想用3.12太新部分PyTorch轮子对3.10支持最稳。-i指定清华镜像源国内服务器下载速度明显更快。装完可以用yolo detect predict sourcebus.jpg验证安装能输出一张带检测框的图则说明环境OK。如果你是纯小白最好先跑通默认的coco预训练模型再动自己的数据这能排除环境问题。Linux上遇到最多的是CUDA版本和PyTorch不匹配。nvidia-smi显示的驱动支持最高版本不等于PyTorch能用最高版本。稳妥做法是用conda install pytorch torchvision cudatoolkit11.x格式化安装或者直接安装ultralytics会自动拉适配版本但对于离线环境建议先建好基础环境再安装。这里有表格可以对照显存大小batch建议imgsz训练速度参考8G8640约0.6s/iter16G16640约0.4s/iter24G以上32640更快但收益变小这个表格只是参考实际速度还跟CPU、硬盘读写有关。4.2 Windows环境搭建与路径坑Windows版教程和Linux差别不大核心坑是路径分隔符。资源包里给的HTML教程专门提示过把C:\Users\...写成字符串时要加双反斜杠或者用正斜杠否则Python会把\U、\t当成转义字符数据集路径直接失效。我常用的做法是在脚本顶部统一用正斜杠data_yaml D:/yolo_dataset/data.yaml命令部分依然是pip install ultralytics yolo train dataD:/yolo_dataset/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16参数说明data指向yaml文件model可以是yolov8n.pt、yolo11n.pt这类预训练权重epochs训练轮数imgsz输入图片缩放尺寸batch是每批图片数。Windows上更常见的坑是路径带中文或空格ultralytics在读取某些数据时会出现奇怪报错所以项目目录尽量用英文。另外如果提示CUDA unavailable先检查nvidia-smi再在Python里跑torch.cuda.is_available()输出False就重装对应CUDA版本的PyTorch。Windows还有一个麻烦是杀毒软件会拦截一些权重下载文件或者读取数据时无响应。遇到这种情况把项目目录加入白名单或者用yolo train之前先运行一次yolo predict把网络连接和权限检查一遍。很多时候环境看起来“没报错”但训练特别慢就是数据在机械硬盘上顺序读得太慢可以先把数据集放到SSD上试试。4.3 修改yaml与训练参数跑通自己的数据集训练自己的疲劳驾驶数据集只需要把原coco数据集的data.yaml换掉。在资源包根目录新建一个drowsy.yaml内容大致如下path: D:/yolo_dataset train: images/train val: images/val test: images/test nc: 1 names: [drowsy]逻辑说明path是数据集根目录train、val、test分别是三个划分脚本生成的图片子目录相对于path的路径nc是类别数当前只有疲劳一个类别就写1names是类别名字列表顺序必须和YOLO标签里的类别编号一致。如果你的原始标签里还有“正常”类这里要写nc: 2和names: [normal, drowsy]编号0是正常1是疲劳。训练命令用yolo train dataD:/yolo_dataset/drowsy.yaml modelyolov8n.pt epochs150 imgsz640 batch32如果资源包自己不提供预训练权重别愁ultralytics会自动下载yolov8n.pt首轮会显示进度。训练完runs/detect/train目录下会生成best.pt、last.pt、results.png等文件。这里额外提醒第一次跑训练时数据集大概1000张没有必要一上来就用yolov8x这些大模型先用n也就是nano尺寸跑通流程再试大模型提升精度能省下不少时间。4.4 训练日志与权重输出怎么看很多新手盯着终端看其实终端只显示一部分指标完整信息全在runs/detect/train/下。results.png包含了训练集和验证集的box_loss、cls_loss、dfd_loss、precision、recall、mAP50、mAP50-95曲线。箱线图趋势判断遵循一个简单原则loss在前20轮快速下降后面缓慢下降最终收敛到平稳如果loss曲线出现突然抬升或者频繁震荡先怀疑学习率太大或者标签坐标出错。best.pt是按照验证集mAP50挑选的最优权重last.pt是最后一轮的权重。推荐用best.pt做后续推理和验证。如果要测试单张图片yolo predict modelruns/detect/train/weights/best.pt sourcedemo.jpg这会把画了框的结果保存到runs/detect/predict。如果图片里没检测出疲劳目标先别怀疑模型可以先用yolo val看验证集mAP判断是训练没收敛还是推理阈值太高。5. 避坑记录标签格式、划分脚本、训练发散这些坎我都踩过做目标检测数据集落地最容易翻车的不是算法而是数据流程。下面这五条是我在类似资源上踩过的坑每一条都按现象、原因、解决列清楚。5.1 标注框坐标越界导致训练loss出现nan现象训练进行到某个epoch后loss出现nan权重文件大小异常验证时什么目标都检测不到。原因YOLO标签txt里的归一化坐标必须位于0到1之间但原始标注如果有的框超出图像边界或转换公式用了错误的宽高分母就会出现大于1或小于0的坐标。YOLO数据加载器遇到越界框时有时不报错而是裁剪成负数区域导致梯度爆炸。解决开训前先运行2.3节那段统计脚本把所有越界值打印出来。对越界的框可以选择原样保留一部分训练但更稳的是直接删除该标签的越界行或者用人工检查图片边界重新标注。从那以后我每次切划数据后都会跑一遍坐标范围检查成本只有几秒钟但能省掉一整天的排查时间。5.2 coco的categories、image_id与yolo的class编号对不上现象直接拿coco格式json和yolo格式txt分别训练同一批数据前者mAP很高后者mAP接近0或者训练时val阶段类别名称全错。原因LabelImg导出的COCO json里categories经常从0或者从1开始而YOLO的txt固定要求从0开始。如果json转txt时没有重映射类别编号模型的类别维度和标签实际语义错位相当于把“疲劳”当成第0类“正常”当成第1类但数据集里只有第0类导致学习不到有效特征。解决用程序读取json的categories字段按id排序后重新赋予0、1、2……再转换成yolo txt。转换后随机抽三张图片同时打开同名json和txt逐行比对class编号和框坐标。这里也推荐“只维护一种标签其余临时生成”的方案避免三格式同时维护出现不一致。5.3 划分脚本重复了同一批图片现象train和val两个目录里出现相同文件名训练时验证集指标虚高部署时表现又变差。原因有些划分脚本不是按图片切分而是按“文件列表”切分但脚本把图片和标签各自listdir后再独立shuffle导致图片A与标签B配对。更常见的情况是划分脚本写死了train_ratio0.8却没有剔除已经属于test的那部分数据第二次运行时会把test也并进train。解决运行完划分脚本后立刻用Python对比三个子目录的文件名集合计算交集。交集不为空就看作划分失败。我一般用comm -12 (ls train/images | sort) (ls val/images | sort) | wc -l如果输出不为0说明脚本或路径有问题。这个检查应纳入流程不看结果别进下一步。5.4 训练时用错预训练权重模型从0开始现象训练曲线前20轮loss一路走高之后才慢慢下降最终精确度远不如预期。原因数据集本体只有1000张图随机初始化训练会非常吃力。很多人看到报错找不到yolov8n.pt就改用了modelyolov8n.yaml这等于从零开始训练没有预训练骨架导致收敛极慢。解决优先使用COCO预训练权重yolov8n.pt或yolo11n.pt如果离线环境没有该权重可以在ultralytics官网下载后放到项目目录再指定本地路径。训练时注意日志里会显示Pretrained weights loaded如果没有那行提示说明权重没正确加载。搞清楚这点后训练收敛速率会有质的提升。5.5 显存不足与batch size调试现象输入batch32直接报OOM进程被杀调小imgsz后又出现精度下降。原因YOLO默认输入尺寸是640batch size越大显存占用越高。1000张图的数据集很小如果Batch太大很容易超显存而Batch太小又会让BN层统计不稳定。疲劳驾驶图中框往往较小imgsz减小会让小目标更难被检测。解决先在nvidia-smi查看可用显存按经验公式估8G显存用batch8, imgsz64016G显存用batch16更大显存再往上加。如果显存不足优先缩小batch而不是imgsz。也可以开启梯度累积训练命令加accumulate4等效于把batch放大四倍但显存占用不变。这个参数在ultralytics训练中有效试过之后OOM明显减少。6. 进阶实践从指标验证到用YOLOv11重新训练资源包默认教程可能面向YOLOv5/v8但ultralytics框架的命令风格基本一致完全可以在这份数据集上跑YOLOv11。首先用最佳权重做验证yolo val datadrowsy.yaml modelruns/detect/train/weights/best.pt验证输出包括mAP50、mAP50-95、precision、recall以及每种类别的详细AP。如果只关心疲劳检测重点看mAP50是否过90mAP50-95是否过60如果只有80%左右先去检查数据质量再调超参数。接着尝试换模型和超参数。YOLOv11的命名在ultralytics下是yolo11n.pt大小和v8n接近但检测头做了优化对疲劳这类小框场景往往收敛更快。训练命令yolo train datadrowsy.yaml modelyolo11n.pt epochs200 imgsz640 batch16 patience30patience30表示验证指标连续30轮不提升就早停省时间。此外可以打开efficient head yolo、yolo损失函数相关文章来理解不同版本训练loss差异v8用的分类损失和v5不同收敛速度和类别不平衡表现也变了所以别把v5时代的超参数原样套在v11上。跑完验证后可以做一次推理体验yolo predict modelruns/detect/train/weights/best.pt sourcetest.mp4把疲劳驾驶视频喂进去观察连续帧里闭眼、打哈欠的检测稳定性。如果漏检多可以调低conf0.25到conf0.15但也要接受误检率上升。最后提醒一个流程习惯从那以后我每次拿到新的目标检测数据集都强制自己先跑一遍标签坐标检查、划分交集检查、权重预训练检查三个步骤再开始训练这套流程帮我避掉了大多数玄学问题。希望帮到你。本文还有配套的精品资源点击获取
返回列表