FarSeg:前景感知关系网络,适用于遥感影像前背景不均衡分割场景
PaddleSeg实现高分辨率遥感影像分割网络FarSeg,iSAID数据集切图训练与评估,已在PaddleRS可用。
1 论文介绍
Foreground-Aware Relation Network for Geospatial Object Segmentation in High Spatial Resolution Remote Sensing Imagery arxiv | PDF
method | iters | bs | card | loss | align_corners | mIoU | weight | log |
---|---|---|---|---|---|---|---|---|
paper | 60k | 4 | 2 | ASFLoss | √ | 63.71 | download | \ |
ours | 60k | 8 | 1 | ASFLoss | √ | 63.09 | download | train & val |
1.1 问题引入
语义分割任务的多尺度问题已经被广泛地研究,而在高分辨率遥感影像场景中,除了尺度问题外,还存在背景类内差别较大、前/背景不均衡等明显问题。
针对这3种问题,论文提出的FarSeg有对应的解决方案:
- 多尺度问题:FPN;
- 背景类内差别大:Foreground-Scene Relation Module,加强{前景类之间的联系, 前景类-背景类之间的差异};
- 前/背景不均衡:Foreground-Aware Optimization,损失函数,更加关注困难样本.
1.2 网络结构
- (a): 常见的网络结构,骨干网络ResNet50输出4层,通道数[256,512,1024,2048] (CodeBlock);FPN特征融合,通道数[256]*4 (CodeBlock);c5被利用2次,FPN & scene embedding branch.
- (b): c5经过gap变成scene embedding vector [N,2048,1,1] (CodeBlock). scene embedding vector和FPN特征经过ConvBNReLU生成scene-feature、content-feature & reencoder-feature,scene-feature和content-feature进行sigmoid(相乘并在通道方向求和)生成relation heatmaps (CodeBlock),最后relation heatmaps和reencoder-feature相乘得到优化特征refined-feature (CodeBlock).
- ©: decoder是常规的ConvBNReLU-UpSampling,进行4个尺度特征的解码和均值融合 (CodeBlock).
1.3 损失函数
前景类-背景类样本间的严重不均衡影响着模型的训练,FarSeg提出Foreground Aware Optimization关注困难样本的学习.
对于常规的难样本加权损失 ∑ l ( p i , y i ) = 1 Z ∑ ( 1 − p i ) γ l ( p i , y i ) \sum l\left(p_i, y_i\right)=\frac{1}{Z} \sum\left(1-p_i\right)^\gamma l\left(p_i, y_i\right) ∑l(pi,yi)=Z1∑(1−pi)γl(pi,yi),模型训练初期预测错误较多,但不一定是难预测的,FarSeg提出了 l ′ ( p i , y i ) = [ 1 Z ( 1 − p i ) γ + ζ ( t ) ( 1 − 1 Z ( 1 − p i ) γ ) ] ⋅ l ( p i , y i ) l^{\prime}\left(p_i, y_i\right)=\left[\frac{1}{Z}\left(1-p_i\right)^\gamma+\zeta(t)\left(1-\frac{1}{Z}\left(1-p_i\right)^\gamma\right)\right] \cdot l\left(p_i, y_i\right) l′(pi,yi)=[Z1(1−pi)γ+ζ(t)(1−Z1(1−pi)γ)]⋅l(pi,yi),其中 ζ ( t ) \zeta(t) ζ(t) 设定为从[1,0]的衰减函数,这样使得损失函数在训练中由CELoss开始平滑过渡,作者对比了 l i n e a r linear linear、 p o l y poly poly和 c o s i n e cosine cosine,实验显示 c o s i n e cosine cosine效果最好 (CodeBlock).
1.4 实验部分
数据方面:
- iSAID数据集的语义分割部分,训练集训练,验证集测试(论文评估指标).
- 使用步长512,窗口896×896的滑窗将原图切割成896×896图像 (图像填充0,标签填充255).
- 随机{水平翻转、垂直翻转、90°翻转、180°翻转、270°翻转},IMAGENET归一化系数.
超参数方面:
- iters: 60000
- batch size: 4 (2 gpus)
- learning rate: poly(power=0.9, begin=0.007, end=0)
- optimizer: sgd (momentum=0.9, weight_decay=0.0001, grad_clip=norm_clip(max=35, method=L2))
- loss: t_max=10000, gamma=2
其他配置:
- backbone: resnet50 (IMAGENET pretrained)
- automatic mixed precision: true
最终在iSAID验证集上得到mIoU=63.71,本项目复现精度mIoU=63.09.
2 运行项目
首先clone项目到本地,后续需注意项目根目录的位置.
!git clone https://github.com/ucsk/FarSeg.git
%cd FarSeg/
2.1 准备数据
训练和评估所需数据为iSAID数据集的语义分割任务部分。
原始数据: 图像 DOTA-v1.0 (train/val/test),标注 iSAID (train/val).
对于下载完成的原始iSAID数据集,按照如下结构在FarSeg项目的根目录进行准备:
├── PaddleRS
├── PaddleSeg
├── LICENSE
├── README.md
+└── iSAID_zip
+ ├── train
+ │ ├── images
+ │ │ ├── part1.zip
+ │ │ ├── part2.zip
+ │ │ └── part3.zip
+ │ └── Semantic_masks
+ │ └── images.zip
+ └── val
+ ├── images
+ │ └── part1.zip
+ └── Semantic_masks
+ └── images.zip
准备好原始数据集的目录结构之后,在项目根目录按如下命令生成步长为512、尺寸为896x896的图像(若尺寸不足,图像填充0,标签填充255)。
经过预处理的iSAID数据集:AI Studio: iSAID (patch).
挂载路径:data/data167913/iSAID.zip & data/data167913/valid_dir.zip. 请手动解压并调整到如下目录结构.
!python PaddleRS/tools/prepare_dataset/prepare_isaid.py iSAID_zip
经过预处理后的数据会存储在根目录iSAID/
中,介绍如下:
valid_dir/
为验证集原图,labels.txt
包含背景类.- 概况:16类(含背景),训练集33978张,验证集11644张.
- 数据格式:图片为RGB三通道图像,标签为单通道图像,值为INT[0,15]+{255},二者均为PNG格式存储.
PaddleRS
PaddleSeg
LICENSE
README.md
iSAID_zip
+iSAID
+├── ann_dir
+│ ├── train
+│ └── val
+├── img_dir
+│ ├── train
+│ └── val
+├── valid_dir
+│ ├── images
+│ ├── labels
+│ └── val_list.txt
+├── train_list.txt
+├── val_list.txt
+└── labels.txt
!tree iSAID/ -d
iSAID/
├── ann_dir
│ ├── train
│ └── val
├── img_dir
│ ├── train
│ └── val
└── valid_dir
├── images
└── labels
9 directories
2.2 模型训练
项目使用PaddleSeg风格,代码如下.
%cd PaddleSeg/
!pip install -r requirements.txt
!python setup.py install
!rm -r paddleseg.egg-info/ dist/ build/
在终端环境运行如下代码,将resnet50预训练保存于pretrian_weights/resnet50_pth.pdparams
.
cd FarSeg/PaddleSeg/
wget -O pretrain_weights/resnet50_pth.pdparams https://bj.bcebos.com/v1/ai-studio-online/ffef16b1a0004f1bba606c7540d501ea5cf116a2288742b4888cf88c64ee0f55?responseContentDisposition=attachment%3B%20filename%3Dresnet50_pth.pdparams&authorization=bce-auth-v1%2F5cfe9a5e1454405eb2a975c43eace6ec%2F2022-09-11T06%3A46%3A52Z%2F-1%2F%2F1bdd0efebc7f95167ab8bf22a434c6c449647bfa57fa814ab588e03dc8a76bbc
- 训练配置如下,开始训练.
!cat configs/farseg/farseg_r50_896x896_asf_amp_60k.yml
!python train.py \
--config=configs/farseg/farseg_r50_896x896_asf_amp_60k.yml \
--save_interval=400 \
--keep_checkpoint_max=50 \
--num_workers=4 \
--log_iters=50 \
--save_dir=farseg_r50_896x896_asf_amp_60k \
--use_vdl \
--precision=fp16 \
--amp_level=O1
- 训练日志可视化:VisualDL-FarSeg-Train.
2.3 模型评估
在原图的验证集上执行步长=512,窗口=896×896的滑动窗口进行预测评估。
在终端环境中下载训练好的权重于pretrain_weights/farseg_r50_896x896_asf_amp_60k.pdparams
.
cd FarSeg/PaddleSeg/
wget -O pretrain_weights/farseg_r50_896x896_asf_amp_60k.pdparams https://bj.bcebos.com/v1/ai-studio-online/0e0057eb768d42d7b8f3389b0114cf70f74cdf65c0a749eb8f135b37ee06306a?responseContentDisposition=attachment%3B%20filename%3Dfarseg_r50_896x896_asf_amp_60k.pdparams&authorization=bce-auth-v1%2F5cfe9a5e1454405eb2a975c43eace6ec%2F2022-09-15T08%3A01%3A37Z%2F-1%2F%2Fe663278bfc9afc49a0542e8c212ff11d06c276675050554b14d2ecd15e252add
- 验证集切图评估,最优结果mIoU=62.56. 评估日志 VisualDL-FarSeg-val.
!python val.py \
--config=configs/farseg/farseg_r50_896x896_asf_amp_60k.yml \
--model_path=pretrain_weights/farseg_r50_896x896_asf_amp_60k.pdparams \
--num_workers=4
- 验证集滑动窗口评估,mIoU=63.09.
!python val.py \
--config=configs/farseg/farseg_r50_slide_val.yml \
--model_path=pretrain_weights/farseg_r50_896x896_asf_amp_60k.pdparams \
--num_workers=4 \
--is_slide \
--crop_size 896 896 \
--stride 512 512
2.4 模型预测
!python predict.py \
--config=configs/farseg/farseg_r50_slide_val.yml \
--model_path=pretrain_weights/farseg_r50_896x896_asf_amp_60k.pdparams \
--image_path=/home/aistudio/work/P2093.png \
--save_dir=/home/aistudio/work/output \
--is_slide \
--crop_size 896 896 \
896 \
--stride 512 512

- Foreground-Scene Relation Module Heatmaps.
3 其他说明
- 关于FarSeg中的cls_head,由于输入图像被设置为896×896 (896 % 8 == 0),所以在该部分设置align_corners=False会更优,但是在论文代码中使用UpsamplingBilinear2d实现,本文与此一致.
此文章为搬运
原项目链接
更多推荐
所有评论(0)