工控编程吧

标题: halcon add_samples_image_class_gmm函数介绍 [打印本页]

作者: qq263946146    时间: 2019-5-31 19:43
标题: halcon add_samples_image_class_gmm函数介绍
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)
例程执行结果
(, 下载次数: 1)