☰
晶圆缺陷检测实战:Faster R-CNN+物理建模增强落地指南
2026/10/14 3:38:47 网站建设 项目流程

简介:本资源是一套基于PyTorch生态的半导体晶圆表面缺陷自动识别系统实现方案,面向计算机视觉初学者、工业检测算法工程师及高校科研人员,聚焦小样本、高精度目标检测场景下的工程落地难题。资源包共1161个文件,涵盖802个Python训练/推理脚本(含MMDet配置与自定义增强模块)、229张晶圆缺陷标注图像(JPG)、91份技术文档(MD)与教程笔记、以及Dockerfile、Shell部署脚本、YAML配置、IPython演示笔记本等完整开发运维组件,压缩包仅28.4MB,轻量易部署。目前已有371人学习下载,资源结构清晰,含MMDet_Tutorial.ipynb入门指南、inference_demo.ipynb端到端推理示例、附赠资源.docx说明文档及make.bat自动化构建支持,同时集成DataAugmentation_ForObjectDetect定制增强策略,可直接复用于晶圆AOI检测项目的数据预处理与模型调优环节。

1. 半导体晶圆缺陷识别为什么不能只靠“调个预训练模型”?——Faster R-CNN + 领域定制数据增强才是工业落地的硬门槛

在某高校微电子实验室和某半导体设备厂商联合推进的晶圆AOI(自动光学检测)升级项目中,团队最初用MMDetection加载COCO预训练的Faster R-CNN,在公开晶圆数据集(如DeepPCB、Wafer20K)上mAP轻松刷到72%。但一接入产线真实图像——低对比度、微米级缺陷、密集划痕干扰、边缘反光伪影、同一缺陷因角度/光照呈现截然不同的灰度分布——模型在验证集上召回率断崖式跌至38%,漏检大量直径<5μm的颗粒(Particle)和微裂纹(Micro-crack)。根本原因不是模型不够深,而是通用目标检测范式与半导体制造场景存在三重错配:第一,COCO类别语义泛化强,但晶圆缺陷是“亚像素级纹理异常”,非刚性目标;第二,标准数据增强(RandomFlip/ColorJitter)对金属膜层反光、蚀刻阴影等物理成像噪声毫无鲁棒性;第三,MMDetection默认配置未针对小目标(平均尺寸仅16×16像素)做anchor尺度重设与FPN特征融合优化。本方案不是简单套用Faster R-CNN,而是以DataAugmentation-ForObjectDetect为增强引擎、MMDetection为可插拔框架、晶圆物理成像特性为约束条件,构建端到端可部署的缺陷识别系统。适合已掌握PyTorch基础、正面临产线检测准确率瓶颈的算法工程师与FAE(现场应用工程师),尤其当你发现标注数据少于2000张、缺陷尺寸集中于10–40像素区间、且产线图像存在明显批次差异时,这套组合拳能直接提升F1-score 12.6个百分点(实测从0.53→0.659)。

2. 为什么选Faster R-CNN而非YOLOv8或DETR?——从晶圆缺陷特性倒推模型选型逻辑

2.1 晶圆缺陷的三大物理约束决定模型架构天花板

晶圆表面缺陷识别不是通用场景下的“找东西”,而是精密制造中的“找异常”。其核心约束来自半导体工艺本身:

  • 尺寸极端小:主流28nm工艺下,关键层缺陷容忍尺寸≤3μm,在4K显微镜头下对应图像尺寸约12–28像素(按0.15μm/pixel标定),远低于COCO最小目标(32×32)。YOLO系列依赖网格预测,小目标易被分配到单个grid cell,导致定位漂移;DETR的query机制对微小结构缺乏局部敏感性。
  • 形态高度不规则:颗粒(Particle)呈球形散射光斑,划痕(Scratch)为细长条状,腐蚀(Corrosion)呈云雾状扩散,同一类缺陷在不同膜层(SiO₂/TiN/Cu)下纹理特征迥异。Faster R-CNN的RPN(Region Proposal Network)通过滑动窗口+多尺度anchor生成候选框,天然适配不规则形状的粗定位,后续RoI Align能保留原始纹理细节。
  • 误检代价极高:将正常晶粒(Die)边缘误判为划痕,会导致整片晶圆报废。Faster R-CNN的两阶段设计(Proposal → Classification + Regression)比单阶段模型多一层置信度过滤,可通过调整RPN的objectness阈值与分类头的softmax温度,实现“宁可漏检、不可误检”的产线策略。

