add_samples_image_class_gmm(Image, ClassRegions : : GMMHandle, Randomize : )
add_samples_image_class_gmm将图像Image中的训练样本添加到GMMHandle给出的高斯混合模型(GMM)中。
使用add_samples_image_class_gmm存储训练样本,
然后使用classify_image_class_gmm训练用于多通道图像像素分类。
add_samples_image_class_gmm的工作原理类似于add_sample_class_gmm。
图像必须有许多通道,这些通道等于create_class_gmm内参数NumDim。
NumClasses像素类的训练区域在ClassRegions中传递。
因此,ClassRegions必须是一个包含NumClasses区域的元组。
ClassRegions中区域的顺序决定像素的类。
如果图像中没有特定类的样本,则必须在ClassRegions中的类位置传递一个空区域。
使用这种机制,可以使用多个图像,通过多次调用add_samples_image_class_gmm,
使用不同的图像和适当选择的区域,将所有相关类的训练样本添加到GMM中。
ClassRegions的区域应包含对应类别的代表性培训样本。
因此,它们不需要覆盖整个图像。
分类区域中的区域不应该相互重叠,因为这将导致在训练数据中,
来自重叠区域的样本将被分配到多个类中,这可能导致分类性能较低。
整数类型的图像数据特别不适合用GMM建模。
Randomize可以用来克服这个问题,正如add_sample_class_gmm中所解释的那样。
2.classify_image_class_gmm(Image : ClassRegions : GMMHandle, RejectionThreshold : )
classify_image_class_gmm使用高斯混合模型(GMM)GMMHandle对多通道图像Image 进行像素分类。
在调用classify_image_class_gmm之前,必须使用train_class_gmm训练GMM。
图像必须具有NumDim个通道(如create_class_gmm所指定)。
在输出上,ClassRegions包含了NumClasses个区域作为分类的结果。
注意,ClassRegions中返回的区域的顺序与add_samples_image_class_gmm中的训练区域定义的类的顺序相对应。
参数 RejectionThreshold可用于拒绝分类不确定的像素。
RejectionThreshold表示分类返回的K-sigma概率度量的阈值
(请参阅classify_class_gmm和evaluate_class_gmm)。
所有具有低于 RejectionThreshold概率的像素都不分配给任何类。
例程:
*例程展示如何使用GMM分类器进行网格检查任务。
*计算出属于单个训练类的所有像素,然后从分类ROI中减去这些像素,提取出错误的像素。
*对于网格的检查,GMM可以用来检测与训练好的网格纹理不相同的纹理。
dev_update_off ()
ReadPretrainedClassifier := false
*取消以下注释行可以从磁盘读取事先训练的分类器,可以提速一分钟左右
* ReadPretrainedClassifier := true
SaveClassifier := false
*取消以下注释可以将训练好的GMM分类器保存到磁盘
* SaveClassifier := true
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)
get_system ('example_dir', HalconExamples)
*用于分类的纹理过滤器将在图像边界返回人为的干扰,因为要检查的塑料网格的图像不包含整数个网格单元。
*因为这将导致错误地在图像边框处检测到缺陷,则在训练和分类时必须排除靠近图像边框的区域
*这可以通过以下矩形完成,请注意,稍后将图像缩小到原来的两倍。
gen_rectangle1 (Rectangle, 10, 10, Height / 2 - 11, Width / 2 - 11)
if (ReadPretrainedClassifier)
*从磁盘从读取事先 训练的分类器
dev_display (Image)
disp_message (WindowHandle, 'Reading classifier from disk...', 'window', 10, 10, 'black', 'true')
read_class_gmm (HalconExamples + '/hdevelop/Segmentation/Classification/novelty_detection.gmm', GMMHandle)
wait_seconds (1.5)
else
*创建一个GMM分类器
create_class_gmm (5, 1, [1,5], 'spherical', 'normalization', 5, 42, GMMHandle)
*基于五张正常图像进行训练
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')
* 生成纹理图像,纹理图像是一个五通道的图像,包含应用了五种不同的过滤结果,
*基本上对应于一阶导数和二阶导数,并充分平滑它们。
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_gmm (ImageTexture, Rectangle, GMMHandle, 2.0)
endfor
*训练GMM分类器
dev_display (ImageZoomed)
disp_message (WindowHandle, 'Training GMM...', 'window', 10, 10, 'black', 'true')
train_class_gmm (GMMHandle, 100, 0.1, 'training', 0.0001, Centers, Iter)
if (SaveClassifier)
write_class_gmm (GMMHandle, HalconExamples + '/hdevelop/Segmentation/Classification/novelty_detection.gmm')
endif
endif
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')
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)
* Classify samples belonging to the trained class with the GMM.
*分类属于忆训练GMM分类器的样本
classify_image_class_gmm (ImageTextureReduced, Correct, GMMHandle, 0.001)
* Subtract them from the ROI to obtain the texture errors.
*从包含缺陷的ROI中提取缺陷
difference (Rectangle, Correct, Errors)
* Postprocess the returned raw errors to remove insignificant parts of the detected errors.
*对返回的擦伤缺陷进行后处理,以删除检测到的错误中不重要的部分。
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 (ImageZoomed)
dev_display (FinalErrors)
if (NumErrors > 0)
disp_message (WindowHandle, 'Mesh not OK', 'window', 10, 10, 'red', 'true')
else
disp_message (WindowHandle, 'Mesh OK', 'window', 10, 10, 'forest green', 'true')
endif
if (J < 14)
disp_continue_message (WindowHandle, 'black', 'true')
endif
stop ()
endfor
clear_class_gmm (GMMHandle)
例程执行结果
使用GMM分类器进行网格检查任务
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|