☰
YOLO吸烟检测数据集实战:从标注解析到模型训练与调优
2026/10/10 12:00:47 网站建设 项目流程

简介:这份YOLO吸烟检测数据集面向计算机视觉学习者与目标检测开发者,用于训练和验证吸烟行为识别模型,可应用于公共场所禁烟监控、智能安防等场景。数据集已按train、val、test完成划分,并附带data.yaml配置文件,类别包含no_smoking、no_smoking_area、smoking三类,yolov5、yolov7、yolov8等主流算法可直接读取训练,省去自行标注与整理目录的繁琐工作。压缩包共412个文件,以204张jpg图像与204个txt标注文件为主,另含4个yaml配置文件,整体约11.48MB,体积轻便便于快速下载与本地部署。目前已有658人学习下载,适合作为课程设计、毕业设计或算法对比实验的数据基础。借助现成的目录结构与标注,读者可快速跑通训练流程,并对照检测结果参考进一步分析模型在吸烟区域识别上的表现。

1. 吸烟检测数据集选型:为什么 YOLO 格式的 smoking-dataset-yolo-1.zip 值得先跑通

你拿到一个标注好的吸烟检测数据集,第一反应大概率是「先看看里面长什么样」。但真正决定这个数据集能不能用的,不是图片数量,而是标注格式和场景覆盖。smoking-dataset-yolo-1.zip 这个命名本身就说明了三件事:任务类型是目标检测、标注体系是 YOLO 的 txt 格式、场景聚焦在吸烟行为识别。它解决的是「从零标注一批吸烟图片成本太高」的问题,适合两类人:一类是想做园区、加油站、化工厂等禁烟区域智能巡检的算法工程师,另一类是想拿一个真实小数据集练手 YOLO 训练全流程的学生和转行者。

吸烟检测和通用目标检测有个本质区别:烟头、烟雾、手持香烟的动作,这三类目标的尺度差异极大。烟头在 1080p 画面里可能只有十几个像素,而人的上半身占了画面三分之一。这意味着你不能直接套用 COCO 预训练模型的默认 anchor 和输入尺寸,否则小目标召回率会低到让你怀疑人生。这个数据集的价值就在于它把「吸烟」这个行为拆成了可标注的视觉目标,让你能在 YOLO 框架下做针对性优化,而不是从零开始定义问题。

2. 拆开 smoking-dataset-yolo-1.zip:目录结构、标注格式与场景分布

2.1 解压后先看什么:三个必须确认的目录

拿到压缩包后不要急着写训练脚本,先解压并确认目录结构。常见的 YOLO 数据集组织方式有两种:一种是 images 和 labels 平级,另一种是按 train/val/test 分目录。我一般会先跑一遍目录树,确认图片和标注文件是否一一对应。

# 解压到指定目录,避免中文路径 unzip smoking-dataset-yolo-1.zip -d ./smoking_dataset # 查看目录层级,重点关注 images 和 labels 的对应关系 find ./smoking_dataset -maxdepth 3 -type d | sort # 统计图片数量和标注数量,两者必须相等 find ./smoking_dataset -name "*.jpg" -o -name "*.png" | wc -l find ./smoking_dataset -name "*.txt" | wc -l

如果图片数和 txt 数不一致,说明有图片漏标或者标注文件命名不匹配。这种情况在二手数据集里很常见,血泪经验是先用脚本找出差集,别等到训练时才发现某张图没有标签,YOLO 会直接跳过它,你还在纳闷为什么 epoch 数对不上。

2.2 YOLO 标注格式逐字段拆解

YOLO 的标注文件是每行一个目标,格式为class_id x_center y_center width height,后四个值都是归一化到 0-1 的相对坐标。打开一个标注文件看看:

# 随机抽一个标注文件查看内容 head -5 ./smoking_dataset/labels/train/smoking_001.txt

输出可能是这样的:

0 0.523 0.412 0.089 0.156 0 0.781 0.623 0.045 0.078 1 0.334 0.289 0.312 0.445

这里 class_id 为 0 可能是 cigarette,1 可能是 smoke,具体类别映射要看 data.yaml 里的 names 列表。关键参数是 x_center 和 y_center,它们不是左上角坐标,而是目标框中心的归一化位置。很多新手在可视化验证时把中心点当左上角画,结果框全偏了,还以为是标注错了。

2.3 场景分布决定你的验证集怎么切

吸烟检测数据集的场景分布直接影响模型泛化能力。你需要统计三类信息:拍摄角度(正面、侧面、俯拍)、光照条件(室内、室外、夜间)、目标尺度分布。如果数据集里 80% 都是室内正面半身照,那你训出来的模型在室外俯拍场景下基本是废的。

