一、项目概述
本项目实现了一个基于传统机器学习方法的铸造缺陷智能检测系统,采用支持向量机(SVM)结合方向梯度直方图(HOG)特征提取技术,能够自动识别铸造零件表面的缺陷,并给出检测置信度。系统配备了友好的 PyQt5 可视化界面,支持单张图片检测和批量数据集检测。
关键技术栈:
- Python 3.8+
- scikit-learn (SVM 分类器)
- OpenCV (图像处理)
- scikit-image (HOG 特征提取)
- PyQt5 (GUI 界面)
二、数据集介绍
本项目使用的是公开的铸造缺陷数据集,包含铸造零件的正面图像,分为正常(OK)和缺陷(NG)两类。
2.1 数据集统计
| 数据集 | 总数 | 缺陷样本 | 正常样本 | 用途 |
|---|---|---|---|---|
| 训练集 | 5,638 | 3,194 (56.7%) | 2,444 (43.3%) | 模型训练 |
| 验证集 | 995 | 564 (56.7%) | 431 (43.3%) | 模型评估 |
| 测试集 | 8 | 4 | 4 | 实际演示 |
| 合计 | 6,641 | 3,762 | 2,879 | - |
表2-1 数据集统计
2.2 数据集特点
- 图像尺寸: 300×300 像素,灰度图
- 数据分布: 缺陷样本略多于正常样本(约 1.3:1)
- 类别平衡: 通过设置类别权重(缺陷权重 3.0)来处理轻微的类别不平衡
- 数据来源: Kaggle 公开数据集
三、系统架构与实现
3.1 整体流程
XML
原始图像 → 预处理 → HOG特征提取 → 标准化 → SVM分类 → 结果输出(类别+置信度)
3.2 核心实现代码
3.2.1 HOG 特征提取模块
HOG(Histogram of Oriented Gradients)是一种经典的计算机视觉特征描述子,通过统计图像局部区域的梯度方向直方图来描述图像的纹理和形状特征。
python
from skimage.feature import hog
from sklearn.preprocessing import StandardScaler
import cv2
class HOGFeatureExtractor:
def __init__(self, orientations=9, pixels_per_cell=(8, 8),
cells_per_block=(2, 2), block_norm='L2-Hys'):
"""
HOG特征提取器
参数说明:
- orientations: 梯度方向的数量(9个方向,即每40度一个bin)
- pixels_per_cell: 每个cell的像素大小(8x8像素)
- cells_per_block: 每个block包含的cell数量(2x2)
- block_norm: 归一化方法(L2-Hys是改进的L2范数)
"""
self.orientations = orientations
self.pixels_per_cell = pixels_per_cell
self.cells_per_block = cells_per_block
self.block_norm = block_norm
self.scaler = StandardScaler()
def preprocess_image(self, image):
"""图像预处理:直方图均衡化 + 高斯去噪"""
img_equalized = cv2.equalizeHist(image)
img_denoised = cv2.GaussianBlur(img_equalized, (3, 3), 0)
return img_denoised
def extract_hog_features(self, image):
"""提取HOG特征向量"""
img_processed = self.preprocess_image(image)
features = hog(
img_processed,
orientations=self.orientations,
pixels_per_cell=self.pixels_per_cell,
cells_per_block=self.cells_per_block,
block_norm=self.block_norm,
transform_sqrt=True, # 对图像进行sqrt压缩
feature_vector=True # 返回一维特征向量
)
return features
def fit_transform(self, images):
"""批量提取特征并训练标准化器"""
features_list = []
for img in images:
features = self.extract_hog_features(img)
features_list.append(features)
features_array = np.array(features_list)
# 标准化特征(零均值,单位方差)
features_scaled = self.scaler.fit_transform(features_array)
return features_scaled
特征维度分析:
- 输入图像:300×300 = 90,000 像素
- HOG 特征维度:46,656 维
- 维度计算:
((300/8 - 1) × (300/8 - 1) × 2 × 2 × 9) = 46,656
3.2.1 SVM 分类器模块
SVM(Support Vector Machine)是一种强大的二分类算法,通过寻找最优超平面来分隔不同类别的样本。
python
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
class SVMClassifier:
def __init__(self, kernel='linear', C=10.0, gamma='scale', defect_weight=3.0):
"""
SVM分类器
参数说明:
- kernel: 核函数类型(linear表示线性核)
- C: 惩罚参数(越大对误分类惩罚越大)
- gamma: RBF核参数('scale'表示自动计算)
- defect_weight: 缺陷类别权重(提高对缺陷的敏感度)
"""
self.kernel = kernel
self.C = C
self.gamma = gamma
self.defect_weight = defect_weight
# 设置类别权重:0=正常, 1=缺陷
self.class_weight = {0: 1.0, 1: defect_weight}
self.model = SVC(
kernel=self.kernel,
C=self.C,
gamma=self.gamma,
class_weight=self.class_weight,
probability=True, # 启用概率输出(重要!)
random_state=42
)
def train(self, X_train, y_train):
"""训练SVM模型"""
print(f"开始训练 SVM (样本数: {len(X_train)})...")
self.model.fit(X_train, y_train)
# 打印支持向量信息
n_support = self.model.n_support_
print(f"训练完成 (核函数: {self.kernel}, C: {self.C}, "
f"支持向量数: {sum(n_support)})")
def predict(self, X):
"""预测类别"""
return self.model.predict(X)
def predict_proba(self, X):
"""预测概率(置信度)"""
return self.model.predict_proba(X)
def evaluate(self, X, y, dataset_name="数据集"):
"""评估模型性能"""
predictions = self.predict(X)
probabilities = self.predict_proba(X)
# 计算评估指标
accuracy = accuracy_score(y, predictions)
precision = precision_score(y, predictions)
recall = recall_score(y, predictions)
f1 = f1_score(y, predictions)
# 计算误判统计
errors = y != predictions
n_errors = np.sum(errors)
miss_detection = np.sum((y == 1) & (predictions == 0)) # 漏检
false_alarm = np.sum((y == 0) & (predictions == 1)) # 过检
print(f"{dataset_name}结果:")
print(f" 准确率: {accuracy*100:.2f}% | 精确率: {precision*100:.2f}% | "
f"召回率: {recall*100:.2f}% | F1: {f1*100:.2f}%")
print(f" 误判总数: {n_errors}个({n_errors/len(y)*100:.2f}%) | "
f"漏检: {miss_detection}个({miss_detection/np.sum(y==1)*100:.2f}%) | "
f"过检: {false_alarm}个({false_alarm/np.sum(y==0)*100:.2f}%)")
return {
'accuracy': accuracy,
'precision': precision,
'recall': recall,
'f1': f1,
'predictions': predictions,
'probabilities': probabilities
}
模型参数说明:
- 线性核(linear): 适合高维特征空间(46,656维),计算效率高
- C=10.0: 较大的惩罚参数,减少训练误差
- probability=True: 启用 Platt Scaling 方法输出概率值
- 缺陷权重=3.0: 提高对缺陷样本的重视程度,降低漏检率
3.2.3 检测流程实现
python
def detect_defect(image_path, model, scaler, feature_extractor):
"""
完整的缺陷检测流程
参数:
- image_path: 输入图像路径
- model: 训练好的 SVM 模型
- scaler: 标准化器
- feature_extractor: HOG 特征提取器
返回:
- prediction: 预测类别 (0=正常, 1=缺陷)
- confidence: 置信度 (0-100%)
"""
# 1. 读取图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (300, 300))
# 2. 提取 HOG 特征
features = feature_extractor.extract_hog_features(image)
features = features.reshape(1, -1)
# 3. 标准化特征
features_scaled = scaler.transform(features)
# 4. SVM 预测
prediction = model.predict(features_scaled)[0]
probabilities = model.predict_proba(features_scaled)[0]
# 5. 计算置信度
confidence = probabilities[int(prediction)] * 100
# 6. 返回结果
label = "NG" if prediction == 1 else "OK"
print(f"检测结果: {label} (置信度: {confidence:.2f}%)")
return prediction, confidence
四、模型训练与评估
4.1 训练过程
XML
python train_model.py
4.2 训练输出示例:
XML
开始训练SVM铸造缺陷检测模型
1. 加载数据并划分验证集
原始数据: 6633张图片
训练集: 5638张 (缺陷:3194, 正常:2444)
验证集: 995张 (缺陷:564, 正常:431)
2. 提取HOG特征
提取训练集特征: 100%|████████| 5638/5638 [02:42<00:00]
提取验证集特征: 100%|████████| 995/995 [00:29<00:00]
3. 训练SVM模型
训练完成 (核函数: linear, C: 10.0, 支持向量数: 2288)
4. 评估模型
训练集结果:
准确率: 100.00% | 精确率: 100.00% | 召回率: 100.00% | F1: 100.00%
验证集结果:
准确率: 97.39% | 精确率: 98.56% | 召回率: 96.81% | F1: 97.67%
4.3 性能指标
| 指标 | 训练集 | 验证集 | 说明 |
|---|---|---|---|
| 准确率 | 100.00% | 97.39% | 整体分类正确率 |
| 精确率 | 100.00% | 98.56% | 预测为缺陷中真正是缺陷的比例 |
| 召回率 | 100.00% | 96.81% | 真实缺陷中被检测出的比例 |
| F1 分数 | 100.00% | 97.67% | 精确率和召回率的调和平均 |
| 漏检率 | 0.00% | 3.19% | 缺陷被误判为正常的比例 |
| 过检率 | 0.00% | 1.86% | 正常被误判为缺陷的比例 |
表4-1 性能指标
性能分析:
- 训练集达到 100% 准确率,说明模型具有良好的拟合能力
- 验证集准确率 97.39%,泛化性能优秀
- 漏检率 3.19%,在工业应用中属于可接受范围
- 精确率 98.56%,减少了误报带来的生产损失
五、可视化结果

