前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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界面可以用户交互修改参数。
*初始显示和菜单文本 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
版权声明:本文为博主原创文章,转载请附上博文链接!

