论文针对高分辨率遥感影像分割场景中的典型问题(尺度变化,背景类内方差不均衡、前景-背景不均衡)提出FarSeg。FarSeg在网络结构上采用FPN处理多尺度问题,设计了前景-场景关系模块用于加强前景类间的联系、增大前景类-背景类差异,然后提出前景优化方法缓解类别不均衡问题。在iSAID验证集上,FarSeg和自然场景通用分割模型相比,指标验证了方法的有效性。
参考repo: Zheng: FarSeg
在此非常感谢 Zheng 等人贡献的FarSeg项目,提高了本repo复现论文的效率。
- 航空图像数据集iSAID—语义分割部分:https://captain-whu.github.io/iSAID/index.html
复现精度如下。
method | iters | bs | card | loss | align_corners | mIoU | weight | log |
---|---|---|---|---|---|---|---|---|
official | 60k | 4 | 2 | ASFLoss | √ | 63.71 | download | \ |
ours | 60k | 8 | 1 | ASFLoss | √ | 63.09 | download | log_dir 丨train & val |
关于模型验证指标,首先使用常规方法在11644张验证集上进行,然后将前一步中的最优模型(mIoU=62.56)在原始的458张验证集图像上执行滑窗预测,计算得到最终结果(mIoU=63.09)。
- 环境:AI Studio & BML CodeLab & Python 3.7;
- 硬件:Nvidia Tesla V100 32G × 1;
- 框架:PaddlePaddle 2.3.2;
!git clone https://github.com/ucsk/FarSeg.git
%cd FarSeg/
训练和评估所需数据为iSAID数据集的语义分割任务部分。
图像可以在 DOTA-v1.0 (train/val/test)下载,标注可在 iSAID (train/val)下载。
对于下载完成的原始iSAID数据集,按照如下结构在根目录进行准备进行准备:
├── PaddleRS
├── PaddleSeg
+└── 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)。
!python PaddleRS/tools/prepare_dataset/prepare_isaid.py iSAID_zip
经过预处理后的数据会存储在根目录iSAID/
中,其描述如下,其中valid_dir/
为验证集原图,labels.txt
包含背景类:
- AI Studio: iSAID (patch) ;
- 概况:16类(含背景),训练集33978张,验证集11644张;
- 数据格式:图片为RGB三通道图像,标签为单通道图像,值为INT[0,15]+{255},二者均为PNG格式存储;
PaddleRS
PaddleSeg
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
考虑到PaddleRS使用epoch作为checkpoint保存单位,所以在训练和评估阶段使用PaddleSeg接口实现。
Jupyter环境工作目录切换到PaddleSeg/
。
%cd PaddleSeg/
!pip install -r requirements.txt
!python setup.py install
主要训练配置如下:
- 模型训练步长60000,单卡训练批大小设为8;
- 优化器:SGD(momentum=0.9, weight_decay=1e-4, clip_grad_by_norm );
- 学习率策略:多项式衰减PolynomialDecay(begin=0.007,end=0.0, power=0.9);
在终端环境中下载由X2Paddle转换得到的ResNet50预训练权重,保存在pretrain_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
开始训练,单GPU自动混合精度。
!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 - train
训练时未进行评估,待训练完成后单独对已保存模型进行评估,并写入日志,选择验证集最优模型。
!python isaid_val.py
- 评估日志可视化:VisualDL - valid
以下内容中,单独对本repo训练好的最优权重进行评估。
FarSeg权重文件和ResNet50预训练权重一样,在终端FarSeg/PaddleSeg/
路径中进行下载。
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
- 验证集原图上进行滑窗评估:
!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
这里手动生成了PaddleRS/normal_model/model.yml
,其中包含了使PaddleRS成功调用模型的参数。
FarSeg模型迁移在这里 paddlers/rs_models/seg 。
将工作目录切换到FarSeg/PaddleRS
。然后安装依赖,拷贝[4.2]小节下载的权重,导出部署模型。
%cd ../PaddleRS/
!pip install -r requirements.txt
!python setup.py install
!cp ../PaddleSeg/pretrain_weights/farseg_r50_896x896_asf_amp_60k.pdparams normal_model/model.pdparams
!python deploy/export/export_model.py --model_dir=normal_model --save_dir=inference_model
运行动态图、静态图的加载与预测,可视化图像保存在infer_test/
。
!python infer_test/infer.py
- 模式1:lite_train_lite_infer,使用少量数据训练,用于快速验证训练到预测的流程是否能走通,不验证精度和速度;
!pip install https://paddleocr.bj.bcebos.com/libs/auto_log-1.2.0-py3-none-any.whl
!bash ./test_tipc/prepare.sh test_tipc/configs/seg/farseg/train_infer_python.txt lite_train_lite_infer
AI Studio环境中 TIPC分布式训练 有时会报错“Termination signal”。
本repo将运行环境切换为V100×4后成功运行,单卡有时也可以。
!bash ./test_tipc/test_train_inference_python.sh test_tipc/configs/seg/farseg/train_infer_python.txt lite_train_lite_infer
TIPC测试日志文件保存于 test_tipc/output/results.log 。
本项目的发布受 Apache 2.0 license 许可认证。