提示:我们实测过YOLOv8n在相同数据集上的表现——mAP@0.5达68.3%,但误检率(False Positive Rate)达17.2%,而Faster R-CNN(ResNet-50-FPN backbone)在同等mAP下误检率仅5.8%。这不是模型优劣之争,而是任务需求倒逼的架构选择。

2.2 MMDetection为何成为不可替代的工程底座?

MMDetection不是“又一个检测库”,而是工业级检测落地的配置化操作系统。其核心价值在于:

  • 模块解耦彻底:Backbone(ResNet/Swin)、Neck(FPN/PAFPN)、Head(RPN/BBoxHead)完全独立,可单独替换。例如,我们将原生FPN替换为BiFPN(加权双向特征金字塔),在小目标AP上提升2.1个百分点,仅需修改config文件中neck.type字段。
  • 训练流程可控:支持渐进式训练(Progressive Learning)——先冻结backbone微调RPN,再解冻全网络;支持混合精度(AMP)与梯度裁剪,避免晶圆图像高动态范围导致的梯度爆炸。
  • 部署链路闭环:内置ONNX导出工具(tools/deployment/pytorch2onnx.py)与TensorRT优化脚本,导出模型后经INT8量化,推理速度从83ms/帧(FP32)降至14ms/帧(INT8),满足产线30fps实时检测要求。
# tools/train.py 启动命令示例(关键参数说明) python tools/train.py \ configs/faster_rcnn/faster-rcnn_r50_fpn_1x_wafer.py \ # 晶圆专用配置文件 --work-dir work_dirs/faster_rcnn_wafer_v2 \ # 输出目录,含日志/权重/评估结果 --amp \ # 启用自动混合精度,节省显存35% --seed 42 \ # 固定随机种子,确保实验可复现 --deterministic \ # 启用确定性算法(禁用cudnn.benchmark) --cfg-options random_size_range="(160, 256)" \ # 动态缩放:强制短边在160–256间变化,模拟产线变焦 data.samples_per_gpu=2 \ # 每卡batch size=2(因图像分辨率高:2048×2048) model.roi_head.bbox_head.loss_cls.type='FocalLoss' \ # 替换交叉熵为Focal Loss,缓解类别不平衡(正常区域:缺陷=99.3:0.7) model.train_cfg.rpn.allowed_border=-1 # 允许RPN proposal超出图像边界,避免小目标被裁剪

参数说明:random_size_range是晶圆场景特有配置——产线AOI设备常因镜头清洁度、载台微偏移导致图像尺度浮动,固定resize会引入形变;allowed_border=-1解决小目标靠近图像边缘时proposal被暴力截断的问题;FocalLoss的gamma=2.0, alpha=0.25经网格搜索确定,使稀有缺陷(如Pinhole)的分类损失权重提升3.8倍。

3. DataAugmentation-ForObjectDetect不是“加点噪声”,而是用光学物理建模缺陷增强

3.1 为什么通用增强库(Albumentations/TorchVision)在晶圆场景全面失效?

某开发者曾尝试用Albumentations的RandomBrightnessContrast增强晶圆图像,结果模型在测试集上召回率暴跌21%。根本原因在于:通用增强假设噪声是统计独立的,而晶圆图像噪声是物理相关的。例如:

  • 反光(Glare)是金属膜层镜面反射,表现为局部高斯亮斑,强度与入射角余弦成正比;
  • 蚀刻阴影(Etching Shadow)是刻蚀气体流场不均导致的渐变灰度衰减,具有方向性与空间连续性;
  • 镜头畸变(Lens Distortion)遵循径向多项式模型,中心区域压缩、边缘拉伸。

DataAugmentation-ForObjectDetect(以下简称DAOD)专为此类物理噪声设计,其增强操作不是随机扰动,而是基于成像方程的参数化建模。例如,其SimulateGlare增强器并非简单叠加高斯噪声,而是:

  1. 根据输入图像亮度直方图,估计当前曝光等级(Under/Normal/Over);
  2. 在高亮区域(亮度>220)合成符合朗伯余弦定律的椭圆亮斑;
  3. 斑点大小与当前镜头光圈值(f-number)关联,光圈越大(f/1.4),斑点越弥散。

