新闻详情

新闻详情

首页 / 资讯中心 / 详情

红外疲劳驾驶数据集实战:2000张带标签图像YOLO训练与避坑指南

发布时间:2026/9/28 13:49:56来源:尧图网络
红外疲劳驾驶数据集实战:2000张带标签图像YOLO训练与避坑指南
简介这是一份面向疲劳驾驶检测与红外图像目标识别任务的YOLO系列算法数据集适合从事智能驾驶、行为识别方向的研究生、算法工程师及竞赛选手使用。数据集共2000个文件包含1400个VOC格式xml标注与600个YOLO格式txt标注压缩包约62.46MB已按训练与验证需求划分完毕并附带data.yaml配置文件可直接接入yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流框架训练与测试。YOLO标注采用类别索引与归一化中心点、宽高比例的标准格式便于快速转换与迁移。资源同时提供两种标签体系方便读者在检测模型与数据格式转换之间灵活切换省去自行标注与清洗的时间成本。目前已有128人学习下载适合需要快速搭建红外疲劳驾驶检测基线、验证模型效果或进行课程实践的用户参考使用。1. 红外疲劳驾驶数据集拿到手2000张带标签的图先别急着喂给 YOLO红外图像做疲劳驾驶检测最反直觉的一点是白天可见光下效果拔群的模型到了夜间红外场景经常集体翻车。原因不复杂——红外成像靠的是热辐射差异人脸、眼睑、方向盘、座椅在热图上呈现的纹理和可见光完全不是一回事你拿 COCO 预训练权重直接 finetune模型学到的边缘和纹理先验基本用不上。这个标题里的「2000张图像带标签」数据集价值就在于它把红外域下的疲劳特征闭眼、打哈欠、低头、长时间注视用标注框固定了下来让你不用从零采集和标定。它适合三类人想快速跑通 YOLO 训练闭环的新手、需要红外域 baseline 做对比的实验者、以及要把疲劳检测落到车载或工地场景的工程团队。2000张不算大但足够验证一条完整的「数据检查 → 格式转换 → 训练 → 推理」链路前提是你得先把数据本身摸清楚而不是解压完直接yolo train。2. 红外疲劳数据集的结构拆解与 YOLO 格式对齐拿到一个带标签的图像数据集第一件事不是训练是搞清楚它的目录结构、标签格式和类别定义。红外疲劳驾驶数据集常见的组织方式是images/放图、labels/放同名 txt或者用一个大 CSV 记录文件名和框坐标。不同来源的标注格式差异很大有的是 VOC 的 XML有的是 COCO 的 JSON有的是已经转好的 YOLO txt。你得先判断手里这份属于哪种再决定要不要转换。2.1 先跑一遍数据体检脚本别信「带标签」三个字「带标签」只说明有标注文件不代表标注质量合格。我一般会先写一个体检脚本统计图像尺寸分布、标签文件缺失情况、类别分布和框的宽高比。红外图像有个特点分辨率往往不统一有的 640×512有的 384×288直接 resize 到 640×640 会引入形变影响闭眼这种小目标的检测。import os from pathlib import Path from collections import Counter from PIL import Image img_dir Path(images) lbl_dir Path(labels) sizes Counter() cls_counter Counter() missing_label [] empty_label [] bad_box [] for img_path in img_dir.glob(*.jpg): with Image.open(img_path) as im: sizes[im.size] 1 lbl_path lbl_dir / (img_path.stem .txt) if not lbl_path.exists(): missing_label.append(img_path.name) continue lines lbl_path.read_text().strip().splitlines() if not lines: empty_label.append(img_path.name) continue for line in lines: parts line.split() if len(parts) ! 5: bad_box.append((img_path.name, line)) continue c, x, y, w, h int(parts[0]), *map(float, parts[1:]) cls_counter[c] 1 if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): bad_box.append((img_path.name, line)) print(尺寸分布:, sizes.most_common()) print(类别分布:, cls_counter) print(缺标签:, len(missing_label), missing_label[:5]) print(空标签:, len(empty_label), empty_label[:5]) print(异常框:, len(bad_box), bad_box[:5])这段脚本做四件事统计图像尺寸、统计每个类别的框数量、找出没有对应标签文件的图、找出坐标越界或格式错误的框。参数上img_dir和lbl_dir按你实际解压后的路径改类别编号c从 0 开始如果你的数据集从 1 开始编号需要在转换时统一减 1。跑完之后重点看两个信号如果某个类别框数极少比如「打哈欠」只有几十个训练时这个类基本学不出来如果异常框数量超过总数的 1%说明标注质量有问题得考虑清洗。2.2 类别映射与 data.yaml 的写法YOLO 训练依赖一个data.yaml描述数据路径和类别名。红外疲劳驾驶数据集常见的类别是closed_eye、open_eye、yawn、head_down这几类但不同来源命名不统一有的用中文有的用拼音缩写。你需要建一张映射表把原始类别名统一成英文小写下划线风格因为 YOLO 的类别名会直接写进权重文件中文名在某些部署环境里会出乱码。# data.yaml path: /home/user/fatigue_ir train: images/train val: images/val nc: 4 names: 0: closed_eye 1: open_eye 2: yawn 3: head_downpath是数据集根目录train和val是相对路径。nc必须等于names的条目数多一个少一个都会在训练启动时报错。划分训练验证集时2000 张图我一般按 8:2 切但如果某个类别的样本特别少要做分层抽样保证验证集里每个类别都有出现否则验证指标会失真。红外图像还有一个坑同一个人连续多帧的图如果被随机切分训练集和验证集会高度相似验证指标虚高。正确做法是按「人」或按「采集片段」划分而不是按帧随机切。2.3 从 VOC/COCO 转到 YOLO txt 的转换脚本如果你拿到的标签是 XML 或 JSON需要转成 YOLO 的归一化格式。核心公式是x_center (xmin xmax) / 2 / widthy_center (ymin ymax) / 2 / heightw (xmax - xmin) / widthh (ymax - ymin) / height。下面是从 VOC XML 转换的脚本。import xml.etree.ElementTree as ET from pathlib import Path from PIL import Image cls_map {closed_eye: 0, open_eye: 1, yawn: 2, head_down: 3} xml_dir Path(annotations) out_dir Path(labels) out_dir.mkdir(exist_okTrue) for xml_path in xml_dir.glob(*.xml): tree ET.parse(xml_path) root tree.getroot() size root.find(size) W, H int(size.find(width).text), int(size.find(height).text) lines [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in cls_map: continue 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 / W yc (ymin ymax) / 2 / H w (xmax - xmin) / W h (ymax - ymin) / H lines.append(f{cls_map[name]} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}) (out_dir / (xml_path.stem .txt)).write_text(\n.join(lines))转换时注意三点坐标要除以图像真实宽高不是网络输入尺寸保留 6 位小数足够再多没必要如果 XML 里的宽高和实际图像尺寸不一致有些标注工具会写错以PIL.Image.open读到的实际尺寸为准。转换完再跑一遍 2.1 的体检脚本确认没有异常框。3. 用 YOLOv8 在红外疲劳数据集上跑通训练数据对齐之后训练本身反而是最标准的一步。但红外域有几个参数需要特别调不能照搬可见光的默认配置。这一章讲清楚模型选型、训练命令、关键参数和训练过程中的观察点。3.1 模型选型n/s/m 怎么选预训练权重从哪来YOLOv8 提供 n/s/m/l/x 五个尺度。2000 张图属于小数据集我一般从yolov8n或yolov8s起步。n 参数量约 300 万训练快、过拟合风险低s 约 1100 万精度略高但小数据集上容易过拟合。如果你要做部署到边缘设备n 是首选如果只是刷精度做实验可以试 s 然后看验证集曲线。预训练权重方面YOLOv8 官方在 COCO 上训练的yolov8n.pt可以直接加载。虽然红外域和 COCO 差异大但底层卷积核学到的边缘、角点特征仍有迁移价值比随机初始化收敛快很多。加载方式是训练命令里指定modelyolov8n.ptUltralytics 会自动下载。如果你的环境不能联网需要提前把权重文件放到本地用绝对路径指定。注意红外图像是单通道灰度图但 YOLOv8 默认输入是三通道。Ultralytics 在数据加载时会自动把灰度图复制成三通道不需要你手动改。但如果你自己写 dataloader记得处理这个通道数问题否则会报维度不匹配。3.2 训练命令与红外场景下的参数调整标准训练命令如下我标注了红外场景下需要特别关注的参数。yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ warmup_epochs3 \ hsv_h0.0 \ hsv_s0.0 \ hsv_v0.2 \ degrees5.0 \ translate0.1 \ scale0.3 \ fliplr0.5 \ mosaic0.5 \ patience30 \ device0逐个说关键参数。imgsz640是输入尺寸如果你的红外原图是 384×288放大到 640 会模糊可以改成 416 或 512但要注意必须是 32 的倍数。hsv_h和hsv_s设为 0因为红外图像没有色相和饱和度概念开了反而是噪声hsv_v0.2保留亮度扰动模拟不同热辐射强度。degrees5.0小角度旋转增强疲劳驾驶场景中头部倾斜是真实存在的但角度太大会让闭眼特征变形。mosaic0.5比默认的 1.0 低因为红外图像拼接后热分布不连续过强的 mosaic 会让模型学到虚假纹理。patience30是早停小数据集上过拟合来得快30 轮验证指标不升就停。batch16在 8GB 显存上跑 640 尺寸基本够用如果 OOM 就降到 8 或改用batch-1让 Ultralytics 自动选。lr00.01是初始学习率配合lrf0.01余弦退火到 0.0001。如果你发现 loss 在前几轮震荡剧烈把warmup_epochs加到 5。3.3 训练过程看什么loss 曲线、混淆矩阵和 BN 崩溃训练启动后重点盯三个东西。第一是train/box_loss和val/box_loss的走势如果 train 持续下降但 val 在 20 轮后开始上升就是过拟合需要加数据增强或减模型容量。第二是混淆矩阵红外疲劳检测最容易混的是closed_eye和open_eye因为红外下眼睑的热特征差异很小如果这两个类互相误判严重说明特征区分度不够可以考虑加一个「眼睛状态」的二分类辅助头或者提高输入分辨率。第三是 BN 崩溃。YOLO 训练中 BN 层偶尔会出现 running mean 和 variance 发散表现为 loss 突然变成 nan。红外数据集小、batch 小的时候更容易触发。解决办法有两个把batch调大至少 8或者改用yolov8n.pt里已经冻结 BN 统计量的方式训练。如果已经崩了从上一个 checkpoint 恢复把学习率降一半再跑。# 从崩溃前的 checkpoint 恢复降低学习率 yolo detect train \ datadata.yaml \ modelruns/detect/train/weights/last.pt \ epochs100 \ lr00.005 \ resumeTrueresumeTrue会接着上次的 epoch 继续优化器状态也恢复。如果last.pt已经损坏用best.pt重新开始但学习率要调低因为 best 已经是在较好状态上。4. 推理、验证与红外图像特有的翻车点排查训练完不是终点推理阶段的坑往往比训练还多。这一章讲怎么验证模型真的学到了疲劳特征而不是记住了背景以及红外图像上常见的几类翻车。4.1 用验证集和单张图推理做双重检查先跑验证集看整体指标yolo detect val \ modelruns/detect/train/weights/best.pt \ datadata.yaml \ imgsz640 \ conf0.25 \ iou0.5重点看mAP50和mAP50-95。红外疲劳检测里closed_eye的 AP 通常最低因为目标小、特征弱。如果closed_eye的 AP 低于 0.3而其他类都在 0.7 以上说明小目标检测能力不足可以尝试提高imgsz到 800或者在数据里对眼睛区域做裁剪增强。然后拿几张训练集里没有的图做单张推理肉眼看框的位置和置信度yolo detect predict \ modelruns/detect/train/weights/best.pt \ sourcetest_images/ \ conf0.25 \ saveTrue \ save_txtTruesave_txtTrue会把预测框存成 YOLO 格式方便你写脚本对比预测和真值。我一般会挑几张「模型自信但错了」的图这类样本对改进最有价值。4.2 红外图像盲元与两点校正对检测的影响红外探测器存在盲元坏点表现为图像上固定的白点或黑点。如果数据集里盲元没做校正模型可能把盲元当成特征。判断方法很简单统计所有图像同一位置的像素值如果某个位置在所有图里都是极值那就是盲元。处理方式是在预处理阶段做盲元替换用邻域中值填充。两点校正则是红外成像的常规非均匀性校正目的是让不同温度对应的灰度更线性。如果你的数据集来自不同设备或不同时间灰度分布可能不一致模型会学到设备相关的偏差。一个实用的检查是把训练集和验证集的灰度直方图画出来如果分布差异大说明需要做灰度归一化比如按 1% 和 99% 分位数做线性拉伸。import numpy as np from PIL import Image def normalize_ir(img_path, out_path): img np.array(Image.open(img_path).convert(L)).astype(np.float32) lo, hi np.percentile(img, 1), np.percentile(img, 99) img np.clip((img - lo) / (hi - lo 1e-6), 0, 1) * 255 Image.fromarray(img.astype(np.uint8)).save(out_path)这个归一化对红外图像很关键尤其是多来源数据混合时。参数1和99是分位数如果图像里噪声多可以改成2和98更鲁棒。4.3 避坑红外疲劳检测的 5 个血泪教训现象一验证集 mAP 很高但实际视频推理时框乱跳。原因训练集按帧随机划分相邻帧高度相似验证集泄漏。解决按采集片段或按人划分确保验证集里的人没在训练集出现过。现象二模型把方向盘或座椅头枕误判为疲劳类别。原因红外图像里这些物体的热特征和人体接近且标注时可能漏标了这些干扰物。解决在数据里补充「背景负样本」或者增加一个other类别把干扰物标出来。现象三闭眼和睁眼混淆严重。原因红外分辨率下眼睑开合的热差异只有几个灰度级特征太弱。解决提高输入分辨率到 800 或 960或者用眼睛区域的局部裁剪图单独训一个分类器做二次判断。现象四训练 loss 正常下降但推理时所有框置信度都低于 0.1。原因验证集和训练集的灰度分布不一致模型在验证集上实际是域外推理。解决统一做 4.2 的灰度归一化或者用val集的部分数据做少量 finetune。现象五BN 层 running stats 发散导致 loss 变 nan。原因batch 太小或学习率太高。解决batch 至少 8lr0降到 0.005加warmup_epochs5。如果还崩在模型里冻结前几层 BN。5. 把 2000 张红外图用到极致小数据集上的进阶技巧2000 张图在深度学习里算小数据集但红外疲劳检测这个任务本身类别少、场景固定用对方法完全能训出可用的模型。这一章讲几个我实际用过、能明显提升效果的技巧以及怎么判断这个方向值不值得继续投入。第一个技巧是用预训练模型做特征提取只训检测头。YOLOv8 加载 COCO 权重后冻结 backbone 和前几层 neck只训检测头 20 轮再解冻全部微调。这样在小数据集上收敛更稳过拟合更晚。命令上通过freeze参数控制# 先冻结 backbone 训练 20 轮 yolo detect train datadata.yaml modelyolov8n.pt epochs20 freeze10 lr00.01 # 再解冻全部微调 yolo detect train datadata.yaml modelruns/detect/train/weights/best.pt epochs100 lr00.001freeze10表示冻结前 10 层。第一段训练让检测头先适应红外域第二段低学习率全局微调避免破坏预训练特征。第二个技巧是难例挖掘。训练完第一版后用模型在训练集上推理挑出置信度低或预测错的图人工检查这些图的标注是否有误或者把它们复制多份加入训练集。红外疲劳检测里戴眼镜、侧脸、夜间低对比度这几类样本通常就是难例。2000 张里可能只有一两百张是真正难学的把它们找出来重点训比盲目加数据有效。第三个技巧是用测试时增强TTA提升推理稳定性。Ultralytics 推理时加augmentTrue会做多尺度翻转增强再合并结果对小目标检测有 1-3 个点的 mAP 提升代价是推理速度慢一倍。如果部署环境算力够值得开。yolo detect predict modelbest.pt sourcetest/ augmentTrue conf0.2判断这个方向值不值得做我的标准是看三个数闭眼类 AP 能不能到 0.5 以上、误报率把正常驾驶判为疲劳能不能压到 5% 以下、单帧推理延迟在目标硬件上能不能进 50ms。如果这三个数达标2000 张红外图训出来的模型就具备落地价值如果闭眼 AP 始终上不去要么补数据要么换更高分辨率的热像仪重新采集。我自己在这个任务上翻过最大的车是早期没做灰度归一化模型在实验室数据上 mAP 0.85换一台设备直接掉到 0.4后来老老实实把预处理管线补上才稳定。红外这个域数据一致性比模型结构重要得多。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

