前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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%被占用。
分类器相对于深度学习来讲不吃硬件,所以相对来讲算是轻量级的应用。
==========================================================
这个例子在前面讲gmm的时候用过。
http://www.skcircle.com/?id=1622
原始图片
分割前训练用的区域,共4个。
Sea 蓝色海面
Deck 红色甲板
Walls 白墙
Chimney 黑色烟囱
然后经过svm训练后,分割出来的效果如下
这个结果要对比一下gmm的结果,才更有意义。
gmm的结果如下图,其中黑色的部分是“不属于任何分类”的部分。
也就是说gmm自动会有一个“例外分类”。这也是为啥gmm支持异常检测的原因。这个异常就是“例外分类”。
而上面的svm的结果,是不会有例外分类的,因为程序指定4类,所以图片中所有部分都被划入指定的4个分类时。
源码:
* 这个示例程序演示了如何用支持向量机分类器分割RGB图像。分类器使用四种不同的颜色进行训练。 dev_update_off () dev_close_window () dev_open_window (0, 0, 735, 485, 'black', WindowHandle) set_display_font (WindowHandle, 14, 'mono', 'true', 'false') dev_set_draw ('margin') dev_set_colored (6) dev_set_line_width (3) read_image (Image, 'patras') dev_display (Image) Color := ['indian red','cornflower blue','white','black','yellow'] * 创建4个region做为采样区域 gen_rectangle1 (Sea, 10, 10, 120, 270) gen_rectangle2 (Deck, [170,400], [350,375], [-0.56,-0.75], [64,104], [26,11]) union1 (Deck, Deck) gen_rectangle1 (Walls, 355, 623, 420, 702) gen_rectangle2 (Chimney, 286, 623, -0.56, 64, 33) concat_obj (Sea, Deck, Classes) concat_obj (Classes, Walls, Classes) concat_obj (Classes, Chimney, Classes) dev_set_color (Color[0]) dev_display (Deck) dev_set_color (Color[1]) dev_display (Sea) dev_set_color (Color[2]) dev_display (Walls) dev_set_color (Color[3]) dev_display (Chimney) Message := 'Training regions for the color classifier' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') disp_continue_message (WindowHandle, 'black', 'true') stop () * 创建SVM,添加样本 create_class_svm (3, 'rbf', 0.1, 0.0005, 4, 'one-versus-all', 'normalization', 3, SVMHandle) add_samples_image_class_svm (Image, Classes, SVMHandle) dev_display (Image) Message := 'Training ...' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') * 训练 train_class_svm (SVMHandle, 0.001, 'default') Message := Message + ' ready.' Message[1] := 'Segment image using the classifier ...' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') * 分割图片,也可以说是分类图片的不同部分 classify_image_class_svm (Image, ClassRegions, SVMHandle) region_to_mean (ClassRegions, Image, ImageClass) dev_display (ImageClass) Message[1] := Message[1] + ' ready.' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
代码没啥子好讲的。
就这样了。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

