ARTICLE DETAIL

资讯详情

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

13000张晶圆缺陷检测数据集waferMap详解与YOLOv8训练实战

13000张晶圆缺陷检测数据集waferMap详解与YOLOv8训练实战 简介在半导体制造流程中晶圆表面缺陷的精准定位直接影响产线良率与成本控制。传统整图分类已难以满足工业视觉对缺陷位置、形态的高精度需求基于深度学习的目标检测技术逐渐成为晶圆缺陷识别的主流方案。本文以waferMap数据集为例该数据集包含13000张图像、覆盖9类典型晶圆缺陷模式采用目标检测标注格式可直接用于YOLOv8、Faster R-CNN等主流框架训练。从数据格式转换、训练集划分、切图增强到YOLOv8参数调优系统梳理了一套工程化落地路径并针对细长缺陷、类别不平衡等痛点给出实用解法。文章内容兼顾算法原理与实战技巧为半导体检测算法工程师及工业视觉研究者提供了可参考的完整方案助力快速构建高精度晶圆缺陷检测模型。 我最近在整理一批工业视觉相关的数据集目标检测半导体晶圆缺陷数据集waferMap数据集13000张9类.zip这名字一听就是做晶圆缺陷检测的同学急需的资源。半导体制造流程里晶圆上每一个die的良率直接决定产线成本而缺陷位置、形态、分布往往比“有没有缺陷”更重要。传统公开的晶圆图数据多以整图分类为主真正以目标检测格式交付、带边界框标注、又覆盖9类缺陷模式的数据集确实不多。这套数据共13000张图像可以直接喂给YOLOv8、SSD、Faster R-CNN这类检测框架也可以拿来验证自己写的检测算法。不管你是做半导体检测的算法工程师还是实验室里研究工业缺陷检测的学生这份数据都值得好好利用起来。1. 数据集整体解读与核心价值拆解1.1 为什么需要目标检测语义的晶圆数据先说一个背景问题。我们平时能搜到的晶圆缺陷数据很多是整图分类格式比如WM-811K这个经典数据集每张图对应一个标签告诉你是Ring、Scratch还是Center。这种格式适合做“这张晶圆是否有缺陷”的判断但落到实际产线场景就会有明显局限你在图上圈出一片缺陷区域工艺工程师需要知道具体在哪一行哪一列失效分析需要定位到具体die返修流程需要识别缺陷的形状和走向。这些都是分类标签给不了的。这个waferMap数据集把标注粒度下沉到了目标检测框。每张图像里缺陷区域用矩形框标出来同时给出类别标签模型训练出来之后不但能告诉你有缺陷还能在图上把缺陷轮廓框出来直接对接后续的量测、分类、根因分析流程。这种语义层次上的升级才是这套数据真正值钱的地方。1.2 数据规模与标注格式的初步判断从命名上看13000张、9类规模在工业数据集里属于中等偏上。13000张图如果按8:1:1划分训练、验证、测试能拿到10400张训练图、1300张验证图、1300张测试图。对于单阶段检测器来说这个量级足够训练出一个可以上手的基线模型如果配合合适的预测框数量和anchor设计效果还能再往上走。标注格式方面需要以实际下载后的文件结构为准。常见的交付形式有几种VOC XML一张图一个XML文件里面有object节点、bndbox坐标、name类别。COCO JSON一个JSON包含所有图像的标注信息用categories、annotations、images三个字段组织。YOLO TXT每张图一个TXT每行是“类别 x_center y_center width height”坐标是归一化后的比例值。这三种格式之间转换非常快我会在后面的章节给出完整的转换脚本。建议拿到数据后先打开一张图和对应的标注文件人工核对一下框的位置和类别是否匹配因为工业数据集偶尔会出现标注错位、类别写错、图像尺寸不一致之类的问题。2. 九类缺陷模式识别与标注逻辑2.1 9类缺陷模式及其形成机理半导体晶圆上的缺陷每一种都有对应的工艺成因。这个数据集里出现的9类缺陷我整理成一张表方便对照理解类别名称形态特征常见成因目标检测难点Center集中于晶圆中心区域的块状异常光刻胶涂布不均匀、中心区域工艺参数偏移面积大边界模糊容易被当作整片背景Donut环形或甜甜圈状缺陷中心正常周围一圈异常边缘曝光异常、膜厚在径向分布不均环形目标细长水平框会包入大量背景Edge-Loc靠近晶圆边缘某一局部区域出现缺陷机械手夹持痕迹、边缘滚轮污染目标贴边样本量往往少容易漏检Edge-Ring晶圆边缘整圈连续的环状缺陷带边缘剥离、药液在边缘残留沉积长条型环带标注框跨度大长宽比极端Loc在某个局部小区域出现聚集性缺陷微尘簇、局部污染源多个小目标聚集框重叠严重Near-full几乎整片晶圆都被缺陷覆盖严重工艺事故、设备异常负样本与正样本比例严重失衡Random缺陷在晶圆表面随机散布随机颗粒、环境粉尘小目标多且分散背景噪声干扰大Scratch线状、条带形划痕缺陷机械接触划伤、搬运摩擦目标细长长宽比极大容易断成多个框None无明显缺陷的正常晶圆图正常工艺结果通常作为背景类或负样本这张表的重点不是让你背下来而是理解不同缺陷在检测上的“性格差异”。Scratch和Edge-Ring这类细长目标普通水平检测框很容易框出大面积的背景导致分类器分不清目标和背景Random这类小目标又需要模型在小尺度特征层上有更强的响应能力。我在实际训练中发现如果直接用整张晶圆图缩放到640x640训练Scratch和Random这两类的mAP往往会比其他类低10到20个点后面会讲怎么用切图解决这个问题。2.2 标注层面的几个坑这个数据集的标注逻辑有几个需要注意的地方经验不足很容易踩坑。第一个坑是None类。如果数据里包含None类别训练时要么把它当成背景完全剔除要么单独作为一类。我建议直接剔除。原因很简单正常晶圆图像上并没有需要回归的缺陷区域硬加一个包含整图的框会让模型学到一个“永远输出大框”的坏习惯严重拉低其他类别的精确率。第二个坑是缺陷重叠。Loc类经常出现多个小缺陷聚集在一起标注框之间会有部分重叠。如果你用的是NMS后处理重叠框处理不好会直接吞掉相邻目标。建议在训练后处理时把NMS的IoU阈值适当调高比如从默认的0.45调到0.6左右能少丢一些密集缺陷。第三个坑是旋转问题。Edge-Ring和Scratch这类目标有天然的角度属性水平框只能表达外接矩形会引入很多无效背景。如果这份数据的标注精度足够高可以考虑用mmrotate这类旋转目标检测框架去做。虽然改造成本高一些但对细长缺陷的召回率提升非常明显。3. 数据格式转换与训练集划分实操3.1 把原始标注转成YOLO格式拿到手的数据如果是VOC或者COCO格式YOLOv8直接训练之前需要转成YOLO TXT格式。下面是我常用的转换脚本兼容VOC和COCO两种主流格式直接复制改一下路径就能用。如果是VOC XML格式import os import xml.etree.ElementTree as ET from pathlib import Path def voc_to_yolo(xml_path, out_dir, class_names): tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.findall(object): cls obj.find(name).text if cls not in class_names: continue cls_id class_names.index(cls) bndbox obj.find(bndbox) x1 float(bndbox.find(xmin).text) y1 float(bndbox.find(ymin).text) x2 float(bndbox.find(xmax).text) y2 float(bndbox.find(ymax).text) x_center (x1 x2) / 2 / img_w y_center (y1 y2) / 2 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) if lines: txt_path Path(out_dir) / (Path(xml_path).stem .txt) txt_path.write_text(\n.join(lines), encodingutf-8) # 使用示例 class_names [Center, Donut, Edge-Loc, Edge-Ring, Loc, Near-full, Random, Scratch, None] xml_dir path/to/xmls out_dir path/to/labels for xml_file in Path(xml_dir).glob(*.xml): voc_to_yolo(str(xml_file), out_dir, class_names)如果是COCO JSON格式import json from pathlib import Path def coco_to_yolo(json_path, img_dir, out_dir): with open(json_path, r, encodingutf-8) as f: coco json.load(f) cat_id_map {} for cat in coco[categories]: cat_id_map[cat[id]] cat[name] img_id_map {} for img in coco[images]: img_id img[id] img_w img[width] img_h img[height] img_id_map[img_id] (img[file_name], img_w, img_h) anns_by_img {} for ann in coco[annotations]: img_id ann[image_id] anns_by_img.setdefault(img_id, []).append(ann) for img_id, (file_name, img_w, img_h) in img_id_map.items(): lines [] for ann in anns_by_img.get(img_id, []): cat_name cat_id_map[ann[category_id]] if cat_name None: continue x1, y1, w, h ann[bbox] x_center (x1 w / 2) / img_w y_center (y1 h / 2) / img_h nw w / img_w nh h / img_h lines.append(f{cat_name} {x_center:.6f} {y_center:.6f} {nw:.6f} {nh:.6f}) if lines: txt_path Path(out_dir) / (Path(file_name).stem .txt) txt_path.write_text(\n.join(lines), encodingutf-8)转换时有个细节容易出错VOC里的bbox坐标可能越界比如x1比0小或者x2比图像宽度大。这些越界框如果不处理训练时YOLO会报错。建议在转换时加一个clip操作确保x1 0、y1 0、x2 img_w、y2 img_h再进行归一化。3.2 训练集与验证集的划分策略划分训练集和验证集看起来简单直接train_test_split就行但晶圆数据这里有个特殊的泄漏风险。如果同一片晶圆的不同局部区域被切成了多张子图并且这些子图同时出现在训练集和验证集里模型相当于提前见过答案验证指标会虚高。最稳妥的做法是先按原始晶圆图或者图片目录进行分组保证同一来源的所有图像整体进入训练集或验证集再在组内做随机分配。一张晶圆图上所有patch要么全部在train要么全部在val。虽然这样会让验证集样本稍少一些但指标更真实部署到新产线上时不会翻车。另外建议把带缺陷的图和无缺陷的图混合均匀划分。如果你把正常图都堆到验证集里训练集全是缺陷样本模型泛化能力会严重下降。3.3 切图与数据增强设计晶圆原图通常分辨率很高直接把整张图resize到640x640小目标缺陷会缩成一两个像素点信息完全丢失。我实测过Scratch和Random这两类在直接缩放训练下的mAP基本只有0.3左右切图之后能拉到0.7以上改善非常明显。推荐的切图方案如果原图是1024x1024切成2x2共4张512x512的patch。如果原图是2048x2048切成4x4共16张512x512的patch。滑动窗口步长设为patch尺寸的一半保留5%到10%的重叠区域避免缺陷正好切在patch边界被截断。切完后过滤掉完全没有目标框的patch减少背景样本的占比。切图后的边界框坐标需要重新计算代码思路不复杂patch左上角在原图中的坐标是(px, py)patch尺寸是ph、pw则新框坐标是x_new x_old - px y_new y_old - py如果框被patch边界切掉一部分用clip处理当框面积小于原始面积的30%时直接丢弃否则保留。数据增强方面工业场景和自然图像场景不太一样。晶圆图的方向性和缺陷的物理特征需要保留不要用翻转加旋转的暴力组合。建议用YOLOv8自带的hsv_h、hsv_s、hsv_v增强来做灰度扰动配合轻微的平移和缩放即可。水平和垂直翻转可以用但如果数据集本身存在方向性很强的Scratch划痕翻转可能会让模型学到错误的形状先验需要根据实验效果取舍。4. YOLOv8训练实操与参数调优4.1 训练环境与数据配置YOLOv8是目前用起来最顺手的目标检测框架Ultralytics官方维护安装简单训练代码几乎不用自己写。pip install ultralytics安装完成后先准备好数据配置文件。YOLOv8通过YAML文件指定数据路径和类别名内容如下# wafer.yaml path: /path/to/wafer_dataset train: images/train val: images/val test: images/test names: 0: Center 1: Donut 2: Edge-Loc 3: Edge-Ring 4: Loc 5: Near-full 6: Random 7: Scratch 8: None如果None类已经剔除类别索引记得重新排代码里也别再引用None。训练命令很简单yolo detect train datawafer.yaml modelyolov8s.pt epochs100 imgsz640 batch16 device0如果你用的是切图后的patch数据集这里的imgsz直接设置成patch的尺寸就行不需要resize压缩。4.2 模型选型与关键超参数YOLOv8系列有n、s、m、l、x五个规格工业场景我建议从yolov8s起步。n模型太小对晶圆上的细长缺陷特征表达能力不足l和x模型太吃显存训练速度慢13000张数据量下收益有限。yolov8s是性价比最稳的选择显存占用适中精度在工业缺陷检测里足够用。几个关键超参数的实操建议超参数推荐值说明imgsz640或patch尺寸目标小就提高输入分辨率epochs100-150数据量中等100轮基本收敛batch16-32取决于显存大小optimizerAdamW或SGDAdamW收敛快SGD最终精度略高lr00.01初始学习率SGD常用mosaic1.0默认开启对提升泛化有帮助close_mosaic10最后10轮关闭mosaic增强稳定收敛fl_gamma0.0默认关闭focal loss类别不平衡时可调0.5-1.0YOLOv8对anchor的处理和早期YOLO版本不同它是anchor-free的把目标检测解耦成“目标中心点分类边界距离回归”的思路。这对晶圆缺陷来说其实是好事因为缺陷框的尺寸分布非常大从几个像素的Random小点到覆盖整片晶圆的Near-full大框固定大小的anchor很难全覆盖。anchor-free设计天然适应这种尺度跨度这也是我推荐用YOLOv8而不是YOLOv5的原因之一。4.3 训练结果与指标解读训练结束后results.csv里记录了每一轮的loss、precision、recall、mAP50、mAP50-95等指标。看mAP50有没有稳步上升loss有没有在最后20轮内下降趋势变缓基本能判断是否收敛。晶圆缺陷检测的指标期望值需要结合实际场景来看mAP50达到0.9以上说明常见缺陷类别已经学得不错。mAP50-95在0.7到0.8之间说明框的定位精度较好。Scratch和Edge-Ring的mAP明显低于其他类九成是目标长宽比和尺度问题优先考虑切图和提升推理分辨率。val_batch0_pred.jpg这个可视化文件里会画出模型在验证集上的预测框。我每次训练完的第一件事就是打开这张图肉眼看一遍预测框的位置这一步能发现很多指标上看不出的问题比如框偏移半个身位、类别概率混乱、重复框太多等等。推理和结果导出yolo detect predict modelruns/detect/train/weights/best.pt source/path/to/test_images saveTruebest.pt和last.pt的区别需要注意。best.pt是验证集上mAP最高的权重last.pt是最后一轮权重。训练过程中如果出现过拟合last.pt可能已经退化强烈建议部署时用best.pt。5. 常见问题与排查技巧实录5.1 训练和推理中的典型问题速查表整理一下我实际踩过以及身边同行频繁遇到的坑做成一个速查表问题现象可能原因解决办法训练报错找不到图片YAML中的路径包含中文或空格全部改成英文路径路径层级扁平化Label class 9 exceeds nc9类别索引从1开始而不是0检查标签文件的第一个数字确认从0开始编号mAP虚高但实际效果差训练集和验证集存在同源图像泄漏按晶圆图分组划分数据禁止同图patch跨集合Scratch类mAP极低细长目标在resize后丢失细节切图训练或提高imgsz到1024显存不足OOMbatch太大或输入分辨率太高调小batch开启AMP混合精度正常晶圆图全部误检None类不当加入训练剔除None类或单独用二分类模型处理预测框大量重叠NMS阈值过低把NMS的IoU阈值从0.45调到0.6训练loss不降增强策略过强或学习率不当关闭部分增强降低lr0重试5.2 类别不平衡的实战应对9类缺陷的样本量通常不是均匀分布的。Random、Loc这类常见缺陷可能占了总量的一半Scratch、Near-full这类稀有缺陷可能只有几百张。类别不平衡会直接影响模型的分类边界稀有类别的召回率会非常难看。应对思路从轻到重排列简单过采样对样本量较少的类别在训练时重复读取其图像实现简单效果有一定提升。损失函数调整YOLOv8里开启focal loss把fl_gamma调到0.5到1.0让模型更关注难分类的稀有缺陷样本。针对性数据合成把少量Scratch样本通过旋转、缩放、平移扩充一批数据生成时注意保持划痕的连续性和方向特征不要用太强的几何变换把缺陷形状搞变形。我实测下来用第1种第2种组合就能把Scratch的mAP从0.35提升到0.55左右效果明显。第三种的合成风险在于容易引入不真实的缺陷形态反而拖累泛化能力如果把握不大就不建议用。5.3 部署推理阶段的分辨率权衡训练时用的imgsz和推理时用的imgsz最好保持一致。如果训练时用640推理时把图放大到1024去检测框的坐标在映射回原图时会产生系统性偏移特别是小目标的位置误差会明显变大。晶圆检测场景的推理分辨率设置思路是先明确最小可接受缺陷的物理尺寸再换算成像素尺寸保证这个尺寸在输入图像上至少占据8x8像素一个特征图网格。如果达不到就提高分辨率或者切patch推理。理想情况是用训练时切patch的同一套滑动窗口方案做推理然后把结果合并回整张晶圆图上坐标按切图相反方向映射回去即可。6. 从常规检测到旋转框检测的进阶方向6.1 为什么晶圆缺陷适合旋转目标检测前面已经提过Edge-Ring和Scratch这类缺陷是明显的细长目标水平框检测不可避免地会框入大量背景区域。背景占比过高会导致分类特征被稀释表现为类别置信度偏低、定位精度差。如果用水平框的mAP50-95卡在0.7上不去可以考虑换成旋转框检测。目前最常用的旋转框检测框架是MMRotate支持Rotated Faster R-CNN、Rotated RetinaNet、Oriented R-CNN等算法。它是在水平检测的基础上增加了一个角度回归分支每个框由x、y、w、h、theta五个参数表示。切换成本主要在于标注格式转换和模型结构变化但对于半导体晶圆这类强方向性缺陷场景收益是显著的。使用MMRotate之前需要把标注转为DOTA格式。DOTA格式的标注行是x1 y1 x2 y2 x3 y3 x4 y4 class_name四点按顺时针顺序排列能精确表达任意角度下的细长缺陷。转换时需要小心坐标顺序的一致性否则角度回归会学到完全错误的方向。6.2 数据去重与产线适配补强工业数据集还有一个非常隐蔽的问题重复或近似重复的图像。同一片晶圆的不同工步、不同光照条件下采集的图像可能在像素级别非常相似。如果不去重直接划分训练集和验证集验证指标会比真实部署时高很多。建议在训练前用感知哈希或结构相似度做一次去重操作成本不高却能避免模型“背题”的假象。另外真实产线部署时相机型号、光照条件、灰度分布往往与数据集存在差异。我建议在训练时多做几种灰度扰动增强推理时对输入图像做自适应直方图均衡化可以明显提升跨设备迁移时的稳定性。晶圆图的细节对比度本来就不高灰度归一化这一步处理得好不好直接影响小缺陷的检出率。这个数据集的后续扩展还可以往几个方向走把水平框版本转成旋转框版本跑一遍MMRotate对比两类方案在细长缺陷上的差距用半监督方法把无标签的晶圆图利用起来或者结合图像分割模型做缺陷边缘分割进一步提升缺陷形态分析的精细度。工业视觉检测的难点从来不在单独某一类算法上而在于把数据清洗、标注校验、模型设计、部署适配这一整条链路走通。这套waferMap数据已经给了你一个扎实的起点剩下的就看你怎么用了。本文还有配套的精品资源点击获取
返回列表