前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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
版权声明:本文为博主原创文章,转载请附上博文链接!

