
简介海康拍摄的方便面调料正反目标检测数据集面向目标检测与工业质检场景的开发者解决调料包正常放置one与反向异常two的自动识别问题适用于食品包装质量检测、自动化分拣等实际生产场景。数据集共904个文件包含441张JPG现场图片、442个TXT标签文件及21个XML标注文件压缩包约758.95MBTXT标签可直接用于YOLO系列训练XML文件便于VOC格式转换满足不同框架的使用需求。所有图片均由手动标注作者使用YOLOv8训练后mAP可达90%左右可直接复现精度、训练自定义模型也可作为深度学习课程的检测项目数据集。目前已有109人学习下载适合需要高质量工业小目标数据的算法工程师、科研学生及竞赛团队若需进一步增强数据规模可配合作者的其它增强数据集使用便于扩充训练样本、提升泛化能力。 去年我在一条方便面生产线上蹲了整整两天就为了搞清楚一件事流水线上那堆调料包到底有没有老老实实按规定的方向放进面桶。正常方向放进去的现场叫“one”反过来放的就叫“two”。别小看这个动作调料包一旦反了消费者撕包装的时候会发现封口方向不对甚至直接把料包撕破货架上一整批都得返工。光电传感器能测“有没有”但测不了“朝哪边”所以只能用视觉检测。这个项目就是典型的工业目标检测落地场景海康工业相机拍照算法判断每一包调料的方向再把结果送给产线执行机构剔除异常品。写这篇东西的初衷是想把从数据采集、标注、训练到部署的完整链路拆开讲一遍。很多朋友一提目标检测就想到自动驾驶、想到COCO大场景其实工业产线上的小任务才是真正高频、高价值、也最考验细节的场景。不管你是做视觉算法的工程师还是正在学YOLO训练自己数据集的同学这条链路里的坑和经验基本都是通用的。1. 项目背景与整体方案设计1.1 为什么“方向识别”必须靠视觉方便面调料包在进入面桶前生产线会通过振动盘和输送带把料包整理成固定姿态但二次转运、下料撞击都会导致部分料包翻转。调味包本身是软包装正面有印刷文字和图案背面通常是光面或只有简易说明反过来后视觉特征差异明显可机器又不能去摸。传统方案里有人尝试用光纤传感器配合反光贴纸识别但调料包封口是热压纹、材料半透明稳定触发率撑死到90%漏检一个就是客诉。用视觉做方向识别本质上是把“有无”检测升级为“姿态”检测核心逻辑是先定位图像里有没有调料包再判断这个包当前是正面还是反面。落到技术栈上就是目标检测二分类——这也是我最终选择YOLO系模型而不是纯分类网络的原因。纯分类网络需要目标已经被裁剪到画面中心而产线上相机视野里可能同时出现2到3个料包位置还不固定检测头能同时完成“找出来”和“分方向”两件事。1.2 采集方案的选型逻辑硬件选型上有几个关键决定。相机用了海康的500万像素面阵工业相机帧率大概能跑到30fps完全能覆盖产线每分钟60包的节拍。镜头选的是12mm定焦工作距离固定在400mm左右视野刚好能框住输送带上两个料包的间距。光源是重中之重调料包表面是铝箔复合膜反光严重我用的是低角度条形光源让光线尽量沿着包装表面滑过去这样既能拍清印刷图案又能压住大面积镜面反射。如果光源角度不对反光区域会让模型产生严重的误检。这里有一个容易被忽略的经验工业现场跟实验室不一样环境光不是恒定的。白天工人开窗、晚上日光灯频闪都会影响图像质量。所以我在采集前先把产线实际光照条件摸了一遍用相机SDK里的自动曝光做基准再手动锁定曝光时间和增益保证每一帧图像的亮度和对比度都维持在相同水平。数据一致性是这类项目成功的前提比算法本身重要得多。1.3 为什么标签要叫 one 和 two很多人会问标签叫 normal 和 abnormal 不是更直观吗这背后其实是跟PLC对接的约定。在产线逻辑里PLC需要的是数字信号——0还是1而现场工人的习惯说法就是“正着放是one反着放是two”。如果算法侧输出一个字符串abnormal还得在中间层做一次映射才能变成电信号直接定义成 one 和 two从模型输出到PLC信号只隔了一层极薄的转换逻辑排错的时候也容易对应上。另外从模型训练角度看one 和 two 是语义对等的两个类别没有“异常”这类隐含的标签偏置。把反放定义为“two”而不是“abnormal”会让损失函数对待两类样本更加平等避免了模型天然倾向于学习“正常”而轻视“异常”的问题。如果你接过工业项目就会发现这种看似随意的命名习惯往往藏着现场工程师的实战智慧。2. 数据集构建这一类项目最耗时也最关键的环节2.1 采集设计宁多勿少覆盖一切“正常变化”我在现场采集了大约一周的图像素材按8:1:1划分成训练集、验证集和测试集。采集时不是简单架好相机一直录像而是刻意制造变化去覆盖模型在线上会遇到的各种情况。比如调料包经过输送带时会有轻微的前后滑动、左右偏移还有极少数料包会翘起一角这些都要拍进去。更重要的是不同批次的调料包印刷油墨深浅会有差异我让现场工人帮忙攒了三个批次的料包确保数据集里颜色、对比度都有浮动空间。有一个细节我觉得值得单独提出来产线启动的前半小时设备会轻微热胀冷缩导致输送带抖动比平时大。我特意选了早上刚开机、午休后重新启动、下午稳定运行三个时段去采集把机械抖动造成的虚化、位移也当作“正常情况”收进数据集。这种做法可以大大提升模型在真实环境下的鲁棒性比事后在算法里加各种图像增强更直接。2.2 标注规范与质量把控标注工具用的是LabelImg一类标成 one一类标成 two。标注框的规范要求是紧贴调料包主体但要把热压封边留出约2个像素的边距不要把封边区域圈进来。原因在于封边的热压纹路在图像里有一圈不规则的边缘纹理如果标注框太紧贴模型会去学习这些纹理特征一旦换了一批包装材料这些纹理变化了模型精度就会出现肉眼可见的下降。标注完成后我建议做一次二次质检重点看三类问题有没有标错的类别one和two搞反、有没有框得明显过大或过小、有没有漏标低对比度的反面包体。这一步虽然枯燥但直接决定模型精度的天花板。我个人的经验是标注质量的权重比标注数量更高500张精标图训练出来的模型往往比1500张粗标图的效果更可靠。为了节省时间可以先让两个人各自标一遍再对比不一致的地方逐张确认。2.3 类别不均衡与“小目标”问题采集初期我数了一下正常方向one的样本量大概是反向two的三倍这是产线本身的分布决定的——正常方向本来就是主流。如果不处理模型会偏向预测为one在评估指标上看着还可以实际一上线反向漏检率就暴露了。我的处理办法是先把two类的样本通过采集补到one类样本量的70%以上剩余差异在训练时通过损失函数的类别权重去平衡不采用简单的过采样复制防止过拟合。另外这个场景还存在一定程度的小目标问题。我的相机视野里单个调料包大约占40x40到60x60像素属于中小目标。YOLOv8的默认检测头对这类目标能较好地处理但如果你的相机架得远、视野更大目标像素低于32x32时就要考虑启用额外的小目标检测层如P2层。判断标准也很简单把训练集的标注框尺寸统计一下如果大量目标的像素尺寸低于输入尺寸的10%建议改动检测头结构。3. 模型训练与目标检测评价指标3.1 YOLOv8配置与训练环境我这里选的是YOLOv8n因为项目部署在工控机上只有一块中端GPU推理延迟要求控制在100ms以内nano版精度够用并且速度最快。如果现场有更强的算力比如带TensorRT加速的显卡可以换YOLOv8smAP大约能再提升2到3个百分点。训练前要写yaml配置文件我习惯把数据路径和类别定义都放在一个文件里方便不同环境之间迁移。# dataset.yaml path: /data/kebiao_dataset train: images/train val: images/val test: images/test nc: 2 names: 0: one 1: two训练命令相对固定重点关注几个参数。epochs我设成300patience设30来做early stop避免后期过拟合imgsz设640batch size根据显存调到16。关于“需要GPU吗”这个问题训练阶段最好有一块NVIDIA显卡哪怕是GTX 1660级别的老卡也能训练小模型但推理部署阶段不一定如果压不住延迟可以用TensorRT在GPU上跑也可以把模型转换到NVIDIA Jetson这类边缘设备上做前向计算。3.2 不看mAP你先要看这五个数字目标检测训练过程中评价标准很多人上来就盯mAP但工业场景我更看重几个具体的数字precision、recall、mAP50、mAP50-95和F1-score。这里解释一下precision是模型检测出的结果里真正正确的比例recall是真实样本里被模型找回来的比例mAP50是IoU阈值取0.5时的平均精度mAP50-95则是把IoU阈值从0.5一路加到0.95取平均更严格地衡量框的定位精度。在我的项目里反向类别two的recall是最关键的指标。漏掉一个反向料包它会直接流到下一道工序变成客诉而多标一个“反向”假阳性最多就是把正常料包多剔除一次造成一点物料损失。所以训练结束我先看confusion matrix重点确认two这一类有多少被预测成了one。如果模型倾向于“和稀泥”我会适当增加two类别在损失函数里的权重让模型更愿意往反方向猜。3.3 数据增强的“反方向陷阱”这里必须分享一个新手容易踩的坑对方向敏感的任务数据增强不能乱开。YOLO默认会做水平翻转但在这个任务里水平翻转会让调料包上的文字镜像一个正向的包翻转后看起来就像反向——类别标签却还是one。这等于直接在训练集里注入噪声模型学到的特征会被严重干扰。我最终的增强配置是关闭水平翻转和垂直翻转保留轻微的光照变化、小幅度的平移和缩放、不超过10度的旋转。10度以上的旋转也会改变方向判断的语义因为一旦旋转角度过大包装上的文字方向已经超出了classifier能容忍的范围。这段经验拿小本子记下来任何涉及“朝向”识别的检测任务都适用包括瓶子正反、PCB板元件方向、药板泡罩正反等。4. 实操过程与部署联调4.1 训练结果与阈值调整实操我的模型在验证集上的mAP50最终到0.982mAP50-95在0.91左右precision和recall分别到了0.99和0.98。只看数字确实漂亮但真正上线前还需要做一件事确定置信度阈值。模型输出的置信度只是概率你要根据现场对precision和recall的容忍程度去卡一个阈值。如果阈值设0.5会发现偶尔有置信度0.4的误检如果把阈值调到0.85漏检率会上升。最终我通过遍历阈值画出precision-recall曲线选了曲线上F1最高的点作为默认阈值同时给two类别单独设了一个略低的阈值因为它的漏检代价更高。这个调阈值的过程没用现成工具就是写脚本批量跑验证集然后统计不同阈值下的误检和漏检数量再用现场拍的300张连续视频帧做二次验证。别怕土工业项目里最土的方法往往最可靠。4.2 模型导出与产线联动训练好的模型要导出成部署格式。我在工控机上用TensorRT把模型转换成了engine文件推理时间从大约30ms压到了12ms。这里提醒一下TensorRT对网络层的支持比较挑版本先用ONNX导出再用trtexec工具转engine如果遇到算子不支持一般把opset版本调低就能解决。真正跟产线联动比训练模型麻烦得多。相机用海康SDK采集图像后经过一个用C写的推理服务把检测结果通过Modbus TCP发给PLC。PLC定义一个地址存当前检测状态0表示未发现料包1表示发现正常方向one2表示发现反向two。PLC收到2后会在料包到达剔除工位时触发气吹把反向包吹出产线。这里要强调一个细节剔除动作有个延时需要按输送带速度计算剔除位置否则你吹掉的是后面的正常包。我当时算了一下输送带速度是每秒0.5米相机到剔除气嘴的距离是1.2米所以要在检测到目标后约2.4秒才触发剔除这个时间差是通过PLC的定时器实现的。5. 常见问题与排查技巧实录5.1 高频问题速查问题现象可能原因排查步骤反向料包漏检严重two类recall偏低检查类别权重、补充反向样本、单独调two阈值误检率高频繁吹掉正常包阈值过低或数据增强过度调高置信度阈值、检查是否开了翻转增强同一料包出现两个检测框NMS阈值不合适降低NMS的IoU阈值如从0.5调到0.3光照变化后精度骤降相机曝光参数不固定锁定曝光增益增加不同光照条件的训练样本GPU推理太慢模型过大或未用TensorRT换更小模型、导出engine、减少输入分辨率这些场景我基本都踩过特别是同一个料包出两个框的问题一开始我以为模型学坏了后来发现是NMS没把两个重叠框合并因为调料包的印刷图案对比度太高模型在两个局部区域都输出了高置信度框。调整NMS阈值后问题立即消失。5.2 我踩过的三个“教科书外”的坑第一个坑是模型在实验室里一切正常一上产线就频繁误检。排查到半夜发现是因为产线背景里有一截工人工位的蓝色反光条被模型学成了“调料包”的特征。这让我意识到数据集里一定要包含产线本身的背景负样本。我后面专门采集了500张没有料包的纯背景图放在训练集里一起训练模型才把“背景”和“料包”彻底分开。第二个坑是关于类别标签的现场工人换班后有人把反向料包临时放在了“two”的存储箱里导致我采集素材时混入了几张实际是one却放在two目录下的图。这就是典型的脏标签问题。后来我加了二次质检流程对每一个参与训练的样本做一次特征嵌入可视化把那些聚在类间边缘的样本抽出来人工复查把脏标签清掉。第三个坑是相机安装角度变动。调试时相机支架被物料车撞了一下视角歪了大约3度本来以为误差不大结果验证集上的mAP直接掉了2个点。从那以后我只能反复跟现场强调相机安装后必须做物理锁定并用一张标定板做基准每次巡检时拍一张对比畸变和位姿有没有变化。机器视觉项目里机械结构的稳定性往往比算法本身更影响结果。6. 后续还可以怎么扩展这个项目做到这个程度已经能稳定跑产线了但说实话它还有很多值得扩展的空间。比如调料包是透明的、半透明的或者表面带褶皱等复杂状态当前模型表现会不稳定可以尝试用旋转框检测用mmrotate这类框架识别带角度的目标能直接输出调料包的偏转角度而不仅仅是类别。另外如果产线要同时检测多种料包可以在数据集里增加更多类别把不同料包类型也区分开一个模型完成多种物料的检测。我在实际部署中还发现把模型输出的置信度做成一个折线图投到产线大屏上让工人随时能看到当前模型的“心情”比出了错再复盘要有效得多。其实这类项目最终的价值不在于把某个模型训到多高精度而在于让现场人员信任这套系统愿意让它在产线上长期运行。数据、算法、部署、维护每一环都稳住了这个目标检测项目才算真正落地。本文还有配套的精品资源点击获取