import os from collections import Counter label_dir = "./smoking_dataset/labels/train" class_counter = Counter() box_sizes = [] for txt_file in os.listdir(label_dir): with open(os.path.join(label_dir, txt_file)) as f: for line in f: parts = line.strip().split() if len(parts) == 5: cls_id = int(parts[0]) w, h = float(parts[3]), float(parts[4]) class_counter[cls_id] += 1 box_sizes.append(w * h) print("类别分布:", class_counter) print("目标框面积中位数:", sorted(box_sizes)[len(box_sizes)//2])

这段脚本输出类别分布和目标框面积中位数。如果中位数小于 0.01,说明小目标占比很高,训练时输入尺寸至少设到 640,最好用 1280 做微调。如果某个类别样本数不到总数的 5%,考虑做数据增强或者调整损失函数里的类别权重。

3. 用 YOLOv8 跑通吸烟检测训练:从 data.yaml 到第一个 best.pt

3.1 环境搭建:PyCharm 里装 ultralytics 的避坑步骤

在 PyCharm 里新建项目后,不要直接 pip install ultralytics,先确认 Python 版本。YOLOv8 要求 Python 3.8 以上,但 3.12 在某些 torch 版本下会有兼容问题。我一般用 3.10 或 3.11。

# 创建虚拟环境,避免污染全局包 python -m venv venv_smoking source venv_smoking/bin/activate # Windows 用 venv_smoking\Scripts\activate # 先装 torch,再装 ultralytics,顺序反了容易拉错版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics # 验证安装 yolo checks

yolo checks会输出环境信息,重点看 CUDA 是否可用。如果显示 CPU only,检查显卡驱动和 torch 版本是否匹配。在 AGX Orin 上搭建 YOLO 环境时,要用 NVIDIA 官方提供的 JetPack 对应 torch 轮子,直接 pip 装大概率跑不起来 GPU 推理。

3.2 data.yaml 的五个必填字段与路径写法

YOLOv8 训练依赖 data.yaml 描述数据集。这个文件看着简单,但路径写错是最高频的翻车点。

# smoking_data.yaml path: /home/user/smoking_dataset # 数据集根目录,绝对路径最稳 train: images/train # 相对 path 的训练图片目录 val: images/val # 相对 path 的验证图片目录 test: images/test # 可选,没有就不写 nc: 2 # 类别数,必须和 names 长度一致 names: 0: cigarette # 类别 id 从 0 开始,顺序不能乱 1: smoke

注意 train 和 val 写的是相对路径,YOLO 会自动拼到 path 后面。如果你写成绝对路径,某些版本会解析失败。另外 nc 和 names 必须对应,改了 names 忘了改 nc 是最隐蔽的错误,训练能跑起来但类别全乱。

3.3 训练命令与六个关键参数怎么设

yolo detect train \ data=smoking_data.yaml \ model=yolov8s.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ project=smoking_runs \ name=exp1

逐个说参数:model 选 yolov8s 而不是 yolov8n,是因为吸烟检测里烟头是小目标,n 版本的感受野和特征提取能力不够,mAP 会差 5 个点以上。imgsz=640 是起点,如果小目标召回率低于 0.5,改成 1280 再训一轮。batch=16 取决于显存,8G 显存跑 640 尺寸大概能到 16,跑 1280 只能到 4。lr0=0.01 是 SGD 的初始学习率,如果你用 AdamW,改成 0.001。patience=20 表示 20 个 epoch 验证指标不提升就早停,吸烟数据集通常 50-80 个 epoch 就收敛了,设太大浪费时间。

训练过程中重点看三个指标:box_loss 是否稳定下降、mAP50 是否持续上升、cls_loss 是否震荡。如果 box_loss 下降但 mAP50 不涨,大概率是过拟合了,加 dropout 或者减模型复杂度。

3.4 用验证集跑一遍混淆矩阵,确认烟头和烟雾没被混淆

训练完成后不要只看 mAP 数字,跑一遍验证看混淆矩阵。

yolo detect val \ model=smoking_runs/exp1/weights/best.pt \ data=smoking_data.yaml \ conf=0.25 \ iou=0.5 \ plots=True

conf=0.25 是置信度阈值,低于这个值的检测框会被过滤。iou=0.5 是 NMS 的 IoU 阈值。plots=True 会生成混淆矩阵和 PR 曲线图。重点看 cigarette 和 smoke 之间有没有大量误判,如果有,说明这两个类别的视觉特征区分度不够,考虑合并成一个「smoking」大类,或者增加更多区分性样本。

4. 吸烟检测训练避坑:五条血泪经验

4.1 现象:训练 loss 正常下降但验证 mAP 始终为 0

原因:data.yaml 里的 val 路径指向了不存在的目录,YOLO 找不到验证图片,但不会报错,只是跳过验证。解决:训练前用ls确认 val 目录下有图片,或者在 data.yaml 里写绝对路径测试一次。

4.2 现象:模型在测试集上把所有人的手都框成 cigarette

原因:训练集里正样本太多,负样本(不吸烟的手)太少,模型学到了「手等于烟」的虚假关联。解决:往训练集里加一批不吸烟的手部图片作为背景负样本,或者用 mosaic 增强时提高负样本比例。

4.3 现象:GPU 显存溢出,batch 降到 2 还是 OOM

原因:imgsz 设太大,或者数据集里有超大分辨率图片没做预处理。解决:先跑脚本统计图片尺寸分布,把超过 1920 的图片等比缩放到 1280 以内,再重新训练。另外检查是否开了 cache=True,缓存全部图片到内存会额外占显存。

4.4 现象:导出的 ONNX 模型推理结果和 PyTorch 不一致

原因:导出时没有指定 dynamic 轴,或者预处理归一化参数不一致。解决:导出命令加dynamic=True,并且确认推理时的 mean 和 std 与训练时一致。YOLOv8 默认是 0-1 归一化,不需要额外减均值。

4.5 现象:在 AGX Orin 上推理速度只有 5 FPS

原因:用了 PyTorch 原生推理而不是 TensorRT。解决:用 ultralytics 自带的 export 功能转 TensorRT 引擎,yolo export model=best.pt format=engine half=True,FP16 精度下速度能提升 3-5 倍。注意 TensorRT 引擎和硬件绑定,在 Orin 上导出的不能拿到别的显卡上用。

5. 从能跑到好用:吸烟检测的进阶调优与验证习惯

5.1 小目标召回率上不去时,先改 anchor 还是先改输入尺寸

吸烟检测里烟头是小目标,默认 anchor 是基于 COCO 聚类的,对烟头这种极端尺度不友好。我的习惯是先改输入尺寸,从 640 提到 1280,这一步通常能带来 8-12 个点的召回提升。如果还不够,再用 k-means 重新聚类 anchor。YOLOv8 虽然是无锚框设计,但特征金字塔的层级分配仍然影响小目标检测。可以在训练配置里调整overlap_mask和mask_ratio,不过这两个参数主要影响分割任务,检测任务重点还是输入分辨率和数据增强。

5.2 用 TTA 和模型集成榨干最后几个点

测试时增强(TTA)对吸烟检测这种小目标场景效果明显。推理时把图片水平翻转、多尺度缩放,然后合并检测框。

from ultralytics import YOLO model = YOLO("smoking_runs/exp1/weights/best.pt") # 开启 TTA 推理 results = model.predict( source="./test_images", augment=True, # 启用 TTA conf=0.2, iou=0.45, imgsz=1280 )

augment=True 会做多尺度加翻转的 TTA,推理时间增加约 3 倍,但 mAP 通常能涨 2-4 个点。如果延迟要求不严格,这个操作性价比很高。模型集成则是训 3-5 个不同 seed 的模型,推理时对框做加权 NMS,涨点更明显但成本也更高。

5.3 验证习惯:每次改参数前先跑 baseline

我踩过最大的坑是改了一堆参数后效果变差,却不知道是哪个参数导致的。后来养成习惯:任何调参之前,先跑一次当前配置的验证集指标并记录。改一个参数,跑一次验证,对比 mAP50 和召回率。吸烟检测数据集不大,一次验证通常 2-3 分钟,这个时间花得值。另外验证时固定 conf 和 iou 阈值,否则指标没有可比性。

5.4 一个具体技巧:用背景图片降低误检率

吸烟检测在实际部署中最头疼的是误检,比如把白色口罩绳、耳机线误判成香烟。一个低成本技巧是往训练集里加 5%-10% 的纯背景图片,标注文件为空。YOLO 会把这类图片的所有区域当作负样本,有效降低误检。背景图片可以从实际部署场景的监控画面里截取,不需要标注,直接放进 images/train 并在 labels/train 放一个空的同名 txt 文件即可。

这个方案值不值得做,取决于你的场景对误检的容忍度。如果误检一次就要人工复核,那加背景图片这一步不能省。如果只是做统计趋势分析,可以先用基础模型跑起来再迭代。我自己的习惯是先把最小可运行版本跑通,拿到第一版 mAP 数字,再决定往哪个方向优化。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询