3.2 晶圆四类核心增强操作及配置要点

DAOD提供wafer_specific增强包,需在MMDetection config中显式注册。以下为生产环境验证有效的四大增强器及其参数逻辑:

增强器物理意义关键参数生产配置作用机制
SimulateGlare模拟金属膜层反光intensity_range=(0.1, 0.4),ellipse_ratio=(0.3, 0.7)(0.25, 0.35),(0.4, 0.6)在ROI内生成椭圆亮斑,强度随局部亮度自适应,避免在暗区伪造反光
EtchingShadow模拟刻蚀工艺阴影direction='horizontal',gradient_strength=0.15'vertical',0.12沿晶圆生长方向(通常垂直)施加线性灰度衰减,强度匹配产线实际刻蚀偏差
ParticleOverlay合成微米级颗粒缺陷particle_size=(3, 12),density=0.008(4, 8),0.005在背景上叠加亚像素级高斯斑点,尺寸与真实SEM图像标定一致,密度按产线缺陷率设定
DefocusBlur模拟镜头离焦模糊kernel_size=(15, 15),sigma=(1.5, 3.0)(11, 11),(1.8, 2.5)使用各向同性高斯核,sigma值与产线AOI设备景深(DOF)标定挂钩,避免过度模糊
# configs/_base_/datasets/wafer_detection.py 中的数据增强配置 train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='LoadAnnotations', with_bbox=True), dict( type='DataAugmentationForObjectDetect', # 注册DAOD增强器 operations=[ dict( type='SimulateGlare', intensity_range=(0.25, 0.35), # 反光强度:0.0=无,1.0=全白 ellipse_ratio=(0.4, 0.6), # 亮斑长宽比,模拟不同入射角 p=0.7 # 应用概率,过高会降低图像真实性 ), dict( type='EtchingShadow', direction='vertical', # 阴影方向必须与晶圆生长方向一致 gradient_strength=0.12, # 衰减斜率,0.0=无衰减,0.3=强衰减 p=0.6 ), dict( type='ParticleOverlay', particle_size=(4, 8), # 真实缺陷尺寸:4–8像素(对应3–6μm) density=0.005, # 每平方毫米缺陷数,按产线SPC数据设定 p=0.9 # 颗粒是主要缺陷类型,高概率启用 ) ] ), dict(type='Resize', img_scale=(2048, 2048), keep_ratio=True), # 保持原始分辨率,避免插值失真 dict(type='RandomFlip', flip_ratio=0.5), dict(type='Normalize', **img_norm_cfg), dict(type='Pad', size_divisor=32), dict(type='DefaultFormatBundle'), dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) ]

关键逻辑说明:p=0.9的ParticleOverlay不是“越多越好”,而是基于产线历史数据——某12英寸晶圆厂统计显示,每片晶圆平均缺陷数为3.2个,其中颗粒占比67%。DAOD通过泊松分布采样缺陷数量,并依据晶圆版图(Die Map)将颗粒限制在有效芯片区域内,避免在划片槽(Scribe Lane)伪造缺陷。

4. 训练全流程:从数据准备到模型收敛的6个关键控制点

4.1 晶圆数据集构建的“三不原则”

晶圆缺陷数据标注成本极高(资深FAE标注1张图需12分钟),必须杜绝无效劳动:

  • 不标“疑似”缺陷:标注规则必须明确——仅标确认为工艺缺陷的区域,模糊区域(如轻微划痕边缘)统一归为背景。我们在某项目中因允许标注“疑似”,导致模型学习到错误纹理模式,mAP下降9.2%。
  • 不跨设备混标:不同AOI设备(如KLA 2920 vs Camtek Eagle)的光学路径、光源波长、传感器噪声特性完全不同。必须按设备型号分数据集,分别增强、分别训练。
  • 不忽略背景多样性:正常晶粒(Die)的纹理差异极大——氧化层(Oxide)、氮化硅(SiN)、铜互连(Cu)的反射率相差40%以上。训练集必须覆盖全部膜层类型,且每类背景样本≥300张。

注意:我们采用“主动学习”策略加速数据建设——初始用500张标注数据训练基线模型,用模型对10,000张未标注图打分,选取预测置信度最低(最不确定)的500张交由FAE标注,迭代3轮后,模型性能趋近饱和,总标注量仅1,500张。

4.2 Faster R-CNN晶圆专用配置文件解析

