当前位置: 首页 > news >正文

使用 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,以全面评估模型。
http://www.dtcms.com/a/358471.html

相关文章:

  • Python API接口实战指南:从入门到精通
  • HarmonyOS三方库的使用
  • Java SpringAI应用开发面试全流程解析:RAG、流式推理与企业落地
  • 【Java工程师面试全攻略】Day13:云原生架构与Service Mesh深度解析
  • 防火墙技术(二):安全区域
  • 【Linux】系统部分——软硬链接动静态库的使用
  • Tomcat 企业级运维实战系列(四):Tomcat 企业级监控
  • 每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?)
  • Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署
  • Qt实战:如何打开摄像头并实现视频的实时预览
  • 生成式 AI 重构内容生产:效率提升背后的创作版权边界争议
  • react虚拟列表实现及原理
  • leetcode2(移除元素)
  • 本地部署音效生成器 Moodist 并实现外部访问
  • Spring Cloud 和 Dubbo 是目前主流的两大微服务框架,分别代表了两种不同的技术路线
  • HarmonyOS 应用开发:基于API 12及以上的现代化实践
  • I2C多点触控驱动开发详解
  • Elasticsearch logsdb 索引模式和 TSDS 的业务影响
  • 【小白笔记】基本的Linux命令来查看服务器的CPU、内存、磁盘和系统信息
  • 网络编程4-并发服务器、阻塞与非阻塞IO、信号驱动模型、IO多路复用..
  • MQTT 连接建立与断开流程详解(二)
  • 项目管理在企业中的作用
  • 小迪Web自用笔记7
  • Redission 实现延迟队列
  • 鸿蒙NEXT布局全解析:从线性到瀑布流,构建自适应UI界面
  • Notepad++常用设置
  • 金仓数据库迁移评估系统(KDMS)V4正式上线,助力企业高效完成数据库国产化替代
  • 果蔬采摘机器人:自动驾驶融合视觉识别,精准定位,高效作业
  • 【SoC】【W800】基于W800的PWM实现
  • 类和反射的机制