资讯详情

吸烟人群检测数据集:2000张XML标注图转YOLO训练全流程

📅 2026/9/24 18:14:47 | 华诺云谱 👁 阅读
吸烟人群检测数据集:2000张XML标注图转YOLO训练全流程
简介本资源为面向目标检测任务的吸烟人群检测数据集适合从事行为识别、安防监控或影视内容分析的研究者与算法工程师使用可直接用于模型训练与验证无需额外清洗或格式转换。压缩包内共2000个文件全部为xml格式的标注文件对应2000余张自然场景及影视剧中人物抽烟的图片标注内容为边界框左上角与右下角坐标整体约198.63MB目录按文件夹组织结构清晰便于批量读取。目前已有685人学习下载说明该数据集在同类任务中具备一定参考价值。读者可借助这批真实场景样本快速搭建吸烟行为检测基线验证YOLO、Faster R-CNN等主流框架的落地效果也可用于数据增强、标注格式转换与模型鲁棒性测试省去自行采集与标注的时间成本。1. 吸烟人群检测数据集2000 张自然场景图与 XML 边界框能不能直接喂给 YOLO前阵子接了个园区吸烟行为识别的活客户丢过来一句话“有没有现成的抽烟检测数据集我不想从零标。”我翻了一圈公开渠道要么是 COCO 里零星几张要么是合成图直到拿到这份吸烟人群检测数据集——2000 张真实场景图配 2000 个 XML 标注文件标签就是边界框左上角、右下角坐标没有多余字段。它解决的不是“模型怎么设计”而是“标注从哪来”这个最耗人力的环节。适合谁做目标检测落地、想快速验证抽烟检测可行性、或者拿它当 YOLO 系列训练数据练手的人。下面我按“数据长什么样 → 怎么转格式 → 怎么训 → 坑在哪”拆一遍都是我自己跑过的流程。2. 先看清数据底子XML 结构、类别分布与选型理由2.1 目录组织与 XML 字段拆解拿到压缩包解压后常见做法是图片和标注分两个文件夹放文件名一一对应。比如你看到的002134.xml、001988.xml这种编号对应的图片通常是002134.jpg或002134.png。先别急着写转换脚本抽三五个 XML 打开看看结构这是后面所有操作的依据。annotation foldersmoke/folder filename002134.jpg/filename size width1920/width height1080/height depth3/depth /size object namesmoke/name bndbox xmin842/xmin ymin315/ymin xmax1010/xmax ymax602/ymax /bndbox /object /annotation这段结构里size决定归一化分母bndbox的四个值是绝对像素坐标name是类别名。逻辑说明YOLO 训练要的是归一化后的中心点加宽高所以转换的核心就是用xmin/ymin/xmax/ymax和width/height做四则运算。参数说明xmin、ymin是左上角xmax、ymax是右下角这是 VOC 标准格式和 COCO 的[x,y,w,h]不一样别混。我一般会先统计所有 XML 里name的取值确认是不是只有smoke一个类避免训练时类别数写错。2.2 为什么这份数据适合直接上 YOLO选型理由很直接XML 是 Pascal VOC 格式而 YOLOv5、YOLOv8 官方都提供了 VOC 转 YOLO 的成熟脚本社区资料最多出问题好搜。2000 张的量级对于单类别检测属于“能跑出可用模型”的起点不算大但足够验证流程。自然场景加影视剧截图意味着光照、遮挡、人物姿态都有变化比实验室摆拍数据更接近真实部署环境。常见做法是把它按 8:1:1 切成训练、验证、测试如果数据里有人物重复出现最好按人物 ID 切防止同一人同时出现在训练和验证集导致指标虚高。我一般会先跑一遍去重用感知哈希看有没有几乎一样的图有就删掉重复的不然模型会记住背景。3. 把 XML 转成 YOLO 格式转换脚本与四个边界坑3.1 转换脚本逐行说明下面这个脚本我用了很多次输入是图片文件夹和 XML 文件夹输出是images和labels两个目录标签是cls x_center y_center w h的归一化格式。import os import xml.etree.ElementTree as ET # 类别映射先确认XML里name的实际取值 classes [smoke] def convert(xml_dir, img_dir, out_img_dir, out_lbl_dir): os.makedirs(out_img_dir, exist_okTrue) os.makedirs(out_lbl_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_name) bnd obj.find(bndbox) xmin float(bnd.find(xmin).text) ymin float(bnd.find(ymin).text) xmax float(bnd.find(xmax).text) ymax float(bnd.find(ymax).text) # 归一化并转中心点格式 x_center (xmin xmax) / 2.0 / w y_center (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}) # 写标签文件同名txt txt_name os.path.splitext(xml_file)[0] .txt with open(os.path.join(out_lbl_dir, txt_name), w) as f: f.write(\n.join(lines)) # 复制图片保持同名 for ext in [.jpg, .png, .jpeg]: src os.path.join(img_dir, os.path.splitext(xml_file)[0] ext) if os.path.exists(src): import shutil shutil.copy(src, os.path.join(out_img_dir, os.path.basename(src))) break convert(annotations, images, yolo/images, yolo/labels)逻辑说明先读size拿宽高再遍历每个object把绝对坐标转成相对坐标。参数说明classes列表必须和 XML 里的name完全一致大小写敏感x_center等保留 6 位小数是 YOLO 的常见精度要求。跑完后抽查几个 txt确认数值都在 0 到 1 之间如果出现大于 1 或负数说明坐标越界得回去看原图标注。3.2 四个容易翻车的边界情况第一个坑是坐标越界。有些 XML 里xmax比图片宽度还大或者xmin是负数直接归一化会得到离谱值。解决方法是转换时加裁剪把坐标限制在[0, w]和[0, h]内。第二个坑是空标签文件。如果某张图里object为空脚本会写出一个空 txtYOLO 训练时可能报错我一般会跳过空文件或删掉对应图片。第三个坑是图片格式不统一有的.jpg有的.png复制时得按扩展名匹配否则标签有了图没过去。第四个坑是文件名带空格或中文os.listdir读得到但后续路径容易断建议先批量重命名成纯数字编号。这四个坑我全踩过血泪经验就是转换完一定用labelImg或cv2可视化几张眼见为实。4. 用 YOLOv8 训练这份数据配置、命令与指标观察4.1 数据集 YAML 与训练命令转换完的目录结构建议是yolo/images/train、yolo/images/val、yolo/labels/train、yolo/labels/val。然后写一个smoke.yamlpath: ./yolo train: images/train val: images/val nc: 1 names: [smoke]参数说明nc是类别数单类别写 1names顺序要和转换脚本里的classes一致。训练命令用 YOLOv8 的 CLIyolo detect train datasmoke.yaml modelyolov8n.pt epochs100 imgsz640 batch16逻辑说明yolov8n.pt是轻量预训练权重适合先跑通流程imgsz640是常见输入尺寸如果原图分辨率很高且目标小可以调到 960 或 1280但显存要够。batch16根据显卡调整8G 显存跑 640 一般没问题。训练开始后重点看mAP50和mAP50-95单类别任务mAP50到 0.7 以上算可用低于 0.5 得回头查标签质量。4.2 训练中常见的指标异常与处理如果mAP一直不涨先看train/box_loss有没有下降不降说明学习率或数据有问题。常见做法是先用小学习率lr00.001跑 10 个 epoch 看趋势。如果val/box_loss上升而train下降是过拟合加数据增强或减模型复杂度。如果mAP波动大可能是验证集太小2000 张按 8:1:1 切验证集只有 200 张可以改成 7:2:1。另外抽烟检测里烟头目标很小imgsz太小会丢我一般会开mosaic1.0和scale0.5增强小目标。训练完用yolo detect val再跑一遍验证集看混淆矩阵确认没有把背景误检成 smoke。5. 避坑与排查标注、路径、显存、评估四类问题5.1 标注类问题现象训练时提示Label class 0 is not in the dataset。原因YAML 里names和 txt 里的类别 ID 对不上或者 txt 里出现了classes列表外的 ID。解决重新跑转换脚本确认classes只有smoke并检查 txt 第一列是否都是 0。现象可视化时框全偏了。原因XML 里size的宽高和实际图片尺寸不一致常见于图片被裁剪过但 XML 没更新。解决用cv2.imread读实际尺寸和 XML 里的width/height对比不一致的样本直接剔除。5.2 路径与文件类问题现象训练报No images found。原因smoke.yaml里的path是相对路径但训练时工作目录变了。解决改成绝对路径或者确认在yolo上级目录执行命令。现象标签文件有但图片没复制过去。原因图片扩展名是.JPG大写脚本只匹配了小写。解决复制时用os.path.splitext后统一转小写再匹配或者直接遍历图片目录建映射。5.3 显存与训练类问题现象CUDA out of memory。原因batch或imgsz太大。解决先降batch到 8再降imgsz到 512或者用yolov8n而不是s以上模型。如果还不行开ampFalse关混合精度但会慢。现象训练到一半 loss 变nan。原因学习率太高或数据里有异常值。解决加lr00.001并检查 txt 里有没有nan或超大数值转换时加max(0, min(1, value))裁剪。5.4 评估类问题现象mAP很高但实际测试漏检多。原因验证集和训练集分布太像或者按图片随机切导致同一场景泄漏。解决按场景或人物切分确保验证集有独立场景。另外抽烟检测里手部遮挡烟头很常见评估时单独看小目标召回率别只看总体mAP。6. 进阶技巧用这份数据做半自动标注与模型迭代这份数据除了直接训练还能当“预标注器”用。我一般会先用它训一个初版模型然后拿这个模型去推理新视频帧把置信度高的框导成 XML人工只修错的标注效率能翻倍。具体做法用yolo detect predict输出 txt再写个反向脚本把 txt 转回 XML格式和原始一致这样新标注能和旧数据合并。import cv2 def yolo_to_xml(img_path, txt_path, out_xml, cls_names): img cv2.imread(img_path) h, w img.shape[:2] lines open(txt_path).read().strip().split(\n) xml fannotationfilename{img_path.split(/)[-1]}/filename xml fsizewidth{w}/widthheight{h}/heightdepth3/depth/size for line in lines: if not line: continue c, xc, yc, bw, bh map(float, line.split()) xmin int((xc - bw / 2) * w) ymin int((yc - bh / 2) * h) xmax int((xc bw / 2) * w) ymax int((yc bh / 2) * h) xml fobjectname{cls_names[int(c)]}/name xml fbndboxxmin{xmin}/xminymin{ymin}/ymin xml fxmax{xmax}/xmaxymax{ymax}/ymax/bndbox/object xml /annotation open(out_xml, w).write(xml)参数说明cls_names和训练时一致xc/yc/bw/bh是归一化值乘回宽高得到绝对坐标。这个反向脚本我用了半年配合labelImg修框比从零标快太多。验证方法拿 50 张新图先模型预标再人工修统计修改率低于 20% 就说明模型可用了。从那以后我每次拿到新场景数据都先跑一遍预标注再动手省下来的时间够多训两轮。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。