工控编程吧

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

作者: qq263946146    时间: 2019-5-31 20:56
标题: halcon add_samples_image_class_mlp函数介绍
1.add_samples_image_class_mlp(Image, ClassRegions : : MLPHandle : )
add_samples_image_class_mlp将图像Image中的训练样本添加到MLPHandle给出的多层感知器(MLP)中。
使用add_samples_image_class_mlp存储训练样本,
然后使用classify_image_class_mlp训练用于多通道图像像素分类的分类器。
add_samples_image_class_mlp的工作原理类似于add_sample_class_mlp。
因为这里总是使用MLP进行分类,
以必须在使用create_class_mlp创建MLP时指定OutputFunction = 'softmax'。
图像Image必须有多个等于NumInput的通道,在调用 create_class_mlp时指定。
NumOutput像素类的训练区域在ClassRegions 中传递。
因此,ClassRegions必须是一个包含NumOutput区域的元组。
ClassRegions中区域的顺序决定像素的类别。
如果图像中没有特定类的样本,则必须在ClassRegions中的类位置传递一个空区域。
使用这种机制,可以使用多个图像,通过多次调用add_samples_image_class_mlp,
并使用不同的图像和适当选择的区域,将所有相关类的训练样本添加到MLP中。
ClassRegions中的区域应包含对应类别的代表性培训样本。
因此,它们不需要覆盖整个图像。
ClassRegions中的区域不应该相互重叠,因为这将导致在训练数据中,
来自重叠区域的样本会被分配到多个类中,
这可能导致训练收敛速度较慢,分类性能较低。


2.classify_image_class_mlp(Image : ClassRegions : MLPHandle, RejectionThreshold : )
classify_image_class_mlp使用多层感知器(MLP) MLPHandle对多通道图像Image 进行像素分类。
在调用classify_image_class_mlp之前,必须使用train_class_mlp对MLP进行训练。
Image 必须有NumInput通道(如create_class_mlp所指定)。
在输出上,ClassRegions包含作为分类结果的NumOutput区域。
注意,ClassRegions中返回的区域的顺序与add_samples_image_class_mlp中的训练区域定义的类的顺序相对应。
参数RejectionThreshold可用于拒绝分类不确定的像素。
RejectionThreshold表示分类返回的概率度量的阈值(请参阅classify_class_mlp和evaluate_class_mlp)。
所有具有低于RejectionThreshold的像素都不分配给任何类。


因为一个MLP通常将特征空间中位于训练数据凸包外全部像素分配给一个类别,因其有高概率(可信度),
在许多情况下明确训练一个拒绝类别很有用,即使使用RejectionThreshold,
这种方法可以通过调用add_samples_image_class_mlp添加拒绝类样本与调用train_class_mlp 重新训练MLP来实现。


