前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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
版权声明:本文为博主原创文章,转载请附上博文链接!

