使用 SVM(支持向量机)进行图像分类:从读取图像到训练与分类的完整流程
本文介绍如何用支持向量机(SVM)对图像进行分类。以“石头/剪刀/布/none”分类为示例。
概述
- 目标:使用 SVM 对图像(例如“石头/剪刀/布”手势)进行分类。流程包括读取图像、显示、收集样本、创建 SVM、训练 SVM、运行分类器,最后释放资源。
- 算法:支持向量机(SVM),此处使用 RBF(径向基)核,采用 one-versus-one 策略来处理多类分类问题。
重要步骤
1、创建 SVM 分类器
create_class_svm (7, 'rbf', KernelParam, Nu, |ClassNames|, 'one-versus-one', 'principal_components', 5, SVMHandle)
参数解释(依据常见 API 含义):
- 7: SVM的输入变量(特征)数量。
- 'rbf':内核类型。
- KernelParam::内核函数的附加参数。在RBF核的情况下,的值。对于多项式核
- Nu:SVM的正则化常数。
- |ClassNames|:类别数量。
- 'one-versus-one':SVM的模式。
- 'principal_components':用于转换特征向量的预处理类型。
- 5:预处理参数:转换特征的数量(Preprocessing=“none”和Preprocessing=”normalization“时忽略)。
- SVMHandle:SVM句柄。
- 注意:不同halcon版本参数顺序或含义可能不同,实际使用时请参照你所用版本的文档。
2、提取图像特征
- read_image (Image, Selection[Index])
- threshold (Image, Region, 0, 40)
- 获取区域面积和中心坐标
- area_center (Region, Area, Row, Column)
- *获取区域的紧密度
- compactness (Region, Compactness)
- *获取区域的二阶矩
- moments_region_central_invar (Region, PSI1, PSI2, PSI3, PSI4)
- *获取区域的凸度
- convexity (Region, Convexity)
- *将这7个值组成数组
- Features := real([Area,Compactness,PSI1,PSI2,PSI3,PSI4,Convexity])
3、添加样本特征
add_sample_class_svm (SVMHandle, Features, ClassNumber)
- SVMHandle:SVM句柄。
- Features:特征
- ClassNumber:当前样本的类别
4、开始训练
train_class_svm (SVMHandle, 0.001, 'default')
- SVMHandle:SVM句柄。
- 0.001:训练的停止参数。
- 'default':训练方式。通常选项:“default”。如果SVM中已经包含SVs, 那么应该用于训练:“add_sv_to_train_set”。
5、进行分类
*用SVM分类器进行分类
classify_class_svm (SVMHandle, Features, 1, Class)
- SVMHandle:SVM句柄。
- Features:特征向量。
- 1:要确定的最佳分类个数。
- Class:使用SVM对特征向量进行分类的结果。
结果示例:
实践建议与常见问题
- 数据准备:高质量、标注准确、包含各种背景/光照/角度变化的样本对模型的泛化至关重要。
- 特征选择:SVM 对特征尺度敏感。若使用像素原始向量,请做归一化或标准化。更常见的是用 HOG、SIFT、LBP 或卷积神经网络提取的特征向量。
- 超参数调优:KernelParam(RBF 的 gamma)与正则化参数(如 C 或 Nu)会极大影响性能。用交叉验证和网格搜索找到最优组合。
- 多类策略:one-versus-one 在类别数较少的情形下效率和效果不错。类别数增多时,训练复杂度上升。
- PCA 降维:在样本维度很高时使用 PCA 可以加速训练并去噪,但要保证保留足够信息以维持分类性能。
- 性能度量:训练完成后用独立测试集计算混淆矩阵、精确率/召回率/F1,以全面评估模型。