【Halcon学习笔记】13.图像分类
1.概述
分类就是将一个目标对象根据某种特征划到某个提前准备好的类别中去。这些特征可能是像素的颜色、纹理或者是区域的大小、形状。为了定义类别,特征必须通过已知对象被指定并训练,在训练之后,分类器将对象的特征与有关类别的特征做比较,并返回最大匹配的类别。根据所选的分类器,类别的可能性或者分类的可行度等可能额外的信息将被给出。
1.1 分类器意义
分类器的作用是将目标对象指定给多个类别中的一个。例如,有一张图片中包含了几个形状相似的物体,并且已将每个物体区域分割出来了,需要判断是否属于同一类别,此时就可以适用分类器。注:OCR(optical character recognition)光学文字识别就是分类器的一个特殊应用。
一般来说,可以用两种方法对图像进行分类:一是基于数据特征分类,如圆度、面积;一是基于像素特征分类,如纹理、颜色。
1.2 常见分类器
Halcon提供了不同的分类器,其中比较常用的分类器有:MLP分类器、SVM分类器、SMM分类器、k-NN分类器。

2. 相关算子(MLP分类器为例)
2.1 创建
1)create_class_mlp() //创建MLP分类器
NumInput:用于分类和训练的特征空间的维度数量
NumHidden:神经网络中隐藏层的单元数(10)
NumOutput:输出的分类数量
OutputFunction:神经网络的输出单元使用的函数('softmax')
Preprocessing:在训练和分类之前对特征向量使用的预处理方式('normalization') NumComponents:预处理后减少的特征向量的维度数量
RandSeed :随机种子数(42)
MLPHandle:MLP分类器句柄
2.2 添加
1)add_sample_class_mlp() //将单个样本添加到MLP分类器中
MLPHandle:MLP分类器句柄
Features:样本的特征向量(必须是real类型)
Target:输出的目标向量
2)add_samples_image_class_mlp() //将多通道图像训练样本添加到MLP分类器中
Image:待训练的图像
ClassRegions:待训练的图像区域
MLPHandle:MLP分类器句柄
2.3 训练
1)train_class_mlp() //训练MLP分类器
MLPHandle:MLP分类器句柄
MaxIterations:优化算法的最大迭代次数(200)
WeightTolerance:优化算法的两次迭代之间的权重差异阈值(1.0)
ErrorTolerance:优化算法的两次迭代之间的误差均值的阈值(0.01)
Error:MLP在最佳权重下的训练数据的平均误差
ErrorLog:将MLP的训练数据的平均误差作为迭代次数返回
2.4 识别
1)classify_class_mlp() //对特征向量进行分类
MLPHandle:MLP分类器句柄
Features:输入的待评估的特征向量
Num:想要寻找的最佳分类的数量
Class:输出所寻找的类别ID
Confidence:输出寻找出的类别的自信度
2)classify_image_class_mlp() //对多通道图片进行像素分类
Image:输入的图像
ClassRegions:输出的检测结果区域
MLPHandle:MLP分类器句柄
RejectionThreshold:抛弃种类的阈值
2.5 释放
1)clear_class_mlp () //释放MLP分类器
MLPHandle:MLP分类器句柄
3. 图像分类在Halcon中的应用步骤
图像分类可分为基于数据特征分类和基于像素特征两种分类方式,但在应用时其大致思路是一致的。

3.1 基于数据特征的分类器应用(以circularity和roundness作为特征向量分类)
1)创建分类器
create_class_mlp (2, 10, 3, 'softmax', 'normalization', 3, 42, MLPHandle)
2)提取样本图像中的特征向量
select_obj (Objects, Region, J)
circularity (Region, Circularity)
roundness (Region, Distance, Sigma, Roundness, Sides)
Features := [Circularity,Roundness] //数据特征向量
3)将样本添加到分类器中
class:=[0,0,1,1,2,2] //分为3类
add_sample_class_mlp (MLPHandle, Features, class[Index])
4)利用样本数据训练分类器
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
5)对目标执行分类检测
select_obj (Objects, Region, J)
area_center (Region, Area, Row, Column)
circularity (Region, Circularity)
roundness (Region, Distance, Sigma, Roundness, Sides)
Features := [Circularity,Roundness]
classify_class_mlp (MLPHandle, Features, 1, outClass, Confidence)
6)释放分类器
clear_class_mlp (MLPHandle)


3.2 基于像素特征的分类器应用
1)创建分类器
create_class_mlp (3, 10, 4, 'softmax', 'normalization', 3, 42, MLPHandle)
2)提取样本图像中的区域像素
read_image (Image, ‘Training’)
gen_empty_obj (Classes)
gen_rectangle1 (Yellow, 195.98, 198.538, 231.86, 216.952)
gen_rectangle1 (Pink, 197.54, 287.166, 230.82, 306.138)
gen_rectangle1 (Blue, 197.8, 383.142, 232.38, 398.766)
gen_rectangle1 (Orange, 20.1, 192.802, 110.58, 386.638)
concat_obj (Yellow, Pink, Classes)
concat_obj (Classes, Blue, Classes)
concat_obj (Classes, Orange, Classes)
3)将样本添加到分类器中
add_samples_image_class_mlp (Image, Classes, MLPHandle)
4)利用样本数据训练分类器
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
5)对目标执行分类检测
read_image (Image, ‘Detect’)
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.01)
6)释放分类器
clear_class_mlp (MLPHandle)



by Ryou2-