往期文章:
Halcon 数据拟合:分别用最小二乘法和神经网络拟合直线曲线
目录
前言:各位朋友们好,我是大脸猫。分类器属于机器学习的一种,在图像算法中的发展历史中,相对于深度学习来说较为老旧。近几年由于深度学习的大火,很多无法做到精准筛选缺陷的情况也迎刃而解。但这项技术也是对硬件要求颇高,即使各家对神经网络做出轻量化,硬件门槛也还是存在的,但分类器比深度学习却是不太吃硬件配置,相对来说也算是轻量化应用。
🚀🚀1.分类器
1.1 SVM介绍及使用
Halcon中有常见的四类分类器:MLP(多层感知机)、SVM(支持向量机)、K-NN(K-最邻近)、GMM(高斯混合类型),其中分类器的区别如下:
MLP | SVM | K-NN | GMM | |
训练速度 | 慢 | 中等 | 快 | 快 |
分类速度 | 快 | 中等 | 中等 | 快 |
达到更高的分类速度要求 | 1、少量的分类种类 2、少量的神经元 | 1、少量的支持向量 | 1、少量的训练样本 | 1、少量的分类种类 |
内存需求 | 低 | 中等 | 高 | 低 |
继承训练(是否需要重新训练整个分类器) | 不支持 | 不推荐 | 支持 | 不推荐 |
是否适合高维特征空间 | 支持 | 支持 | 支持 | 不支持 |
是否适合奇异值检测 | 不支持 | 支持 | 支持 | 支持 |
在本文中,我们以动漫《火影忍者》的十种写轮眼种类为例,使用SVM(支持向量机)做分类:
☘️☘️算法如下:
**----------------------- 训练SVM -----------------------**
*获取所有特征属性名字
FeatureGroups := ['region','color']
get_feature_names (FeatureGroups, FeatureNames)
get_feature_lengths (FeatureNames, FeatureLengths)
*创建SVM
create_class_train_data (sum(FeatureLengths), ClassTrainDataHandle)
set_feature_lengths_class_train_data (ClassTrainDataHandle, FeatureLengths, FeatureNames)
*读图
list_files ('D:/trains', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
*图像文件名称格式:'种类'+'序号'
parse_filename (ImageFiles[Index], BaseName, Extension, Directory)
tuple_str_bit_select (BaseName, 1, Select)
ClassID := number(Select)
get_domain (Image, Domain)
*计算特征数据
calculate_features (Domain, Image, FeatureNames, Features)
*添加特征数据
add_sample_class_train_data (ClassTrainDataHandle, 'feature_column', Features, ClassID)
endfor
select_feature_set_svm (ClassTrainDataHandle, 'greedy', [], [], SVMHandle, SelectedFeatures, Score)
clear_class_train_data (ClassTrainDataHandle)
**----------------------- 测试 -----------------------**
*存放种类
TestClass := []
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('D:/test', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
get_domain (Image, Domain)
calculate_features (Domain, Image, SelectedFeatures, Features)
classify_class_svm (SVMHandle, real(Features), 1, Class)
TestClass := [TestClass,Class]
endfor
⭐⭐分析:
① get_feature_names (FeatureGroups, FeatureNames),获取特征的名称。
② get_feature_lengths (FeatureNames, FeatureLengths),根据特征名称,计算每个特征的维度。
③ create_class_train_data (sum(FeatureLengths), ClassTrainDataHandle),根据总的特征维度,创建对应的SVM模型。
④ set_feature_lengths_class_train_data (ClassTrainDataHandle, FeatureLengths, FeatureNames),将每个特征的名称以及对应的维度添加到SVM模型。
⑤ calculate_features (Domain, Image, FeatureNames, Features),在特定的区域和图像,按照每个特征的名称中,计算每个的特征数据Features。
⑥ add_sample_class_train_data (ClassTrainDataHandle, 'feature_column', Features, ClassID),将计算得出的特征数据Features以及对应的分类种类添加到SVM模型。
⑦ select_feature_set_svm (ClassTrainDataHandle, 'greedy', [], [], SVMHandle, SelectedFeatures, Score),在特征数据群里面筛选出训练数据中最有效果的子特征,即自动抓取有效子特征,并返回SVM模型以及SelectedFeatures(有效子特征)
按照本次的分类测试结果来看,分类准确率百分之百,四种分类器均有优缺点,在实际应用场景中,还是需要贴合自身需求选择合适的分类器。
分类器普遍活跃在缺陷识别、光学字符识别、图像分割等领域,特别是面对多种缺陷容易混淆的情况时,选择合适的分类器往往能事半功倍。
由于SVM是自动抓取特征,因此在海量数据集中,存在很多很多的特征数据,直接训练测试SVM模型时,速度可能会很慢,数据的某些噪音,也可能存在过拟合现象。