项目背景
半导体晶圆作为集成电路的载体,在制造过程中需要反复经过复杂的薄膜、光刻、刻蚀等工序。而这些制造过程中工序的异常会导致晶圆缺陷的产生。在晶圆质检中,利用电学测试设备对晶圆片上的每颗晶粒进行电性测试,可得到用于描述晶圆缺陷状态的晶圆图谱,如下图所示。
在上图中,每个小方块即是晶圆上的一颗芯片,有颜色标识的即为测试异常的芯片。对晶圆上有缺陷的芯片的空间分布图谱的模式进行识别分析,可有效辅助识别制造过程中的缺陷根源,并有针对性的进行改进和预防,从而提升晶圆制造的产品良率。例如,上图中有部分长条状的失效可能是划伤等造成。
本项目基于开源的WM-811K晶圆缺陷图谱数据集,使用飞桨图像分类套件PaddleClas进行晶圆缺陷分类图谱分析,演示如何使用PaddleClas快速搭建一个完整的图像分类方案,包括数据集准备、模型训练、验证、测试以及相应的部署。
https://aistudio.baidu.com/aistudio/projectdetail/5151210
数据集介绍
本项目采用开源的WM-811K数据集。原始数据可以从以下网站下载。
http://mirlab.org/dataSet/public/
需要注意的是从该网站下载下的数据分为MATLAB格式的.mat文件和python序列化后的.pkl文件。该数据集共收集了811457张晶圆测试后的图片。但是要注意,其中只有172950做了标签,将失效按照芯片的空间分布分类成9个类别(0,1,2...8)。
对每种缺陷的图谱进行可视化预览可以对数据有基本的认识。在数据集中有个label_list.txt文件,该文件中包含了每种缺陷的标签(0-8)及其对应的缺陷名称。下面使用该文件创建缺陷名称,并选择相应的图片进行可视化。
在train.txt文件中,每种缺陷随机选择5个样本进行可视化。
根据图片和缺陷的名称,可以大概了解每种缺陷的分类方法,例如:
开发环境准备
本项目使用PaddleClas进行图谱分类算法模型的训练和验证,需要安装PaddleClas以及相应的工具,配置PaddleClas的运行环境。
下载PaddleClas
安装相应的依赖
使用ResNet50模型进行训练
PaddleClas/ppcls/configs/ImageNet/ResNet/ResNet50.yaml
python tools/train.py -c /home/aistudio/PaddleClas/ppcls/configs/ImageNet/ResNet/ResNet50.yaml
python tools/eval.py -c /home/aistudio/PaddleClas/ppcls/configs/ImageNet/ResNet/ResNet50.yaml -o Global.pretrained_model=/home/aistudio/PaddleClas/output/ResNet50/best_model
python tools/infer.py -c /home/aistudio/PaddleClas/ppcls/configs/ImageNet/ResNet/ResNet50.yaml -o Global.pretrained_model=/home/aistudio/PaddleClas/output/ResNet50/best_model -o Infer.infer_imgs=/home/aistudio/work/test/Center_85238.jpg
python tools/export_model.py -c /home/aistudio/PaddleClas/ppcls/configs/ImageNet/ResNet/ResNet50.yaml -o Global.pretrained_model=/home/aistudio/PaddleClas/output/ResNet50/best_model -o Global.save_inference_dir=deploy/models/ResNet50
使用ResNet50模型推理及可视化
%cd /home/aistudio/PaddleClas/deploy
!python python/predict_cls.py \
-c configs/inference_cls.yaml
import osimport pandas as pdimport cv2import matplotlib.pyplot as plt%matplotlib inline
img_root = "/home/aistudio/work/test"wrong_list = ['Edge-Loc_48272.jpg', 'Edge-Loc_58508.jpg', 'Edge-Loc_7413.jpg', 'Loc_87266.jpg', 'Scratch_355662.jpg']wrong_label = ['Loc','Edge-Ring','Loc','Donut','Loc']
plt.figure(figsize = (15,6))for i in range(len(wrong_list)):img_path = os.path.join(img_root, wrong_list[i])img = cv2.imread(img_path)plt.subplot(1,len(wrong_list), i+1)plt.imshow(img[:,:, ::-1])plt.xlabel(wrong_list[i])# plt.axis('off')plt.title("Predict Result: " + wrong_label[i], fontsize = 12)
使用MobileNet推理及可视化
inference_model_dir:"/home/aistudio/PaddleClas/deploy/models/MobileNetV3_large_x0_75"
%cd /home/aistudio/PaddleClas/deploy
!python python/predict_cls.py \
-c configs/inference_cls_mobilenetv3.yaml
wrong_list = ['Donut_7334.jpg', 'Edge-Loc_48272.jpg', 'Loc_94941.jpg']
wrong_label = ['Random','Loc','Donut']
plt.figure(figsize = (15,6))
for i in range(3):
img_path = os.path.join(img_root, wrong_list[i])
img = cv2.imread(img_path)
plt.subplot(1,3, i+1)
plt.imshow(img[:,:, ::-1])
plt.xlabel(wrong_list[i])
# plt.axis('off')
plt.title("Predict Result: " + wrong_label[i], fontsize = 12)