例程:
* 例程使用MLP分类器来把橙子和柠檬从背景中分离出来。
read_image (Image, 'color/citrus_fruits_01')
get_image_pointer1 (Image, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
set_display_font (WindowHandle, 12, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (2)
dev_display (Image)
dev_update_window ('off')
dev_update_pc ('off')
dev_update_var ('off')
dev_set_color ('white')
* 创建一个MLP分类器
create_class_mlp (3, 3, 3, 'softmax', 'normalization', 10, 42, MLPHandle)
*读取一张训练图像,添加'oranges' 和 'background'类别样本
read_image (Image, 'color/citrus_fruits_01')
dev_display (Image)
gen_rectangle1 (OrangeRegion, 100, 130, 230, 200)
dev_display (OrangeRegion)
disp_message (WindowHandle, 'OrangeRegion', 'window', 100, 210, 'black', 'true')
dev_set_color ('white')
gen_rectangle1 (BackgroundRegion, 30, 20, 50, 50)
dev_display (BackgroundRegion)
disp_message (WindowHandle, 'BackgroundRegion', 'window', 30, 60, 'black', 'true')
dev_set_color ('white')
gen_empty_region (EmptyRegion)
gen_empty_obj (TrainingRegions1)
concat_obj (TrainingRegions1, OrangeRegion, TrainingRegions1)
concat_obj (TrainingRegions1, EmptyRegion, TrainingRegions1)
concat_obj (TrainingRegions1, BackgroundRegion, TrainingRegions1)
add_samples_image_class_mlp (Image, TrainingRegions1, MLPHandle)
stop ()
* 'lemons' and 'background' to the classifier类别样本
*读取一张训练图像,添加'lemons' 和 'background'
read_image (Image, 'color/citrus_fruits_03')
dev_display (Image)
gen_rectangle1 (LemonRegion, 180, 130, 230, 240)
dev_display (LemonRegion)
disp_message (WindowHandle, 'LemonRegion', 'window', 180, 250, 'black', 'true')
dev_set_color ('white')
gen_rectangle1 (BackgroundRegion, 400, 20, 430, 50)
dev_display (BackgroundRegion)
disp_message (WindowHandle, 'BackgroundRegion', 'window', 400, 60, 'black', 'true')
gen_empty_obj (TrainingRegions2)
concat_obj (TrainingRegions2, EmptyRegion, TrainingRegions2)
concat_obj (TrainingRegions2, LemonRegion, TrainingRegions2)
concat_obj (TrainingRegions2, BackgroundRegion, TrainingRegions2)
add_samples_image_class_mlp (Image, TrainingRegions2, MLPHandle)
stop ()
*
*训练分类器
disp_message (WindowHandle, 'Training...', 'window', 10, 450, 'black', 'true')
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
disp_message (WindowHandle, 'completed', 'window', 30, 450, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
dev_set_color ('white')
stop ()
dev_set_draw ('fill')
* 分割图像
for I := 1 to 15 by 1
    read_image (Image, 'color/citrus_fruits_' + I$'.2d')
    classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
    select_obj (ClassRegions, ClassOranges, 1)
    select_obj (ClassRegions, ClassLemons, 2)
    select_obj (ClassRegions, ClassBackground, 3)
    dev_set_draw ('fill')
    dev_display (Image)
    dev_set_color ('slate blue')
    dev_display (ClassBackground)
    dev_set_color ('goldenrod')
    dev_display (ClassOranges)
    dev_set_color ('yellow')
    dev_display (ClassLemons)
    disp_message (WindowHandle, 'Classify Image ' + I, 'window', 10, 10, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
    * 后续处理提取的分类区域
    closing_circle (ClassOranges, RegionClosingOranges, 3.5)
    connection (RegionClosingOranges, ConnectedRegionsOranges)
    select_shape (ConnectedRegionsOranges, SelectedRegionsOranges, 'area', 'and', 20000, 99999)
    fill_up (SelectedRegionsOranges, RegionFillUpOranges)
    area_center (RegionFillUpOranges, AreasOranges, RowsOranges, ColumnsOranges)
    shape_trans (RegionFillUpOranges, RegionFillUpOranges, 'convex')
    *
    closing_circle (ClassLemons, RegionClosingLemons, 3.5)
    connection (RegionClosingLemons, ConnectedRegionsLemons)
    select_shape (ConnectedRegionsLemons, SelectedRegionsLemons, 'area', 'and', 15000, 99999)
    fill_up (SelectedRegionsLemons, RegionFillUpLemons)
    area_center (RegionFillUpLemons, AreasLemons, RowsLemons, ColumnsLemons)
    shape_trans (RegionFillUpLemons, RegionFillUpLemons, 'convex')
    *
    dev_display (Image)
    dev_set_draw ('margin')
    dev_set_line_width (5)
    dev_set_color ('goldenrod')
    dev_display (RegionFillUpOranges)
    dev_set_color ('yellow')
    dev_display (RegionFillUpLemons)
    disp_message (WindowHandle, 'Classify Image ' + I + ' with Post Processing', 'window', 10, 10, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    disp_message (WindowHandle, 'Class: oranges', 'window', RowsOranges, ColumnsOranges - 50, 'black', 'true')
    disp_message (WindowHandle, 'Class: lemons', 'window', RowsLemons, ColumnsLemons - 50, 'black', 'true')
    stop ()
endfor
dev_clear_window ()
clear_class_mlp (MLPHandle)

例程执行结果:
(, 下载次数: 0)