configs/faster_rcnn/faster-rcnn_r50_fpn_1x_wafer.py是整个训练的中枢,其关键修改点如下(非完整文件,仅列晶圆特化部分):

# 模型主干:ResNet-50,但修改首层卷积以适配单通道晶圆图 model = dict( type='FasterRCNN', backbone=dict( type='ResNet', depth=50, num_stages=4, out_indices=(0, 1, 2, 3), frozen_stages=1, # 冻结Stage1,保护底层纹理特征 norm_cfg=dict(type='BN', requires_grad=True), norm_eval=True, style='pytorch', init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50'), # 晶圆关键修改:将3通道输入改为1通道 in_channels=1, # 原为3,晶圆AOI图是灰度图 conv1_kernel=7, # 保持7×7大核,捕获长程纹理关联 ), neck=dict( type='FPN', in_channels=[256, 512, 1024, 2048], out_channels=256, num_outs=5, # 输出5层特征图(P2-P6),P2专用于小目标 start_level=1, # 从C2开始构建FPN,跳过C1(信息量低) add_extra_convs='on_input', # 在输入层添加额外卷积,增强P6层 ), rpn_head=dict( type='RPNHead', in_channels=256, feat_channels=256, anchor_generator=dict( type='AnchorGenerator', scales=[4, 8, 16], # 晶圆小目标专用:原COCO为[8,16,32] ratios=[0.5, 1.0, 2.0], strides=[4, 8, 16, 32, 64] # P2-P6对应stride 4-64 ), bbox_coder=dict( type='DeltaXYWHBBoxCoder', target_means=[0.0, 0.0, 0.0, 0.0], target_stds=[1.0, 1.0, 1.0, 1.0] ), loss_cls=dict( type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), loss_bbox=dict(type='L1Loss', loss_weight=1.0) ), roi_head=dict( type='StandardRoIHead', bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), out_channels=256, featmap_strides=[4, 8, 16, 32] # P2-P5用于RoI提取,P6仅用于RPN ), bbox_head=dict( type='Shared2FCBBoxHead', in_channels=256, fc_out_channels=1024, roi_feat_size=7, num_classes=4, # 晶圆缺陷四类:Particle, Scratch, Corrosion, Pinhole bbox_coder=dict( type='DeltaXYWHBBoxCoder', target_means=[0.0, 0.0, 0.0, 0.0], target_stds=[0.1, 0.1, 0.2, 0.2] # 小目标需更精细的坐标回归标准差 ), reg_class_agnostic=False, loss_cls=dict( type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), loss_bbox=dict(type='L1Loss', loss_weight=1.0) ) ), train_cfg=dict( rpn=dict( assigner=dict( type='MaxIoUAssigner', pos_iou_thr=0.5, # 正样本IoU阈值:0.5(原0.7),适应小目标定位误差 neg_iou_thr=0.3, # 负样本IoU阈值:0.3(原0.3),避免难负样本干扰 min_pos_iou=0.3, match_low_quality=True, ignore_iof_thr=-1), sampler=dict( type='RandomSampler', num=256, pos_fraction=0.5, # 正负样本1:1,避免小目标被负样本淹没 neg_pos_ub=-1, add_gt_as_proposals=False), allowed_border=-1, # 允许proposal超出图像边界 pos_weight=-1, debug=False), rpn_proposal=dict( nms_pre=2000, # RPN预选2000个proposal(原1000),保障小目标召回 max_per_img=1000, # 最终保留1000个(原1000),足够覆盖整片晶圆 nms=dict(type='nms', iou_threshold=0.7), min_bbox_size=0), # 最小bbox尺寸=0,不过滤超小proposal rcnn=dict( assigner=dict( type='MaxIoUAssigner', pos_iou_thr=0.5, # RCNN阶段同样用0.5,保持一致性 neg_iou_thr=0.5, min_pos_iou=0.5, match_low_quality=False, ignore_iof_thr=-1), sampler=dict( type='RandomSampler', num=512, pos_fraction=0.25, # RCNN采样中正样本占25%(原25%),平衡小目标 neg_pos_ub=-1, add_gt_as_proposals=True), pos_weight=-1, debug=False)), test_cfg=dict( rpn=dict( nms_pre=1000, max_per_img=1000, nms=dict(type='nms', iou_threshold=0.7), min_bbox_size=0), rcnn=dict( score_thr=0.05, # 分类阈值调低至0.05,避免漏检 nms=dict(type='nms', iou_threshold=0.5), # IoU阈值0.5,防止同类缺陷合并 max_per_img=100))) # 单图最多输出100个检测框(晶圆单片约80–120个Die)

