半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习
在半导体行业,工程师依靠 CP Yield(生产过程中芯片的合格率)、WAT(晶圆验收测试)和 Particle 的晶圆图模式来识别工艺问题。然而,在没有人工干预的情况下将这些晶圆图模式分类是一项重大挑战。许多论文都研究了这个问题,从这一篇纹章旗,我将和您一起来学习使用深度学习的技术来解决该问题的方法。
一、半导体质量控制概念
(1)CP Yield
CP Yield 是指 Critical Process Yield,即“关键工艺良率”。它衡量的是在半导体制造过程中特定关键工艺步骤的良品率,反映了该工艺步骤的生产效率和质量控制水平。
具体来说,CP Yield 聚焦于那些对最终产品质量和性能影响最大的工艺步骤,如掩膜制作、光刻、离子注入、化学机械抛光(CMP)等。这些工艺步骤被认为是生产过程中最为“关键”的环节,因为它们直接决定了最终芯片的性能、功能和良率。
关键点:
-
影响因素: CP Yield 受到多种因素的影响,包括设备精度、工艺参数的控制、环境条件(如温湿度)、原材料的质量等。
-
重要性: 高的 CP Yield 表示该工艺步骤具有较好的稳定性和可控性,能够生产出更多符合要求的合格芯片,降低了缺陷率和返工成本。相反,低的 CP Yield 可能意味着工艺中存在问题,需要调整或优化。
-
与总良率的关系: CP Yield 是影响整体生产良率(Total Yield)的重要因素,特别是在复杂的集成电路制造过程中,良好的 CP Yield 能显著提高整体良率。
(2)WAT
WAT 通常是指 Wafer Acceptance Test(晶圆验收测试)。WAT 是一种测试过程,用于评估和验证半导体晶圆在生产过程中是否符合质量标准,通常在晶圆的加工和封装过程之前进行。它通常包括以下几个方面:
-
电性能测试: 确保晶圆上的每个芯片是否正常工作,符合电气性能规格。这可能包括测量电流、电压、功耗等。
-
物理尺寸测量: 确保晶圆的物理尺寸、厚度等参数是否符合设计要求。
-
缺陷检测: 检查晶圆表面是否有任何可见的缺陷或污染物,例如划痕、裂纹、气泡等。
-
光学检查: 通过光学显微镜或其他仪器检测晶圆表面的质量,确认没有严重的缺陷。
WAT 的目的是在进入下游的封装、测试和最终出货之前,确保每片晶圆的质量符合规范,避免不良产品流入生产线或市场,节省后期处理的成本。
二、WM-811K Wafermap
(1) 简介
WM-811K Wafermap 数据集是一个用于缺陷检测和分类的公开数据集,主要用于研究半导体制造过程中的晶圆缺陷分析。这一数据集由许多晶圆的缺陷模式组成,其中每个晶圆被标记为正常或存在某种类型的缺陷模式。研究人员和从业者可以利用该数据集来开发和评估机器学习和深度学习算法,以自动化地检测和识别晶圆上的缺陷模式。
通常情况下,一片8英寸wafer上往往可以放置数百到上千颗芯片(die - 晶粒),具体视芯片的面积大小。
WM-811K Wafermap 数据集包含 811,457 幅图像,其中172,950 幅图像具有手动缺陷标签,总共包含 9 个缺陷标签:0、1、2、3、4、5、6、7 和 8。其中,标签 8(代表无模式 -no pattern)占总数的 85.2%。在wafer测试中。
9种缺陷标签分别是:0 中心(4294(2.5%))、1 甜甜圈(555(0.3%))、2 边缘位置(5189(3.0%))、3 边缘环(9680(5.6%))、4 局部( 3593(2.1%))、5随机(866(0.5%))、6 划痕(1193(0.7%))、7 接近满(149(0.1%))、8无(638507 (85.2%))。
WM-811k 数据集中半导体晶片故障类型的示例。
晶圆(wafer)是半导体材料(通常为硅)制成的薄片,是集成电路(IC)制造的基础。每个晶圆上可以切割出多个裸片(Die),每个裸片上都包含一个集成电路。为了测试这些集成电路的性能,自动检测机器会对晶圆上的每个IC进行测试,并生成晶圆图(或称映射图),通过这些图像可以识别出哪些芯片性能符合标准(合格),哪些芯片存在性能问题(不合格)。
晶圆图上,合格和不合格裸片的分布模式往往能够反映出制造过程中可能存在的特定问题。深度学习技术能够有效地分析大量晶圆图中的缺陷模式,从而帮助快速识别制造问题。这种方法可以及时调整制造流程,减少浪费,提高生产效率。
在晶圆测试分析中,一般会对单张晶圆上的数据进行分析,也会对多上晶圆叠加后,对单个die进行属性据分析,以此来筛选出异常值,判断工艺过程中的品质和良率。
(2)数据集PKL
经过上面的介绍,我想您一定已经基本了解了半导体测试中的数据分析概要,现在我们来使用这个数据集。为了方便学习,我们仍采用AI大杀器PYTHON来作为编程语言。所以采用的这个数据集是已经转化为 PKL文件的数据集。
这个数据集 ,你可以从这里下载:
http://mirlab.org/dataSet/public/
在 Python 中,很多数据集使用 PKL 格式(即 pickle
格式)存储,主要是因为 pickle
是 Python 内置的对象序列化模块,它非常方便地将 Python 对象转换为字节流,从而可以保存到文件中,或者将其传输到其他地方。具体来说,有以下几个原因:
-
支持存储复杂数据结构:
pickle
可以序列化几乎所有的 Python 数据结构,包括字典、列表、元组、类实例等复杂对象,因此,很多机器学习和数据处理框架(如 scikit-learn、TensorFlow 等)使用pickle
格式来存储训练好的模型、数据集或者其他中间结果。 -
高效性:与其他格式(如 JSON 或 CSV)相比,
pickle
在存储和加载数据时通常更加高效。它可以直接存储 Python 对象,不需要转换为字符串或其他格式,因此避免了额外的开销。 -
与 Python 环境兼容:
pickle
格式是 Python 专用的,因此能够无缝地与 Python 环境集成。当你使用pickle
保存数据时,保存的对象将保持 Python 的原始数据类型和结构,这使得在相同的 Python 环境中加载时非常方便和直观。 -
简便性:使用
pickle
可以直接将数据或模型保存到文件中,且仅需要几行代码即可实现保存和加载操作。与其他格式(如 HDF5 或 Parquet)相比,pickle
格式在操作上通常更加简单。 -
广泛的应用:很多机器学习库(如
scikit-learn
)将训练好的模型保存为.pkl
文件。这样用户可以方便地将模型保存下来,以便在之后的时间点加载使用。
(3) 基础用法
mp_file = "/data/public_lib/wm811k_wafer_map/in/LSWMD.pkl"
import pandas as pd
df=pd.read_pickle(mp_file)
df.info()
首先我们将这个数据集放在一个固定的位置,然后引用它,并使用pandas 来读取。
上面代码的意思请看解释:
import pandas as pd
- 这一行导入了
pandas
库,并给它起了个别名pd
。pandas
是一个强大的数据分析和处理库,提供了很多方便的数据结构(如 DataFrame 和 Series)和数据处理功能。
df = pd.read_pickle(mp_file)
- 这一行使用
pandas
的read_pickle
函数来加载存储在mp_file
路径中的 pickle 文件,并将其内容加载到一个名为df
的变量中。这个df
可能是一个pandas DataFrame
对象,通常用于存储表格数据。read_pickle
会自动反序列化 pickle 文件的内容,恢复为 Python 对象(在这里是一个 DataFrame)。pandas DataFrame
对象是一个强大的数据结构方法。
df.info()
- 这一行调用了
df
对象的info()
方法,这个方法会打印出 DataFrame 的概述信息,包括:- 列的数量和名称
- 每列的数据类型
- 非空值的数量
- 内存使用情况等 这些信息有助于了解数据的基本结构和数据完整性。
执行结果如下:
从上面的结果来看,这个脚本运行时间比较长,总计35.5秒,这是因为数据集比较大,读取的时间比较长。
df.info()
输出的结果提供了有关 DataFrame df
的一些基本信息。下面是详细的解释:
输出解析:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 811457 entries, 0 to 811456
<class 'pandas.core.frame.DataFrame'>
表示df
是一个pandas.DataFrame
对象,这是 Pandas 中用于存储表格数据的主要数据结构。RangeIndex: 811457 entries, 0 to 811456
显示 DataFrame 包含了 811,457 行数据,索引范围从 0 到 811,456(即共有 811,457 个数据条目)。
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 waferMap 811457 non-null object
1 dieSize 811457 non-null float64
2 lotName 811457 non-null object
3 waferIndex 811457 non-null float64
4 trianTestLabel 811457 non-null object
5 failureType 811457 non-null object
-
Data columns (total 6 columns): 表示 DataFrame 中有 6 列数据。
-
Column 列显示了每一列的名称:
waferMap
dieSize
lotName
waferIndex
trianTestLabel
failureType
-
Non-Null Count 显示每一列非空(non-null)值的数量。在这个 DataFrame 中,所有列都有 811,457 个非空值,意味着每一列的所有数据都已填充,没有缺失值。
-
Dtype 列显示了每一列的数据类型:
waferMap
,lotName
,trianTestLabel
,failureType
的数据类型为object
,表示它们是字符串类型(通常用于存储文本数据)。dieSize
,waferIndex
的数据类型为float64
,表示它们是浮动点数字(可能表示大小和索引等数值数据)。
dtypes: float64(2), object(4)
- 表示 DataFrame 中有 2 列数据类型为
float64
,4 列数据类型为object
。
memory usage: 37.1+ MB
- 显示了 DataFrame 占用的内存大小。该 DataFrame 占用约 37.1 MB 的内存。
上面的info,让我们对该数据集有了一个总体结构的了解。我们后面在使用这个数据集的时候,需要根据这个结构来调用想用的对象。
接下来,我们在程序后面加上一句:
df.head()
执行后结果如下:
它显示了这个数据集的前5行数据。
结果分析(各列解释):
-
waferMap
:- 内容:这列包含了类似
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...]]
这样的列表数据。 - 解释:
waferMap
是一个二维数组或矩阵(以嵌套列表形式表示),它可能代表晶圆的一个映射或状态,表示每个位置的检测结果或者晶圆测试的结果。每个0
可表示没有问题的位置,而其他值(例如1
或其他)代表特定的检测结果。这里的数据用嵌套列表表示,所以每个晶圆或测试的状态以列表形式存储。
- 内容:这列包含了类似
-
dieSize
:- 内容:这一列包含了
1683.0
等数值。 - 解释:
dieSize
可能表示晶圆的尺寸或测试区域的大小。每一行的dieSize
都是1683.0
,这表明所前5行的数据对应相同的尺寸,是固定的晶圆大小。
- 内容:这一列包含了
-
lotName
:- 内容:这一列包含了如
lot1
的字符串。 - 解释:
lotName
表示数据的批次名称。lot1
表示前5行是第一个批次的数据,行的lotName
都是lot1
,说明这些数据来自于同一个批次。
- 内容:这一列包含了如
-
waferIndex
:- 内容:这一列包含了类似
1.0, 2.0, 3.0, 4.0, 5.0
等数值。 - 解释:
waferIndex
表示晶圆的编号或在批次中的索引位置。每一行数据的waferIndex
依次递增,表示批次中的不同晶圆。
- 内容:这一列包含了类似
-
trianTestLabel
:- 内容:这一列包含了类似
[[Training]]
的数据。 - 解释:这一列的数据结构是一个嵌套的列表,表示与训练相关的标签。在这些行中,
trianTestLabel
的值是[[Training]]
,说明这些数据条目是标记为“训练”的数据集。
- 内容:这一列包含了类似
-
failureType
:- 内容:这一列包含了
[[none]]
的数据。 - 解释:这一列也包含了嵌套的列表,表示故障类型。
failureType
在这些行中的值是[[none]]
,意味着这些数据没有出现任何故障或失败。
- 内容:这一列包含了
接着,我们在后面再加上一句:
df.tail()
执行结果如下:
df.tail()
显示了 DataFrame 的最后 5 行数据。
和前5行不同的是,failureType
:故障类型标签,部分行有标注(如 Edge-Ring
, Edge-Loc
),者对应了我们前面列出的9中故障模式。有些行没有标注故障类型(空列表 []
)。
这些行数据展示了同一批次(lot1
)中多个晶圆的状态,包含了晶圆的映射、尺寸、索引以及相关的训练标签和故障类型。
好的,今天我们就熟悉到这里,通过理解半导体测试开始,熟悉这个数据集,然后使用python来初步了解这个数据集的结构,为我们后面玩转这个数据集做准备。
你学会了吗?