data_analyse_and_check.md 6.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
# 数据校验和分析
为确保能正常训练,我们应该先对数据集进行校验。同时,遥感影像往往由许多波段组成,不同波段数据分布可能大相径庭,例如可见光波段和热红外波段分布十分不同。为了更深入了解数据的组成、优化模型训练效果,需要对数据进行分析。
接下来以`remote_sensing_seg`数据集为例展示数据校验和分析的全过程。

## Step1 数据校验和初步分析

我们提供数据校验和分析的脚本,帮助您排查基本的数据问题,为如何配置训练参数提供指导。使用方式如下所示:
```shell script
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文件保存到数据集所在目录。

### 数据校验
数据校验内容如下:
#### 1 列表分割符校验(separator_check)
检查在`train.txt``val.txt``test.txt`列表文件中的分隔符设置是否正确。

#### 2 数据读取校验(imread_check)
检查是否能成功读取`train.txt``val.txt``test.txt`中所有图片。

若不正确返回错误信息。错误可能有多种情况,如数据集路径设置错误、图片损坏等。

#### 3 标注通道数校验(single_channel_label_check)
检查标注图的通道数。正确的标注图应该为单通道图像。

#### 4 标注类别校验(label_class_check)
检查实际标注类别是否和配置参数`num_classes``ignore_index`匹配。

**NOTE:**
标注图像类别数值必须在[0~(`num_classes`-1)]范围内或者为`ignore_index`
标注类别最好从0开始,否则可能影响精度。

#### 5 图像与标注图尺寸一致性校验(shape_check)
验证图像尺寸和对应标注图尺寸是否一致。


### 数据分析
数据统计分析内容如下:

#### 1 标注类别统计(label_class_statistics)
统计每种类别的像素总数和所占比例。统计结果示例如下:
```
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)]
```

#### 2 图像尺寸范围统计(img_shape_range_statistics)
统计数据集中图片的最大和最小的宽高。

#### 3 图像通道数统计(img_channels_statistics)
统计数据集中图片的通道个数。

#### 4 数据范围统计(data_range_statistics)
逐通道地统计数据集的数值范围。

#### 5 数据分布统计(data_distribution_statistics)
逐通道地统计数据集分布。并将分布保存为`pkl`文件,方便后续可视化和数据裁剪。

#### 6 归一化系数计算(cal_normalize_coefficient)
逐通道地计算归一化系数mean、standard deviation.

**备注:** 数据分析步骤1\~3在训练集、验证集、测试集上分别进行,步骤4\~6在整个数据集上进行。

## Step2 数据分布可视化,确定数据裁剪范围
### 数据分布可视化
我们提供可视化数据分布脚本,对数据集的数据分布按通道进行可视化。  
可视化需要先安装matplotlib:
```shell script
pip install matplotlib
```
使用方式如下:
```shell script
python tools/data_distribution_vis.py --pkl_path 'dataset/remote_sensing_seg/img_pixel_statistics.pkl'
```
参数说明:
- --pkl_path: 数据分布文件保存路径

其中部分通道的可视化效果如下:
![](./imgs/data_distribution.png)
需要注意的是,为便于观察,纵坐标为对数坐标。

### 确定数据裁剪范围
遥感影像数据分布范围广,其中往往存在一些异常值,影响算法对实际数据分布的拟合效果。为更好地对数据进行归一化,需要抑制遥感影像中少量的异常值。  
我们可以根据上述的数据分布统计结果来确定数据裁剪范围,并在后续图像预处理过程中对超出范围的像素值通过截断进行校正,从而去除异常值带来的干扰。

例如对于上述数据分布进行逐通道数据裁剪,我们选取的截断范围是:
```
裁剪范围最小值: 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]
```

## Step3 统计裁剪比例、归一化系数
为避免数据裁剪范围选取不当带来的影响,应该统计异常值像素占比,确保受影响的像素比例不要过高。
接着对裁剪后的数据计算归一化系数mean和standard deviation,用于图像预处理中的归一化参数设置。

使用方式如下:
```shell script
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]
```