前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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的时候用过。
原始图片
分割前训练用的区域,共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:=['indianred','cornflowerblue','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:='Trainingregionsforthecolorclassifier'
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]:='Segmentimageusingtheclassifier...'
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
来源:
版权声明:本文为博主原创文章,转载请附上博文链接!
#转载请注明出处 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。
收藏 | 0点赞 | 0打赏作者