halcon分类器使用标准流程

分类器类型与选择

Halcon 支持多种分类器,了解它们的特点有助于你根据具体任务做出选择 :
1.MLP 多层感知器 分类速度快,训练速度慢,适用于对内存要求低,需要快速分类,支持离线训练的场景
2.SVM 支持向量机 分类速度较快(尤其低维时),训练速度快,适用于内存占用与样本量相关样本量不是特别巨大的分类任务
3.GMM 高斯混合模型 训练和分类速度都很快,不支持高维特征。适用于类别少、速度要求高的场景,支持异常检测
4.k-NNk 近邻训练极快,分类速度慢,内存需求高,适用于缺陷检测,多维度特征分类

标准工作流程

不同类型的分类器在Halcon中的使用流程类似,下图以MLP分类器为例展示了其核心步骤:

flowchart TD

A[准备样本图像] --> B[图像预处理与特征提取]

B --> C[创建分类器]

C --> D[添加样本与训练]

D --> E{保存与读取模型?}

E -- 是 --> F[保存/读取分类器]

E -- 否 --> G[直接使用分类器]

F --> G

G --> H[分类新图像]

H --> I[清理资源]

详细关键环节的操作与要点
一. 准备样本与特征提取

首先需要准备足够数量的、带有明确类别标签的样本图像

随后,对图像进行预处理(如二值化、图像分割等),提取出目标区域

接着,计算这些区域的特征值,形成特征向量。常用的形状特征包括:

圆度 (Circularity):衡量区域接近圆形的程度

不变矩 (PSI1, PSI2, ...):描述区域形状的几何特征,对旋转、缩放等变化不敏感

灰度投影:图像在水平和垂直方向的灰度值分布
二. 创建、训练与使用分类器

这是流程的核心步骤,主要涉及以下几个关键算子:
2.1,创建分类器 :使用如 create_class_mlp算子。需要设定特征向量的维度、隐藏层单元数、输出类别数等参数
2.2,添加样本与训练 :使用 add_sample_class_mlp将上一步得到的特征向量和对应的类别标签添加到分类器中
2.3,训练 :使用 train_class_mlp算子进行训练
2.4,保存与读取模型 :训练完成后,可以使用 write_class_mlp保存模型,之后通过 read_class_mlp读取,避免每次重新训练
2.5,分类新图像 :对新图像进行同样的预处理和特征提取后,使用 classify_class_mlp算子即可获取其类别
2.6,清理资源:最后使用 clear_class_mlp清除分类器,释放内存

注意事项:

特征选择是关键:特征质量直接决定分类效果。应选择那些能将不同类别明显区分开的特征 ,你可以从计算区域的几何特征(如面积、圆度)和灰度特征(如平均灰度、偏差)入手

参数调优:在创建MLP分类器时,隐藏层单元数(NumHidden)需要谨慎设置。过小可能导致模型能力不足,过大则可能过拟合

预处理的重要性:对特征向量进行预处理(如归一化)可以加速训练并提升精度 ,在图像处理阶段,有效的分割算法是成功提取特征的前提

监控训练过程:训练时,可以观察误差曲线(ErrorLog)。理想的曲线应该是开始快速下降,之后趋于平稳。如果曲线一直陡峭,可能需要调整参数重新训练

代码示例

1.训练部分

a. 创建MLP分类器

b. 准备训练数据(读取图像,提取特征,添加样本)

c. 训练分类器

d. 保存训练好的模型

推理部分:

a. 加载训练好的模型

b. 读取待分类图像并提取特征

c. 使用分类器进行分类

d. 显示分类结果

下面是一个详细的代码示例,我们将使用一个简单的例子:对三种不同的金属零件(螺母、垫圈、挡圈)进行分类。

注意:实际应用中,特征提取的方法需要根据具体问题调整,这里我们使用形状特征(圆度、不变矩等)作为示例。

标准流程

Halcon分类器的使用主要分为训练和推理两个阶段。以下代码以MLP分类器为例,演示如何对金属零件(如螺母、垫圈、挡圈)进行分类。

bash 复制代码
* 1. 创建MLP分类器
* 参数: 输入特征数6, 隐藏层神经元5, 输出类别数3, 输出函数'softmax', 预处理'normalization'
create_class_mlp (6, 5, 3, 'softmax', 'normalization', 3, 42, MLPHandle)

* 2. 准备训练样本
* 样本文件名和对应的类别标签 (0:螺母, 1:垫圈, 2:挡圈)
FileNames := ['nuts_01','nuts_02','nuts_03','washers_01','washers_02','washers_03','retainers_01','retainers_02','retainers_03']
Classes := [0,0,0,1,1,1,2,2,2]

