
简介面向半导体视觉检测初学者的芯片缺陷检测项目资源围绕轮廓跟踪、模板匹配等经典算法提供从图像预处理、特征提取到缺陷判断的完整实现思路。包内共88个文件以C源码、Visual Studio工程文件、Python脚本、PNG/JPG处理结果图、DOCX实验报告及MP4操作演示为主整体大小133.26MB目录按项目工程、实验数据与结果图分层组织便于对照学习。已有1375人学习下载。资源可直接用于课程设计或算法复现包含待检测芯片图像、二值化/腐蚀/膨胀等中间处理效果、引脚参数显示与缺陷标注结果帮助理解倾斜校正、模板匹配和轮廓跟踪在真实场景中的落地步骤实验报告与录屏进一步补充了参数调节和排错细节。 前阵子整理硬盘翻出来一个自己搭的检测项目包叫“视觉算法-芯片缺陷检测.zip”。琢磨了一下还是决定把这套东西拆开写成一篇偏实战的分享。做视觉这几年的不少朋友都有类似感受网上开源的检测项目不少但基本都是实验室Demo要么数据集太干净要么流程只到训练完就没了离产线能用还有一段距离更别说直接落地到芯片这种高价值、高要求的场景里。我这个包算是一个完整的闭环尝试从数据准备、算法选型到训练推理全部打包在一起适合刚入行的算法工程师、搞机器视觉的测试开发以及想在半导体行业做AOI自动光学检测落地的同学参考。先说清楚这个项目到底是干嘛的。芯片在制造和封装过程中表面容易出现划伤、崩边、脏污、缺角、色差、异物附着等各类缺陷。这些缺陷直接影响芯片的良率和可靠性早期主要靠人工目检但效率低、漏检率高、成本也高。这套“视觉算法-芯片缺陷检测”方案就是用工业相机拍图结合传统图像处理算法和深度学习分类网络对芯片表面进行自动化缺陷识别并输出标框和分类结果把人工复检的比例降下来。整个项目用Python实现核心库基于OpenCV和PyTorch代码量不大最大的价值在于把“怎么一步步搭一套能跑的检测流程”讲清楚了。1. 项目背景与整体设计思路1.1 为什么芯片缺陷检测值得用视觉算法做芯片检测和普通零部件检测最大的区别在于两点精度要求高、缺陷种类杂。一片晶圆经过切割、贴片、键合、塑封等工序每一道都可能引入缺陷。很多缺陷肉眼可见但尺寸小、对比度低工人盯着显微镜看一天眼睛状态直接影响检出率。AOI设备的核心逻辑就是代替人眼完成这套繁琐的重复劳动。我在设计这个项目时优先考虑的不是用什么听起来高级的网络模型而是能不能真正解决检测需求。芯片表面缺陷检测普遍面临几个难搞的问题缺陷种类多且形态差异大划伤是线状的脏污是块状的崩边发生在边缘色差靠颜色判断。背景复杂芯片表面有字、引脚、线路纹理容易干扰判断。产线节拍要求高一张图的处理时间通常要求在几十毫秒到几百毫秒之间太重的人工智能模型跑不起来。缺陷样本少实际产线的不良率很低正负样本极不平衡。综合这些条件直接端到端扔一个目标检测网络进去并不现实。最稳妥的思路是“传统算法粗筛 深度模型细判”的组合拳先通过可靠的图像预处理和规则算法把可疑区域框出来再用轻量级分类网络确认这个区域到底是真缺陷还是误报。这套流程在工业现场非常常见也是我这个zip包里的核心逻辑。1.2 方案选型背后的几个关键考量我在开局定方案时纠结过三个问题检测框架选目标检测还是分类传统图像处理需不需要保留深度学习模型选多大的。目标检测比如YOLO、Faster R-CNN可以直接输出缺陷的位置和类别听起来一步到位但训练需要大量带框标注数据而且芯片缺陷往往非常小小目标检测即便在高端显卡上也要花不少精力调。分类网络只需要把候选区域裁出来判断是正常还是异常对标注要求相对低更容易跑通。所以我在最终版本里把“检测”这个动作拆成了两步先用规则算法生成候选框再用分类网络做最终判定。第一步解决“缺陷在哪”第二步解决“这到底是不是缺陷”。传统图像处理在很多人眼里已经过时了但在芯片这类高一致性场景下恰恰是最高效的工具。芯片的图像背景非常稳定光照条件可控很多缺陷通过阈值分割、边缘提取、形态学运算就能得到不错的候选区域。把传统算法完全删掉只靠深度学习去全图扫描等于用大炮打蚊子速度慢还容易漏。保留传统算法既能减轻后续模型的负担也能在深度学习效果不理想时提供一个兜底方案。深度学习模型方面我选的是ResNet18和MobileNetV3二选一的结构输入图像裁剪成224x224。理由很直接这类轻量网络参数量小、推理快在工业场景下部署划算而且做二分类或少量类别分类时精度已经足够。整个项目默认走ResNet18你如果现场设备性能紧张把配置文件里模型名改成MobileNetV3就能切换。2. 检测算法拆解与技术要点2.1 三段式检测流程预处理、粗筛、细判整个检测算法可以拆成三个环节对应代码里的preprocess.py、rule_engine.py和classifier.py。预处理阶段做的事包括灰度化、去噪、光照校正和对比度增强。芯片表面往往有反光直接二值化容易把反光区域误判成缺陷。我用的处理手段是对图像做高斯滤波平滑然后用顶帽变换Top-Hat提取亮背景下的暗缺陷或者用黑帽变换Black-Hat提取暗背景下的亮缺陷。这个细节很关键它比单纯调阈值要稳定得多特别是在光照不完全均匀的情况下。粗筛阶段由规则引擎完成。针对划伤、脏污、崩边这几类常见缺陷分别设计不同的算子划伤用线状结构元素的形态学开运算突出细长区域然后通过面积和长宽比过滤掉噪点脏污用灰度阈值配合连通域分析提取面积异常、灰度异常的连通块崩边主要看图像边缘通过边缘梯度突变定位缺口。筛选出来的候选区域统一裁剪成固定尺寸留着给分类器用。细判阶段由深度学习模型接手。每个候选区域经过归一化后送入分类网络输出一个概率分布比如“正常”“划伤”“脏污”“崩边”。为了提高召回率我会把粗筛阈值设松一点宁可得出一批假阳性候选框再由分类器把这些假阳性过滤掉。这样整体准确率会明显上升漏检率也能压得比较低。2.2 关键算法参数与计算逻辑实际写代码时参数不像教科书里给得那么精确需要根据图像分辨率实测调整。以我们相机采集的500万像素灰度图为例几个核心参数我初始配置是这样高斯滤波核大小5x5sigma取1.2。太大容易把细小划伤糊掉太小去噪效果差。顶帽变换结构元素尺寸15x15的矩形核用于提取暗缺陷。如果缺陷是细微划伤结构元素改成 15x3 的线形核效果更好。连通域最小面积阈值50像素。小于这个面积的候选块大概率是噪点不值得送进分类网络。候选区域裁剪尺寸224x224送入网络前做归一化像素值除以255之后按ImageNet的均值方差做标准化。分类网络输出置信度阈值0.7。置信度低于0.7的候选框全部视为背景这个值可以根据实际误检率上下浮动。有个细节值得单独说一下连通域分析后我会对每个候选框计算几个手工特征——面积、周长、外接矩形宽高比、灰度均值、灰度标准差、局部对比度。这些特征用于在规则引擎阶段做第一轮过滤比如宽高比大于10的区域几乎可以确定是划伤而不是脏污面积特别小但标准差大的区域大概率是纹理干扰。这套特征工程虽然传统但在实际调参过程中帮了大忙比盲目调模型参数更直观。3. zip包结构与实操流程实录3.1 解压后先看目录结构拿到zip包第一步当然是解压。这个包我是用标准zip格式打的直接双击解压或者用命令行都行。需要注意项目路径里尽量不要有中文和空格我之前碰到过同事把项目放在“桌面/新建文件夹”里结果OpenCV读取路径报错排查半天。完整的目录结构长这样chip_defect_detection/ ├── data/ │ ├── train/ │ │ ├── normal/ │ │ ├── scratch/ │ │ ├── stain/ │ │ └── chipping/ │ ├── val/ │ └── test/ ├── configs/ │ └── train.yaml ├── core/ │ ├── __init__.py │ ├── preprocess.py │ ├── rule_engine.py │ ├── feature_extract.py │ ├── classifier.py │ └── dataset.py ├── utils/ │ └── viz.py ├── train.py ├── infer.py ├── export_onnx.py └── requirements.txtdata目录下按缺陷类别分了子文件夹normal是正常样本scratch是划伤stain是脏污chipping是崩边。这是最基础的图像分类数据集组织方式PyTorch的ImageFolder可以直接读取。configs/train.yaml是训练参数配置所有模型结构、学习率、训练轮数都可以在这里改。core目录放算法核心代码每个模块职责单一。train.py负责训练infer.py负责单张图片的推理export_onnx.py用于导出ONNX模型方便后续部署。3.2 运行环境搭建与依赖安装依赖都在requirements.txt里主要包括torch 和 torchvisionCPU版或GPU版都可以训练推荐GPUopencv-pythonnumpypandaspyyamlonnx 和 onnxruntime用于导出和跑ONNX模型scikit-learn用于评价指标计算安装命令很简单conda create -n chip_defect python3.8 conda activate chip_defect pip install -r requirements.txtPython版本建议用3.8或3.9PyTorch的兼容性最稳。我之前在Python 3.10下跑过部分依赖版本容易打架特别是opencv-python和numpy的版本冲突会报一些莫名其妙的错。3.3 数据准备与训练全流程训练前数据整理是这项目里最花时间的一步。你需要为每个缺陷类别准备至少200张以上图片图片只裁减到缺陷区域附近不需要整颗芯片都放进去。这样做的逻辑是分类器只需要判断“这块区域像不像缺陷”定位工作已经由规则引擎完成了不要给分类器增加额外负担。数据准备好后直接改配置文件里的路径和训练参数python train.py --config configs/train.yaml训练过程中程序会打印每个epoch的loss和验证集准确率并在验证集上保存准确率最高的模型权重best_model.pth。整个训练过程如果只有几百张图片在普通显卡上跑50个epoch也就几分钟的事情。训练完后用infer.py对测试图片做推理python infer.py --image data/test/scratch_001.bmp --weights weights/best_model.pth推理结果会生成一张带框和标签的可视化图片同时输出一个CSV文件记录每个缺陷框的坐标、类别和置信度。这个CSV就是和产线MES系统对接的基础数据格式。4. 模型训练与调优的实战心得4.1 数据标注与增强的细节很多项目挂在数据集质量上芯片检测尤其如此。芯片缺陷样本难获取是客观现实产线不良率本来就低有时候跑一个月也不一定能攒出几百张真实缺陷图。我的做法是两条腿走路真实不良样本尽量多收集同时做离线数据增强。数据增强不等于简单翻转和旋转。针对芯片检测场景我更推荐这几类增强亮度扰动模拟不同光源强度下的拍摄效果幅度控制在±20%内太大会把缺陷特征洗掉。高斯噪声模拟相机传感器噪声提升模型鲁棒性。随机裁剪缩放模拟缺陷大小变化。形态学膨胀腐蚀模拟不同清晰度下缺陷边缘的变化。标注方面芯片缺陷最怕的是分类边界模糊。比如细小划伤和正常丝印纹理之间没有明确界线不同人打标签可能给同一张图不同的标注。我在项目里给了一个标注规范建议拿不准的样本归入normal因为规则引擎会把可疑区域框出来分类器宁可漏掉也不要把噪声学进去否则后面误报会铺天盖地。4.2 训练参数设置与过拟合规避训练参数我基本沿用了一套实用配置比较稳优化器Adam初始学习率 0.001学习率调整ReduceLROnPlateau连续5个epoch验证集不下降就降为原来的0.1倍Batch size64单卡训练轮数50损失函数CrossEntropyLoss加了类别权重正常类权重设为1缺陷类权重设为1.5数据集小的时候特别容易过拟合模型对训练集记得滚瓜烂熟但验证集一测就打回原形。我的经验是第一看验证集loss曲线第二看有没有加早停机制。训练脚本里加了EarlyStopping验证集loss连续10个epoch不下降就提前终止防止后期纯浪费时间。4.3 从PyTorch到ONNX的部署加速训练归训练真正到产线上跑还是得考虑速度和运行时依赖。PyTorch直接部署不是不行但带着一大堆Python依赖性能和兼容性都有点尴尬。所以我写了一个export_onnx.py把训练好的模型导出成ONNX格式python export_onnx.py --weights weights/best_model.pth --output weights/chip_model.onnx导出ONNX时有一个关键算子问题值得特别注意。PyTorch里的部分数据增强算子或动态尺寸结构在ONNX转换时可能不支持所以导出前要把模型切到eval模式并用固定尺寸的输入做dummy输入。导出后的ONNX模型可以用onnxruntime或TensorRT推理速度比PyTorch动态图快不少。实测一张224x224的图片纯模型推理CPU上只要十毫秒左右GPU上可以压到两三毫秒完全能跟上产线节拍。5. 常见问题与排查技巧实录5.1 环境与zip包相关的问题这里分享几个我踩过的坑也包括网上大家经常问到的压缩包问题。zip包解压报错“invalid zip archive: could not find EOCD”这个错误本质是压缩包文件不完整或者下载过程中被截断了。EOCDEnd of Central Directory是zip格式的尾部标记找不到它说明文件末尾缺失。解决办法不是研究什么修复工具而是重新下载并校验文件大小和哈希值。如果下载多次还是报错换一个解压工具试试比如7-Zip对部分异常zip的容错性比系统自带的好一些。解压后中文文件名乱码有些压缩包在Windows下用GBK编码压缩在macOS或Linux下解压会显示乱码。我的建议是压缩时文件名尽量用英文项目代码里也不要出现中文路径这是跨平台最省心的方法。运行import报错“DLL load failed”这是Windows环境下常见的OpenCV/PyTorch依赖问题多半是VC运行库没装或者Python版本和库不匹配。建议装了Python 3.8后用conda统一管理环境不要自己在系统Python里强行装包。5.2 检测效果不佳的排查思路如果跑完推理发现误检很多或者漏检严重不要急着调网络结构。先按这个顺序排查检查粗筛阶段是不是漏掉了可疑区域。规则引擎阈值设太严缺陷没生成候选框那后面模型再好也白搭。此时先把面积阈值调低宁可多框一些区域。检查分类器是不是把正常区域误判成缺陷。解决办法是增加normal类训练样本也要确保训练样本包含各种光线条件下的正常图比如引脚反光、丝印纹理等。检查光照一致性。芯片检测对光照极其敏感同一个缺陷在明场和暗场下表现完全不同。现场调试时一定要先固定光源角度和亮度再做算法参数微调。我整理了一个速查表方便大家对照现象可能原因排查动作误检多粗筛阈值太松、分类器置信度阈值低调低候选框过滤面积、提高置信度阈值漏检粗筛阈值太严、缺陷对比度低降低面积阈值、增加顶帽/黑帽预处理训练准确率低样本量不足、类别不平衡增加数据增强、设置类别权重CPU推理慢模型参数量大、输入尺寸大换MobileNetV3、导出ONNXGPU跑不起来CUDA版本不匹配检查torch版本和CUDA驱动版本对应关系5.3 规则引擎参数自动标定的小技巧最后说一个我觉得挺实用的小技巧。规则引擎里的面积阈值、长宽比阈值这类参数纯靠人去试很容易试到崩溃。我写了一个简单的自动标定脚本逻辑是准备一批确认过的缺陷图和正常图放在固定目录。遍历候选参数组合运行规则引擎。计算在标注框范围内的召回率和正常图上的误检率。保存效果最好的一组参数到YAML文件。实际效果比我手动调参速度提升一大截而且每次换产线产品、换相机分辨率时重新跑一遍就能快速适配省了很多现场调试时间。写在最后的个人体会这个项目断断续续做了挺久给我最大的感触是芯片缺陷检测真正难的从来不是用什么高大上的模型而是把整个链路捋顺——数据怎么标、候选框怎么出、模型怎么判、结果怎么输出每一步都要经得起现场推敲。很多网友拿到代码包后喜欢直接问“怎么提升准确率”但准确率只是最后一步的结果前期的缺陷样本挖掘、规则引擎参数、光照环境稳定这些才是决定上限的因素。如果你打算拿这套代码跑自己的场景我建议先别急着改模型结构按照这个包里的流程走一遍把候选框和分类器的配合调顺了再考虑算法性能的优化。项目代码我打包成了zip解压后建议先去data/test里跑一遍demo再替换自己的数据遇到问题欢迎随时交流。本文还有配套的精品资源点击获取