文章目录
create_class_gmm 创建高斯混合模型(GMM)以进行分类任务 add_samples_image_class_gmm 提取训练样本,并将其添加到高斯混合模型 (GMM) 的训练数据集中 train_class_gmm 训练一个高斯混合模型 (GMM) clear_class_gmm 清除模型 create_class_lut_gmm 基于已训练的高斯混合模型 (GMM) 创建一个查找表 (LUT),用于分类字节图像 classify_image_class_lut 使用查找表 (LUT) 分类器对字节图像进行分类。 clear_class_lut 清除分类器 示例
create_class_gmm 创建高斯混合模型(GMM)以进行分类任务
create_class_gmm ( : : NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed : GMMHandle)
NumDim ( 输入控制) :指定特征空间的维度数量。这是用来对数据点进行分类的特征或属性的数量。
NumClasses ( 输入控制) :定义 GMM 应该能够区分的不同类别的数量。每个类别代表分类任务中的一个不同的类别或标签。
NumCenters ( 输入控制) :为每个类别指定中心的数量。这些中心代表每个类别的高斯分布的均值位置。可以为每个类别指定不同的中心数量。
CovarType ( 输入控制) :设置协方差矩阵的类型。这决定了每个高斯分布形状的复杂度。可选值包括:
'spherical' :球形协方差,表示各方向上的方差相同。
'diag' :对角线协方差,表示各方向上的方差不同但相互独立。
'full' :完全协方差,表示各个方向上都有不同的方差并且方向之间有相关性。
Preprocessing ( 输入控制) :指定用于变换特征向量的预处理类型。预处理可以改善分类性能。可选值包括:
'normalization' :归一化,将所有特征缩放到相同的尺度。
'principal_components' :主成分分析,使用主成分分析来减少特征维数。
'canonical_variates' :规范变量,使用规范变量分析来减少特征维数并最大化类别间的差异。
'none' :不进行预处理。
NumComponents ( 输入控制) :如果选择了 'principal_components' 或 'canonical_variates' 预处理方法,则需要指定转换后的特征数量。当预处理为 'none' 或 'normalization' 时,此参数被忽略。
RandSeed ( 输入控制) :设置随机数生成器的种子值,用于初始化 GMM 的随机值。这有助于复现实验结果。
GMMHandle ( 输出控制) :返回创建的 GMM 的句柄,以便后续操作使用。
add_samples_image_class_gmm 提取训练样本,并将其添加到高斯混合模型 (GMM) 的训练数据集中
add_samples_image_class_gmm ( Image, ClassRegions : : GMMHandle, Randomize : )
Image ( 输入对象) : 这是用于训练的图像。通常是一张或多张通道的图像,如灰度图像、彩色图像等。
ClassRegions ( 输入对象) : 这是包含各个类别区域的区域数组。每个区域对应于图像中的一个类别或类别的一部分。这些区域通常是由用户手动标注或者通过其他方法自动分割得到的。
GMMHandle ( 输入控制, 状态被修改) : 这是之前使用 create_class_gmm 创建的 GMM 的句柄。此操作符会修改这个 GMM 的状态,即向其中添加训练样本。
Randomize ( 输入控制) : 这是一个实数值,表示要添加到训练数据中的高斯噪声的标准差。默认情况下为 0.0 ,意味着不添加任何噪声。可以通过添加一定标准差的高斯噪声来增强模型的鲁棒性,使其能够在面对噪声数据时有更好的表现。
train_class_gmm 训练一个高斯混合模型 (GMM)
train_class_gmm ( : : GMMHandle, MaxIter, Threshold, ClassPriors, Regularize : Centers, Iter)
GMMHandle ( 输入控制, 状态被修改) : 这是之前使用 create_class_gmm 创建的 GMM 的句柄。此操作符会修改这个 GMM 的状态,即对其进行训练。
MaxIter ( 输入控制) : 指定期望最大化算法的最大迭代次数。这是一个整数值,用于控制训练过程中的最大迭代轮数。
Threshold ( 输入控制) : 设置期望最大化算法终止的相对误差阈值。当连续两次迭代之间的变化小于这个阈值时,算法将停止。这是一个实数值,取值范围为 [ 0.0 , 1.0 ] 。
ClassPriors ( 输入控制) : 确定类别先验概率的方式。可以选择以下两种模式:
'training' : 根据训练数据中的类别频率计算先验概率。
'uniform' : 所有类别的先验概率相等。
Regularize ( 输入控制) : 为了防止协方差矩阵奇异而使用的正则化值。这是一个实数值,用于调整协方差矩阵中的对角元素,以确保其非奇异。取值范围为 [ 0.0 , 1.0 ) 。
Centers ( 输出控制) : 训练完成后每个类别找到的中心数量。这是一个整数数组,长度与类别数量相同。
Iter ( 输出控制) : 每个类别执行的实际迭代次数。这也是一个整数数组,长度与类别数量相同。
clear_class_gmm 清除模型
clear_class_gmm ( : : GMMHandle : )
create_class_lut_gmm 基于已训练的高斯混合模型 (GMM) 创建一个查找表 (LUT),用于分类字节图像
create_class_lut_gmm ( : : GMMHandle, GenParamName, GenParamValue : ClassLUTHandle)
GMMHandle ( 输入控制) : 这是已经使用 train_class_gmm 训练好的 GMM 的句柄。该 GMM 用于生成 LUT 分类器的基础。
GenParamName ( 输入控制) : 一个字符串数组,包含通用参数的名字,这些参数可以在创建 LUT 分类器时进行调整。可选的参数名称包括:
'bit_depth' : 表示用于创建 LUT 的位深度。
'class_selection' : 控制如何选择类别进行分类。例如,可以选择“fast”快速选择或者“best”最佳选择。
'rejection_threshold' : 设置拒绝阈值,用于确定哪些像素应该被拒绝分类。
GenParamValue ( 输入控制) : 一个数组,包含与 GenParamName 中指定的通用参数相对应的值。这些值可以根据具体的应用场景进行调整。
ClassLUTHandle ( 输出控制) : 返回创建的 LUT 分类器的句柄,用于后续的分类任务。
classify_image_class_lut 使用查找表 (LUT) 分类器对字节图像进行分类。
classify_image_class_lut ( Image : ClassRegions : ClassLUTHandle : )
Image ( 输入对象) : 这是需要分类的输入字节图像。也可以接受多通道图像。
ClassRegions ( 输出对象) : 输出的是分割出的区域数组,代表图像中分类后的各个区域。每个区域对应于图像中的一个分类结果。
ClassLUTHandle ( 输入控制) : 这是之前使用 create_class_lut_gmm 创建的 LUT 分类器的句柄。此操作符使用该分类器对图像进行分类。
clear_class_lut 清除分类器
clear_class_lut ( : : ClassLUTHandle : )
示例
* In this example five different color fuses are segmented with
* a look- up table classifier ( LUT) based on a Gaussian Mixture
* Model ( GMM) .
* 读取图片
dev_update_off ( )
dev_close_window ( )
dev_open_window ( 0 , 0 , 800 , 600 , 'white' , WindowHandle)
dev_set_draw ( 'margin' )
ImageRootName : = 'color/color_fuses_0'
FuseTypes : = [ 5 , 10 , 15 , 20 , 30 ]
FuseColors : = [ 'Orange' , 'Red' , 'Blue' , 'Yellow' , 'Green' ]
FuseHighlight : = [ 'orange' , 'red' , 'blue' , 'goldenrod' , 'forest green' ]
DisplayTextShift : = [ 85 , 65 , 75 , 85 , 85 ]
dev_set_color ( 'white' )
dev_set_line_width ( 2 )
read_image ( Image, ImageRootName + '0' )
dev_display ( Image)
*
* Define ROIs for the training data of the classifier
* 定义ROI 进行颜色分类
set_display_font ( WindowHandle, 14 , 'mono' , 'true' , 'false' )
gen_rectangle1 ( FuseOrange, 195 , 90 , 230 , 120 )
dev_display ( FuseOrange)
disp_message ( WindowHandle, 'Orange Fuse' , 'image' , 160 , 90 - 65 , 'black' , 'true' )
gen_rectangle1 ( FuseRed, 191 , 280 , 226 , 310 )
dev_display ( FuseRed)
disp_message ( WindowHandle, 'Red Fuse' , 'image' , 160 , 280 - 55 , 'black' , 'true' )
gen_rectangle1 ( FuseBlue, 190 , 470 , 225 , 500 )
dev_display ( FuseBlue)
disp_message ( WindowHandle, 'Blue Fuse' , 'image' , 160 , 470 - 60 , 'black' , 'true' )
gen_rectangle1 ( FuseYellow, 192 , 672 , 227 , 702 )
dev_display ( FuseYellow)
disp_message ( WindowHandle, 'Yellow Fuse' , 'image' , 160 , 672 - 70 , 'black' , 'true' )
gen_rectangle1 ( FuseGreen, 197 , 880 , 232 , 910 )
dev_display ( FuseGreen)
disp_message ( WindowHandle, 'Green Fuse' , 'image' , 160 , 880 - 65 , 'black' , 'true' )
* 产生一个空的分类
gen_empty_obj ( Classes)
* 将颜色逐一访日
concat_obj ( FuseOrange, FuseRed, Classes)
concat_obj ( Classes, FuseBlue, Classes)
concat_obj ( Classes, FuseYellow, Classes)
concat_obj ( Classes, FuseGreen, Classes)
disp_message ( WindowHandle, 'ROIs for the training data' , 'window' , 12 , 12 , 'black' , 'true' )
disp_continue_message ( WindowHandle, 'black' , 'true' )
stop ( )
*
* Create the GMM classifier, add the samples, and train it
* 创建模型
create_class_gmm ( 3 , 5 , 1 , 'full' , 'none' , 3 , 42 , GMMHandle)
* 将图片和归类放入模型
add_samples_image_class_gmm ( Image, Classes, GMMHandle, 0 )
disp_message ( WindowHandle, 'Training GMM classifier...' , 'window' , 48 , 12 , 'black' , 'true' )
* 进行高斯训练
train_class_gmm ( GMMHandle, 100 , 0.001 , 'training' , 0.001 , Centers, Iter)
*
* Create the GMM- based LUT classifier
disp_message ( WindowHandle, 'Creating LUT classifier...' , 'window' , 84 , 12 , 'black' , 'true' )
* 创建分类器
create_class_lut_gmm ( GMMHandle, [ 'bit_depth' , 'rejection_threshold' ] , [ 6 , 0.03 ] , ClassLUTHandle)
* 清除高斯句柄
clear_class_gmm ( GMMHandle)
*
* Segment images with LUT classifier
for Img : = 0 to 3 by 1
read_image ( Image, ImageRootName + Img)
count_seconds ( T1)
* 进行分类
classify_image_class_lut ( Image, ClassRegions, ClassLUTHandle)
count_seconds ( T2)
TimeToClassify : = ( T2 - T1) * 1000
dev_display ( Image)
dev_set_line_width ( 3 )
for Fuse : = 1 to 5 by 1
*
* Perform post- processing on returned classes
copy_obj ( ClassRegions, ObjectsSelected, Fuse, 1 )
* 闭运算先膨胀再腐蚀
closing_circle ( ObjectsSelected, RegionClosing, 3.5 )
* 形成单独的连通域
connection ( RegionClosing, ConnectedRegions)
* 选取像素点的大小
select_shape ( ConnectedRegions, SelectedRegions, 'area' , 'and' , 2500 , 99999 )
* 进行填充
fill_up ( SelectedRegions, RegionFillUp)
* 获取坐标点的位置
area_center ( RegionFillUp, Area, Row, Column)
* 包凸
shape_trans ( RegionFillUp, RegionTrans, 'convex' )
dev_set_color ( FuseHighlight[ Fuse - 1 ] )
dev_display ( RegionTrans)
*
disp_message ( WindowHandle, FuseColors[ Fuse - 1 ] + ' ' + FuseTypes[ Fuse - 1 ] + ' A' , 'image' , Row - 10 , Column - DisplayTextShift[ Fuse - 1 ] , FuseHighlight[ Fuse - 1 ] , 'white' )
endfor
disp_message ( WindowHandle, TimeToClassify$'.1f' + ' ms' , 'window' , 12 , 12 , 'black' , 'true' )
if ( Img < 3 )
disp_continue_message ( WindowHandle, 'black' , 'true' )
stop ( )
endif
endfor
*
clear_class_lut ( ClassLUTHandle)
disp_message ( WindowHandle, 'No more lines to execute' , 'window' , 50 , 12 , 'black' , 'true' )