图5-1 训练集混淆矩阵
训练集上实现了完美分类,2444 个正常样本和 3194 个缺陷样本全部被正确识别,无误判。这表明模型在训练数据上充分学习了特征模式。

图5-2 验证集混淆矩阵
验证集共 995 个样本,其中:
- 正常样本(431个): 423 个正确识别,8 个误判为缺陷(过检)
- 缺陷样本(564个): 546 个正确识别,18 个误判为正常(漏检)

图5-3 检测系统初始界面
界面说明: 系统采用 PyQt5 开发,界面分为三个主要区域:
- 左侧: 原始图像显示区域,展示待检测的铸造零件图片
- 右侧: 检测结果显示区域,标注检测结果(NG/OK)和置信度
- 底部: 操作按钮区,包括"选择模型文件夹"、"选择数据集文件夹"、"上一张/下一张"导航按钮、"开始检测当前图片"按钮
- 状态栏: 显示模型状态、数据集信息、当前图片序号等系统状态

图5-4 缺陷检测结果示例
检测结果: 系统成功识别出铸造零件存在缺陷,标注为 NG 100.0%,表示模型以 100% 的置信度判定该零件为不合格品(缺陷品)。
检测细节:
- 原始图像(左): 300×300 灰度图,展示铸造零件的实际外观
- 检测结果(右): 在图像左上角用红色字体标注"NG 100.0%"
- 状态信息: 底部状态栏显示"模型状态: 已加载 - results/","数据集状态: 已选择 - 8张图片","当前图片: 1/8 - cast_def_0_15.jpeg"
六、系统特点与优势
6.1 技术优势
-
传统机器学习方法
- 无需大规模数据集和 GPU 资源
- 训练速度快(约 3 分钟)
- 模型体积小(<1GB)
- 推理速度快(单张图片<0.1秒)
-
HOG 特征鲁棒性强
- 对光照变化不敏感
- 能够捕捉边缘和纹理特征
- 适合灰度图像处理
-
SVM 分类器优势
- 在高维空间中表现优秀
- 支持概率输出(置信度)
- 通过类别权重处理样本不平衡
七、总结
本项目成功实现了基于传统机器学习的铸造缺陷检测系统,验证集准确率达到 97.39%,证明了 SVM + HOG 方法在工业缺陷检测领域的有效性。系统具有训练快速、推理高效、部署简单等优点,适合资源受限的工业场景。
通过可视化界面的设计,系统降低了使用门槛,使得非技术人员也能便捷地进行质量检测工作。项目代码结构清晰,模块化设计便于后续扩展和维护。
八、演示视频
基于 SVM + HOG 的铸造缺陷检测