前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。halcon中常见的有四类分类器:
MLP(多层神经网络neural Nets)
SVM(支持向量机)
K-NN(K-最邻近)
GMM(高斯混合类型)
分类器的应用领域主要是下面这些:
image segmentation 图像分割
object recognition 对象识别
quality control 质量控制
novelty detection 缺陷检测
optical character recognition(OCR) 光学字符识别
勇哥第一次见到分类器的视觉项目是锂电池的极片缺陷检测,效果还不错。
这两年深度学习火起来后,发现深度学习完成上面所说的领域的应用更容易,效果也更好。
但深度学习对硬件要求太高,你把IPC加装个一百多W的显卡很多时候是不现实的。
如果你用cpu来跑,会发现速度乎快乎慢,cpu全部内核会100%被占用。
分类器相对于深度学习来讲不吃硬件,所以相对来讲算是轻量级的应用。
==========================================================
MLP是基于多层神经网络的分类器。
目前勇哥使用它进行缺陷分类。
它的使用方式比较简单,分为两步:
第一步:创建分类器、添加特征向量
在下面的例子里,勇哥把产品分为了两类:ok,ng
实际上mlp分类器支持多级分类。
list_files (path1, ['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) *添加ok图片特征 for i := 0 to |ImageFiles| - 1 by 1 read_image(Image1, ImageFiles[i]) GetFeature(Image1, ImageOK, ImageNG, roi, 1, parameter, FeatureVector) if(i=0) *第一次需要创建分类器 create_class_mlp (|FeatureVector|, 6, 2, 'softmax', 'normalization', 10, 42, MLPHandle) endif *向分类量添加特征向量,注意参数0在这里表示ok的分类 add_sample_class_mlp (MLPHandle, FeatureVector, 0) endfor *添加NG图片特征 list_files (path2, ['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 i := 0 to |ImageFiles| - 1 by 1 read_image(Image1, ImageFiles[i]) GetFeature(Image1, ImageOK, ImageNG, roi, 2, parameter, FeatureVector) *向分类量添加特征向量,注意参数0在这里表示ng的分类 add_sample_class_mlp (MLPHandle, FeatureVector, 1) endfor *训练 train_class_mlp (MLPHandle, 200, 1, 0.0001, Error, ErrorLog) write_class_mlp(MLPHandle, 'D:/cs.gmc') clear_class_mlp(MLPHandle)
第二步:读取分类器训练文件,对图片进行分类
Classes := ['OK','NG'] read_class_mlp('D:/cs.gmc', MLPHandle) for i:=cNum to 1 by -1 *读取要处理的图片 select_obj(outimgAry, ObjectSelected, i) *取图片的特征 GetFeature(ObjectSelected, ImageOK, ImageNG, roi, 3, info, outvalue) *对图片进行分类,FoundClassIDs是分类结果,只会是0和1,k是置信度。 classify_class_mlp (MLPHandle, outvalue, 1, FoundClassIDs, k) if(FoundClassIDs[0]=1 and k>0.98) *ng图片计数 csNG:=csNG+1 else *ok图片计数 csOK:=csOK+1 endif endfor
上面两步看上去是不是很简单,这是一种典型的mlp分类器的用法。还有另一种用法,以后勇哥再谈。
当前这种用法如果你的图片尺寸不是很大的话,速度是飞快的。对cpu的使用率也没有深度学习那么夸张。
那么实际分类效果怎么样?
其实,我只是说mlp分类器的用法很简单,我从没说过用好它并取得好的效果很简单。
上面的代码中你注意到那个用户函数GetFeature没,它是获取图片的特征向量。
难度就在这里了。
未完待续…………
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