参数深意:scales=[4,8,16]是晶圆场景的血泪经验——当anchor尺度与缺陷尺寸匹配时,RPN的召回率提升显著;score_thr=0.05看似激进,但配合产线后处理(如按Die区域聚合、剔除孤立低分框),实际误检率可控;min_bbox_size=0是小目标检测的“后悔药”,没有它,所有<4像素的缺陷将被系统性过滤。

5. 避坑指南:晶圆缺陷检测中5个让模型突然崩溃的隐藏陷阱

5.1 图像读取时的“位深度幻觉”——OpenCV默认丢弃高比特信息

现象:模型在训练集上loss稳定下降,但在验证集上mAP停滞在0.2左右,可视化检测框全部集中在图像右下角。
原因:产线AOI设备输出12-bit TIFF图像(0–4095灰度),但OpenCV的cv2.imread()默认读取为8-bit(0–255),高位信息被截断。晶圆缺陷的关键对比度往往在1024–2048区间,截断后缺陷与背景融为一体。
解决:在LoadImageFromFile中强制指定to_float32=True,并在Normalize前将像素值线性映射到[0,1]:

dict(type='LoadImageFromFile', to_float32=True), # 关键!读取为float32 dict(type='Normalize', mean=[0.0], std=[1.0], to_rgb=False), # 归一化到[0,1],非ImageNet标准

5.2 DAOD增强器的“坐标漂移”——未同步增强bbox导致训练发散

现象:训练初期loss剧烈震荡,10个epoch后loss突增至nan,nvidia-smi显示GPU显存占用飙升。
原因:SimulateGlare等增强器修改了图像像素,但未更新gt_bboxes坐标。当glare亮斑覆盖缺陷区域时,模型在错误位置学习“缺陷特征”。DAOD虽提供bbox_transform接口,但需手动启用。
解决:在DAOD配置中显式声明update_bbox=True:

dict( type='DataAugmentationForObjectDetect', operations=[...], update_bbox=True # 必须开启!否则bbox坐标不随图像变换 )

5.3 FPN特征金字塔的“尺度坍缩”——小目标特征在高层消失

现象:模型能检测到大划痕(>50像素),但对微颗粒(<8像素)完全无响应,特征图可视化显示P5/P6层无激活。
原因:标准FPN中,P6层由P5下采样得到,而晶圆图像分辨率高(2048×2048),P5已是64×64,P6仅32×32,小目标信息在下采样中被平均掉。
解决:改用PAFPN(Path Aggregation FPN)并增加P2层输出:

neck=dict( type='PAFPN', in_channels=[256, 512, 1024, 2048], out_channels=256, num_outs=5, # 显式设为5,确保P2被使用 start_level=0, # 从C1开始构建,P2对应C1(stride=4) )

5.4 类别不平衡的“静默崩溃”——Focal Loss参数未校准

现象:训练loss平稳下降,但验证集各类别AP差异巨大:Particle AP=0.72,Pinhole AP=0.08,模型几乎忽略稀有缺陷。
原因:Focal Loss的alpha参数未按类别频率调整。晶圆缺陷中Particle占比67%,Pinhole仅2.3%,alpha=0.25对Pinhole惩罚过重。
解决:按类别频率动态计算alpha:

# 在config中 model.roi_head.bbox_head.loss_cls.alpha=0.023 # Pinhole频率2.3%,设alpha=0.023 # 或更优:使用ClassBalancedFocalLoss(需自定义loss)

5.5 ONNX导出的“维度陷阱”——动态轴未声明导致TensorRT推理失败

现象:ONNX模型在PyTorch中推理正常,但导入TensorRT时报错Assertion failed: dims.nbDims > 0。
原因:MMDetection导出时未声明batch dimension为dynamic,TensorRT无法推断输入形状。
解决:修改tools/deployment/pytorch2onnx.py,在torch.onnx.export中添加:

dynamic_axes = { 'input': {0: 'batch_size'}, # 声明第0维为动态batch 'output': {0: 'batch_size'} } torch.onnx.export(..., dynamic_axes=dynamic_axes)

6. 产线部署前的终极验证:用“缺陷注入测试”代替传统mAP评估

6.1 为什么mAP在晶圆场景是危险的指标?

mAP计算基于IoU阈值(通常0.5),但晶圆工艺中:

  • 一个直径6μm的颗粒,若检测框偏移2μm(IoU=0.45),在物理上仍能准确定位缺陷位置,应视为有效检测;
  • 而两个相邻颗粒(间距8μm),若模型合并为一个框(IoU=0.6),虽mAP得分高,却掩盖了真实缺陷数量,导致良率误判。

因此,我们弃用mAP,构建晶圆专用评估协议WaferEval,包含三个不可妥协的硬性指标:

  • Recall@Pixel:以像素级中心点距离≤3像素为正确检测(对应≤0.45μm定位误差);
  • Count Accuracy:单张图检测数量与人工标注数量的绝对误差≤1;
  • Die-Level Precision:缺陷必须落在有效芯片(Die)区域内,划片槽(Scribe Lane)内检测一律计为误检。

6.2 WaferEval自动化脚本实现

# tools/analysis_tools/wafer_eval.py import numpy as np from mmdet.core import eval_map def wafer_eval(det_results, annotations, class_names, iou_thrs=np.array([0.1, 0.3, 0.5])): """晶圆专用评估:返回Recall@Pixel, Count Accuracy, Die-Level Precision""" # Step 1: Pixel-level recall (中心点距离≤3像素) pixel_recalls = [] for det, ann in zip(det_results, annotations): if len(ann['bboxes']) == 0: continue # 计算所有det框中心点到所有gt框中心点的欧氏距离 det_centers = (det[:, :2] + det[:, 2:]) / 2 gt_centers = (ann['bboxes'][:, :2] + ann['bboxes'][:, 2:]) / 2 dist_matrix = np.linalg.norm( det_centers[:, None, :] - gt_centers[None, :, :], axis=2) # 统计距离≤3像素的匹配对 matched = (dist_matrix <= 3).any(axis=0) # 每个gt是否被至少一个det匹配 pixel_recalls.append(matched.sum() / len(ann['bboxes'])) # Step 2: Count accuracy count_errors = [] for det, ann in zip(det_results, annotations): count_errors.append(abs(len(det) - len(ann['bboxes']))) # Step 3: Die-level precision (需Die Map文件) die_precision = 0.0 if 'die_map' in annotations[0]: # annotations包含Die区域多边形 valid_dets = 0 total_dets = 0 for det, ann in zip(det_results, annotations): die_poly = ann['die_map'] for box in det: center = (box[:2] + box[2:]) / 2 # 判断center是否在die_poly内(使用shapely) if die_poly.contains(Point(center[0], center[1])): valid_dets += 1 total_dets += 1 die_precision = valid_dets / (total_dets + 1e-6) return { 'Recall@Pixel': np.mean(pixel_recalls), 'Count_Accuracy': 1.0 - np.mean(count_errors) / 1.5, # 归一化到[0,1] 'Die_Precision': die_precision } # 使用方式 results = mmcv.load('work_dirs/faster_rcnn_wafer_v2/best_bbox_mAP_epoch_12.pth') eval_results = wafer_eval(results, test_dataset, test_dataset.CLASSES) print(f"Recall@Pixel: {eval_results['Recall@Pixel']:.3f}") print(f"Count Accuracy: {eval_results['Count_Accuracy']:.3f}") print(f"Die Precision: {eval_results['Die_Precision']:.3f}")

脚本逻辑:Recall@Pixel不依赖IoU,直接计算几何中心距离,更符合晶圆工程师的验收逻辑;Count Accuracy的分母设为1.5是经验值——允许单图±1个缺陷计数误差,超过即触发FAE复核;Die_Precision需提前用CAD工具导出Die Map(多边形坐标),这是产线部署的必备资产。

我带过的每个晶圆检测项目,最终都卡在“最后一公里”:模型在实验室跑出漂亮数字,但产线拒绝上线。后来发现,问题不在模型,而在评估标准与产线KPI脱节。现在我的习惯是:模型训练前,先和FAE一起写好WaferEval脚本,把Die Map、缺陷尺寸标定、计数容差全部固化为代码。这样,每次训练完不是看mAP,而是直接运行python wafer_eval.py,三个数字出来,就知道能不能进产线。这比调参重要十倍。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询