写点什么

基于飞桨 PaddleClas 完成半导体晶圆图谱缺陷种类识别

  • 2023-02-20
    北京
  • 本文字数:3524 字

    阅读完需:约 12 分钟

基于飞桨PaddleClas完成半导体晶圆图谱缺陷种类识别


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


作者 AI Studio 主页


https://aistudio.baidu.com/aistudio/personalcenter/thirdview/80110

项目背景

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


wps_doc_0.png


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


本项目基于开源的 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 个样本进行可视化。


wps_doc_1.png


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


  • 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
复制代码


训练结果可视化:


wps_doc_2.png


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


wps_doc_4.png


使用 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)
复制代码


wps_doc_6.png


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

总结

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

用户头像

还未添加个人签名 2022-12-26 加入

还未添加个人简介

评论

发布
暂无评论
基于飞桨PaddleClas完成半导体晶圆图谱缺陷种类识别_paddle_飞桨PaddlePaddle_InfoQ写作社区