头图

wolfmax老狼,飞桨领航团无锡团团长,飞桨开发者技术专家(PPDE),AICA六期学员,某半导体CIM软件集成商图像算法工程师,主要研究方向为图像检测、图像分割等算法。
作者AI Studio主页
https://aistudio.baidu.com/ai...

项目背景

半导体晶圆作为集成电路的载体,在制造过程中需要反复经过复杂的薄膜、光刻、刻蚀等工序。而这些制造过程中工序的异常会导致晶圆缺陷的产生。在晶圆质检中,利用电学测试设备对晶圆片上的每颗晶粒进行电性测试,可得到用于描述晶圆缺陷状态的晶圆图谱,如下图所示。

 title=

在上图中,每个小方块即是晶圆上的一颗芯片,有颜色标识的即为测试异常的芯片。对晶圆上有缺陷的芯片的空间分布图谱的模式进行识别分析,可有效辅助识别制造过程中的缺陷根源,并有针对性的进行改进和预防,从而提升晶圆制造的产品良率。例如,上图中有部分长条状的失效可能是划伤等造成。

本项目基于开源的WM-811K晶圆缺陷图谱数据集,使用飞桨图像分类套件PaddleClas进行晶圆缺陷分类图谱分析,演示如何使用PaddleClas快速搭建一个完整的图像分类方案,包括数据集准备、模型训练、验证、测试以及相应的部署。

  • 项目链接

https://aistudio.baidu.com/ai...

数据集介绍

本项目采用开源的WM-811K数据集。原始数据可以从以下网站下载。

  • 下载网址

http://mirlab.org/dataSet/pub...

需要注意的是从该网站下载下的数据分为MATLAB格式的.mat文件和python序列化后的.pkl文件。该数据集共收集了811457张晶圆测试后的图片。但是要注意,其中只有172950做了标签,将失效按照芯片的空间分布分类成9个类别(0,1,2...8)。

对每种缺陷的图谱进行可视化预览可以对数据有基本的认识。在数据集中有个label_list.txt文件,该文件中包含了每种缺陷的标签(0-8)及其对应的缺陷名称。下面使用该文件创建缺陷名称,并选择相应的图片进行可视化。

在train.txt文件中,每种缺陷随机选择5个样本进行可视化。

 title=

根据图片和缺陷的名称,可以大概了解每种缺陷的分类方法,例如:

  • Center:大部分缺陷的芯粒位于晶圆圆心附近;​
  • Donut:缺陷的芯粒空间分布类似于一个甜甜圈;
  • Loc:局部出现缺陷芯粒聚集等。

开发环境准备

本项目使用PaddleClas进行图谱分类算法模型的训练和验证,需要安装PaddleClas以及相应的工具,配置PaddleClas的运行环境。

下载PaddleClas

执行git clone命令下载,GitHub比较慢,可以从Gitee上下载。另外,在本项目环境中打包了一份PaddleClas,使用时直接解压即可。

  • git clone

https://gitee.com/paddlepaddl...

安装相应的依赖

使用pip install命令安装PaddleClas根目录下的requirements.txt即可,同时可以设置镜像,加速安装。

  • pip install --upgrade -r requirements.txt -i

https://mirror.baidu.com/pypi...

选择模型训练

配置好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

训练结果可视化: title=

  • 将训练过程可视化可以方便地观察训练过程的变化。差不多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)

 title=

使用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)

 title=根据上述两节的可视化结果来看,可以发现分类错误的图谱大部分是Loc、Edge-Loc等图片,这种现象与晶圆图谱分类的特殊性有关,与普通的图片分类不同,晶圆图谱的失效模式类别和区域位置强相关,例如同样是loc失效,在中间为center类别,在边缘为Edge-Loc类别,在其他位置为Loc,这个和图片分类中的位置不变性相矛盾。对此,后期可以通过增加相应类别的样本数量来改善效果。

总结

本项目主要介绍如何在半导体制造中引入深度学习技术解决问题。半导体制造作为高端制造业,其整个产业链的安全非常重要。本项目展示使用飞桨图像分类套件PaddleClas来快速解决问题,希望能在此领域抛砖引玉,希望更多的小伙伴能挖掘更多的应用,一起助力半导体智能制造产业的发展!大国崛起,吾辈自强!


飞桨PaddlePaddle
30 声望34 粉丝

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集深度学习核心训练和推理框架、基础模型库、端到端开发套件、丰富的工具组件于一体,是中国首个自主研发、功能丰富、开源开放的产业级深度...