资讯动态

汽车零部件实例分割数据集制作与YOLO格式实战

发布时间:2026/10/20 2:34:58 来源:尧图企业网站定制
一辆轿车密密麻麻的部件如果不能做到像素级的区分与分割能拿来做训练吗我之前做了这方面的项目核心是汽车零部件实例分割数据集的制作与实战格式采用YOLO分割格式覆盖挡风玻璃、保险杠、车灯、车轮这几大常见部件类。这篇文章把整个流程复盘出来包括数据怎么标注、掩码怎么转成YOLO格式、训练时有哪些坑以及部署时如何把模型输出还原成业务可用的轮廓。适合正在搞目标检测和实例分割、又被数据集格式卡住的人尤其是想把手头零件识别落到实际产线场景的开发者。1. 项目背景与数据集整体设计思路1.1 为什么需要一套“汽车零部件分割”专门数据集做汽车相关的视觉任务很多人第一反应是直接去公开数据集里找整车的检测框。框的粒度确实能把车找出来但一旦任务变成“挡风玻璃上的裂纹区域在哪”“保险杠变形的位置范围有多大”“车灯是否完整可见”边界框就严重不够用。边界框会把背景、车漆、甚至车身的其他部件一起圈进来后续做像素级的缺陷判断、角度测量、更换定位全都是噪声。我这次要解决的场景是后端零配件识别与拍照质检。摄像头抓拍车辆前端、侧方、尾部图像拿到画面之后需要把挡风玻璃、保险杠、车灯、车轮四类关键部件分别抠出来再交到下游做损伤分析、型号比对和装配检测。只有做到了实例分割才能把“部件本身是什么”和“部件占图像哪个区域”这两件事同时搞定为后续几何测量和纹理分析留出干净的数据面。这里我原本调研过COCO、Cityscapes等公开数据但这些数据集主要是自动驾驶视角、街景语义类别并不覆盖保险杠、车灯这类售后零配件而且标注粒度并不适应近景正拍或斜拍的产线视角。与其费力清洗改写公开数据不如按自己的业务定义做一套专门的汽车零部件实例分割数据集既能把目标类别锁定又能让标注规范和后续质检流程对齐。这套数据集的规格是图像分割项目里的第10073期也就是长期迭代数据资产中的一期类目固定、样本管理可控。1.2 数据集构成与标注方案选型本次数据集的构成如下目标类别挡风玻璃、保险杠、车灯、车轮共4类实例分割目标。标注格式YOLO格式的分割标注即每张图片对应一个文本文件记录类别id和归一化多边形坐标。采集来源车辆前脸、侧方、尾部多角度图像覆盖不同光照、不同颜色车身、不同车型轮廓。样本规模初始版本共收集、清洗并标注了约2000张有效图像其中训练集1500张、验证集300张、测试集200张。标注方案的选型上我对比了三种常见思路纯矩形框检测。速度快、标注成本低但下车身部件边界不清晰无法支撑像素级质检测量。语义分割。能区分画面中“哪些像素属于车灯”但如果同类型多实例比如两侧车灯同时出现语义分割输出的单张掩码没有区分实例的能力不满足计数和逐件分析的需求。实例分割。每个目标都有自己的独立掩码能同时做分类、位置和轮廓表示。本次任务对“左右车灯是否都完好”“前后保险杠是否都完整”这类逐实例判断有硬性要求所以实例分割是唯一合理路径。由于整体项目既要快速迭代又要和YOLO系列算法的训练流程无缝配合最终选择了“多边形标注 转YOLO格式”的方案。标注工具用常见的开源图像标注工具标注时直接闭合多边形然后通过脚本把多边形坐标归一化写入YOLO分割格式的txt文件。这个方案的优点在于一旦格式正确后续yolo训练数据加载是零成本且可视化调试非常方便任何一张图打开对应的分割标注就能直接看出掩码位置是否正确。1.3 从业务需求反推类别设计设计类别的时候不能只看部件名字要看实际下游任务怎么用。挡风玻璃除了前挡侧窗、后挡也要一并考虑。项目里我单独把“所有车窗玻璃”统一归为挡风玻璃类。保险杠分为前保险杠和后保险杠侧面小剐蹭多见于保险杠的边角如果只标矩形会混入翼子板区域。车灯包括前大灯、尾灯、转向灯等发光区域。车灯往往是多部件组合体标注时按闭合灯体轮廓处理。车轮覆盖轮毂与轮胎可见区域连线形成的整体轮廓。实际上在制造厂质检场景里前保险杠经常与中网、下格栅、雾灯框在语义上相互重叠但这种重叠关系不应左右实例分割的类别划分标注时遵循“视觉上属于同一组件”的原则。比如前保险杠的多边形包括主体外轮廓板面即使它遮挡了雾灯一半也仍然向内包含雾灯在内。把雾灯再独立标成车灯类就会产生重叠实例这会干扰训练收敛因此这里明确类别互斥同一像素只属于一个类别各实例间允许相邻不允许重叠。这部分的经验是类别定义必须写清楚而且要配有少量示例图。标注员和后续接手的开发者都理解同一个“前保险杠边界到哪、车灯边界到哪”是降低返工率的第一道门槛。2. YOLO格式落地的核心细节与实操要点2.1 为什么选YOLO分割格式而不是COCO JSON很多开源实例分割数据集都使用COCO JSON格式存储标注即一个超大JSON文件里保存每张图片、每个标注区域、每个类别id。这种方式的好处是生态成熟、pycocotools直接能算mAP。但实际生产环境里各个摄像头会持续产出新图片每次只新增一小批这时每次都重新读写大型JSON文件就会很别扭合并标注、查看单图标注、删除漂移图片都比较麻烦。YOLO分割格式采用“每图一个txt”的结构图片和标注天然一一对应。新增一批图片只需要同时生成同级目录下的txt标注训练脚本按图片列表加载即可。删除一个坏样本也只需要删掉图片和它同名的txt不会影响其他数据。这种去中心化的标注文件组织方式在工程迭代上更轻量。转换逻辑也比较直接标注工具导出的COCO多边形坐标是绝对像素值YOLO分割格式要求的是归一化坐标。转换公式是x_norm x_abs / image_width y_norm y_abs / image_height类别编号从0开始一个txt里的每行代表一个实例格式如下class_id x1_norm y1_norm x2_norm y2_norm ... xn_norm yn_norm这里所有坐标都是归一化比例值不需要小数点后保留太多位数5位小数就足够多了反而增大文件体积。2.2 目录结构设计与脚本实现数据集落地目录我参考了YOLO系列常见布局方便后续训练和验证脚本直接复用dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── data.yaml └── class_names.txtdata.yaml里面写清楚路径、类别数和类别名训练时直接指定这个文件即可。class_names.txt是给人工检查用的避免每次都要去翻yaml。转换脚本的核心流程是读取标注工具导出的JSON遍历各个标注区域把每个多边形点的绝对坐标除以图片宽高得到归一化值写txt。如果标注里有多个实例就按类别分别编号写出多行。实际操作时有一件事很多人会忽略标注工具导出坐标时多边形的点序可能不统一有些是顺时针有些是逆时针。YOLO格式不要求统一方向模型训练时输入坐标作为掩码点集最终标注内部会自动做标准化区域构造。但为了后期人工检查和做形状后处理方便统一按逆时针存储是更稳妥的做法这里的做法是在转换脚本里按多边形面积符号做一次点序修正。2.3 图像尺寸与归一化带来的边界问题YOLO分割格式本身对原始图像尺寸没有硬性要求但训练时通常会resize到固定输入尺寸。为了避免出现极度细长或超小目标带来的欠采样问题我在采集阶段统一把源图做了尺寸下限处理所有图片最短边不小于960像素。太小的图会导致车灯、保险杠边角等细节在resize后被压缩成几个像素标注多边形虽然存在但网络实际学到的是模糊特征。另一个边界问题是归一化坐标可能因为标注时不小心超出图像边界出现小于0或大于1的坐标点。这类样本在训练时会导致掩码面积异常甚至影响损失计算。我在脚本里加了一个校验步骤坐标值超出[0, 1]范围的实例自动打印警告。边角处轻微超出例如0.02左右可以裁剪到边界值0或1保留超得多的直接删除该实例并在报告中列出方便回到标注工具修正。2.4 类别平衡与样本统计四类零部件在实际图像里出现概率并不均衡。车轮几乎每张图都有保险杠和挡风玻璃也很常见但车灯如果侧面车牌角度不好可能只有一侧可见。我统计了标注结果车灯实例数大约只占车轮实例数的65%。这种情况下直接训练容易导致模型对车灯类敏感度下降。我的处理方式是做实例级重采样训练列表里对车灯样本按一定倍率重复采样让每个batch里四类的实例数量相对均衡。这里没有用在线难例挖掘而是简单的过采样策略实测对车灯类别召回有明显改善。做数据增强时也单独给车灯类加了小幅随机亮度扰动因为车灯在夜间/隧道环境下与保险杠表面对比度差异极大需要让模型对亮暗变化更鲁棒。3. 实操过程与核心环节实现3.1 数据采集与清洗从原始图像到可标注样本采集阶段我拿了三种来源的图片混合使用一是园区停车场定点相机拍摄的车辆进出画面二是车间内部模拟产线的固定机位拍摄三是少量从公开短视频截帧。这一步的关键不是拍得多好看而是要覆盖不同拍摄距离、角度、车身颜色和光线条件让模型在推理时不因为某个没见过的场景直接崩掉。清洗阶段主要做三件事剔除模糊与运动拖影图像这类图即使标注了模型学到的是糊边界对精度没有贡献。剔除车辆占比过小的远景图目标太小分割几乎无意义如果业务上确实需要远距离识别应单独做一组高分辨率采集而不是让模型在同一尺度下硬扛。剔除同一车辆连续帧高度重复的图像常会有几帧只是车牌位置差了几个像素保留一帧即可避免模型过拟合到这套重复背景上。清洗后剩余约2000张可用于标注。对于一套4类别的实例分割数据集来说这个数量不算多但考虑到模型输入尺寸和类别边界相对固定初始迭代是够用的。后期需要扩充时优先补充车灯类和侧面视角数据。3.2 标注策略与质量控制标注时使用多边形勾勒目标轮廓。我的经验是挡风玻璃沿玻璃可见边缘勾勒包括黑色包边胶条但不包括车顶外板。保险杠沿外轮廓勾勒锐利转角处尽量细化不让轮廓直接跨越曲面转折。车灯沿灯罩可见范围勾勒灯罩被保险杠遮挡时以可见最大轮廓闭合。车轮包含轮毂和轮胎黑色橡胶区域整体一圈勾勒。标注完成后我设计了双重审核机制第一遍由标注软件自动检查标注多边形与图像边缘是否贴合第二遍由另一套脚本把标注掩码渲染回原图生成可视化比对图人工抽查30%的样本。实践证明这一步非常有效能发现“保险杠轮廓跑到了翼子板里面”“车灯只标了一半”这类单靠肉眼看json永远发现不了的问题。3.3 多边形坐标转YOLO格式的代码实现我转换标注产出时直接用python脚本从标注工具导出的json读取信息一次处理所有图片。核心代码如下import json from pathlib import Path def convert_json_to_yolo(json_path, output_dir, img_width, img_height): with open(json_path, r, encodingutf-8) as f: data json.load(f) out_txt output_dir / (Path(json_path).stem .txt) lines [] for obj in data[shapes]: class_id CLASS_MAP[obj[label]] points obj[points] norm_points [] for x, y in points: nx round(x / img_width, 5) ny round(y / img_height, 5) # 限制到[0,1]区间轻微越界裁剪严重越界跳过 if nx -0.05 or nx 1.05 or ny -0.05 or ny 1.05: print(fWARNING: 实例{obj[label]}坐标严重越界跳过) break nx max(0.0, min(1.0, nx)) ny max(0.0, min(1.0, ny)) norm_points.append((nx, ny)) else: # 所有点都处理完才写入 coord_str .join(f{x:.5f} {y:.5f} for x, y in norm_points) lines.append(f{class_id} {coord_str}) out_txt.write_text(\n.join(lines), encodingutf-8)这段代码的核心就是归一化和边界处理。实际项目中我还加了一个统计模块转换完成后自动输出每个类别的实例数、平均多边形点数、是否有空标注文件。空标注文件如果没有及时发现训练时会导致该图片被跳过整个batch的有效样本变少对收敛造成隐性影响。3.4 掩码渲染验证与数据拆分转换后一定要渲染一遍确认格式没问题。我写了个渲染脚本读取图片和txt标注把归一化坐标还原为像素坐标填充半透明颜色叠加在原图上。渲染结果里能直接看到每个部件的掩码边缘是否贴合目标、类别颜色是否正确。这一步检查和标注可视化审核的最大区别在于它验证的是“格式转换有没有出错”而不是“标注内容本身准不准”。数据拆分我按车辆图像的出现时间排序保证同一辆车尽量只出现在训练集或验证集中避免验证集数据与训练集高度相似导致评估虚高。具体拆分脚本里首先按图片文件名的时间戳分组再将组整体切分到训练、验证、测试三个集合中。测试集200张是拍完后完全没参与过训练的样本训练过程中也不看测试集指标只做最终推理对比。3.5 训练配置与调参记录模型我用了YOLOv8-seg这种分割模型输入尺寸640x640初始学习率0.001batch size 16训练epoch设为120。数据增强上默认开启mosaic和mixup但对分割任务把mosaic的拼接比例调低了因为mosaic会把多个车的部件拼在一起导致分割掩码之间的边界纠缠模型容易把不同车的保险杠轮廓学成一片。训练过程中我需要同时看loss曲线和验证集mAP的变化。大多数时候loss下降但mAP波动说明模型在某些类别上出现了明显的过拟合或漏检。我训练中配置了每10个epoch保存一次权重之后选mAP最高而不是最后一个epoch的权重来做推理验证。很多新手习惯直接用last.pt实际上在分割任务里best.pt往往比last.pt高出好几个点的mAP。还有一个值得记录的参数分割头的anchor-free设计对多边形细节敏感输入分辨率太低时会丢失细边角。如果后续对挡风玻璃边缘的精度要求更高需要考虑把输入resize到960或1280。我这次先按640算是一个速度和精度的平衡点推理耗时在边缘设备上比较可控后续如果要在产线落地可以继续分档测试。4. 常见问题与排查技巧实录4.1 小目标与遮挡导致的漏检车灯是漏检重灾区尤其是夜间或深色车身场景里车灯与周围车漆对比度低模型经常漏掉一侧。排查时我发现训练集里车灯标注面积普遍偏小一个车灯往往只占原图面积的1%-3%而车轮和保险杠动辄占据10%以上且小目标的锚点分配在特征金字塔深层容易丢失。解决思路有三条增加车灯实例的过采样倍数让模型每一个epoch见到的车灯更多。提高输入分辨率从640调到960车灯的特征图尺寸随之变大独立识别能力增强。增加对比度增强参数在HSV增强里把饱和度调整略加大让深色车身和亮色车灯更容易区分。经过一轮调整车灯类别的mAP从71%提升到了83%代价是单张推理耗时增加了约15ms属于可接受范围。4.2 掩码锯齿、孔洞与边缘不平滑问题训练出的模型测试时输出的掩码偶尔出现锯齿或孔洞。这类问题常见于遇到复杂的保险杠格栅和车轮轮毂多孔区域。轮毂本身有很多镂空标注时我按轮胎外部轮廓完整勾勒模型学到的掩码是闭合区域但在镂空处预测容易出现“想镂空又没完全镂空”的纠结结果。我的经验是遇到这种多孔结构实例分割直接学闭合外轮廓即可后面的齿孔细节交给下游形态学处理而不是让模型逐孔拟合。否则模型容量浪费在无关纹理上训练收敛也更慢。推理后处理里做一次图像闭运算再用轮廓提取即可获得干净平滑的边缘。4.3 类别不平衡与错标污染如果保险杠和挡风玻璃占据了绝大多数有效像素模型天然会更偏向这些大类。错标污染也经常发生在相似外观类别之间比如挡风玻璃的黑色包边被误标为保险杠在深色车身上的边缘。这种错标不会立刻导致精度崩塌但会让模型在两种类别交界的像素上学到模糊决策面。排查错标时我写了一个脚本统计每个类别掩码的像素占比分布发现某几张图的挡风玻璃掩码面积异常大打开一看是标上了整片车顶。这类错误靠人工抽查很难全覆盖但通过面积离群值分析可以很快定位。修改后重训挡风玻璃的边界精度有明显改善。4.4 遮挡与截断目标的处理车辆侧面视角时车轮常常只露出一半保险杠也容易被前车或障碍物遮挡一部分。对这类“截断实例”标注时必须保持一个原则只标注可见部分的多边形不脑补被遮挡区域。如果强制标注被遮挡区域模型训练时会学到“保险杠在遮挡环境中依然有完整轮廓”的错误先验推理时就会自信地画出遮挡物之后的掩码这对后续损伤面积计算是致命的。按可见部分标完后训练出的模型对截断目标能输出正确的不完整掩码下游处理只需要记录可见面积并标注不完整状态即可。我对这类需求在数据yaml里单独设置了“截断”难例标签实际训练时把截断样本作为一种困难样本参与重采样提升模型对部分可见目标的鲁棒性。4.5 推理结果与业务系统的对接训练完成后还有一个容易被忽略的环节把模型输出的掩码转换成业务系统能使用的格式。模型推理结果通常是掩码像素集合我需要转为多边形轮廓再组织成JSON传给上层应用。转换时用到了opencv的findContours配合多边形简化。简化的epsilon参数需要调取太大轮廓会失真取太小点集会冗余。我试下来对汽车零部件这类平滑轮廓epsilon取闭合多边形周长的1.5%比较合适。这一环节还容易遇到坐标映射问题。模型输出是640x640空间内的掩码原始图像可能是1920x1080转换时需要等比映射回原图坐标。如果直接简单缩放而不考虑letterbox的填充区域轮廓会整体偏移在业务图上错位明显。我写了一个公共函数将模型输入图的偏移量和缩放比例记录在推理上下文中后处理统一带入映射彻底解决了这个问题。5. 实操心得与后续可扩展方向这套数据集与训练流程完整跑下来我个人的一个重要体会是实例分割任务里数据准备和格式转换的时间占比往往比调模型本身还高。数据集如果能做到“标注规范、格式统一、渲染可查”这三点后续模型迭代会非常顺利。我在实际项目中踩过几次坑之后形成了固定的四步检查顺序先看格式转换脚本跑完输出有没有警告再看渲染图边缘是否贴合然后看面积离群统计是否有异常最后才进入训练阶段。后续这个内容还可以这样扩展一是把数据集扩充到更多零部件比如后视镜、车门、轮眉、散热器格栅等和保险杠、车灯一起构成完整的车辆外饰件分割体系二是加入夜间红外或低照度场景图像进一步强化车灯在特殊光照下的识别能力三是把分割掩码与几何测量模块结合起来直接输出保险杠变形面积、车灯破损比例、挡风玻璃裂纹长度这类量化指标。另外同一套数据标注流程完全可以迁移到其他工业质检场景例如家电面板、电子元件外壳、金属结构件的轮廓分割只需要换类别定义和采集环境即可。如果想拿来就用我建议先下载或复现一套类似结构的数据资产按四个类别跑通训练和可视化验证流程再根据实际车辆外观补充自己的业务数据。格式上严格保持每图一个同名txt、类别编号从0连续分配、归一化坐标限定在[0,1]基本不会踩坑。模型的初始权重可以用通用的预训练分割权重如果自己的数据量不大至少前30个epoch不要轻易动backbone的冻结层让模型先在零件轮廓的低层特征上稳定下来再去微调全局关系。这一段经验来自我实际训练时对比过冻结与不冻结的差异冻结backbone训练的前期loss更平缓后期分类头收敛后整个模型精度更稳。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