简介这是一份面向疲劳驾驶检测与红外图像目标识别任务的YOLO系列算法数据集适合从事智能驾驶、行为识别方向的研究生、算法工程师及课程设计者使用可直接用于模型训练与验证测试。压缩包共2000个文件约62.46MB其中1400个xml文件为VOC格式标注600个txt文件为YOLO格式标注两种标签一一对应方便按需转换与复用。数据集已按训练与验证划分完毕并附带data.yaml配置文件兼容yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流版本省去自行整理与划分的繁琐流程。YOLO标注采用类别索引与归一化中心点、宽高比例符合标准训练输入要求。目前已有128人学习下载读者可快速搭建红外场景下的疲劳驾驶检测基线用于算法对比、消融实验或二次标注扩展缩短从数据准备到模型跑通的周期。1. 红外疲劳驾驶数据集拆包2000 张带标签图像能直接喂给 YOLO 吗拿到一个标注好的数据集第一反应往往不是「太好了」而是「这标签到底能不能用」。这份红外图像疲劳驾驶数据集2000 张图像配双格式标签yolo 格式的 txt 和 voc 格式的 xml 各存一份外加一个 data.yaml理论上覆盖 yolov5 到 yolo11 全系列。红外图像在疲劳驾驶场景里的价值很直接夜间、逆光、戴墨镜这些可见光容易翻车的工况红外靠热辐射成像人脸轮廓和眼部区域反而更稳。但「能直接训练」和「训练出能用的模型」之间隔着标签校验、类别映射、划分一致性这几道坎。这篇笔记按拆包、校验、配置、训练、排错的顺序走一遍适合手里已经拿到这份资源、准备跑第一轮 baseline 的人。2. 双格式标签与 data.yaml先搞清楚手里到底有什么2.1 两种标签格式的坐标逻辑差异这份数据集同时给了 yolo txt 和 voc xml很多人以为随便挑一个用就行其实两者的坐标语义完全不同混用会直接导致框全飘。yolo 格式是归一化的中心点加宽高五个字段class x_center y_center width height后四个都是 0 到 1 的比例值相对的是图像自身的宽高。voc 格式是绝对像素坐标xmin ymin xmax ymax左上角加右下角而且类别写在name标签里而不是数字索引。这意味着两件事。第一如果你用 yolo 系列训练直接用 txt 文件夹别去碰 xml省得自己写转换还引入误差。第二如果你要做可视化检查或者喂给某些只吃 voc 的评估脚本才需要 xml这时候得注意 xml 里的类别名要和 data.yaml 里的 names 顺序严格对应否则类别索引会错位。我一般会先抽 5 张图把 txt 的归一化坐标乘回图像宽高和 xml 的像素坐标对一遍误差在 1 到 2 像素内才算标签一致。2.2 data.yaml 里真正要改的三个字段data.yaml 是 yolo 系列的入口配置但直接拿来用经常报路径错。典型结构长这样path: ./dataset train: images/train val: images/val nc: 2 names: [normal, fatigue]path是数据集根目录train和val是相对 path 的图像目录。这里最常见的坑是很多人只改了 path没注意 train/val 下面应该直接是图像文件而对应的 labels 目录要和 images 同级、同名替换。yolo 的默认约定是images/train/xxx.jpg对应labels/train/xxx.txt文件名主干必须一致。如果你的目录结构是train/images和train/labels那 train 字段要写成train/images同时确认 ultralytics 能自动推导出 labels 路径推不出来就得手动调。nc和names必须和标签里的类别索引对齐。这份数据集是疲劳驾驶二分类场景常见是 normal 和 fatigue 两类索引 0 和 1。如果你发现 txt 里出现了 class 2要么是标注时多标了要么是 names 顺序错了训练前必须查清楚否则模型学出来的类别是乱的。2.3 划分一致性校验别让同一张图同时出现在 train 和 val数据集号称已经划分好但「划分好」不等于「划分对」。红外图像如果是连续帧截取的相邻帧高度相似随机划分很容易让训练集和验证集出现近乎重复的样本验证指标虚高实际部署一塌糊涂。我一般会做两件事一是统计 train 和 val 的文件名主干有没有交集二是看 val 的指标是不是高得离谱比如 mAP 一上来就 0.95 以上那基本就是泄漏了。import os def check_split(root): train_imgs set(os.path.splitext(f)[0] for f in os.listdir(f{root}/images/train)) val_imgs set(os.path.splitext(f)[0] for f in os.listdir(f{root}/images/val)) overlap train_imgs val_imgs print(ftrain: {len(train_imgs)}, val: {len(val_imgs)}, overlap: {len(overlap)}) if overlap: print(重叠样本示例:, list(overlap)[:5]) check_split(./dataset)这段脚本按文件名主干求交集overlap 不为 0 就说明划分有问题。解决方式是按采集批次或时间戳重新划分而不是按文件名随机切。红外疲劳驾驶数据如果来自不同驾驶员或不同时段最好保证同一批次的图像只进一个集合。3. 从零跑通 YOLOv8 训练配置、命令与参数含义3.1 环境与依赖的版本对齐yolo 系列迭代快ultralytics 包版本和 torch 版本不匹配是翻车重灾区。我一般锁定一套能跑通的组合Python 3.10、torch 2.1 以上、ultralytics 8.1 以上。装的时候先装 torch 再装 ultralytics避免它自动拉一个不兼容的 torch。pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 pip install ultralytics yolo checksyolo checks会打印环境自检结果重点看 CUDA 是否可用、ultralytics 版本、以及有没有报依赖冲突。如果 CUDA 不可用训练会退回 CPU2000 张图跑一轮可能要几小时先确认显卡驱动和 torch 的 CUDA 版本对得上。V100 这类卡跑 yolov8n 很轻松但如果你用的是 yolov8x显存要留够batch 得往下调。3.2 训练命令与关键参数假设 data.yaml 已经改好目录结构是标准的 images/labels 布局训练命令可以这样写yolo detect train \ data./dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ workers4 \ projectruns/fatigue \ nameexp1modelyolov8n.pt是预训练权重红外图像和可见光分布差异大但预训练权重仍然能加速收敛不建议从零初始化。imgsz640是输入分辨率红外图像如果原始尺寸小放大到 640 可能糊可以先看图像实际尺寸再定。batch16在 8G 显存上跑 yolov8n 比较稳报显存不足就降到 8。workers是数据加载线程Windows 上设太高容易卡死4 到 8 之间试。训练启动后重点看第一轮的 loss 曲线。如果 box_loss 一直不降大概率是标签路径没对上或者坐标格式错了如果 cls_loss 异常高检查类别索引和 names 是否一致。3.3 验证与推理确认模型真的学到了东西训练完先跑验证再跑单张推理看可视化结果。yolo detect val modelruns/fatigue/exp1/weights/best.pt data./dataset/data.yaml yolo detect predict modelruns/fatigue/exp1/weights/best.pt source./dataset/images/val saveTrue验证输出的混淆矩阵能看出类别是否被混淆。疲劳驾驶二分类里如果 normal 和 fatigue 大量互错可能是两类的外观差异在红外下不够明显或者标注边界不一致。推理结果默认存在runs/detect/predict打开几张图看框的位置和置信度置信度普遍偏低0.3 以下说明模型还没学稳可以加 epoch 或者检查标签质量。4. 红外图像训练的避坑与排查五条血泪经验4.1 现象训练 loss 正常但 mAP 一直是 0原因通常是验证集的标签路径没被正确读取ultralytics 找不到 val 的 labels就把所有预测都当误检。解决方式是手动确认labels/val目录存在且文件名和images/val一一对应再检查 data.yaml 里 val 字段指向的是图像目录而不是 labels 目录。4.2 现象报 “No labels found” 但目录里明明有 txt多数是缓存问题。ultralytics 第一次扫描后会生成labels.cache如果中途改了标签或换了路径缓存没刷新就会一直报旧结果。删掉数据集目录下所有.cache文件再重跑通常就好了。4.3 现象训练中途 BN 层崩溃或 loss 变 NaN红外图像如果存在大量纯黑或纯白区域归一化后方差接近 0BN 层容易数值不稳。解决方式是调小学习率比如从 0.01 降到 0.001或者把 batch 调大让统计量更稳。另外检查图像里有没有损坏文件用脚本扫一遍尺寸为 0 的图。4.4 现象验证指标很高但实际推理框全错这是典型的训练验证泄漏。同一批连续帧被分到了 train 和 val模型记住了背景而不是目标。按采集批次重新划分确保 val 里的场景在 train 里没出现过。红外疲劳驾驶数据尤其要注意这点因为同一驾驶员同一时段的图像差异极小。4.5 现象xml 和 txt 标签对不上转换后框偏移voc 转 yolo 时归一化要用图像自身的宽高而不是数据集的平均尺寸。如果转换脚本里写死了宽高框就会整体偏移。正确做法是逐图读取尺寸再归一化import xml.etree.ElementTree as ET from PIL import Image def voc_to_yolo(xml_path, img_path, class_map): img_w, img_h Image.open(img_path).size tree ET.parse(xml_path) lines [] for obj in tree.findall(object): cls class_map[obj.find(name).text] bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) xc (xmin xmax) / 2 / img_w yc (ymin ymax) / 2 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}) return linesclass_map把类别名映射成索引必须和 data.yaml 的 names 顺序一致。归一化保留 6 位小数足够yolo 读取时不会因为精度丢框。5. 跨版本迁移与标签质量抽检让这份数据集多跑几个模型5.1 yolov5 到 yolo11 的配置差异这份数据集号称通吃 yolov5 到 yolo11实际迁移时主要改两处。yolov5 的 data.yaml 字段名和 ultralytics 略有不同yolov5 用train:和val:直接写路径不需要path字段而 yolov8 以后推荐用path加相对路径。另外 yolov5 的权重格式是.pt但加载方式要用它自己的train.py不能直接套 ultralytics 的命令。yolov9、yolov10、yolo11 基本沿用 ultralytics 接口data.yaml 可以直接复用模型权重换成对应的yolov9c.pt、yolov10n.pt、yolo11n.pt即可。版本配置文件字段训练入口权重示例yolov5train/val/nc/namestrain.pyyolov5s.ptyolov8path/train/val/nc/namesyolo detect trainyolov8n.ptyolov9同 yolov8yolo detect trainyolov9c.ptyolo11同 yolov8yolo detect trainyolo11n.pt迁移时最容易忽略的是输入分辨率。yolov5 默认 640yolo11 也支持 640但如果你在 yolov5 上用了rectTrue做矩形推理换到 ultralytics 后这个参数名变了得查对应版本的文档。我一般迁移后先跑 10 个 epoch 看 loss 是否正常下降再决定要不要跑满。5.2 标签质量抽检脚本2000 张图不可能全看但可以按置信度或框面积抽检。下面这段脚本统计每张图的框数量和框面积占比异常值挑出来人工看。import os import numpy as np def audit_labels(label_dir): stats [] for f in os.listdir(label_dir): if not f.endswith(.txt): continue path os.path.join(label_dir, f) boxes np.loadtxt(path, ndmin2) if boxes.size 0: stats.append((f, 0, 0)) continue areas boxes[:, 3] * boxes[:, 4] stats.append((f, len(boxes), areas.mean())) # 框数量异常多或面积异常大的挑出来 suspicious [s for s in stats if s[1] 10 or s[2] 0.8] for s in suspicious[:20]: print(s) audit_labels(./dataset/labels/train)框数量超过 10 个或者单框面积占比超过 0.8大概率是标注错误或者把整张图框成了目标。红外疲劳驾驶场景里人脸区域通常占图像的三分之一以内超过这个比例就要人工复核。我一般抽检完会把可疑样本单独移到一个review文件夹确认没问题再放回去。5.3 一个具体技巧用预训练模型先做一轮伪标注对比如果你不确定标签质量可以拿 yolov8n 的 COCO 预训练权重先对这批红外图跑一轮推理虽然 COCO 没有人脸疲劳类别但能检测到人这个大类。把预训练检测到的人框和你的标签框做 IoU 对比IoU 普遍低于 0.3 的图要么是标签偏了要么是红外图像里人太暗预训练模型没检出来。这个方法不能替代人工但能快速定位一批可疑样本。从那以后我每次拿到新数据集都强制走一遍「划分校验 → 标签抽检 → 小轮训练看 loss」这三步不再直接上大 epoch。这份红外疲劳驾驶数据集的双格式标签和 data.yaml 省了不少转换功夫但标签质量和划分一致性还是得自己过一遍才放心。希望帮到你。本文还有配套的精品资源点击获取