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分类器为例,演示如何对金属零件(如螺母、垫圈、挡圈)进行分类。
* 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 1read_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 1select_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 1select_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和置信度Confidenceclassify_class_mlp (MLPHandle, Features, 1, Class, Confidence)ClassesResult := [ClassesResult, Class]
endfor* 6. 清理资源
clear_class_mlp (MLPHandle)
关键算子
在以上流程中,以下几个算子是构建分类系统的核心:
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也提供了基于深度学习的分类方法,其流程更为简化,无需手动设计特征:
* 1. 读取预训练的深度学习模型
read_dl_classifier ('pretrained_model.hdl', DLClassifierHandle)* 2. 直接对图像进行分类
apply_dl_classifier (Image, DLClassifierHandle, DLResult)
get_dl_classifier_result (DLResult, 'class', Class)
深度学习模型尤其适用于纹理、颜色复杂或目标形态多变的分类场景
