少有人走的路

勇哥的工业自动化技术网站

勇哥的视觉实验:MLP分类器(一) 基本用法

前言:

==========================================================

分类器相对于深度学习来讲是一种古老传统的图片处理技术。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

版权声明:本文为博主原创文章,转载请附上博文链接!



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864