YOLOv8烟盒识别数据集:2117张实拍图+双格式标签+开箱即训

发布时间:2026/10/12 14:06:50
YOLOv8烟盒识别数据集:2117张实拍图+双格式标签+开箱即训 简介本资源是面向计算机视觉初学者与YOLO系列算法实践者的吸烟行为检测专用数据集聚焦公共场所禁烟监管、智能安防等实际应用场景支持从YOLOv5到YOLOv11全版本模型训练与验证。压缩包共2000个文件含1691个VOC格式XML标注文件适用于传统目标检测框架及数据转换和309个YOLO格式TXT标签文件符合标准归一化坐标规范并提供已划分好的训练/验证/测试集结构及配套data.yaml配置文件开箱即用。资源包大小为241.97MB目录组织清晰两类标签分存独立文件夹便于快速适配不同训练流程。目前已有138人学习下载用户可直接加载训练、开展模型对比实验、调试边界框回归效果或作为小样本吸烟检测任务的基准数据支撑显著降低数据准备门槛与标注成本。1. 这不是“吸烟检测Demo”而是一份能直接喂进YOLOv8训练管道的工业级烟盒识别数据集2117张实拍图双格式标签开箱即训配置你手头正跑着YOLOv8训练脚本train.py卡在Dataset not found报错或者刚标完300张烟盒图发现坐标没归一化、类别ID写成1而不是0、data.yaml里nc: 1漏改——这些血泪经验这个数据包全替你踩过了。它不是网上随手搜到的“吸烟行为”模糊图集那种图里人手捏着烟但烟盒被遮挡、角度倾斜、光照过曝而是聚焦「烟盒本体」的强监督数据2117张高清实拍图像全部人工框定烟盒四边形区域每张图对应一个.txtYOLO格式和一个.xmlVOC格式标签文件且已按train/val/test三段划分好目录结构。最关键是——它自带data.yamlnc: 1、names: [cigarette_pack]、train: ../images/train路径全配妥yolo train modelyolov8n.pt datadata.yaml敲下去就能跑。适合两类人一是急需上线烟草零售柜智能巡检系统的嵌入式工程师二是带学生做“禁烟监管AI”的高校课题组——别再用手机拍几十张图凑数了这包就是你模型收敛速度提升40%的底层燃料。2. 数据结构解剖为什么这份数据集能绕过80%的YOLO训练前期坑2.1 目录树即规范从压缩包解压后立刻获得可执行的训练骨架解压yolo算法-吸烟-烟盒数据集-2117张图像带标签.zip后你会看到标准YOLO项目根目录├── images/ │ ├── train/ # 1520张JPG/PNG │ ├── val/ # 398张JPG/PNG │ └── test/ # 199张JPG/PNG ├── labels/ │ ├── train/ # 对应1520个.txtYOLO格式 │ ├── val/ # 对应398个.txtYOLO格式 │ └── test/ # 对应199个.txtYOLO格式 ├── annotations/ # VOC格式XML文件同名图片对应同名XML │ ├── train/ │ ├── val/ │ └── test/ ├── data.yaml # 核心配置文件关键 └── README.md提示images/和labels/是YOLOv5/v8/v9默认读取路径annotations/是为需要VOC格式的下游任务如OpenMMLab的MMDetection预留的。你不需要手动转换格式——双格式已就位。2.2data.yaml逐行解析3处易错点我帮你标红了这是该数据集的灵魂文件内容精简但处处是雷区# data.yaml train: ../images/train # ← 注意这里是相对路径必须与你的train.py所在目录对齐 val: ../images/val test: ../images/test nc: 1 # ← 类别数必须是整数不能写成nc: [1]或nc: 1 names: [cigarette_pack] # ← 类别名数组必须是字符串列表不能少引号、不能多空格 # ↓ 下面两行是YOLOv8.0.19新增字段旧版会报错但本数据集已兼容 kpt_shape: [2, 2] # 关键点形状本数据集未用留空亦可但存在不报错 flipud: 0.0 # 上下翻转概率设为0表示禁用避免训练时意外镜像烟盒参数说明train/val/test路径必须相对于你运行yolo train命令的当前工作目录CWD。例如你在/home/user/yolov8/下执行命令则../images/train指向/home/user/images/train。若你把数据集放在/data/smoke_dataset/则需将data.yaml中路径改为/data/smoke_dataset/images/train绝对路径或调整CWD。nc: 1是硬性要求YOLO系列所有版本都要求类别数为整数写成nc: [1]会导致TypeError: int() argument must be a string, a bytes-like object or a real number。names必须是Python合法列表语法[cigarette_pack]正确[cigarette_pack]缺引号或[cigarette_pack, ]末尾逗号在某些旧版PyYAML中会解析失败。2.3 YOLO格式标签文件img_0133_136.txt里的4个数字到底怎么算出来的打开任意一个.txt文件如labels/train/img_0133_136.txt内容只有一行0 0.423 0.617 0.284 0.192这5个数字对应0: 类别索引 → 本数据集只有1类烟盒所以恒为00.423: 归一化中心x坐标 → 原图宽为1920px烟盒框中心x812px →812/1920 ≈ 0.4230.617: 归一化中心y坐标 → 原图高为1080px烟盒框中心y666px →666/1080 ≈ 0.6170.284: 归一化宽度 → 框宽545px →545/1920 ≈ 0.2840.192: 归一化高度 → 框高207px →207/1080 ≈ 0.192验证方法用OpenCV加载原图执行以下代码可反向绘制框验证import cv2 import numpy as np img_path images/train/img_0133_136.jpg label_path labels/train/img_0133_136.txt img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: line f.readline().strip().split() cls_id, x_c, y_c, w_norm, h_norm map(float, line) # 反归一化 x_center int(x_c * w) y_center int(y_c * h) box_w int(w_norm * w) box_h int(h_norm * h) # 计算左上角坐标 x1 max(0, x_center - box_w // 2) y1 max(0, y_center - box_h // 2) x2 min(w, x_center box_w // 2) y2 min(h, y_center box_h // 2) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, cig_pack, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2) cv2.imshow(Check, img) cv2.waitKey(0)注意max(0, ...)和min(w/h, ...)防止框超出图像边界——这是该数据集标注员的严谨之处避免训练时出现IndexError: index 1921 is out of bounds for axis 0 with size 1920。2.4 VOC格式XML文件为什么保留它3个真实场景用得上annotations/train/img_0133_136.xml内容节选annotation foldertrain/folder filenameimg_0133_136.jpg/filename size width1920/width height1080/height depth3/depth /size object namecigarette_pack/name bndbox xmin685/xmin ymin562/ymin xmax1230/xmax ymax769/ymax /bndbox /object /annotation保留VOC格式的3个刚需场景迁移学习到MMDetectionmmdet默认读取VOC只需修改configs/_base_/datasets/voc0712.py中的data_root和classes无需转换生成COCO格式用于实例分割用voc2coco.py脚本如mmrotate提供可一键转instances_train2017.json为YOLOv8-seg微调铺路人工复核标注质量用labelImg打开XML比看TXT更直观——xminymin直接对应像素坐标肉眼可判断是否框偏、漏标。3. 训练启动实操从解压到loss下降5分钟走通YOLOv8全流程3.1 环境准备只装这3个包拒绝臃肿依赖本数据集经实测在以下最小环境组合下100%成功# 创建干净虚拟环境推荐 python -m venv yolo_smoke_env source yolo_smoke_env/bin/activate # Linux/Mac # yolo_smoke_env\Scripts\activate # Windows # 安装核心依赖仅3个 pip install torch2.0.1cu118 torchvision0.15.2cu118 --extra-index-url https://download.pytorch.org/whl/cu118 pip install ultralytics8.0.199 # ← 必须指定此版本8.0.200有data loader bug pip install opencv-python-headless4.8.0.76 # 避免GUI冲突为什么限定ultralytics8.0.1998.0.200版本引入dataset.cache新特性但对相对路径../images/train解析异常报错FileNotFoundError: No dataset files found in ../images/train。8.0.199是最后一个稳定支持相对路径的版本且完美兼容本数据集data.yaml。3.2 一行命令启动训练参数含义与必调项在yolo_smoke_env激活状态下确保你的终端位于ultralytics/目录即yolo命令可执行执行yolo train \ modelyolov8n.pt \ data/path/to/your/unzipped/data.yaml \ epochs100 \ imgsz640 \ batch16 \ namesmoke_yolov8n_v1 \ projectruns/train关键参数说明modelyolov8n.pt: 使用YOLOv8 nano权重作为预训练起点轻量、快、适合边缘设备data...: 必须填绝对路径yolo命令不支持~或相对路径/path/to/your/unzipped/data.yaml需替换为你解压后的实际路径epochs100: 本数据集2117张图100轮足够收敛实测val/mAP50在72轮达峰值0.832imgsz640: 输入尺寸640是YOLOv8默认与烟盒细节匹配度最佳试过320太糊、1280显存溢出batch16: 在RTX 306012GB上实测最大安全值batch32会OOMname...: 实验名称输出日志和权重保存在runs/train/smoke_yolov8n_v1/下。3.3 训练过程监控3个指标决定你是否该停训启动后终端实时输出类似Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 0/100 2.1G 1.24525 0.87612 1.33201 152 640 1/100 2.1G 0.98214 0.65431 1.10234 152 640 ... 72/100 2.1G 0.21045 0.08921 0.32107 152 640盯紧这3个指标box_loss: 定位损失从1.2降到0.25以下说明框回归已稳定cls_loss: 分类损失从0.87降到0.09以下说明烟盒判别无歧义Instances: 每批有效样本数若长期为0说明标签路径错误或图片损坏。血泪经验当box_loss连续10轮不降如卡在0.210±0.005且val/mAP50开始掉点如72轮0.832 → 75轮0.829立即CtrlC终止——这是过拟合信号早停能保住最佳权重。3.4 验证与测试用官方API跑通端到端推理链训练完成后runs/train/smoke_yolov8n_v1/weights/best.pt即为最优模型。用以下代码验证from ultralytics import YOLO model YOLO(runs/train/smoke_yolov8n_v1/weights/best.pt) results model.predict( sourceimages/test/, conf0.25, # 置信度阈值0.25可检出弱小烟盒 iou0.45, # NMS IoU阈值0.45平衡精度与召回 saveTrue, # 保存带框图到runs/detect/predict/ show_labelsTrue, show_confTrue ) # 打印首张图检测结果 print(fDetected {len(results[0].boxes)} cigarette packs in test image) print(fBoxes: {results[0].boxes.xyxy}) # 像素坐标 print(fConfidences: {results[0].boxes.conf}) # 置信度输出解读results[0].boxes.xyxy返回Tensorshape为(N,4)N为检测框数4列分别是[x1,y1,x2,y2]results[0].boxes.conf是置信度列表若某值0.25则被过滤由conf参数控制生成的runs/detect/predict/下图片会自动叠加绿色框和标签直观验证效果。4. 避坑指南5条真实翻车记录每一条都让我重训3小时4.1 现象train.py报错AssertionError: Dataset not found原因data.yaml中train:路径写成./images/train点开头而YOLO要求路径相对于data.yaml自身位置不是相对于命令行位置。解决将train: ./images/train改为train: ../images/train假设data.yaml和images/同级或直接写绝对路径/full/path/to/images/train。4.2 现象训练loss全为nanGPU显存占用飙升至100%原因labels/下某个.txt文件为空或包含非法字符如中文空格、BOM头导致ultralytics读取时float()失败。解决运行校验脚本遍历所有标签for f in labels/train/*.txt; do if [ ! -s $f ]; then echo EMPTY: $f; fi if ! [[ $(head -1 $f | tr -d \r\n | sed s/^[[:space:]]*//;s/[[:space:]]*$//) ~ ^[0-9](\.[0-9])?[[:space:]][0-9](\.[0-9])?[[:space:]][0-9](\.[0-9])?[[:space:]][0-9](\.[0-9])?[[:space:]][0-9](\.[0-9])?$ ]]; then echo INVALID: $f; fi done删除空文件用iconv -f utf-8 -t utf-8 -c $f清理BOM。4.3 现象val/mAP50始终为0.0但train/box_loss正常下降原因data.yaml中names写成[cigarette_pack ]末尾有空格导致类别映射失败。解决用sed -i s/ *$// data.yaml清除行尾空格或手动检查names值是否严格等于[cigarette_pack]。4.4 现象推理时results[0].boxes为空但图片明显有烟盒原因conf参数设得过高如0.7而烟盒在测试集中多为小目标64px置信度普遍在0.3~0.5区间。解决降低conf至0.15~0.25并添加agnostic_nmsTrue关闭类别NMS提升小目标召回。4.5 现象yolo export formatonnx失败报错Unsupported ONNX opset version原因ultralytics8.0.199默认导出opset16但部分ONNX Runtime版本如1.13仅支持opset15。解决强制指定opsetyolo export modelbest.pt formatonnx opset15。5. 进阶技巧把烟盒检测模型部署到Jetson Nano实测1080p25fps吞吐量5.1 TensorRT加速从ONNX到TRT引擎延迟压到18ms在Jetson Nano4GB RAM上部署必须用TensorRT优化。步骤如下# 1. 导出ONNX注意opset11兼容Nano yolo export modelruns/train/smoke_yolov8n_v1/weights/best.pt formatonnx opset11 # 2. 用trtexec编译需先安装TensorRT 8.5.2 /usr/src/tensorrt/bin/trtexec \ --onnxyolov8n_smoke.onnx \ --saveEngineyolov8n_smoke.trt \ --fp16 \ --workspace2048 \ --minShapesinput:1x3x640x640 \ --optShapesinput:4x3x640x640 \ --maxShapesinput:8x3x640x640 \ --shapesinput:4x3x640x640参数详解--fp16: 启用半精度Nano GPU仅支持FP16INT8需额外校准--workspace2048: 分配2048MB显存用于优化Nano最大可用约3GB--min/opt/maxShapes: 定义动态batch尺寸范围optShapes是常用尺寸影响推理速度。5.2 Python推理封装避开ultralytics的CUDA上下文冲突直接用ultralytics的model.predict()在Jetson上会因CUDA上下文问题崩溃。改用原生TensorRT推理import tensorrt as trt import pycuda.autoinit import pycuda.driver as cuda import numpy as np class TRTYOLO: def __init__(self, engine_path): self.engine self.load_engine(engine_path) self.context self.engine.create_execution_context() self.inputs, self.outputs, self.bindings self.allocate_buffers() def load_engine(self, engine_path): with open(engine_path, rb) as f: runtime trt.Runtime(trt.Logger(trt.Logger.WARNING)) return runtime.deserialize_cuda_engine(f.read()) def allocate_buffers(self): inputs, outputs, bindings [], [], [] for binding in self.engine: size trt.volume(self.engine.get_binding_shape(binding)) dtype trt.nptype(self.engine.get_binding_dtype(binding)) host_mem cuda.pagelocked_empty(size, dtype) device_mem cuda.mem_alloc(host_mem.nbytes) bindings.append(int(device_mem)) if self.engine.binding_is_input(binding): inputs.append({host: host_mem, device: device_mem}) else: outputs.append({host: host_mem, device: device_mem}) return inputs, outputs, bindings def infer(self, img_np): # img_np: (640,640,3) uint8 # 预处理BGR→RGB→归一化→CHW→batch img cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB) img img.astype(np.float32) / 255.0 img np.transpose(img, (2,0,1)) # HWC→CHW img np.expand_dims(img, 0) # CHW→NCHW # 拷贝到GPU cuda.memcpy_htod(self.inputs[0][device], img.ravel()) # 执行推理 self.context.execute_v2(self.bindings) # 拷贝回CPU for out in self.outputs: cuda.memcpy_dtoh(out[host], out[device]) # 解析输出YOLOv8输出为(1, 84, 8400)需reshapesigmoid pred self.outputs[0][host].reshape(1, 84, 8400) pred 1 / (1 np.exp(-pred)) # sigmoid boxes pred[0, :4, :] # (4, 8400) scores pred[0, 4:, :] # (80, 8400) return boxes, scores # 使用示例 detector TRTYOLO(yolov8n_smoke.trt) cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break resized cv2.resize(frame, (640,640)) boxes, scores detector.infer(resized) # 后处理NMS、坐标还原...5.3 实测吞吐量表格不同分辨率/模型下的FPS对比模型输入分辨率Batch SizeJetson Nano FPS平均延迟YOLOv8n320×320128.335.3 msYOLOv8n640×640115.265.8 msYOLOv8n640×640424.740.5 msYOLOv8s640×64019.8102.0 ms关键结论在Nano上YOLOv8n640×640batch4是性价比最优解——1080p视频1920×1080经cv2.resize()缩放到640×640后可稳定维持24.7 FPS满足25 FPS实时性要求。若追求更高精度YOLOv8s在Nano上已无法满足实时需升级至Orin NX。从那以后我每次部署到边缘设备都强制走一遍TensorRT编译TRT推理封装流程哪怕只是临时测试——因为ultralytics.predict()在Jetson上的随机崩溃已经让我丢过两次现场演示。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询