ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

手机侧边缺陷检测数据集实战:VOC与YOLO双格式小样本训练指南

手机侧边缺陷检测数据集实战:VOC与YOLO双格式小样本训练指南 1. 这个数据集到底能干什么智能手机侧边缺陷检测说白了就是给手机中框、侧边按键、卡托槽、Type-C开孔这些位置做“体检”。产线上手机外壳经过冲压、CNC、阳极氧化、喷砂、高光倒角等十几道工序之后侧边最容易出现划痕、碰伤、毛刺、漏白、异色这些毛病。人眼在流水线上盯久了会疲劳漏检率波动很大所以用视觉方案替代人工目检是这几年消费电子制造里非常确定的一个方向。我手上这个数据集规模是288张图标注格式同时给了VOC和YOLO两套类别一共5类。这个体量放在工业缺陷检测里属于“小样本起步包”不是那种动辄几万张的通用数据集。它的价值在于你可以用它快速跑通一条从数据加载、格式转换、模型训练到推理验证的完整链路验证你的检测方案在手机侧边这种细长、高反光、缺陷对比度低的场景下到底能不能work。适合谁用一是刚接触工业缺陷检测、想找个真实场景练手的算法同学二是产线视觉工程师想评估YOLO系列在自己工位上的可行性三是做数据标注和数据集构建的人可以参考它的类别划分和标注粒度。需要提前说清楚288张图训练出来的模型直接上产线是不现实的它的定位是原型验证和流程打通。真正落地需要在这个基础上做数据扩充、难例挖掘和产线实拍补充。但如果你连这288张都跑不明白后面加数据也是白搭。2. 数据集结构与类别设计拆解2.1 五类缺陷的划分逻辑标题里只说了“5类别”没有展开具体是哪五类。结合手机侧边缺陷检测的行业常见实践这五类大概率落在以下几个方向划痕scratch、碰伤/压伤dent、毛刺burr、漏白/露底exposed base material、异色/脏污discoloration。我之所以这样推断是因为手机侧边缺陷在质检标准里基本就是按“外观形态成因”来分类的划痕和碰伤是机械损伤毛刺是加工残留漏白是阳极氧化或喷涂覆盖不全异色是氧化或污染导致。这里有个关键点类别划分不是越细越好。我见过有人把划痕又分成横向划痕、纵向划痕、斜向划痕结果每类样本只有十几张模型根本学不动。288张图分5类平均每类不到60张这已经是小样本的极限了。所以这个数据集的类别设计应该是做了合并的把形态相近、成因相近的归到一类保证每类有足够的样本量支撑训练。2.2 VOC与YOLO双格式的实际意义VOC格式是XML每张图对应一个XML文件里面记录了图片尺寸、每个目标的bbox坐标xmin,ymin,xmax,ymax和类别名。YOLO格式是TXT每行一个目标格式是class_id x_center y_center width height坐标全部归一化到0到1之间。为什么同时给两套因为不同框架吃不同格式。你如果用PyTorch自带的检测框架或者早期的一些开源项目可能直接读VOC如果用Ultralytics的YOLOv5/v8/v11它要求YOLO格式的TXT加一个data.yaml。两套都给省去了你自己写转换脚本的麻烦。但我要提醒一句拿到手之后一定要做一次一致性校验确认XML和TXT里的目标数量、类别对得上。我遇到过转换脚本把类别ID映射搞错的情况比如把“划痕”和“碰伤”的ID写反了训练出来的模型混淆矩阵会非常奇怪。2.3 288张图的分布与潜在偏差288张图如果按训练集:验证集:测试集7:2:1来分训练集大概200张验证集58张测试集30张。这个划分下验证集和测试集的样本量都偏少评估指标的置信区间会比较宽。我的建议是第一轮先用全部数据做交叉验证比如5折这样每张图都有机会出现在验证集里能更充分地利用这288张图。等模型结构调得差不多了再固定一个划分做最终评估。另外要注意类别分布是否均衡。如果某一类只有20张而另一类有80张训练时会出现类别不平衡。处理办法有几个一是用YOLO训练时的cls损失权重调整二是对少样本类别做数据增强旋转、翻转、亮度扰动、加噪声三是在验证时看每类的AP而不是只看mAP。我个人的习惯是先把每类的样本数统计出来画个柱状图心里有数再决定增强策略。3. 从VOC到YOLO格式转换与数据校验实操3.1 转换脚本的核心逻辑虽然数据集已经给了两套格式但你还是需要理解转换过程因为后续做数据增强或者合并其他数据集时格式转换是绕不开的。VOC转YOLO的核心公式x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height类别ID需要你自己维护一个类别到ID的映射表比如{scratch:0, dent:1, burr:2, exposed:3, discoloration:4}。这个映射表一旦确定训练和推理必须保持一致否则类别名会错乱。下面是一个我常用的转换脚本骨架用Python写依赖xml.etree.ElementTree和osimport xml.etree.ElementTree as ET import os classes [scratch, dent, burr, exposed, discoloration] class_to_id {c: i for i, c in enumerate(classes)} def convert_voc_to_yolo(xml_path, txt_path, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in class_to_id: continue bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{class_to_id[cls_name]} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(txt_path, w) as f: f.write(\n.join(lines))注意坐标归一化后要保留6位小数YOLO训练时对精度不敏感但保留足够位数能避免累积误差。另外要处理边界情况如果bbox超出图片范围要clip到[0,1]之间否则训练时可能报错。3.2 数据校验的四个必查项拿到数据集后别急着开训先做四件事第一检查图片和标注文件是否一一对应。有时候会有图片没有XML或者XML没有图片。写个脚本遍历两个目录找出差集。第二检查标注框是否越界。用OpenCV读图片拿到实际宽高和XML里的size字段对比如果不一致说明标注时用的尺寸和实际图片尺寸对不上需要重新映射。第三可视化抽查。随机抽20张图把bbox画上去人眼看一遍。这一步能发现很多脚本查不出来的问题比如框画歪了、类别标错了、漏标了。我一般用matplotlib或者cv2.rectangle快速画图存到一个文件夹里翻着看。第四统计每类样本数和每张图的平均目标数。如果某张图有几十个目标可能是标注时把整条划痕拆成了很多小段这种标注方式对检测模型不友好需要考虑合并。提示数据校验这一步花的时间会在训练阶段加倍省回来。我见过太多人跳过校验直接训结果loss不降回头查数据发现一半的标注是错的。4. YOLO训练配置与参数调优4.1 模型选型为什么从小模型开始288张图5个类别我强烈建议从YOLOv8n或者YOLOv11n这种nano级别开始。原因很简单数据量小大模型参数量多很容易过拟合。nano模型参数量在300万左右特征提取能力对于侧边缺陷这种纹理和边缘特征明显的任务已经够用。如果你用YOLOv8x参数量60多M在288张图上训练训练集loss能降到很低但验证集mAP可能不升反降。等nano模型跑通了mAP到了一个瓶颈再考虑换s或m模型同时配合更强的数据增强和正则化。这是一个渐进的过程不要一上来就上大模型。4.2 输入尺寸与锚框设置手机侧边缺陷的特点是“细长”。划痕可能是一条几十像素长、几个像素宽的线碰伤可能是一个小圆点。如果输入尺寸设成640x640原图缩放后细长缺陷可能只剩几个像素特征非常弱。我的建议是如果原图分辨率高比如2000x1500以上可以尝试用1280的输入尺寸或者用切片推理SAHI的方式把大图切成小块分别检测再合并。锚框方面YOLOv8/v11默认是anchor-free的不需要手动设锚框但如果你用YOLOv5需要根据你的数据集聚类生成锚框。用kmeans对训练集的bbox宽高做聚类k取9能得到适配你数据的锚框尺寸。这一步对细长缺陷的召回率影响很大。4.3 数据增强策略小样本训练数据增强是重中之重。我常用的增强组合MosaicYOLO自带的四图拼接能显著增加背景多样性但对细长缺陷可能造成截断建议训练后期关闭。随机旋转±15度以内手机侧边缺陷方向不固定旋转能增加方向鲁棒性。亮度/对比度扰动±20%模拟产线光照波动。高斯噪声轻微噪声模拟传感器噪声。随机擦除小概率擦除部分区域强迫模型学习局部特征。注意不要用垂直翻转因为手机侧边的上下方向是有语义的比如按键位置翻转后不符合真实分布。水平翻转也要谨慎如果侧边有左右不对称的结构翻转会引入错误标签。4.4 训练超参设置与监控一个我常用的起步配置参数值说明epochs200小数据集需要多轮batch16根据显存调整imgsz640起步值可尝试1280lr00.01初始学习率lrf0.01最终学习率系数momentum0.937SGD动量weight_decay0.0005权重衰减warmup_epochs3预热轮数patience50早停耐心值训练过程中重点看三个曲线训练loss、验证loss、mAP50。如果训练loss降但验证loss升说明过拟合需要加增强或减模型。如果两个都不降说明学习率或数据有问题。mAP50在验证集上的波动会比较大因为验证集样本少建议看平滑后的趋势。注意YOLO训练时默认会做letterbox填充如果你的图片长宽比差异大填充区域会很多有效信息被压缩。可以考虑用rect模式训练按batch内最大长宽比填充减少无效区域。5. 缺陷检测的难点与排查技巧5.1 高反光表面的成像问题手机侧边通常是金属材质阳极氧化后表面有光泽打光不当会产生镜面反射缺陷被高光淹没。这个问题在数据集里可能已经体现为某些图片过曝或过暗。训练时模型会学到这些成像特征但换一个光照条件就失效。解决办法一是在数据增强里加入gamma变换模拟不同曝光二是在推理阶段用多角度打光或者偏振片从硬件上改善成像。软件层面能做的有限但至少要让模型见过各种光照下的缺陷形态。5.2 小目标漏检的排查如果训练完发现小划痕、小碰伤漏检严重按以下顺序排查第一看标注框是不是太小。如果bbox只有几个像素YOLO的下采样倍率32倍会导致特征图上只剩不到一个像素根本学不到。这种情况要么提高输入分辨率要么用更浅的特征层检测。第二看正样本匹配。YOLO的标签分配策略对小目标可能不友好可以尝试调整overlap_mask或者用copy_paste增强把小目标复制到其他位置。第三看置信度阈值。推理时默认conf0.25小目标的置信度往往偏低可以降到0.1试试但会引入误检需要权衡。5.3 类别混淆的解决思路划痕和碰伤在视觉上有时很难区分都是线条状或点状。如果混淆矩阵显示这两类互相误判严重说明特征区分度不够。可以尝试一是在标注规范上重新定义比如按深度或宽度阈值来分二是用更强的backbone提取纹理特征三是加一个分类头做二次判断检测框出来后裁剪出来送分类网络。5.4 常见问题速查表问题现象可能原因排查方向loss不下降学习率过大/过小尝试1e-2到1e-4mAP为0类别映射错误检查data.yaml和TXT验证loss震荡batch过小增大batch或梯度累积某类AP极低样本太少增强或过采样推理速度慢输入尺寸过大降低imgsz或换nano模型框重叠严重NMS阈值不当调整iou_thres背景误检多负样本不足加入纯背景图6. 从原型到产线的扩展思路288张图跑通之后下一步就是数据扩充。产线实拍数据是最有价值的因为分布和训练集一致。采集时要注意覆盖不同光照、不同批次、不同工位。标注环节建议用半自动方式先用当前模型预标注人工修正这样效率比纯手工高很多。模型迭代方面可以引入主动学习把模型置信度低的样本挑出来优先标注用最少的标注量换取最大的性能提升。另外如果产线有多个相似工位可以考虑用域适应或者联邦学习的方式让模型在不同工位间泛化。部署环节YOLO可以导出ONNX或TensorRT在边缘设备上跑。手机侧边检测通常要求实时nano模型在主流边缘芯片上能做到30FPS以上。如果精度不够可以用模型集成或者级联检测先粗定位侧边区域再在ROI内做精细检测。最后分享一个我在实际项目中的体会工业缺陷检测里数据质量比模型结构重要得多。同样288张图标注精准、类别一致的数据集比多一倍但标注粗糙的数据集训出来的模型效果好很多。所以拿到数据集第一件事不是调参是把数据看一遍把标注问题修掉。这个时间投入回报率最高。
返回列表