语义分割针对类别不平衡进行设置类别权重
在工业缺陷检测中,经常会遇到瑕疵样本少或瑕疵在全图中占比较小的问题,从而导致类别不平衡,训练出来的模型容易导致漏检或者分割的瑕疵不全/不连续。Halcon在处理这一问题时,对类别进行权重设置来平衡。具体见(calculate_dl_segmentation_class_weights)
get_dict_tuple (DLDataset, 'class_ids', ClassIDs)//获取类别
NumClasses := |ClassIDs|
ClassIDsToClassIdx := gen_tuple_const(max(ClassIDs) + 1,-1)
ClassIDsToClassIdx[ClassIDs] := [0:|ClassIDs| - 1]
ClassAreas := gen_tuple_const(|ClassIDs|,0)//不同类别区域面积初始化
for SampleIndex := 0 to |SampleIndices| - 1 by 1
read_dl_samples (DLDataset, SampleIndices[SampleIndex], DLSample)//读取一个样本
get_dict_object (SegmentationImage, DLSample, 'segmentation_image')//读取标注图像
get_image_type (SegmentationImage, ImageType)//获取图像类型
if (find(['int1','int2','uint2','byte'],ImageType) == -1)
convert_image_type (SegmentationImage, SegmentationImage, 'uint2')//转换图像格式
endif
gray_histo_abs (SegmentationImage, SegmentationImage, 1, AbsoluteHisto)//灰度直方图
ClassAreas := ClassAreas + AbsoluteHisto[ClassIDs]//叠加不同类别的区域面积
endfor
ClassAreas[ClassIDsToClassIdx[IgnoreClassIDs]] := 0//针对忽略类别进行处理
TotalArea := sum(ClassAreas)//求和
ClassWeights := gen_tuple_const(|ClassIDs|,0.)//初始化
ValidClasses := find(ClassAreas [!=] 0,1)//找到面积为0的类别
ClassFreq := ClassAreas / real(TotalArea)//求相对比例
ClassWeights[ValidClasses] := 1. / (ClassFreq[ValidClasses] + 0.0001)//求权重
ClassWeights := ClassWeights / min(ClassWeights[ValidClasses])//归一化权重