勇哥的视觉实验:K-NN分类器(三)动态UI演示k-NN分类器及其参数

前言:

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

分类器相对于深度学习来讲是一种古老传统的图片处理技术。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%被占用。
分类器相对于深度学习来讲不吃硬件,所以相对来讲算是轻量级的应用。

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


这个例子显示了k-NN分类的参数

显示的点表示二维特征空间中的样本(特征是行和列坐标)。

每个采样点属于四个类中的一个:红色、绿色、蓝色和青色。

k-NN分类器根据其k个邻居的类(其中k是任意数>=1)将类分配给任何新的数据点。

您可以通过单击按钮或进入图像来选择邻居k的数量和要分类的数据点。

您也可以选择4种不同的分类方法,如算子classify_class_knn参考文件所述:


-'neighbors_distance'(不返回类,只返回到最近点的距离)

-'classes_distance'(返回最近点的类)

-'classes_frequency'(返回最大k个最近邻点的个数)

-'classes_frequency_weighted'(考虑数量和距离)


程序运行后,有一个UI界面可以用户交互修改参数。

image.png


*初始显示和菜单文本
Width := 180
Height := 200
dev_update_off ()
dev_close_window ()
dev_set_preferences ('graphics_window_context_menu', 'false')
open_window (0, Width * 3 + 12, 300, Height * 3, 0, 'buffer', '', WindowHandleResultBuffer)
set_part (WindowHandleResultBuffer, 0, 0, Height * 3, 300)
open_window (0, 0, Width * 3, Height * 3, 0, 'buffer', '', WindowHandleBuffer)
set_part (WindowHandleBuffer, 0, 0, Height - 1, Width - 1)
dev_open_window (0, Width * 3 + 12, 300, Height * 3, 'black', WindowHandleResult)
dev_open_window (0, 0, Width * 3, Height * 3, 'black', WindowHandle)
dev_clear_window ()
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
set_display_font (WindowHandleResult, 14, 'mono', 'true', 'false')
set_display_font (WindowHandleBuffer, 14, 'mono', 'true', 'false')
set_display_font (WindowHandleResultBuffer, 14, 'mono', 'true', 'false')
dev_set_part (0, 0, Height * 3 - 1, Width * 3 - 1)
HighlightColor := ['black','yellow']
NormalColor := ['white','gray']
Colors := ['red','green','blue','cyan']
LabelWidth := 30
LabelHeight := 10
Columns := [0:LabelWidth:179]
gen_rectangle1 (LabelK, gen_tuple_const(6,0), Columns, gen_tuple_const(6,LabelHeight - 1), Columns + LabelWidth - 1)
gen_rectangle1 (LabelMethod, [LabelHeight,LabelHeight,2 * LabelHeight,2 * LabelHeight], [0,Width / 2,0,Width / 2], [2 * LabelHeight - 1,2 * LabelHeight - 1,3 * LabelHeight - 1,3 * LabelHeight - 1], [Width / 2 - 1,Width - 1,Width / 2 - 1,Width - 1])
concat_obj (LabelK, LabelMethod, LabelRegions)
Instructions := 'Please use the'
Instructions[1] := 'left mouse button to select'
Instructions[2] := ' - method'
Instructions[3] := ' - number of neighbors'
Instructions[4] := ' - a candidate point'
Instructions[5] := '(Right click to exit)'
Methods := ['neighbors_distance','classes_distance','classes_frequency','classes_weighted_frequencies']
*
*初始化数据
*
*创建一个带有点的通用测试区域,并为其建立一个k-NN索引
create_test_region_with_index_knn (TrainingDataDots, KNNHandle)

*分类的初始参数:
*这些值可以在示例中以交互方式更改
Method := 2
K := 3
Row := 139
Column := 57
P := [Row,Column]
* Trigger display for the first loop 第一个循环触发显示
First := 1
Button := 1

*如果ContinuosMode设置为0,则必须通过单击鼠标左键来明确设置候选点。
*您可能希望尝试此操作,以查看更改的参数对给定点的影响。
*(例如,不同的分类结果取决于邻居的数量或分类方法)。
ContinuousMode := true
dev_error_var (ErrorVar, 1)

*用户交互循环

*等待鼠标按钮(右击退出)
while (Button != 4)
    * Get the next mouse position
    dev_set_check ('~give_error')
    get_mposition (WindowHandle, Row, Column, Button)
    if (ErrorVar != 2)
        if (First)
            Row := 300
            Column := 300
            Button := 0
        else
            continue
        endif
    endif
    Row := Row / 3
    Column := Column / 3
    dev_set_check ('give_error')
    
    *左键单击
        *测试是否单击了标签
    if (Row < LabelHeight and Button % 2 == 1)
        * Case 1: Click on k-label
        * Select k
        for I := 1 to 6 by 1
            select_obj (LabelK, LabelSelected, I)
            test_region_point (LabelSelected, Row, Column, IsInside)
            if (IsInside)
                K := I
                break
            endif
        endfor
    elseif (Row < 3 * LabelHeight and Button % 2 == 1)
        * Case 2: Click on method label
        * Select method
        for I := 1 to |Methods| by 1
            select_obj (LabelMethod, LabelSelected, I)
            test_region_point (LabelSelected, Row, Column, IsInside)
            if (IsInside)
                Method := I - 1
                break
            endif
        endfor
    elseif (Button % 2 == 1 or ContinuousMode)
        * Select point
        P := [Row,Column]
    endif
    
    * 设置所选参数
    set_params_class_knn (KNNHandle, ['method','k','max_num_classes'], [Methods[Method],K,K])
    
    * 对所选点进行分类
    classify_class_knn (KNNHandle, P, Result, Rating)
    * 可视化结果
    clear_window (WindowHandleBuffer)
    clear_window (WindowHandleResultBuffer)
    visualize_knn_classifiction (TrainingDataDots, WindowHandleBuffer, WindowHandleResultBuffer, KNNHandle, P, K, Result, Rating)
    * 更新菜单
    disp_menu (LabelRegions, WindowHandleBuffer, WindowHandleResultBuffer, K, Method, NormalColor, HighlightColor, Instructions)
    copy_rectangle (WindowHandleBuffer, WindowHandle, 0, 0, 3 * Height - 1, 3 * Width - 1, 0, 0)
    copy_rectangle (WindowHandleResultBuffer, WindowHandleResult, 0, 0, 3 * Height - 1, 300 - 1, 0, 0)
endwhile
* 清理
disp_end_of_program_message (WindowHandleResult, 'black', 'true')
wait_seconds (0.3)
dev_set_preferences ('graphics_window_context_menu', '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