* 3. 循环读取每个样本图像,提取特征并添加到分类器
for J := 0 to |FileNames| - 1 by 1
    read_image (Image, 'rings/' + FileNames[J])
    * 图像预处理:二值化分割目标区域
    binary_threshold (Image, Objects, 'max_separability', 'dark', UsedThreshold)
    connection (Objects, ConnectedRegions)
    fill_up (ConnectedRegions, Objects)
    
    * 计算每个区域的特征向量
    count_obj (Objects, Number)
    for k := 1 to Number by 1
        select_obj (Objects, Region, k)
        * 提取形状特征:圆度、轮廓圆度、不变矩
        circularity (Region, Circularity)
        roundness (Region, Distance, Sigma, Roundness, Sides)
        moments_region_central_invar (Region, PSI1, PSI2, PSI3, PSI4)
        * 组成6维特征向量
        Features := [Circularity, Roundness, PSI1, PSI2, PSI3, PSI4]
        * 将样本添加到分类器
        add_sample_class_mlp (MLPHandle, Features, Classes[J])
    endfor
endfor

* 4. 训练分类器
* 参数: 最大迭代次数200, 权重容差1, 误差容差0.01
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)

* 5. 清除训练样本数据,释放内存
clear_samples_class_mlp (MLPHandle)

* 6. 保存训练好的模型
write_class_mlp (MLPHandle, 'metal_parts_classifier.mlp')
完成训练后,使用训练好的模型对新图像进行分类:
* 1. 读取已训练的模型
read_class_mlp ('metal_parts_classifier.mlp', MLPHandle)

* 2. 读取待分类图像
read_image (TestImage, 'rings/mixed_01')

* 3. 图像预处理(与训练阶段一致)
binary_threshold (TestImage, TestObjects, 'max_separability', 'dark', UsedThreshold)
connection (TestObjects, ConnectedRegions)
fill_up (ConnectedRegions, TestObjects)

* 4. 对每个区域进行分类
count_obj (TestObjects, Number)
ClassesResult := []
for k := 1 to Number by 1
    select_obj (TestObjects, Region, k)
    * 提取相同的特征向量
    circularity (Region, Circularity)
    roundness (Region, Distance, Sigma, Roundness, Sides)
    moments_region_central_invar (Region, PSI1, PSI2, PSI3, PSI4)
    Features := [Circularity, Roundness, PSI1, PSI2, PSI3, PSI4]
    
    * 5. 使用分类器进行分类
    * 返回分类结果Class和置信度Confidence
    classify_class_mlp (MLPHandle, Features, 1, Class, Confidence)
    ClassesResult := [ClassesResult, Class]
endfor

* 6. 清理资源
clear_class_mlp (MLPHandle)

关键算子
在以上流程中,以下几个算子是构建分类系统的核心

bash 复制代码
create_class_mlp:创建MLP分类器
NumInput:特征向量的维度,必须与后续提取的特征数一致
NumHidden:隐藏层神经元数量,影响模型复杂度和能力
NumOutput:分类的类别数
Preprocessing:特征预处理,通常选择 'normalization'(归一化)以提升训练效果和速度
add_sample_class_mlp:添加一个训练样本
Features:从样本区域提取的特征向量
Target:该样本对应的类别标签(如0, 1, 2)
train_class_mlp:训练分类器
训练过程会迭代优化分类器内部参数。可监控 ErrorLog来观察训练过程是否正常(误差应快速下降后趋于平稳)
classify_class_mlp:使用训练好的模型进行分类,输入待识别区域的特征向量,返回其所属的 Class及置信度 Confidence。

扩展应用:深度学习方法

对于更复杂的图像分类任务,Halcon也提供了基于深度学习的分类方法,其流程更为简化,无需手动设计特征:

bash 复制代码
* 1. 读取预训练的深度学习模型
read_dl_classifier ('pretrained_model.hdl', DLClassifierHandle)

* 2. 直接对图像进行分类
apply_dl_classifier (Image, DLClassifierHandle, DLResult)
get_dl_classifier_result (DLResult, 'class', Class)

深度学习模型尤其适用于纹理、颜色复杂或目标形态多变的分类场景

相关推荐
Mrliu__25 分钟前
Opencv(十六) : 图像边缘检测
人工智能·opencv·计算机视觉
噜~噜~噜~9 小时前
最大熵原理(Principle of Maximum Entropy,MaxEnt)的个人理解
深度学习·最大熵原理
小女孩真可爱10 小时前
大模型学习记录(五)-------调用大模型API接口
pytorch·深度学习·学习
Hcoco_me13 小时前
YOLO目标检测学习路线图
学习·yolo·目标检测
水月wwww14 小时前
深度学习——神经网络
人工智能·深度学习·神经网络
青瓷程序设计14 小时前
花朵识别系统【最新版】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
青瓷程序设计15 小时前
鱼类识别系统【最新版】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
WWZZ202516 小时前
快速上手大模型:深度学习13(文本预处理、语言模型、RNN、GRU、LSTM、seq2seq)
人工智能·深度学习·算法·语言模型·自然语言处理·大模型·具身智能
千里飞刀客17 小时前
aruco位姿检测
人工智能·opencv·计算机视觉
枯木逢秋࿐17 小时前
深度学习常用模型
深度学习