wolfmax老狼,飞桨领航团无锡团团长,飞桨开发者技术专家(PPDE),AICA六期学员,某半导体CIM软件集成商图像算法工程师,主要研究方向为图像检测、图像分割等算法。
• 作者AI Studio主页
https://aistudio.baidu.com/aistudio/personalcenter/thirdview/80110
项目背景
半导体晶圆作为集成电路的载体,在制造过程中需要反复经过复杂的薄膜、光刻、刻蚀等工序。而这些制造过程中工序的异常会导致晶圆缺陷的产生。在晶圆质检中,利用电学测试设备对晶圆片上的每颗晶粒进行电性测试,可得到用于描述晶圆缺陷状态的晶圆图谱,如下图所示。
在上图中,每个小方块即是晶圆上的一颗芯片,有颜色标识的即为测试异常的芯片。对晶圆上有缺陷的芯片的空间分布图谱的模式进行识别分析,可有效辅助识别制造过程中的缺陷根源,并有针对性的进行改进和预防,从而提升晶圆制造的产品良率。例如,上图中有部分长条状的失效可能是划伤等造成。
本项目基于开源的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个样本进行可视化。
根据图片和缺陷的名称,可以大概了解每种缺陷的分类方法,例如:
Center:大部分缺陷的芯粒位于晶圆圆心附近;
Donut:缺陷的芯粒空间分布类似于一个甜甜圈;
Loc:局部出现缺陷芯粒聚集等。
开发环境准备
本项目使用PaddleClas进行图谱分类算法模型的训练和验证,需要安装PaddleClas以及相应的工具,配置PaddleClas的运行环境。
下载PaddleClas
执行git clone命令下载,GitHub比较慢,可以从Gitee上下载。另外,在本项目环境中打包了一份PaddleClas,使用时直接解压即可。
git clone
https://gitee.com/paddlepaddle/PaddleClas
安装相应的依赖
使用pip install命令安装PaddleClas根目录下的requirements.txt即可,同时可以设置镜像,加速安装。
pip install --upgrade -r requirements.txt -i
https://mirror.baidu.com/pypi/simple
选择模型训练
配置好PaddleClas的运行环境后,可以使用PaddleClas内的模型直接进行训练,这也是使用套件的好处。模型组网已经完成,直接修改config配置文件即可完成模型的训练,非常高效!
在本项目中,我们使用用于服务器端部署的ResNet模型和移动端部署的MobileNet模型来进行演示。
使用ResNet50模型进行训练
有了PaddleClas开发套件,只需要将对应模型的yaml文件按照自己的项目配置进行更改即可。主要是指定数据集的位置以及相应的优化器配置。
对于ResNet50,相应的config文件位置为:
PaddleClas/ppcls/configs/ImageNet/ResNet/ResNet50.yaml
对于该模型,我们作如下配置进行训练:
epochs:200
learning rate: 0.01
learning rate scheduler: PiecewiseDecay
使用toos/train.py脚本开启一键训练:
python tools/train.py -c /home/aistudio/PaddleClas/ppcls/configs/ImageNet/ResNet/ResNet50.yaml
训练结果可视化:
将训练过程可视化可以方便地观察训练过程的变化。差不多150个epoch之后,模型的精度稳定到0.85以上;
另外,可以直观地看到学习率采用PiecewiseDecay方式衰减的变化趋势。
模型评估
在训练过程中,我们可以在训练的脚本中加入--eval,可以实现一边训练一边评估。另外,在训练结束之后,我们也可以单独对模型进行评估,运行tools/eval.py脚本,同时指定模型的位置即可。
执行以下命令评估ResNet50模型的效果:
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
模型预测
完成评估后,可以使用tools/infer.py脚本进行单张图片或者多张图片批量预测。在预测脚本中传入使用的模型和测试的图片路径即可。
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
模型导出部署
飞桨支持导出推理模型用于部署推理场景,相比于训练调优场景,推理模型会将网络权重与网络结构进行持久化存储。并且飞桨支持使用预测引擎加载推理模型进行预测推理。在PaddleClas套件中通过tools/export_model.py导出模型。导出后,将生成以下三个文件:
inference.pdmodel:用于存储网络结构信息;
inference.pdiparams:用于存储网络权重信息;
inference.pdiparams.info:用于存储模型的参数信息,在分类模型和识别模型中可忽略。
通过运行如下命令导出模型:
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模型推理及可视化
使用以下指令实现ResNet50模型的推理:
%cd /home/aistudio/PaddleClas/deploy
!python python/predict_cls.py \
-c configs/inference_cls.yaml
使用ResNet50模型进行推理,可以对照文件名和推理的结果来判断预测是否正确。对于ResNet模型,可以统计出75张图片,有5张预测错误。我们将分类错误的图片单独拿出来分析,直观地分析错误的原因,便于改进。
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_cls.yaml复制一份并更改为inference_cls_mobilenetv3.yaml,同时将该文件内的模型的位置更改成MobileNet的位置,即:
inference_model_dir:"/home/aistudio/PaddleClas/deploy/models/MobileNetV3_large_x0_75"
执行以下命令实现MobileNet模型的推理:
%cd /home/aistudio/PaddleClas/deploy
!python python/predict_cls.py \
-c configs/inference_cls_mobilenetv3.yaml
最终,仅有3张图片分错,Test_Acc达到 96%,进一步改进即可上demo!
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)
根据上述两节的可视化结果来看,可以发现分类错误的图谱大部分是Loc、Edge-Loc等图片,这种现象与晶圆图谱分类的特殊性有关,与普通的图片分类不同,晶圆图谱的失效模式类别和区域位置强相关,例如同样是loc失效,在中间为center类别,在边缘为Edge-Loc类别,在其他位置为Loc,这个和图片分类中的位置不变性相矛盾。对此,后期可以通过增加相应类别的样本数量来改善效果。
总结
本项目主要介绍如何在半导体制造中引入深度学习技术解决问题。半导体制造作为高端制造业,其整个产业链的安全非常重要。本项目展示使用飞桨图像分类套件PaddleClas来快速解决问题,希望能在此领域抛砖引玉,希望更多的小伙伴能挖掘更多的应用,一起助力半导体智能制造产业的发展!大国崛起,吾辈自强!
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~