勇哥的视觉实验: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

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



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

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

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864