基于 SVM + HOG 的铸造缺陷检测系统

一、项目概述

本项目实现了一个基于传统机器学习方法的铸造缺陷智能检测系统,采用支持向量机(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 技术优势

  1. 传统机器学习方法

    • 无需大规模数据集和 GPU 资源
    • 训练速度快(约 3 分钟)
    • 模型体积小(<1GB)
    • 推理速度快(单张图片<0.1秒)
  2. HOG 特征鲁棒性强

    • 对光照变化不敏感
    • 能够捕捉边缘和纹理特征
    • 适合灰度图像处理
  3. SVM 分类器优势

    • 在高维空间中表现优秀
    • 支持概率输出(置信度)
    • 通过类别权重处理样本不平衡

七、总结

本项目成功实现了基于传统机器学习的铸造缺陷检测系统,验证集准确率达到 97.39%,证明了 SVM + HOG 方法在工业缺陷检测领域的有效性。系统具有训练快速、推理高效、部署简单等优点,适合资源受限的工业场景。

通过可视化界面的设计,系统降低了使用门槛,使得非技术人员也能便捷地进行质量检测工作。项目代码结构清晰,模块化设计便于后续扩展和维护。

八、演示视频

基于 SVM + HOG 的铸造缺陷检测

相关推荐
AI源码10 分钟前
基于 Python 的汽车市场数据分析与可视化平台
python·数据分析·汽车
starrysky8101 小时前
zipfile 中文乱码修复:把已知 GBK 旧 ZIP 解压到正确中文目录
python
方方洛1 小时前
ray教程-27-附录F-RayClient与runtime_env与多语言
人工智能·分布式·机器学习
用户91294046848421 小时前
Codex 从零到能交付(09):让 Codex 写有用的测试,而不是只测成功路径
python
2601_967987371 小时前
Debian如何配置Python调试工具
python·debian·pdb·调试工具·ipdb
MoRay1 小时前
放弃云端 Computer Use,我用 Python 手搓了一个带“物理防呆”的本地 GUI Agent 底座
python·github
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
小小张说故事3 小时前
Python 的 __init__ 到底是不是构造函数?拆开 __new__ 先造对象、那次被跳过的初始化和必须返回 None 的规矩
python
拖累斯3 小时前
Jenkins + Python 全自动跑通「禅道任务/BUG 导出 → 月度开发考核表」
python·jenkins·bug