为确保能正常训练,我们应该先对数据集进行校验。同时,遥感影像往往由许多波段组成,不同波段数据分布可能大相径庭,例如可见光波段和热红外波段分布十分不同。为了更深入了解数据的组成、优化模型训练效果,需要对数据进行分析。
接下来以remote_sensing_seg
数据集为例展示数据校验和分析的全过程。
我们提供数据校验和分析的脚本,帮助您排查基本的数据问题,为如何配置训练参数提供指导。使用方式如下所示:
python tools/data_analyse_and_check.py --data_dir 'dataset/remote_sensing_seg/' --num_classes 5
参数说明:
- --data_dir: 数据集所在目录
- --num_classes: 数据的类别数
运行后,命令行将显示概览信息,详细的错误信息将以data_analyse_and_check.log文件保存到数据集所在目录。
数据校验内容如下:
检查在train.txt
,val.txt
和test.txt
列表文件中的分隔符设置是否正确。
检查是否能成功读取train.txt
,val.txt
,test.txt
中所有图片。
若不正确返回错误信息。错误可能有多种情况,如数据集路径设置错误、图片损坏等。
检查标注图的通道数。正确的标注图应该为单通道图像。
检查实际标注类别是否和配置参数num_classes
,ignore_index
匹配。
NOTE:
标注图像类别数值必须在[0~(num_classes
-1)]范围内或者为ignore_index
。
标注类别最好从0开始,否则可能影响精度。
验证图像尺寸和对应标注图尺寸是否一致。
数据统计分析内容如下:
统计每种类别的像素总数和所占比例。统计结果示例如下:
Label class statistics:
(label class, percentage, total pixel number) = [(0, 0.1372, 2194601), (1, 0.0827, 1322459), (2, 0.0179, 286548), (3, 0.1067, 1706810), (4, 0.6556, 10489582)]
统计数据集中图片的最大和最小的宽高。
统计数据集中图片的通道个数。
逐通道地统计数据集的数值范围。
逐通道地统计数据集分布。并将分布保存为pkl
文件,方便后续可视化和数据裁剪。
逐通道地计算归一化系数mean、standard deviation.
备注: 数据分析步骤1~3在训练集、验证集、测试集上分别进行,步骤4~6在整个数据集上进行。
我们提供可视化数据分布脚本,对数据集的数据分布按通道进行可视化。
可视化需要先安装matplotlib:
pip install matplotlib
使用方式如下:
python tools/data_distribution_vis.py --pkl_path 'dataset/remote_sensing_seg/img_pixel_statistics.pkl'
参数说明:
- --pkl_path: 数据分布文件保存路径
其中部分通道的可视化效果如下:
需要注意的是,为便于观察,纵坐标为对数坐标。
遥感影像数据分布范围广,其中往往存在一些异常值,影响算法对实际数据分布的拟合效果。为更好地对数据进行归一化,需要抑制遥感影像中少量的异常值。
我们可以根据上述的数据分布统计结果来确定数据裁剪范围,并在后续图像预处理过程中对超出范围的像素值通过截断进行校正,从而去除异常值带来的干扰。
例如对于上述数据分布进行逐通道数据裁剪,我们选取的截断范围是:
裁剪范围最小值: clip_min_value = [7172, 6561, 5777, 5103, 4291, 4000, 4000, 4232, 6934, 7199]
裁剪范围最大值: clip_max_value = [50000, 50000, 50000, 50000, 50000, 40000, 30000, 18000, 40000, 36000]
为避免数据裁剪范围选取不当带来的影响,应该统计异常值像素占比,确保受影响的像素比例不要过高。 接着对裁剪后的数据计算归一化系数mean和standard deviation,用于图像预处理中的归一化参数设置。
使用方式如下:
python tools/cal_norm_coef.py --data_dir 'dataset/remote_sensing_seg/' \
--pkl_path 'dataset/remote_sensing_seg/img_pixel_statistics.pkl' \
--clip_min_value 7172 6561 5777 5103 4291 4000 4000 4232 6934 7199 \
--clip_max_value 50000 50000 50000 50000 50000 40000 30000 18000 40000 36000
参数说明:
- --data_dir: 数据集路径
- --pkl_path: 数据分布文件保存路径
- --clip_min_value: 数据裁剪范围最小值
- --clip_max_value: 数据裁剪范围最大值
裁剪像素占比统计结果如下:
channel 0, the percentage of pixels to be clipped = 0.0005625999999999687
channel 1, the percentage of pixels to be clipped = 0.0011332250000000155
channel 2, the percentage of pixels to be clipped = 0.0008772375000000165
channel 3, the percentage of pixels to be clipped = 0.0013191750000000058
channel 4, the percentage of pixels to be clipped = 0.0012433250000000173
channel 5, the percentage of pixels to be clipped = 7.49875000000122e-05
channel 6, the percentage of pixels to be clipped = 0.0006973750000000001
channel 7, the percentage of pixels to be clipped = 4.950000000003563e-06
channel 8, the percentage of pixels to be clipped = 0.00014873749999999575
channel 9, the percentage of pixels to be clipped = 0.00011173750000004201
可看出,被裁剪像素占比均不超过0.2%
裁剪后数据的归一化系数如下:
Count the channel-by-channel mean and std of the image:
mean = [0.14311189 0.14288498 0.14812998 0.16377212 0.27375384 0.27409344 0.27749602 0.07767443 0.56946994 0.55497161]
std = [0.09101633 0.09600706 0.09619362 0.10371447 0.10911952 0.11043593 0.12648043 0.02774626 0.06822348 0.06237759]