资讯动态

YOLO驾驶员吸烟检测数据集构建与模型训练全流程实战

发布时间:2026/9/2 23:51:39 来源:尧图企业网站定制
简介本资源是面向智能座舱与车载DMS驾驶员监控系统开发者的YOLO系列算法专用数据集聚焦车内吸烟行为检测这一关键安全场景适用于疲劳驾驶、分心驾驶等AI视觉分析任务的模型训练与验证。数据集共921个文件含460张高质量JPG图像与对应460份YOLO格式TXT标签单类别cigarette另附结构完备的data.yaml配置文件已按标准划分train/val/test三级目录支持YOLOv5至YOLOv9全系列框架开箱即用。39.43MB压缩包体积轻量高效目录层级清晰、路径配置规范省去数据预处理与路径调试环节。目前已有277人学习下载配套CSDN博文详细展示了数据集构建逻辑、标注规范及多版本YOLO训练效果对比可直接用于科研实验、课程设计或工业级DMS功能原型开发。1. 项目概述与核心价值最近在整理一个关于驾驶员行为检测的老项目发现手头一份名为“Cigar-driver-detect-data.zip”的数据集在硬盘里躺了快两年。这个数据集的核心就是利用YOLO算法来识别驾驶员在车内吸烟的行为。听起来是不是挺有现实意义的无论是车队安全管理、网约车平台合规检查还是未来智能座舱的主动安全预警这个场景都绕不开。但说实话找到一份标注质量高、场景覆盖全的吸烟检测数据集比想象中难多了。网上的公开数据集要么场景单一全是白天正面要么标注粗糙烟和手都分不清要么数据量太小根本喂不饱现在动辄需要上万张图片的深度学习模型。这份“Cigar-driver-detect-data.zip”就是我当年为了解决这个问题带着团队一点点攒出来的。它不是一个简单的图片打包而是一个为YOLO格式量身定制、经过精心清洗和标注的解决方案。今天我就把它拆开了、揉碎了从数据集的构建思路、标注细节到如何用它高效地训练一个真正能用的YOLO吸烟检测模型把里面的门道和踩过的坑一次性讲清楚。无论你是刚入门目标检测的新手还是正在寻找特定场景数据集的从业者这份“干货”应该都能让你少走不少弯路。2. 数据集深度解构不只是图片和标签拿到一个数据集最忌讳的就是直接扔进模型开始训练。尤其是行为检测这类细粒度任务理解数据的“基因”至关重要。这个Cigar-driver-detect数据集其设计哲学完全围绕着“车内吸烟”这一核心场景的复杂性和实用性展开。2.1 数据采集与场景覆盖策略我们最初的目标就很明确要做一个能在真实世界泛化好的模型数据就必须覆盖足够多的变量。拍脑袋坐在车里摆拍几十张照片那样的数据集毫无价值。我们的采集遵循了以下几个原则驾驶员多样性涵盖了不同年龄、性别、发型是否遮挡、是否佩戴眼镜的驾驶员。这是为了避免模型将某些外貌特征与吸烟行为错误关联。环境光变化这是最关键也是最费功夫的部分。数据集包含了白天自然光顺光、逆光、侧光。夜间环境仅仪表盘光、城市路灯、地下车库照明、对面车灯眩光模拟会车场景。黄昏/黎明光线昏暗且色温复杂的时段。拍摄视角与姿态主驾驶位视角模拟固定摄像头、副驾驶位视角、后排视角。驾驶员姿态包括正常坐姿、身体前倾、侧身、抬头等。吸烟的手部位置也多变如手持烟在嘴边、搭在车窗、放在方向盘附近等。干扰物与负样本这是提升模型鲁棒性的核心。数据集中包含了大量手持类似物体如笔、手机、零食、水瓶的图片以及手部在嘴部附近但不吸烟如喝水、捂嘴、打电话的图片。这些负样本能有效防止模型将“手嘴部区域”的简单组合误判为吸烟。实操心得采集阶段最贵的成本不是设备而是“场景还原”。我们租用了不同的车辆在不同时间、不同天气下由不同人员反复模拟。夜间数据尤其珍贵因为很多公开数据缺乏高质量的夜间样本而这恰恰是事故高发和监管盲区。2.2 标注规范与YOLO格式适配数据质量一半在采集一半在标注。我们采用YOLO格式但标注的学问远不止于画个框。类别定义我们只定义了一个类别smoking。为什么不区分“香烟”、“手”、“嘴”因为我们的任务是行为检测而不是物体检测。目标是判断“吸烟行为是否发生”这个行为的主体是“正在吸烟的驾驶员”其视觉核心通常是手与香烟的组合体且位置相对固定嘴部附近。将其作为一个整体目标进行检测比分别检测香烟和手再做逻辑判断在工程上更简单、更稳定。边界框BBox策略范围框住手持香烟的手部区域并尽可能包含部分嘴部或脸颊区域。框体不宜过大以免包含过多无关背景也不宜过小要能容纳手部的一些姿态变化。难点处理对于香烟被手部分遮挡、或烟雾缭绕导致边缘模糊的情况标注员需要根据经验和上下文进行合理估计。我们为此制作了详细的标注手册并进行了多轮校准训练。YOLO格式详解生成的标签文件是.txt格式与图片同名。每一行代表一个目标格式为class_id x_center y_center width height。class_id 类别索引这里就是0。x_center, y_center 目标框中心点的归一化坐标除以图片宽高。width, height 目标框的归一化宽高。例如0 0.512 0.423 0.085 0.12表示图片中有一个吸烟行为目标其中心点位于图片宽度的51.2%、高度的42.3%处框的宽度和高度分别是图片宽高的8.5%和12%。2.3 数据集目录结构与核心文件解压Cigar-driver-detect-data.zip后你会看到一个清晰的结构这是高效管理数据集的基础Cigar-driver-detect-data/ ├── images/ │ ├── train/ # 训练集图片约70%数据 │ │ ├── day_001.jpg │ │ ├── night_045.jpg │ │ └── ... │ └── val/ # 验证集图片约15%数据 │ └── ... ├── labels/ │ ├── train/ # 对应训练集的标签文件 .txt │ └── val/ # 对应验证集的标签文件 .txt ├── data.yaml # YOLO模型训练的核心配置文件 └── README.md # 数据集说明文档含统计信息这个结构是YOLOv5/v8等主流框架推荐的标准格式。关键在于data.yaml文件它定义了模型的“数据地图”# data.yaml 内容示例 path: ../Cigar-driver-detect-data # 数据集根目录 train: images/train # 训练集图片路径相对path val: images/val # 验证集图片路径 # test: images/test # 如果有测试集可取消注释 # 类别名称和数量 nc: 1 # number of classes names: [smoking] # class names3. 基于YOLOv8的模型训练全流程实操有了高质量的数据集训练模型就是水到渠成的事。这里我以当前最流行、对新手最友好的Ultralytics YOLOv8为例展示端到端的训练流程。为什么选v8因为它平衡了速度、精度和易用性从命令行到Python API都极其简洁。3.1 环境搭建与依赖安装首先需要一个干净的Python环境。强烈建议使用Conda或Venv进行环境隔离。# 1. 创建并激活虚拟环境以Conda为例 conda create -n yolo_smoke python3.8 -y conda activate yolo_smoke # 2. 安装PyTorch请根据你的CUDA版本到PyTorch官网选择对应命令 # 例如对于CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 3. 安装Ultralytics YOLOv8 pip install ultralytics # 4. 可选但推荐安装常用工具库 pip install opencv-python pillow matplotlib seaborn pandas注意事项PyTorch版本与CUDA驱动版本的匹配是深度学习环境最大的“坑”。在安装前务必在命令行输入nvidia-smi查看你的CUDA版本。如果版本不匹配训练时要么报错要么会退回到CPU模式速度慢如蜗牛。3.2 数据准备与配置文件修改将下载的Cigar-driver-detect-data.zip解压到你的项目目录。假设结构如下your_project/ ├── cigar-driver-detect-data/ # 解压后的数据集 │ ├── images/ │ ├── labels/ │ └── data.yaml └── train.py # 你的训练脚本你需要检查并可能修改data.yaml中的path项确保它指向正确的绝对路径或相对于训练脚本的相对路径。最简单的方式是将path改为当前数据集的绝对路径。3.3 模型训练与关键参数解析训练可以通过命令行一键启动但理解关键参数才能调出好模型。命令行方式yolo taskdetect modetrain modelyolov8s.pt data/path/to/your/cigar-driver-detect-data/data.yaml epochs100 imgsz640 batch16 workers4Python脚本方式更推荐便于迭代和记录from ultralytics import YOLO # 加载一个预训练模型推荐从YOLOv8s开始平衡速度与精度 model YOLO(yolov8s.pt) # 开始训练 results model.train( datacigar-driver-detect-data/data.yaml, # 数据配置路径 epochs150, # 训练轮数根据数据集大小调整100-200是常见范围 imgsz640, # 输入图像尺寸越大精度可能越高但更耗资源 batch16, # 批次大小取决于你的GPU显存如RTX 3060 12G可用16 workers4, # 数据加载线程数通常设为CPU核心数 device0, # 使用GPU 0如果是CPU则设为cpu seed42, # 随机种子确保实验可复现 patience30, # 早停耐心值如果连续30轮验证集指标无提升则停止 saveTrue, # 保存检查点 save_period10, # 每10轮保存一次检查点 nameyolo8s_smoke_detect_v1, # 本次训练运行的名称 pretrainedTrue, # 使用预训练权重强烈建议 optimizerauto, # 优化器自动选择 lr00.01, # 初始学习率 lrf0.01, # 最终学习率因子 (lr0 * lrf) warmup_epochs3, # 学习率热身轮数 box7.5, # 框损失权重 cls0.5, # 分类损失权重我们只有一类可适当调低 dfl1.5, # DFL损失权重 )关键参数解读与调优建议模型选择 (model):yolov8n最小最快、yolov8s推荐起点、yolov8m、yolov8l、yolov8x最大最准。从s开始如果欠拟合再换大模型。图像尺寸 (imgsz): 默认640。如果你的目标吸烟的手部在图像中占比很小可以尝试增大到960甚至1280但这会显著增加显存消耗和训练时间。可以先从640开始。批次大小 (batch): 在GPU显存允许的前提下越大越好通常能带来更稳定的梯度估计。如果出现“CUDA out of memory”错误就减小batch或imgsz。学习率 (lr0): 0.01是YOLOv8的默认值对于我们的数据集通常是个不错的起点。如果训练过程中损失剧烈震荡或变为NaN可以尝试降低到0.001。损失权重 (box,cls,dfl): 这是YOLOv8的精细调优旋钮。我们的任务是单类检测因此分类任务简单可以适当降低cls权重从默认0.5降到0.2-0.3让模型更专注于框位置的回归(box)和分布焦点损失(dfl)。3.4 训练过程监控与评估解读训练启动后Ultralytics会在终端打印实时日志并在runs/detect/yolo8s_smoke_detect_v1目录下生成一系列重要文件。你需要重点关注终端输出观察损失曲线train/box_loss,train/cls_loss,val/box_loss等是否平稳下降。验证集损失在训练后期应趋于平稳或轻微波动。结果可视化results.png: 所有指标随训练轮次的变化曲线是评估训练过程健康度的总览图。confusion_matrix.png: 混淆矩阵对于单类任务主要看背景背景被误检为目标的比例这个值越低越好。val_batchX_labels.jpgval_batchX_pred.jpg: 随机抽取的验证集批次图片左边是真实标签右边是模型预测。这是最直观判断模型好坏的方式看框得准不准有没有漏检或误检。训练结束后模型的最佳权重会自动保存在runs/detect/train/weights/best.pt。评估这个模型不要只看最后的mAP0.5更要看mAP0.5:0.95更严格的指标和验证集上的precision精确率、recall召回率。高精确率Precision意味着模型说“这是吸烟”时可信度很高误报把喝水当成吸烟少。这对减少误报警很重要。高召回率Recall意味着真实的吸烟行为被检测出来的比例高漏报少。这对安全监控很重要。通常需要根据应用场景在两者间权衡。使用best.pt在验证集上验证yolo taskdetect modeval modelruns/detect/train/weights/best.pt datacigar-driver-detect-data/data.yaml4. 模型优化与部署实战技巧训练出一个基础模型只是第一步要让它在真实场景中可靠工作还需要进行优化和精心的部署。4.1 模型性能优化策略如果验证集指标不理想如mAP低于0.85可以按以下顺序排查和优化数据层面分析错误样本使用YOLOv8提供的val模式生成预测图仔细查看哪些图片预测错了。是光线问题姿势特殊还是遮挡严重针对性地补充这类数据到训练集进行增量训练。数据增强调优YOLOv8默认开启了Mosaic、MixUp等强增强。对于小目标吸烟的手有时过强的增强反而有害。可以在train参数中调整model.train(... hsv_h0.015, # 色调增强强度默认0.015 hsv_s0.7, # 饱和度增强强度默认0.7 hsv_v0.4, # 明度增强强度默认0.4 degrees0.0, # 旋转角度范围默认0.0对于车内固定摄像头可设为0 translate0.1, # 平移比例默认0.1 scale0.5, # 缩放比例默认0.5 shear0.0, # 剪切角度默认0.0可设为0 perspective0.0, # 透视变换默认0.0可设为0 flipud0.0, # 上下翻转概率默认0.0对于车内场景通常为0 fliplr0.5, # 左右翻转概率默认0.5保留 mosaic1.0, # Mosaic增强概率默认1.0可尝试降至0.5 mixup0.0, # MixUp增强概率默认0.0初期可关闭 )模型层面更换模型尺度如果yolov8s欠拟合训练损失降不下去换yolov8m。如果过拟合训练损失很低但验证集损失高可以尝试yolov8n或增加正则化如dropout。微调Fine-tuning如果数据量有限例如只有几千张可以从在类似场景如车内人脸、手势识别上预训练的模型开始微调而不是从通用的COCO数据集预训练模型开始。但这需要找到合适的预训练模型。后处理调优置信度阈值conf默认0.25。提高它如0.4可以提升精确率减少误报但会降低召回率可能漏报。需要在验证集上测试找到平衡点。非极大值抑制NMS阈值iou默认0.7。降低它如0.5可以让重叠框的抑制更严格适用于目标密集场景。我们的吸烟检测通常目标单一默认值即可。4.2 模型部署与应用示例训练好的best.pt可以直接用于推理。这里给出一个简单的Python推理脚本并模拟一个实时监控场景from ultralytics import YOLO import cv2 import time # 加载训练好的模型 model YOLO(runs/detect/train/weights/best.pt) # 示例1单张图片推理 results model(test_image.jpg, imgsz640, conf0.4) # 设置推理尺寸和置信度阈值 # 可视化结果 results[0].show() # 显示图片 results[0].save(output.jpg) # 保存图片 # 打印检测结果信息 for box in results[0].boxes: print(f检测到吸烟行为置信度{box.conf.item():.2f}, 位置{box.xyxy[0]}) # 示例2模拟实时视频流例如从摄像头 cap cv2.VideoCapture(0) # 0代表默认摄像头或替换为视频文件路径 frame_count 0 start_time time.time() while cap.isOpened(): success, frame cap.read() if not success: break # 每隔N帧检测一次平衡精度和实时性例如每秒5-10帧检测 if frame_count % 6 0: # 假设摄像头30fps每6帧检测一次即5fps检测频率 results model(frame, imgsz640, conf0.4, verboseFalse) # verboseFalse关闭日志 annotated_frame results[0].plot() # 绘制检测框 # 在画面上显示FPS fps 1 / (time.time() - start_time) if frame_count 0 else 0 cv2.putText(annotated_frame, fFPS: {fps:.1f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) start_time time.time() cv2.imshow(Driver Smoking Detection, annotated_frame) else: # 非检测帧直接显示或进行其他处理 cv2.imshow(Driver Smoking Detection, frame) frame_count 1 if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()部署到生产环境的考虑模型导出best.pt是PyTorch格式部署时通常需要转换为更高效的格式。# 导出为ONNX格式通用性好 yolo export modelbest.pt formatonnx imgsz640 # 导出为TensorRT格式NVIDIA GPU上极致性能 yolo export modelbest.pt formatengine device0 imgsz640性能优化使用TensorRT、OpenVINO等推理引擎加速。对于边缘设备如Jetson系列可能需要进一步量化INT8以提升速度。系统集成将检测模型封装成gRPC或RESTful API服务供车载中控或云端管理平台调用。需要考虑视频流解码、推理调度、结果上报等整套流水线。5. 常见问题排查与避坑指南在实际操作中你几乎一定会遇到下面这些问题。这里我把解决方案和思考过程都列出来。5.1 训练阶段问题问题1训练损失loss不下降或者很快降为0然后不变。可能原因学习率过高导致梯度爆炸数据标签错误例如所有标签都是错的模型结构有问题。排查步骤检查数据用YOLOv8自带的工具可视化一批训练数据yolo taskdetect modetrain modelyolov8s.pt datadata.yaml ...先不真正训练看图片和标签是否对应正确。降低学习率将lr0从0.01降到0.001甚至0.0001重新尝试。简化问题用极少量如10张已知正确的数据训练1-2个epoch看loss是否下降。如果还不下降基本确定是代码或环境问题。问题2验证集损失val_loss远高于训练损失且差距越来越大过拟合。可能原因模型复杂度过高相对于数据量训练数据不够多样训练轮次太多。解决方案增加数据使用更多样化的数据增强但注意不要过度见4.1节。使用更小的模型从yolov8s换到yolov8n。添加正则化在model.train()参数中尝试设置dropout0.2如果模型支持。早停Early Stopping设置patience参数如20让训练在验证集指标不再提升时自动停止。减少训练轮次可能50个epoch就够了不需要训练150轮。问题3CUDA out of memoryOOM错误。原因批次大小batch或图像尺寸imgsz太大超出GPU显存。解决首先减小batch如16-88-4。如果还不行减小imgsz如640-512。注意这会降低模型对小目标的检测能力。使用梯度累积gradient_accumulation模拟更大的batch size但YOLOv8命令行接口未直接暴露需修改代码对新手不友好。优先调整前两项。5.2 推理与部署问题问题4模型在训练集上表现很好但在新的真实视频上漏检严重。原因域差异Domain Gap。你的训练数据Cigar-driver-detect-data和新视频的光线、摄像头角度、车型内饰可能不同。解决收集新场景数据并微调这是最根本的方法。从新视频中截取几十到几百帧标注后加入原始训练集用best.pt作为预训练权重进行少量轮次如20-30轮的微调。测试时增强TTA在推理时对图像进行多种变换翻转、缩放等并综合结果能提升鲁棒性但会增加计算量。YOLOv8支持results model(‘image.jpg’, imgsz640, conf0.4, augmentTrue)。降低置信度阈值尝试将推理时的conf从0.25降到0.15或0.1以召回更多目标但误报也会增加。问题5误报太多特别是将手放在嘴边打电话、喝水等动作识别为吸烟。原因负样本非吸烟但手在嘴边的动作不足或特征不够明显。解决增加困难负样本专门收集打电话、喝水、捂嘴、摸脸等动作的图片加入训练集并确保它们被正确标注为“无目标”即对应的标签.txt文件为空。提高分类损失权重虽然我们是单类但调整cls参数会影响模型区分“目标”和“背景”的能力。可以尝试略微提高cls权重如从0.5调到0.8让模型更关注“是不是吸烟”这个分类任务。但这需要重新训练验证。后处理规则如果误报有规律如打电话时手机形状固定可以在检测框基础上添加简单的规则过滤器例如检测到“吸烟”目标后再用人脸关键点模型判断手部与嘴部的相对位置和停留时间。5.3 数据与标注问题问题6标注框的尺寸和位置应该多大、多精确我们的策略框住“手持香烟的区域”并包含部分手腕和嘴部上下文。不必追求像素级精确但要保持一致性。所有标注员应遵循同一标准。对于模糊案例团队讨论确定标准并更新标注手册。问题7数据量到底要多少经验法则对于YOLO这类现代检测器一个特定场景下的单类检测任务要达到较好的泛化能力至少需要3000-5000张高质量标注图片。我们的Cigar-driver-detect-data集在这个量级左右。如果数据少于1000张很容易过拟合。最后分享一个我自己的深刻体会在目标检测项目中数据质量的重要性永远大于模型复杂度。花一周时间清洗和扩充数据集带来的性能提升往往远大于花一周时间调参或换一个更大的模型。这份Cigar-driver-detect-data数据集的价值就在于它提供了一个针对“车内吸烟”场景的、经过设计的、高质量的数据起点。你可以直接用它训练一个 baseline 模型但更重要的是理解其构建逻辑然后根据你自己的具体应用场景比如特定的车型、摄像头型号去迭代和优化它让它真正为你所用。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价