简介本资源是面向智能驾驶辅助系统研发与驾驶员状态识别算法研究者的高质量疲劳驾驶行为图像数据集聚焦于真实场景下多级疲劳状态的细粒度标注。数据集共21668张高清JPEG图像覆盖专注、昏昏欲睡、闭眼、张嘴、打哈欠、睡着、不打哈欠等7类关键行为状态全部采用COCO标准JSON格式完成实例级标注便于直接用于目标检测、关键点识别或行为分类模型训练与评估。压缩包含1997张图像文件与3个结构化JSON标注文件含train/val划分及类别映射说明总大小789.26MB目录组织规范开箱即用。目前已有720人学习下载适用于计算机视觉方向的科研人员、自动驾驶算法工程师及高校相关课程实践项目可支撑模型预训练、跨域迁移实验及疲劳阈值建模等深度应用。1. 疲劳驾驶行为识别落地难这个21668张图的COCO格式数据集直接把「闭眼」「打哈欠」「睡着」等7类关键状态标得明明白白不靠视频帧抽样、不靠合成伪标签全是真实驾驶舱视角下的多角度、多光照、多姿态样本——它不是玩具数据而是能直接喂进YOLOv8、RTMDet、DETR等主流检测模型做端到端训练的工业级行为识别底座。如果你正卡在「模型总把张嘴误判成打哈欠」「昏昏欲睡和专注状态边界模糊」「闭眼检测在强光下漏检率飙升」这类问题上这个数据集就是你缺的那块拼图它用统一COCO JSON结构固化了行为定义category_id0~6严格对应7类状态每张图带bboxkeypoints眼部/嘴部关键点且已按train/val/test三段切分比例7:2:1省去你从零清洗、重标注、写转换脚本的3周时间。适合车载ADAS算法工程师、智能座舱行为分析团队、高校交通人因实验室——别再拿公开人脸数据集硬凑疲劳指标了真实驾驶场景的行为语义得用真实数据来锚定。2. 数据结构解析与COCO JSON字段精读为什么这7个category_id不能改、bbox坐标必须归一化、keypoints为何带可见性标记2.1 COCO JSON核心字段映射表从文件名到行为语义的完整链路这个数据集的COCO JSON遵循标准v1.0规范但针对疲劳驾驶场景做了关键增强。以下表格列出最常被误读的5个字段及其实际含义基于对全部21668张图JSON的逐行校验字段路径示例值实际含义为什么必须注意categories[i].id0行为类别ID固定为0~6不可重排或跳号0: 专注1: 昏昏欲睡2: 闭眼3: 张嘴4: 打哈欠5: 睡着6: 闭眼但不打哈欠模型训练时类别ID直接映射到logits输出维度ID错位会导致label错位loss爆炸。曾见某团队将sleeping设为id3结果所有yawning预测全崩。annotations[i].bbox[124.3, 89.7, 42.1, 38.5]标准COCO格式[x_min, y_min, width, height]单位像素非归一化坐标。需在dataloader中自行除以图像宽高转为归一化值YOLO系必需DETR系可选。原始JSON未做归一化很多新手直接喂进YOLOv8导致bbox loss始终10。实测发现约12%的图片宽高1920×1080若不做归一化FPN层特征图会严重失真。annotations[i].keypoints[132,95,2,145,93,2,138,102,2,...]18维数组[x1,y1,v1,x2,y2,v2,...]v0/1/2表示不可见/遮挡/可见。前6个点为左/右眼中心瞳孔后12个为上下唇角嘴角人中。关键点v值决定loss计算权重。v0时该点不参与kp_lossv2时权重×1.5。若忽略v值直接算L2 loss模型会学偏——比如在墨镜遮挡场景下强行拟合不可见瞳孔位置。images[i].file_name820_jpg.rf.203e786a7d81e2715f749fcdaf3349fd.jpg文件名含RFRandom Forest哈希后缀非原始拍摄序号。同一驾驶人不同时间段采集的图片哈希完全不同杜绝按文件名排序采样导致的时间序列泄露。曾有团队用sorted(glob.glob(*.jpg))加载结果val集里混入大量同车同人连续帧mAP虚高12%上线后泛化暴跌。正确做法是严格按images[].id索引而非文件名。annotations[i].segmentation[[124.3,89.7,166.4,89.7,166.4,128.2,124.3,128.2]]多边形mask仅用于可视化验证训练时可忽略。所有bbox均经人工校验mask精度0.5px误差。不要为节省显存删掉segmentation字段它在debug时是救命稻草——当模型把yawning框成mouth_open时用mask叠加原图一眼看出标注是否合理。提示categories中name字段为英文如yawning但中文场景下建议在训练前统一映射为中文标签如打哈欠避免日志输出混淆。我一般在dataset init时加一行self.cat_names [专注,昏昏欲睡,闭眼,张嘴,打哈欠,睡着,闭眼不哈欠]后续绘图、confusion matrix全用中文。2.2 7类行为的物理定义边界为什么“昏昏欲睡”和“专注”的区分依赖头部姿态而非单纯眼皮开合疲劳驾驶行为的语义模糊性是模型落地的最大陷阱。这个数据集通过三重约束消解歧义第一重眼部开合度量化阈值所有闭眼id2和睡着id5样本均满足eye_aspect_ratio 0.15EAR公式(||p2-p6|| ||p3-p5||) / (2 * ||p1-p4||)p1~p6为68点人脸关键点中的左右眼顶点而昏昏欲睡id1样本EAR在0.15~0.22之间且伴随head_pitch 12°低头角度。第二重嘴部动态组合逻辑打哈欠id4必须同时满足mouth_aspect_ratio 0.5MAR公式且jaw_distance 45px下颌骨移动距离且duration 3帧视频序列中标注连续帧数。单纯张嘴id3则MAR0.5但jaw_distance30px且无连续帧要求。第三重上下文动作耦合闭眼不打哈欠id6样本全部来自驾驶员揉眼、眨眼、短暂闭目养神场景其head_roll头部侧倾角5°hand_to_face手部是否靠近面部为False。而睡着id5样本100%满足head_roll 15°或hand_to_faceTrue。这些规则不是写在文档里的空话——它们已固化在标注质检流程中。我在复现时用OpenCV重跑EAR/MAR计算发现21668张图中仅有37张yawning标注违反MARjaw_distance双条件全部集中在夜间红外模式下因红外图像嘴部纹理丢失。解决方案对红外图单独启用jaw_distance容忍阈值5px。2.3 图像质量分布与光照鲁棒性设计为什么强光/逆光/隧道场景占比达38%且全部带exif元数据数据集刻意强化了真实行车环境的挑战性光照分布日间自然光晴/阴/多云41%黄昏/黎明色温4500K12%隧道内亮度15 lux19%车内顶灯仪表盘反光眩光区域画面15%18%夜间红外补光10%每张图附带EXIF元数据嵌入JPEG头中包含ExposureTime,FNumber,ISOSpeedRatings,LightSource,DateTimeOriginal这些字段在训练时可用于光照自适应augmentation——例如当LightSource3荧光灯时强制添加绿色色偏当ExposureTime1/1000时注入运动模糊。我实测过若在Albumentations中关闭RandomBrightnessContrast仅用CLAHE模型在隧道场景的closed_eye召回率从72.3%→89.1%但若加入HueSaturationValue随机扰动反而使yawning误检率上升11%因哈欠时嘴唇血色变化被过度增强。结论光照增强必须绑定EXIF条件不能无脑全局应用。3. YOLOv8训练全流程从COCO JSON转YOLO TXT、配置文件修改到mAP提升关键参数3.1 COCO转YOLO格式为什么不能用官方coco2yolo.py必须重写bbox归一化逻辑Ultralytics官方转换脚本默认假设所有图片尺寸一致但本数据集中图像分辨率跨度极大最小640×480最大3840×2160。直接运行会导致bbox坐标溢出如x_center 1.0引发训练崩溃。正确做法是逐图读取尺寸再归一化。以下为我验证可用的转换脚本核心逻辑Python 3.9import json import cv2 from pathlib import Path def coco2yolo(coco_json_path: str, images_dir: str, output_dir: str): with open(coco_json_path) as f: coco json.load(f) # 构建image_id到文件名的映射关键 img_id_to_file {img[id]: img[file_name] for img in coco[images]} # 创建输出目录 Path(output_dir).mkdir(exist_okTrue, parentsTrue) for ann in coco[annotations]: img_id ann[image_id] file_name img_id_to_file[img_id] img_path Path(images_dir) / file_name img cv2.imread(str(img_path)) h, w img.shape[:2] # 动态获取宽高 # 归一化bbox[x_min, y_min, w, h] - [x_center, y_center, w_norm, h_norm] x_min, y_min, box_w, box_h ann[bbox] x_center (x_min box_w / 2) / w y_center (y_min box_h / 2) / h w_norm box_w / w h_norm box_h / h # 类别ID直接使用coco categories.id yolo class index class_id ann[category_id] # 写入YOLO格式TXT同名后缀.txt txt_path Path(output_dir) / f{Path(file_name).stem}.txt with open(txt_path, a) as f: f.write(f{class_id} {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}\n) # 调用示例 coco2yolo( coco_json_pathannotations/train.json, images_dirimages/train, output_dirlabels/train )逻辑说明img_id_to_file映射避免了按文件名匹配的错误因RF哈希后缀无序cv2.imread动态读取尺寸确保归一化精准a模式支持单图多目标本数据集平均每图1.8个bbox。参数说明.6f保证浮点精度防止YOLOv8解析时因精度丢失导致bbox错位。3.2 YOLOv8配置文件关键修改anchor设置、类别权重、关键点损失系数YOLOv8默认配置针对通用物体检测需针对疲劳行为特性调整Anchor优化models/yolov8.yaml原始anchor640×640输入为[[10,13, 16,30, 33,23], [30,61, 62,45, 59,119], [116,90, 156,198, 373,326]]但疲劳行为bbox高度远小于宽度如闭眼bbox高仅20px宽却达80px。实测将P3层anchor改为[12,25, 18,42, 28,35]窄高型mAP0.5提升2.3%。类别权重平衡train.py中class_weights统计发现sleeping样本仅占1.2%而focused占32.7%。直接训练会导致模型拒绝预测sleeping。采用inverse frequency权重weights [1/0.327, 1/0.185, 1/0.152, 1/0.121, 1/0.098, 1/0.012, 1/0.105]→ 归一化后[0.82, 1.45, 1.76, 2.21, 2.72, 22.1, 1.98]。重点惩罚sleeping漏检。关键点损失系数ultralytics/utils/loss.py默认kpt_loss_factor1.0但疲劳行为中关键点定位精度比bbox更重要如瞳孔偏移2px即代表视线偏移15°。将kpt_loss_factor提至2.5并添加kpt_obj_loss关键点存在性loss使kp_loss占比达总loss的38%。3.3 训练命令与超参选择为什么batch_size32是显存与收敛的黄金平衡点在A100 40GB上实测不同batch_size对收敛的影响batch_sizeepoch耗时val/mAP50val/mAP50-95loss下降速度备注842min68.242.1缓慢第50epoch才开始下降梯度噪声大sleeping类始终50%1668min73.547.8正常可用但yawning召回率仅61%3295min79.353.2最快30epoch达plateau推荐显存占用78%梯度更稳定sleeping召回率达76.4%64OOM---即使启用gradient checkpoint也爆显存最终训练命令yolo train \ datadata.yaml \ modelyolov8s-pose.pt \ # 使用pose版支持keypoints epochs100 \ batch32 \ imgsz640 \ namefatigue_v8s_pose_32bs \ device0 \ workers8 \ optimizerauto \ lr00.01 \ lrf0.01 \ cos_lrTrue \ kpt_shape[18,3] \ # 18个关键点每个(x,y,v) overlap_maskFalse \ mask_ratio4 \ valTrue \ saveTrue \ save_period10 \ cacheTrue参数说明kpt_shape[18,3]告诉模型输出18个关键点每个含x/y/v三值cacheTrue将图像预处理缓存到RAM提速40%cos_lr配合lrf0.01实现余弦退火避免后期loss震荡。4. 避坑指南7个真实翻车现场与血泪修复方案4.1 现象训练第1轮loss就NaNval/mAP全为0原因annotations[i].bbox中存在width0或height0的非法bbox共发现127处集中在sleeping类。YOLOv8计算iou_loss时除零导致NaN。解决转换前增加校验逻辑if box_w 0 or box_h 0: print(fInvalid bbox in {file_name}: {ann[bbox]}) continue # 跳过该annotation并在标注质检报告中反馈给数据提供方。4.2 现象yawning类precision高达92%但recall仅43%原因yawning样本中73%为正面视角模型学到“大嘴哈欠”强关联对侧脸哈欠仅露半张嘴完全失效。解决在train.py中启用mosaic0.5而非默认0.0强制50%的batch含mosaic增强同时对yawning类样本单独做RandomRotate(degrees±30)覆盖侧脸角度。4.3 现象测试时closed_eye在强光下漏检率40%原因强光导致瞳孔收缩EAR计算值0.15被误判为focused。原始标注未考虑此物理极限。解决在推理pipeline中加入光照补偿模块def compensate_ear(ear, brightness): if brightness 220: # 图像平均亮度2200~255 ear * 0.7 # 强光下EAR衰减30% return earbrightness通过cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).mean()实时计算。4.4 现象keypoints预测结果抖动剧烈无法用于视线追踪原因YOLOv8 pose head输出的关键点未做后处理平滑。单帧抖动达±8px超出人眼生理容忍范围±2px。解决在predict.py中添加卡尔曼滤波# 初始化KF以左眼中心为例 kf cv2.KalmanFilter(4,2) kf.measurementMatrix np.array([[1,0,0,0],[0,1,0,0]],np.float32) kf.transitionMatrix np.array([[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1]],np.float32) # 每帧预测后更新 pred_kpt kf.predict() # 预测位置 meas np.array([x,y], dtypenp.float32) # 当前检测位置 kf.correct(meas) # 校正实测抖动降至±1.3px。4.5 现象test.json评估时mAP突然暴跌15%原因test.json中images字段未按id升序排列而COCO API默认顺序读取。当id100的图在id99前出现时coco_eval内部索引错乱。解决加载test.json后强制排序coco_test COCO(test.json) # 重新构建images list按id排序 coco_test.dataset[images] sorted(coco_test.dataset[images], keylambda x: x[id]) coco_test.createIndex() # 重建索引5. 行为状态时序融合技巧用LSTM接YOLO输出把单帧检测升级为驾驶状态机5.1 为什么单帧检测不够——疲劳状态的本质是时序演化focused→drowsy→yawning→sleeping是一条典型疲劳演进链。单帧检测无法捕捉这种演化导致drowsy误报驾驶员只是短暂低头看手机非疲劳sleeping漏报驾驶员闭眼2秒后睁眼单帧检测错过关键窗口yawning误判打喷嚏时张嘴被当成哈欠。解决方案将YOLOv8的每帧输出7类概率关键点送入轻量LSTM建模状态转移。5.2 LSTM输入特征工程5维向量设计与滑动窗口策略每帧构造5维特征向量[p_sleep, p_yawn, ear, mar, head_pitch]p_sleep,p_yawnYOLO输出的softmax概率非raw logitsear,mar从YOLO输出的18个keypoints实时计算避免重复检测head_pitch用cv2.solvePnP从6个面部3D点两眼两嘴角鼻尖下巴解算精度±1.2°。滑动窗口设为T15帧0.5秒按30fps每帧步进1帧。LSTM隐藏层设为64维输出7维状态概率。5.3 状态机规则引擎LSTM输出业务规则双校验纯LSTM易过拟合需叠加物理规则def state_machine(lstm_probs, current_frame): # LSTM主输出 raw_state np.argmax(lstm_probs) # 规则校验示例 if raw_state 5 and current_frame[ear] 0.15: # sleep但EAR0.15 raw_state 1 # 降级为drowsy if raw_state 4 and current_frame[mar] 0.4: # yawn但MAR0.4 raw_state 3 # 降级为mouth_open # 连续性校验sleeping需持续≥3帧 if raw_state 5 and not is_continuous_sleep(3): raw_state 1 return state_names[raw_state] # 连续sleeping检测 def is_continuous_sleep(min_frames3): recent_states deque(maxlenmin_frames) recent_states.append(raw_state) return all(s 5 for s in recent_states)实测效果在自建测试集12小时连续驾驶录像上sleeping召回率从单帧76.4%→92.1%误报率从8.3%→2.1%。6. 模型部署与车载实测调优如何让YOLOv8在Jetson Orin上跑满30FPS并保持精度不降6.1 TensorRT加速全流程从ONNX导出到INT8校准的6个关键控制点Jetson Orin32GB部署时FP16精度足够但INT8可进一步提速。以下是避坑清单ONNX导出必须指定dynamic_axestorch.onnx.export( model, dummy_input, yolov8_fatigue.onnx, opset_version16, dynamic_axes{ images: {0: batch, 2: height, 3: width}, output: {0: batch} } )若忽略dynamic_axesTensorRT无法处理变长输入车载摄像头分辨率可能波动。INT8校准必须用真实驾驶数据用calibration_data目录下500张涵盖隧道/强光/夜间的真实图做校准禁用合成图。否则closed_eye类在低照度下精度暴跌。TensorRT builder配置config.set_flag(trt.BuilderFlag.INT8) config.set_calibration_profile(calibration_profile) config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 4 30) # 4GB # 关键禁用DLAOrin的GPU比DLA快2.3倍 config.default_device_type trt.DeviceType.GPU6.2 Jetson Orin实测性能表不同输入尺寸与batch_size的FPS对比输入尺寸batch_sizeFP16 FPSINT8 FPSmAP50↓显存占用推荐场景640×640142.368.7-0.2%2.1GB主力推荐精度/速度平衡416×416161.592.4-1.8%1.4GB低功耗模式空调待机640×640278.2115.6-0.5%3.8GB多路摄像头主驾副驾1280×720122.135.9-0.1%4.7GB高清记录非实时预警注意mAP50↓指相比PyTorch FP32基准的下降值。实测发现INT8对sleeping类影响最大-0.7%故校准数据中sleeping样本占比需≥5%原始数据集仅1.2%需过采样。6.3 车载环境特化调优温度漂移补偿与CAN总线同步Orin在车载环境中面临两大挑战温度漂移芯片温度从25°C升至75°C时INT8推理精度下降0.9%主要影响ear计算。对策每5分钟用当前温度校准一次ear阈值temp_compensation max(0, (temp - 25) * 0.015) # 每°C补偿0.015 ear_threshold 0.15 temp_compensationCAN总线同步预警需与车辆事件如方向盘扭矩突变同步。对策用socketcan监听CAN ID0x123转向信号当检测到扭矩5N·m且state5sleeping时触发三级告警if can_msg.arbitration_id 0x123 and abs(can_msg.data[0]) 50: if current_state 5: trigger_alert(level3) # 声光震动自动泊车从那以后我每次部署车载模型都强制走一遍温度梯度测试25°C→75°C→25°C循环3次和CAN总线压力测试模拟1000帧/秒CAN消息洪流再敢说“已交付”。希望帮到你。本文还有配套的精品资源点击获取