工控编程吧
标题: halcon add_samples_image_class_svm函数介绍 [打印本页]
作者: qq263946146 时间: 2019-5-31 21:33
标题: halcon add_samples_image_class_svm函数介绍
add_samples_image_class_svm(Image, ClassRegions : : SVMHandle : )
add_samples_image_class_svm将图像Image中的训练样本添加到SVMHandle给出的支持向量机(SVM)中。
SVM主要用于解决模式识别领域中的数据分类问题
add_samples_image_class_svm用于在训练分类器之前存储训练样本,
使用classify_image_class_svm对多通道图像进行像素分类。
add_samples_image_class_svm的工作原理类似于add_sample_class_svm。
图像Image必须有多个等于NumFeatures的通道,(如create_class_svm所指定的)。
NumClasses的训练区域在ClassRegions 中传递。
因此,ClassRegions必须是一个包含NumClasses个区域的元组。
ClassRegions 中区域的顺序决定像素的类。
如果图像Image中没有特定类的样本,则必须在ClassRegions中的类位置传递一个空区域。
利用该机制,可以对不同的图像和适当选择的区域多次调用add_samples_image_class_svm,
将所有相关类的训练样本添加到SVM中。
ClassRegions中的区域应包含对应类别的代表性培训样本。
因此,它们不需要覆盖整个图像。
ClassRegions中的区域不应该相互重叠,因为这将导致在训练数据中,
来自重叠区域的样本会被分配到多个类中,
这可能导致训练收敛速度较慢,分类性能较低。
该算子的另一个应用是自动新奇性检测,
例如,可以检测到颜色或纹理中的异常。
对于这种模式,定义一个样本区域(例如用于皮肤检测的皮肤区域或用于正确纹理的样本)的训练集被传递给SVMHandle,
SVMHandle在模式“'novelty-detection'”中创建。
经过训练后,检测到与训练样本区域不同的区域(例如皮肤或纹理错误的排斥类)。
2.classify_image_class_svm(Image : ClassRegions : SVMHandle : )
classify_image_class_svm使用支持向量机SVMHandle对多通道图像Image进行像素分类。
在调用classify_image_class_svm之前,必须使用train_class_svm对SVM进行训练。
图像必须具有NumFeatures通道,和使用create_class_svm指定的相同。
在输出上,ClassRegions包含了分类的结果NumClasses区域。
注意,ClassRegions中返回的区域的顺序对应于add_samples_image_class_svm中训练区域定义的类的顺序。
防止SVM将位于特征空间中训练数据的凸包外的全部像素分配给其中一个分类器,
通过定义一个拒绝类别,向此类别添加训练样本进行训练,在很多情况下是很有用的。
这可以通过调用函数train_class_svm ,add_samples_image_class_svm来实现。
显式定义拒绝类的另一种方法是在模式“novelty-detection'”中使用SVM。
请参考create_class_svm和add_samples_image_class_svm中的描述。
例程:
* 例程序展示如何使用SVM分类器的新颖检测模式来执行网格检查任务。
*新奇性检测将训练样本中不包含的特征向量分类为一个新类(因此得名)。
*在网格检测任务中,SVM可用于检测与训练好的对象纹理不匹配的纹理。
dev_update_off ()
read_image (Image, 'plastic_mesh/plastic_mesh_01')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_color ('red')
*用于分类的纹理过滤器会在图像边界返回人为缺陷,因为要检查的塑料网格的图像不包含完整数量网格单元。
*由于这将导致在图像边界上检测出错,我们必须将靠近图像边界的区域排除在训练和分类之外。
*这是通过下面的矩形完成的。请注意,稍后会将图像缩小到原来的两倍。
gen_rectangle1 (Rectangle, 10, 10, Height / 2 - 11, Width / 2 - 11)
*创建带有novelty-detection属性的SVM分类器
create_class_svm (5, 'rbf', 0.01, 0.0005, 1, 'novelty-detection', 'normalization', 5, SVMHandle)
* The training is based on five images that contain no errors.
*读取五张完好图像,缩小两倍,再添加样本
for J := 1 to 5 by 1
read_image (Image, 'plastic_mesh/plastic_mesh_' + J$'02')
* 由于网格的分辨率很高,图像被缩小可节省大量的处理时间。
zoom_image_factor (Image, ImageZoomed, 0.5, 0.5, 'constant')
dev_display (ImageZoomed)
disp_message (WindowHandle, 'Adding training samples...', 'window', 12, 12, 'black', 'true')
* 生成纹理图像
*纹理图像是一个五通道的图像,包含应用五种不同的过滤法则的结果,
* 基本上对应于一阶导数和二阶导数,并充分平滑它们。
texture_laws (ImageZoomed, ImageEL, 'el', 5, 5)
texture_laws (ImageZoomed, ImageLE, 'le', 5, 5)
texture_laws (ImageZoomed, ImageES, 'es', 1, 5)
texture_laws (ImageZoomed, ImageSE, 'se', 1, 5)
texture_laws (ImageZoomed, ImageEE, 'ee', 2, 5)
compose5 (ImageEL, ImageLE, ImageES, ImageSE, ImageEE, ImageLaws)
smooth_image (ImageLaws, ImageTexture, 'gauss', 5)
* 向分类器添加样本
add_samples_image_class_svm (ImageTexture, Rectangle, SVMHandle)
endfor
dev_display (ImageZoomed)
disp_message (WindowHandle, 'Training SVM...', 'window', 12, 12, 'black', 'true')
* 训练支持向量机。这就产生了相当多的支持向量
train_class_svm (SVMHandle, 0.001, 'default')
*为了提高分类速度,减少支持向量的数量。
reduce_class_svm (SVMHandle, 'bottom_up', 2, 0.001, SVMHandleReduced)
stop()
* 现在检测塑料网格中的缺陷。
dev_set_draw ('margin')
dev_set_line_width (3)
for J := 1 to 14 by 1
read_image (Image, 'plastic_mesh/plastic_mesh_' + J$'02')
zoom_image_factor (Image, ImageZoomed, 0.5, 0.5, 'constant')
dev_display (ImageZoomed)
dev_set_color ('white')
dev_display (Rectangle)
texture_laws (ImageZoomed, ImageEL, 'el', 5, 5)
texture_laws (ImageZoomed, ImageLE, 'le', 5, 5)
texture_laws (ImageZoomed, ImageES, 'es', 1, 5)
texture_laws (ImageZoomed, ImageSE, 'se', 1, 5)
texture_laws (ImageZoomed, ImageEE, 'ee', 2, 5)
compose5 (ImageEL, ImageLE, ImageES, ImageSE, ImageEE, ImageLaws)
smooth_image (ImageLaws, ImageTexture, 'gauss', 5)
reduce_domain (ImageTexture, Rectangle, ImageTextureReduced)
* 利用SVM进行新颖性检测。
classify_image_class_svm (ImageTextureReduced, Errors, SVMHandleReduced)
* 对返回的原始错误进行后处理,以删除检测到的错误中不重要的部分。
opening_circle (Errors, ErrorsOpening, 3.5)
closing_circle (ErrorsOpening, ErrorsClosing, 10.5)
connection (ErrorsClosing, ErrorsConnected)
select_shape (ErrorsConnected, FinalErrors, 'area', 'and', 300, 1000000)
count_obj (FinalErrors, NumErrors)
dev_set_color ('red')
dev_display (FinalErrors)
if (NumErrors > 0)
disp_message (WindowHandle, 'Mesh not OK', 'window', 12, 12, 'red', 'true')
else
disp_message (WindowHandle, 'Mesh OK', 'window', 12, 12, 'forest green', 'true')
endif
if (J < 14)
disp_continue_message (WindowHandle, 'black', 'true')
endif
stop ()
endfor
clear_class_svm (SVMHandle)
clear_class_svm (SVMHandleReduced)
例程执行结果为:
(, 下载次数: 0)