1 论文介绍

Foreground-Aware Relation Network for Geospatial Object Segmentation in High Spatial Resolution Remote Sensing Imagery arxiv | PDF

methoditersbscardlossalign_cornersmIoUweightlog
paper60k42ASFLoss63.71download\
ours60k81ASFLoss63.09downloadtrain & 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(1pi)γ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(1pi)γ+ζ(t)(1Z1(1pi)γ)]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

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
!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实现,本文与此一致.

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