构建高质量吸烟行为识别数据集:从数据采集到YOLOv5标注全流程详解

构建高质量吸烟行为识别数据集:从数据采集到YOLOv5标注全流程详解 简介本资源是专为YOLOv5目标检测模型定制的吸烟行为识别数据集面向计算机视觉初学者、安防算法工程师及智能监管系统开发者解决公共场所吸烟行为自动识别与精确定位难题适用于禁烟监测、智慧园区管理等实际落地场景。压缩包共2000个文件含1995个YOLO格式标注txt文件每张图像对应一个边界框坐标与类别标签、3个配置yaml文件定义类别数、路径及训练参数、1个权重下载脚本sh简化环境部署和1份README说明文档整体体积仅39.88MB轻量易用且结构规范。已有71人学习下载资源已通过清洗与标准化处理标注一致性高覆盖室内封闭空间、户外公共区域及复杂人群环境等多类真实场景可直接用于模型训练、验证与推理测试显著降低数据准备门槛。1. 项目概述从零构建一个可用的吸烟行为识别数据集做计算机视觉项目尤其是目标检测最常听到的一句话就是“数据为王”。最近在做一个基于YOLOv5的吸烟行为识别项目核心挑战不是模型调参而是如何搞到一个高质量、标注精准的数据集。网上公开的吸烟检测数据集要么数量稀少要么标注质量堪忧直接拿来用效果往往不理想。这个项目就是围绕如何从零开始构建一个专用于YOLOv5训练的吸烟行为识别数据集展开的。它解决的不仅仅是“有没有数据”的问题更是“如何获得高质量、场景覆盖广、标注规范的数据”这一更本质的痛点。无论你是计算机视觉的在校学生、刚入行的算法工程师还是想落地安防监控项目的开发者这套从数据采集、清洗、标注到质量评估的完整流程都能让你少走很多弯路。2. 数据集构建的核心思路与设计考量2.1 为什么需要自建数据集公开数据集如COCO、VOC虽然庞大但专门针对“吸烟行为”这个细粒度动作的样本却凤毛麟角。吸烟行为识别属于特定目标检测其难点在于目标尺度多变吸烟行为可能表现为手持香烟小目标、嘴部吸烟动作中小目标或整个吸烟姿态中目标。姿态与环境复杂吸烟可能发生在室内、室外、白天、夜晚人物可能处于行走、坐着、交谈等多种状态背景干扰大。标注定义模糊“吸烟行为”的边界是什么是必须看到香烟还是看到典型的吸烟手势如手指夹烟、抬手吸烟即可这需要明确的标注规范。因此自建数据集的核心思路是主动设计数据分布而非被动收集。我的设计考量包括场景多样性刻意采集不同场景办公室、楼道、公园、车站、车内下的图像和视频片段。时间与光照覆盖包含白天、夜晚、逆光、侧光等不同光照条件。人物多样性涵盖不同年龄、性别、衣着的人物以及单人、多人交互的场景。行为完整性覆盖从取烟、点烟、吸烟到弹烟灰、掐灭的完整行为片段而不仅仅是静态的“手持香烟”状态。2.2 数据来源规划与合规性数据来源主要有三公开资源爬取与筛选利用合规的网络爬虫工具从一些允许爬取的公开图片/视频网站以“smoking”、“cigarette”等关键词获取初始素材。这里必须严格遵守robots协议和网站版权规定仅用于个人学习研究且最终数据集不包含可直接追溯个人的敏感信息。模拟场景拍摄在获得参与者知情同意的前提下组织模拟拍摄。这是获取高质量、精准标注数据的最有效方式。我们会设计多种典型场景请志愿者模拟吸烟动作。合成数据辅助使用Blender、Unity等工具生成部分3D合成数据用于补充一些罕见角度或极端光照条件下的样本。合成数据的关键在于渲染的真实性需要仔细调整材质、光照和相机参数。注意所有涉及真人图像的数据必须严格确保已获得肖像权授权并签署用于非商业学术研究的数据使用协议。这是法律和伦理底线绝不能含糊。3. 数据采集、清洗与预处理实操要点3.1 原始数据采集与整理采集到的原始数据通常是混乱的格式不一jpg, png, mp4, avi、分辨率各异、包含大量无关或重复内容。 我的整理流程如下统一媒体格式将所有图片转换为.jpg格式兼顾质量和大小视频则统一抽取帧为.jpg图像。使用FFmpeg工具批量处理视频抽帧命令如下ffmpeg -i input_video.mp4 -r 1 -q:v 2 frames/frame_%04d.jpg参数解释-r 1表示每秒抽1帧对于动作变化不快的吸烟行为够用-q:v 2指定输出图像质量2-31值越小质量越高。初步筛选与去重通过计算图像哈希如感知哈希pHash找出高度相似或完全相同的图片手动或半自动地删除重复项。同时肉眼快速浏览剔除完全无关、质量极差如严重模糊、过曝的图片。构建原始素材库使用一个简单的目录结构进行管理例如raw_data/ ├── source_public/ # 来自公开网络 ├── source_filmed/ # 自行拍摄 └── source_synthetic/ # 合成数据3.2 数据清洗的关键步骤清洗是提升数据集质量的核心直接决定模型上限。人脸与车牌模糊如需如果项目最终应用于对隐私有要求的场景如公共安防方案演示需要使用高斯模糊或马赛克工具对图像中非目标人物的脸部、车牌号等进行脱敏处理。可以使用OpenCV批量处理。图像质量增强分辨率标准化将所有图像短边缩放到一个统一尺寸如640像素长边按比例缩放避免变形。YOLOv5的输入通常是正方形训练时会自动进行Letterbox填充因此这里我们只需保证图像质量无需强行裁剪成正方形。光照归一化采用CLAHE限制对比度自适应直方图均衡化算法缓解部分过暗或过曝的问题提升对比度尤其是在昏暗环境下拍摄的吸烟动作如指尖的光点会更清晰。难例挖掘与补充在初步标注后用一个基础模型跑一遍找出那些置信度低、漏检、误检的样本。这些“难例”正是数据集需要加强的地方。针对性地补充类似场景或角度的数据。4. 数据标注规范、工具与流程详解4.1 定义清晰的标注规范这是保证标注一致性的基石。我们定义两类标注类别Class本项目暂时只设一个类别smoking。但更精细的可以划分为smoking_hand手持烟、smoking_mouth吸烟口部动作等。边界框Bounding Box目标尽可能紧密地框住“吸烟行为”的视觉主体。这可能是香烟本身如果是明显的小棍状也可能是执行吸烟动作的手部区域当香烟不明显时或者是包含手和口部的区域对于明显的吸烟姿态。原则宁可稍微框大一点确保包含关键特征如手指、香烟末端也不要框得太紧导致特征丢失。对于被部分遮挡的目标根据可见部分估算完整边界框。4.2 标注工具选型与实操LabelImg和CVAT是两种常用工具。对于吸烟行为这种数据量不是极端庞大的项目我更喜欢Roboflow在线或LabelImg离线。这里以LabelImg为例说明关键操作和心得。安装与配置pip install labelImg安装后通过命令行启动。关键快捷键与效率技巧W创建矩形框。这是最常用的键。Ctrl S保存当前标注生成XML文件。D下一张图A上一张图。熟练后可以左手放在A/D键上快速切换图片右手用鼠标标注。开启“自动保存”模式在View设置中勾选“Auto Save mode”这样切换图片时会自动保存防止意外丢失。使用预设标签在predefined_classes.txt中预先写入smoking这样在标注时可以直接选择无需手动输入保证类别名称绝对一致。标注流程实录打开LabelImg将“图片目录”和“标注文件保存目录”分别指向你的images/train和labels/train。打开第一张图观察吸烟行为主体。如果香烟清晰可见则直接框选香烟如果香烟细小难辨但手部姿势典型如两指弯曲靠近嘴边则框选手部区域。框选后从下拉菜单中选择smoking类别。务必检查框的位置和大小是否合适。按D键切换到下一张重复过程。心得标注约50张后最好回头随机抽查几张检查自己标注的标准是否前后一致。最好由2-3人同时标注一部分重叠的样本然后计算标注者间信度及时统一有分歧的标注标准。4.3 标注文件格式转换LabelImg默认生成PASCAL VOC格式的XML文件。YOLOv5训练需要的是YOLO格式的.txt文件每个文件对应一张图片内容如class_id x_center y_center width height坐标是归一化后的0-1之间。编写一个Python转换脚本是必备技能。核心代码如下import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(xml_path, output_txt_path, classes_list): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_width int(size.find(width).text) img_height int(size.find(height).text) with open(output_txt_path, w) as f: for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in classes_list: continue cls_id classes_list.index(cls_name) xmlbox obj.find(bndbox) xmin float(xmlbox.find(xmin).text) ymin float(xmlbox.find(ymin).text) xmax float(xmlbox.find(xmax).text) ymax float(xmlbox.find(ymax).text) # 计算归一化中心坐标和宽高 x_center (xmin xmax) / 2.0 / img_width y_center (ymin ymax) / 2.0 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height f.write(f{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n) # 用法示例 classes [smoking] xml_dir path/to/voc_annotations txt_dir path/to/yolo_labels os.makedirs(txt_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if xml_file.endswith(.xml): convert_voc_to_yolo(os.path.join(xml_dir, xml_file), os.path.join(txt_dir, xml_file.replace(.xml, .txt)), classes)注意转换后务必进行可视化验证随机选取几张图片和对应的YOLO格式标签用OpenCV画框检查是否对齐。这是避免后续训练失败的关键一步。5. 数据集组织、划分与YOLOv5配置5.1 标准目录结构YOLOv5对数据集目录结构有明确要求规范的目录能避免很多路径错误。smoking_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ │ ├── 001.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── 100.jpg │ └── ... └── labels/ ├── train/ # 训练集标签.txt文件与图片同名 │ ├── 001.txt │ └── ... └── val/ # 验证集标签 ├── 100.txt └── ...关键点images/train里的001.jpg其对应的标签文件必须是labels/train/001.txt一一对应名字不含后缀必须完全相同。5.2 数据集划分策略不要随意划分常用的策略是分层抽样确保训练集和验证集在场景、光照、人物密度等维度上分布相似。简单随机划分如果数据本身分布比较均匀可以直接按8:1:1或7:2:1随机分成训练集、验证集、测试集。使用sklearn.model_selection的train_test_split函数可以轻松实现。按场景划分如果数据来自多个不同场景如办公室、公园、车站更稳健的做法是按场景文件夹划分。例如每个场景的数据自己按比例划分然后再合并起来。这样可以防止模型在验证时“偷看”到与训练集过于相似的场景从而高估真实性能。测试集隔离测试集在最终模型评估前绝对不要使用。最好在项目一开始就隔离出来不参与任何超参数调优或模型选择过程。5.3 创建数据集配置文件.yamlYOLOv5通过一个.yaml文件来定位数据集。在项目根目录下创建data/smoking.yaml# 数据集路径相对于YOLOv5项目根目录或绝对路径 path: ../smoking_dataset train: images/train val: images/val # test: images/test # 如果有测试集 # 类别数量 nc: 1 # 类别名称列表 names: [smoking]这个文件是连接你的数据和训练脚本的桥梁。之后训练时只需在命令中指定--data smoking.yaml即可。6. 数据增强策略设计与实现数据增强是提升模型泛化能力、防止过拟合的利器。YOLOv5内置了强大的增强管道但我们理解其原理才能更好地配置。6.1 基础空间增强在data/hyps/hyp.scratch-low.yaml或自定义的超参数文件中可以调整hsv_h,hsv_s,hsv_v随机调整图像的色调、饱和度和明度。模拟不同颜色、光照的吸烟场景。建议值hsv_h: 0.015,hsv_s: 0.7,hsv_v: 0.4。适度增强避免颜色失真导致香烟或皮肤特征丢失。degrees随机旋转角度。对于吸烟行为小角度旋转如±10度是合理的大角度旋转可能导致不自然的姿态。translate随机平移。模拟目标在图像中不同位置出现。scale随机缩放。模拟目标远近变化。shear随机剪切变换。轻微剪切可以增加姿态多样性。6.2 针对吸烟行为的特殊增强思考除了内置增强可以尝试一些针对性策略模拟烟雾遮挡在图像上随机添加半透明的白色或灰色模糊区域模拟烟雾缭绕的环境。这能增强模型在烟雾干扰下的鲁棒性。小目标复制粘贴Copy-Paste对于“香烟”这个小目标可以从已有标注中裁剪出来随机粘贴到其他图像的非目标区域作为负样本不这里要小心。更合理的做法是将香烟目标粘贴到其他吸烟行为不明显的图像中创造新的正样本但要保证粘贴位置合理如手部附近。Mosaic增强YOLOv5默认开启Mosaic将四张图拼成一张。这对提升模型检测小目标和上下文理解能力非常有效。对于吸烟行为这能让模型同时看到不同场景、不同尺度的吸烟实例。6.3 增强效果可视化与调试务必可视化增强后的效果使用YOLOv5提供的utils/augmentations.py脚本或自己写代码查看经过增强管道后的图片和标签框是否还正确。 一个常见的坑是过强的增强如大角度旋转、高剪切可能导致边界框扭曲甚至超出图像边界如果处理不当这些“无效”框会被送入训练引入噪声。YOLOv5内部会处理框的合法性但自己定制增强时需格外注意。7. 数据集质量评估与常见问题排查7.1 基础完整性检查在开始训练前进行以下检查文件对应检查确保images/train中的每个.jpg文件在labels/train中都有同名的.txt文件反之亦然。一个快速检查的Shell命令# 检查图片是否有对应标签 for img in images/train/*.jpg; do if [ ! -f labels/train/$(basename $img .jpg).txt ]; then echo Missing label for $img; fi; done标签格式检查随机打开一些.txt文件检查内容格式。确保每行有5个数字用空格分隔类别ID是整数且在范围内本例是0后面4个坐标值在0到1之间。空标签处理有些图片可能没有吸烟行为负样本。对于负样本其对应的.txt文件应该是一个空文件0字节。YOLOv5能够正确处理空标签文件。7.2 数据分布分析使用Python脚本分析数据集的健康度目标尺寸分布计算所有边界框的宽度和高度像素值或相对值绘制散点图或直方图。查看小目标如香烟、中目标手部的比例。如果小目标极少模型可能难以学会检测香烟。位置分布计算边界框中心点的分布。目标是否都集中在图像中央如果是可能需要增加平移增强。每张图目标数统计每张图片中吸烟目标的数量。大部分是单目标还是多目标这会影响训练时anchor的匹配。7.3 常见问题与解决方案实录问题1训练时出现大量NaN损失。排查首先检查标签数据。最常见的原因是标签坐标超出了[0,1]范围。可能是格式转换脚本有bug或者原始标注框就超出了图像边界。解决编写一个清洗脚本过滤掉坐标值小于0或大于1的标签行或者将其截断到[0,1]区间。同时检查图像文件是否损坏用OpenCV的imread测试是否能正常读取。问题2模型训练很快但验证集mAP始终为0或极低。排查数据集划分可能有误。验证集和训练集的数据分布差异巨大例如训练集全是白天室内验证集全是夜晚室外。或者验证集的标签文件路径配置错误模型实际上是在一个空标签集上验证。解决可视化验证集的样本和标签确认其存在且正确。检查数据集配置文件.yaml中的val路径是否正确。重新审视数据集划分策略。问题3模型对某种特定场景如逆光检测效果极差。排查数据集中该类场景的样本数量严重不足。解决针对性补充数据。这是“数据驱动”最直接的体现。去采集或生成更多逆光条件下的吸烟行为图像加入训练集。同时可以调整数据增强针对性增加亮度、对比度变化的强度。问题4标注不一致同一行为有人标香烟有人标手部。排查这是标注规范定义不清导致的长尾问题在多人标注时尤为突出。解决组织一次标注复审。将所有标注可视化召集标注员一起讨论有争议的案例形成更明确的标注规则文档甚至配图示例。然后对已有标注进行统一修正。可以考虑使用标注平台如CVAT的审阅功能来提高效率。构建一个高质量的YOLOv5吸烟行为识别数据集是一个系统工程远不止是“打框”那么简单。它涉及数据规划、采集、清洗、标注、管理、增强和评估的全链路。我的体会是在数据上投入的时间最终都会在模型性能上得到回报。很多时候调参一整天提升的0.5% mAP可能还不如精心清洗和补充一批高质量数据来得有效。最后分享一个习惯在数据集构建的每个阶段原始数据、清洗后、标注后、增强后都随机抽样几十张样本用简单的脚本可视化一下往往能提前发现很多潜在问题事半功倍。本文还有配套的精品资源点击获取