超高温焦耳热冲击制造拓扑缺陷,实现碳纳米管无金属可控生长 2026/9/28 14:48:02

超高温焦耳热冲击制造拓扑缺陷,实现碳纳米管无金属可控生长

看到"西华大学Adv. Sci.:超高温焦耳热冲击制备拓扑缺陷碳,用于催化碳纳米管可控生长"这个标题时,我第一反应是把关键词拆开看:焦耳热冲击、拓扑缺陷碳、可控生长。这三样东西放在一起,讲的是一个很有吸引力的…

阅读更多 →
高通8155音频链路深度解析:从HAL到DSP的TDM全流程调试 2026/9/28 14:47:56

高通8155音频链路深度解析:从HAL到DSP的TDM全流程调试

1. 项目概述:这不是一次普通的音频调试,而是一次从芯片底层到系统服务的穿透式溯源高通8155平台在智能座舱领域已是事实标准,但真正能说清楚“一段PCM音频数据从Android App发出,最终如何变成喇叭里可听的声音”这条链路的人&…

阅读更多 →
Cadence Virtuoso两级运放仿真全流程:从DC工作点到工艺角分析 2026/9/28 14:47:43

Cadence Virtuoso两级运放仿真全流程:从DC工作点到工艺角分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Python作业高效通关:环境配置、代码调试与可视化实践 2026/9/28 14:47:43

Python作业高效通关:环境配置、代码调试与可视化实践

说实话,每年到这个节点,我都会收到一大批“Python作业求助”。题主的状态基本一样:上课感觉自己听懂了,拿到作业题目回到宿舍电脑前一坐,突然不知道从哪下手。更难受的是,明明代码照着课件敲完了&#xff0…

阅读更多 →
UV9R-Plus写频全攻略:RS-232电平校准与CHIRP参数陷阱解析 2026/9/28 14:47:43

UV9R-Plus写频全攻略:RS-232电平校准与CHIRP参数陷阱解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
STM32实现高精度4-20mA采集的全流程设计与实战 2026/9/28 14:47:43

STM32实现高精度4-20mA采集的全流程设计与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