基于深度学习的缺陷检测主要分为两个阶段:训练和测试。训练阶段利用深度学习模型从大量的已标记的图像数据中学习特征,构建出能够检测芯片缺陷的模型;测试阶段则通过将新的芯片图像输入模型中进行预测,达到缺陷检测的目的。
具体来说,在训练阶段,一般会采用卷积神经网络(CNN)作为模型,对图像进行卷积、池化、非线性激活等操作,提取出图像的特征。然后使用全连接层将特征映射到输出结果,实现缺陷分类或定位。
在基于深度学习的缺陷检测中,一般使用卷积神经网络(CNN)等深度学习模型提取图像的特征值。当得到图像的特征向量后,可以使用常见的分类算法进行多分类,如支持向量机(SVM)、最近邻算法(KNN)、决策树算法、朴素贝叶斯算法等。
下面简单介绍一下这些分类算法:
SVM
SVM 是一种二元分类算法,能够将数据映射到高维空间中,并找到一个超平面,使得两类数据能够被分开。对于多分类问题,可以采用一对多(One-vs-All)的方式来实现多分类。该方法就是将所有的类别分别作为正例,其余类别作为负例,训练出 N 个 SVM 分类器,然后将它们进行组合,得到最终的多分类结果。
KNN
KNN 是一种不需要训练过程的分类算法,它的基本思想是找到与新样本最近的 K 个邻居,在这些邻居中出现次数最多的类别作为预测结果。KNN 算法容易理解,但是由于计算量大,对噪声和异常数据敏感,因此在实际应用中需谨慎选择。
决策树算法
决策树是一种基于树形结构的分类算法,通过对特征的划分来实现数据的分类。在构建决策树时,需要根据信息增益或其他指标来选择最优的特征进行划分。然后将数据按照特定的规则分配到各个子节点中,直到叶节点就是一个类别。
朴素贝叶斯算法
朴素贝叶斯算法是一种基于概率统计的分类算法,它假设所有特征之间相互独立,并且对于给定的样本,根据先验概率和条件概率来计算其属于某个类别的概率。然后将该样本分配到概率最大的类别中。朴素贝叶斯算法具有简单、快速、易于实现等优点,但是由于假设特征之间相互独立,所以对于特征相关性较强的问题效果可能不太好。
以knn为例:
可以按照以下步骤进行:
-
数据预处理:将缺陷数据转换为特征向量表示,可以使用卷积神经网络(CNN)等深度学习模型提取缺陷图像的特征向量。同时,需要将数据集划分为训练集和测试集。
-
选择 K 值:KNN 算法中需要设置 K 值,即要考虑多少个邻居。通常情况下,可以使用交叉验证等方法来确定最佳的 K 值。
-
训练 KNN 模型:利用训练集中的数据来训练 KNN 模型,对于每个样本,找到其 K 个最近邻居,并根据它们的类型给出该样本的分类结果。
-
测试 KNN 模型:使用测试集中的数据对 KNN 模型进行测试,计算分类准确率、精度和召回率等指标。如果表现不够理想,可以调整 K 值或者选择其他的分类算法。
需要注意的是,在实际应用中,可能会遇到样本不平衡的情况,一些类别的样本数量很少。这时候可以考虑使用加权 KNN 算法,对不同类别的样本进行加权处理,以提高分类准确率。同时,如果数据维度较高,也可以采用降维技术来减少计算量和存储空间。
具体实现的 Python 代码:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
import pandas as pd
import sklearn
from sklearn.metrics import accuracy_score, precision_score, recall_score
# import pickle
def main(name):
# 在下面的代码行中使用断点来调试脚本。
print(f'Hi, {name}') # 按 Ctrl+F8 切换断点。
# 1. 数据预处理
# 加载数据
data = pd.read_csv('data.csv')
# 将缺陷类型转化成数字标签
le = LabelEncoder()
data['name'] = le.fit_transform(data['name'])
# 划分训练集和测试集
X = data.drop('name', axis=1)
y = data['name']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 2. 选择 K 值
k_list = range(1, 10)
cv_scores = []
for k in k_list:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')
cv_scores.append(scores.mean())
best_k = k_list[cv_scores.index(max(cv_scores))]
# 3. 训练 KNN 模型
knn = KNeighborsClassifier(n_neighbors=best_k)
knn.fit(X_train, y_train)
# 4. 测试 KNN 模型
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
print('Accuracy: %.2f%%' % (accuracy * 100))
print('Precision: %.2f%%' % (precision * 100))
print('Recall: %.2f%%' % (recall * 100))
#
# model_test(knn, le)
# 2. 对新数据进行预处理
new_data = [[87, 167.5833333, 7.227935774, 37.66666667, 48.41831609, 6.73168052, 10.6633509, 169.99, 99.4, 311, 159, 316.5]]
scaler = StandardScaler()
new_data_scaled = scaler.fit_transform(new_data)
# 3. 进行分类
predicted_class = knn.predict(new_data_scaled)[0]
# 输出分类结果
print(f"The predicted class for the new data is: {predicted_class}")
print('end')
def model_test(knn, le):
# 1. 加载训练好的 KNN 模型
# with open('knn_model.pkl', 'rb') as f:
# knn = pickle.load(f)
# 2. 对新数据进行预处理
new_data = [[87, 167.5833333, 7.227935774, 37.66666667, 48.41831609, 6.73168052, 10.6633509, 169.99, 99.4, 311, 159, 316.5]]
scaler = StandardScaler()
new_data_scaled = scaler.fit_transform(new_data)
# 3. 进行分类
predicted_class = knn.predict(new_data_scaled)[0]
# 输出分类结果
print(f"The predicted class for the new data is: {le.inverse_transform(predicted_class)}")
# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
main('PyCharm')
# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
accuracy_score
, precision_score
, 和 recall_score
都是来自于 Scikit-Learn 库的评估模型性能的函数。
accuracy_score(true_y, pred_y)
计算真实标签和预测标签之间的准确率,即分类器正确预测的样本数与总样本数之比。precision_score(true_y, pred_y, average='macro')
计算精确度,即分类器正确预测为某个类别的样本数与分类器预测为该类别的总样本数之比。average
参数可以设置为 'macro'(宏平均)或 'micro'(微平均)。recall_score(true_y, pred_y, average='macro')
计算召回率,即分类器正确预测为某个类别的样本数与该类别的总样本数之比。average
参数可以设置为 'macro'(宏平均)或 'micro'(微平均)。
这些函数都需要两个参数:真实标签和预测标签,它们都是数组形式的。在使用这些函数前,需要将分类器的预测结果与测试集中的真实标签进行比较,以得出模型的性能指标。
通过评估这些指标,我们可以了解分类器的性能,从而选择最佳的模型或者改进现有的模型。
在进行预测时,新数据的特征向量必须与训练集中的特征向量具有相同的形状和大小。同时,也需要使用相同的特征提取方法和特征缩放方法来处理新数据。在预测时,需要调用 KNN 模型中的 predict()
方法来输出分类结果。