勇哥的视觉实验: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分类检查彩色游戏零件的完整性(计算每种颜色的游戏零件件数)。

分类器的训练和应用首先在彩色图像上进行,然后在灰度图像上进行。


halcon中的分类器,像MLP, GMM, SVM等都有两类基本的用法。

一是使用图片的特征向量进行分类。这种用法参见本系列教程的第一篇  http://www.skcircle.com/?id=1616

二是使用图片的像素进行分类。这是本篇示例程序用到的方式。它的使用流程如下:

create_class_mlp (3, 7, 4, 'softmax', 'normalization', 3, 42, MLPHandle)
add_samples_image_class_mlp (Image, Classes, MLPHandle)
train_class_mlp (MLPHandle, 400, 0.5, 0.01, Error, ErrorLog)
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)

本示例程序运行后,你会发现粉色很难被分类出来。如果图片转为灰度,则因为零件跟背景灰度相近,基本上分类都是混乱的。

因此本例子其实也只是说明了用法,如果想实用一些,必须在分类前对图片进行预处理。



程序解释:



首先用鼠标画3个rectangle1框,注意要画在三个游戏零件的内部。完成后按鼠标右键。

image.png

image.png

黄色找到1,粉色找到0,蓝色找到1。每种颜色不满4个则是not ok

image.png

黄色找到2,粉色找到0,蓝色找到4, 只有蓝色是4个都找到了,所以是ok的。

image.png


dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 557, 416, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
* 
* Initialization
ImageRootName := 'color/color_pieces_0'
Regions := ['yellow','pink','blue','background']
Highlight := ['goldenrod','magenta','cyan']
gen_empty_obj (Classes)
* 
* 训练并应用mlp分类器
for Mode := 0 to 1 by 1
    dev_set_color ('black')
    read_image (Image, ImageRootName + '0')
    * 
    * 计算灰度图像
    if (Mode == 1)
        rgb1_to_gray (Image, GrayImage)
        compose3 (GrayImage, GrayImage, GrayImage, Image)
        dev_display (Image)
        disp_message (WindowHandle, 'Train and apply the classes again on gray images', 'window', 12, 12, 'black', 'false')
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
    * 
    * 彩色图像
    if (Mode == 0)
        * 
        * Specify color classes
        for I := 1 to 4 by 1
            dev_display (Image)
            dev_display (Classes)
            disp_message (WindowHandle, ['Drag rectangle inside ' + Regions[I - 1] + ' color','Click right mouse button to confirm'], 'window', 24, 12, 'black', 'false')
            draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
            gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
            concat_obj (Classes, Rectangle, Classes)
        endfor
    endif
    * 
    * 训练指定颜色类别
    create_class_mlp (3, 7, 4, 'softmax', 'normalization', 3, 42, MLPHandle)
    add_samples_image_class_mlp (Image, Classes, MLPHandle)
    disp_message (WindowHandle, 'Training...', 'window', 100, 12, 'black', 'false')
    train_class_mlp (MLPHandle, 400, 0.5, 0.01, Error, ErrorLog)
    * 
    * 使用训练好的MLP分类器测试每幅图像是否包含每种颜色的四个游戏零件
    for J := 0 to 3 by 1
        read_image (Image, ImageRootName + J)
        if (Mode == 1)
            rgb1_to_gray (Image, GrayImage)
            compose3 (GrayImage, GrayImage, GrayImage, Image)
        endif
        * 
        * 分类
        classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
        dev_display (Image)
        * Looking for 4 game pieces of each color ... 寻找每种颜色的4个游戏件。。。
        disp_message (WindowHandle, 'Looking for 4 game pieces of each color ...', 'window', 24, 12, 'black', 'false')
        dev_set_line_width (2)
        * 
        * 计算每种颜色的游戏零件件数
        for Figure := 1 to 3 by 1
            copy_obj (ClassRegions, ObjectsSelected, Figure, 1)
            connection (ObjectsSelected, ConnectedRegions)
            select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 400, 99999)
            count_obj (SelectedRegions, Number)
            dev_set_color (Highlight[Figure - 1])
            dev_display (SelectedRegions)
            OutString := Regions[Figure - 1] + ': ' + Number + '   '
            dev_set_color ('green')
            disp_message (WindowHandle, OutString, 'window', 24 + 30 * Figure, 12, 'black', 'false')
            if (Number != 4)
                disp_message (WindowHandle, 'Not OK', 'window', 24 + 30 * Figure, 120, 'red', 'false')
            else
                disp_message (WindowHandle, 'OK', 'window', 24 + 30 * Figure, 120, 'green', 'false')
            endif
        endfor
        if (J < 3 or Mode == 0)
            disp_continue_message (WindowHandle, 'black', 'true')
            stop ()
        endif
    endfor
    clear_class_mlp (MLPHandle)
endfor
dev_clear_window ()
dev_display (Image)

*在灰度图像上,游戏碎片的灰度值不能与背景的灰度值区分开来,因此无法对游戏碎片进行可靠的分类。
Message := 'The game pieces cannot be classified reliable on'
Message[1] := 'gray images because the gray values of the'
Message[2] := 'game pieces cannot always be distinguished from'
Message[3] := 'the gray values of the background.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')



--------------------- 

作者: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