灯光检测自训数据闭环:从采集标注到YOLOv8训练与部署 简介这份资源面向计算机视觉入门与进阶开发者聚焦基于YOLOv5的灯光检测任务提供一套可直接复用的自训练数据与配套工程。包内共1580个文件以696张jpg图像和630个txt标注文件构成核心数据集另含65个yaml配置、54个Python脚本、15个pt权重及若干png、xml、mp4等辅助素材压缩包约603.83MB覆盖数据采集、标注、增强到模型训练与验证的完整链路。资源同时保留TensorBoard训练日志与多版本配置文件便于读者复盘训练过程、调整超参数并对比不同规模模型的表现。已有252人学习下载适合希望掌握自训练数据流程、理解灯光目标检测实现细节并需要现成数据集与脚本快速跑通实验的读者参考。1. 灯光检测自训数据从零搭一套能跑通的闭环晚上十点车间只剩一排日光灯你手里那台相机拍出来的画面里灯管边缘发虚、反光糊成一片用网上下的通用检测模型一跑要么把灯管认成“白色长条”要么把反光当成目标。灯光检测这个场景难就难在目标本身是发光体边界靠亮度梯度定义而不是靠纹理和颜色。通用数据集里几乎没有“灯管、灯带、灯泡、灯罩反光”这类标注所以自己训练数据几乎是唯一出路。这篇笔记讲的就是怎么从拍图、标注、选模型YOLOv8 这类单阶段检测器就够用、训练到验证搭一套能复现的灯光检测闭环。适合做工业质检、智能照明、安防巡检的工程师也适合刚接触自训数据集、想拿一个真实小场景练手的人。下面按“先想清楚 → 再动手 → 再避坑”的顺序推。2. 灯光检测的数据从哪来采集、标注与增强的取舍2.1 先定检测目标再决定拍什么很多人一上来就狂拍图拍到两千张才发现标注规则没定返工重标。灯光检测的目标通常分三类灯具本体灯管、灯泡、灯带、面板灯、灯光状态亮/灭/闪烁、灯光缺陷暗区、色偏、频闪条纹。这三类的拍摄要求完全不同。灯具本体检测要的是轮廓清晰拍摄时让背景尽量暗、灯亮着边缘对比强状态检测要的是同一机位、同一曝光下拍亮和灭两组缺陷检测最麻烦需要固定曝光和固定白平衡否则你分不清是灯的问题还是相机的问题。我一般会先写一张采集清单明确机位高度、镜头焦距、曝光模式手动、白平衡手动锁定、每类目标最少多少张、是否要包含不同距离和角度。清单不写清楚后面标注和训练全是玄学。2.2 标注规则要写成文档别只存在脑子里灯光检测标注最容易翻车的地方是边界定义。灯管亮着的时候边缘有一圈光晕你标到灯管物理边缘还是光晕外沿不同人标出来能差十几个像素。我的做法是统一标到“肉眼可见的发光区域外沿”并在标注文档里放三张正例、三张反例。反例包括只标灯管不标光晕、把反光当灯、把灯罩边框算进去。用 LabelImg 或 CVAT 都行导出 YOLO 格式的 txt。每张图对应一个 txt每行是class_id x_center y_center width height全部归一化到 0~1。这里有个细节如果一张图里灯管特别长宽高比极端建议不要强行 resize 到正方形后面训练时用 letterbox 保持比例。# 目录结构建议别把所有图堆一个文件夹 dataset/ images/ train/ # 训练集图片 val/ # 验证集图片 labels/ train/ # 对应 txt val/ data.yamldata.yaml是 YOLOv8 训练时的数据描述文件内容如下path: ./dataset # 数据集根目录 train: images/train # 训练图片相对路径 val: images/val nc: 3 # 类别数按你的实际改 names: [lamp_tube, lamp_bulb, reflection] # 类别名参数说明nc必须和 names 长度一致否则训练启动就报错names里建议把“反光”单独设一类否则模型会把反光当灯后面误检很难压。2.3 数据增强灯光场景别乱用颜色抖动YOLOv8 默认开启 mosaic、HSV 抖动、翻转等增强。灯光检测里HSV 的色调和饱和度抖动要慎用因为灯的颜色暖白、冷白、彩色灯带本身就是判别特征你把色调抖一圈模型学到的颜色分布就乱了。我的习惯是保留 mosaic 和随机翻转把hsv_h调到 0.01 以下hsv_s和hsv_v保留默认或略降。亮度抖动可以保留因为实际场景曝光会有波动。另外灯光检测的小目标远处灯泡多mosaic 能提升小目标召回但也会让灯管被裁切得只剩一截标注框和实际内容对不上。如果发现验证集上小目标漏检严重先把 mosaic 关掉对比一轮别一上来就调模型结构。3. 用 YOLOv8 训练灯光检测模型配置、命令与参数3.1 环境与最小可跑命令假设你已经装好 Python 3.9 和 PyTorch直接装 ultralyticspip install ultralytics最小训练命令yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/lamp \ nameexp1逻辑说明modelyolov8n.pt是加载 COCO 预训练权重做迁移学习灯光检测数据量通常不大几百到几千张从零训容易过拟合。imgsz640是输入分辨率灯管细长的话可以试 960但显存和速度要权衡。batch16在 8G 显存上跑 640 分辨率基本安全爆显存就降到 8。device0指定第一块 GPUCPU 训练会慢到怀疑人生。训练过程中重点看三个指标box_loss是否稳定下降、mAP50是否在涨、val/box_loss和train/box_loss的差距。如果 train loss 一直降、val loss 先降后升就是过拟合减 epochs 或加数据。3.2 灯光检测必调的四个参数参数建议值为什么这么设imgsz640 或 960灯管细长分辨率太低边缘糊conf0.25 起调灯光反光误检多阈值太低全是框iou0.5~0.6灯管重叠少NMS 不用太激进lr00.01 默认迁移学习别调太大容易震荡conf是推理时的置信度阈值训练时不生效但验证和部署时直接决定你看到多少框。灯光检测里反光误检是头号问题我一般从 0.25 开始逐步提到 0.4 看召回掉多少找一个误检和漏检的平衡点。3.3 训练完怎么验证别只看 mAPmAP 高不代表能用。灯光检测要额外看两件事一是按亮度分层的召回率把验证集分成“正常曝光”“过曝”“欠曝”三组分别跑一遍看 mAP二是看混淆矩阵重点看reflection和lamp_tube之间有没有大量互混。如果反光被大量认成灯管说明标注里反光样本太少或者增强把亮度抖过头了。# 验证命令 yolo detect val \ modelruns/lamp/exp1/weights/best.pt \ datadataset/data.yaml \ imgsz640 \ conf0.3跑完会在 runs 目录下生成混淆矩阵和 PR 曲线。PR 曲线里如果某一类曲线早早掉到 0说明该类样本太少或太难优先补数据别急着换模型。4. 灯光检测自训数据的避坑与排查4.1 现象训练 loss 正常但推理全是框原因验证集和训练集曝光差异大或者 conf 阈值设太低。灯光检测里训练图如果是暗背景亮灯推理时遇到白天场景模型会把所有高亮区域当灯。解决采集时就把不同光照条件覆盖进去至少包含白天、夜晚、开灯、关灯四种组合。推理时先把 conf 提到 0.4 以上再逐步降。4.2 现象灯管被切成两段检出不完整原因mosaic 增强把长灯管裁断了或者 anchor 尺寸和灯管宽高比不匹配。YOLOv8 是无锚框的但特征图感受野对极端宽高比仍然不友好。解决关掉 mosaic 再训一轮对比如果还断把 imgsz 提到 960让灯管在输入里占更多像素。标注时确保整根灯管一个框不要拆成两段标。4.3 现象反光被反复误检成灯原因反光和灯在亮度上接近标注时没把反光单独设类模型学不到区分。解决把反光单独标一类并在 data.yaml 里加进去。训练后如果反光类 mAP 很低说明样本不够专门补拍反光场景至少 100 张起步。4.4 现象换一个车间模型直接失效原因过拟合到特定背景和灯管型号。灯光检测的泛化性比通用目标检测更差因为发光体的外观受相机参数影响极大。解决训练时加入不同色温、不同相机的图部署前用目标车间的图做一次小样本微调哪怕只有 50 张也能明显拉回效果。4.5 现象训练速度慢GPU 利用率低原因数据加载是瓶颈图片太大或磁盘 IO 慢。灯光检测图如果都是 4K 原图dataloader 会成为瓶颈。解决训练前把图统一缩到长边 1280 以内用cacheTrue把图缓存到内存数据量小于内存时。如果还慢检查是不是在机械硬盘上跑换 SSD。5. 把灯光检测模型推到产线量化、导出与阈值调优训练出 best.pt 只是第一步真正上线还要过导出和阈值调优两关。YOLOv8 支持导出 ONNX、TensorRT、OpenVINO 等格式产线常用 ONNX 或 TensorRT。导出命令yolo export \ modelruns/lamp/exp1/weights/best.pt \ formatonnx \ imgsz640 \ simplifyTruesimplifyTrue会做一层图优化去掉冗余算子ONNX 推理能快 10% 左右。导出后别急着上产线先用几张典型图对比 PyTorch 和 ONNX 的输出框确认没有精度损失。我遇到过导出后框整体偏移几个像素的情况原因是 letterbox 的 padding 计算在导出时被简化了解决办法是导出时显式指定imgsz和原图一致的比例或者在预处理里自己对齐。阈值调优是最后一步也是最容易被忽略的一步。产线上误检和漏检的代价不一样灯光缺陷检测里漏检一个暗区可能比误检十个更严重。我的习惯是画一条 conf-召回/误检曲线横轴 conf 从 0.1 到 0.9纵轴分别画召回率和每张图平均误检数找召回率还在 95% 以上、误检数开始抬头之前的那个点。这个点通常不在 0.25也不在 0.5而是落在 0.35 到 0.45 之间具体看你的数据。还有一个技巧如果同一根灯管在连续帧里被反复检出可以在后处理里加一个简单的帧间去重比如同一位置 3 帧内只保留置信度最高的框。这个逻辑用 Python 十几行就能写比重新训模型划算得多。最后说个我自己的教训灯光检测项目里我花在调模型上的时间大概只占三成剩下七成全在数据采集和标注规则上。一开始总想着换个更强的模型就能解决误检后来发现把反光单独标一类、把曝光锁死比换任何模型都管用。如果你也在做灯光检测先把数据闭环跑通再谈模型优化。希望帮到你。本文还有配套的精品资源点击获取