提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像

提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像_第1张图片

提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像_第2张图片

项目背景

运动结构恢复(Structure from Motion, SfM)是一种能够从多张图像或视频序列中自动地恢复相机的参数以及场景三维结构的技术。由于成本较低,该方法应用广泛,涉及增强现实、自主导航、运动捕捉、手眼标定、影像视频处理、基于影像的三维建模等多个领域[1]。以城市场景的应用为例,通过以无人机为主要搭载平台,获取大范围的城市航空遥感影像,使用SfM可以恢复城市三维结构,也可以对单个建筑物进行航拍数据采集,根据序列影像恢复其精细的三维模型。尽管现在很多研究为提高SfM精度做了大量的努力,但是大多数SfM方法都受到匹配结果的影响,在复杂的场景中,传统的图像匹配算法如SIFT等容易产生误匹配[2],如何有效地过滤误匹配点是SfM领域的关键问题。

近几年,随着语义分割任务的蓬勃发展,我们可以轻松地使用优秀的语义分割模型为特定的下游任务提供置信度高的语义信息。例如Zhai等人[3]使用语义分割模型得到的信息来优化ORB-SLAM2,使其能在在动态环境中保持稳定和最佳的定位性能。Chen等人[2]则使用语义分割模型提取待匹配图像的语义信息,给特征点匹配提供鲁棒的语义约束,提高特征点匹配的准确率。同时,从语义分割的结果中提取的语义约束,构建等式约束的光束法平差来优化3D结构和相机位姿。实验的结果表明利用语义信息辅助SfM可以在相同的效率下达到更好的重建精度。该论文的思路值得我们学习,同时我也注意到文中使用的模型是DeeplabV3+。在今年年初我所看到的一个视频中,在cityscapes-C上同时运行SegFormer和DeeplabV3+,视频中的SegFormer的鲁棒性比DeeplabV3+好很多,于是,我打算使用飞桨图像分割开发套件PaddleSeg中提供的SegFormer模型对论文的数据集进行训练,为SfM提供更精确和稳定的语义约束。

项目介绍

SegFormer模型介绍

PaddleSeg提供了基于飞桨实现的SegFormer模型[4],该模型将Transformer与轻量级多层感知 (MLP) 解码器相结合,表现SOTA,性能优于SETR、Auto-Deeplab和OCRNet等网络。此外,PaddleSeg提供了SegFormer-B0到 SegFormer-B5 一系列模型,以SegFormer-B4为例,该模型有64M参数,在ADE20K数据集上实现了50.3%的mIoU,比之前的最佳方法的参数小5倍,精度提高了2.2%。

关于模型的详细介绍请参考:

  • 论文原文地址:

https://arxiv.org/abs/2105.15203

  • Github代码地址:

https://github.com/PaddlePaddle/PaddleSeg/tree/release/2.5/configs/segformer

  • Segformer解读AI Studio项目地址:

https://aistudio.baidu.com/aistudio/projectdetail/3728553

数据集介绍

本项目使用的数据集为UDD6数据集,是北京大学图形与交互实验室使用DJI-Phantom 4无人机在中国4个城市的60-100m之间高度采集并标注的,面向航拍场景理解、重建的数据集。数据的分辨率为4k(4096*2160)或12M(4000*3000),包含了各种城市场景。该数据集含有的类别如下图所示。

提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像_第3张图片

UDD6共包含有建筑外立面、道路、植被、汽车、建筑屋顶和其他6类,数据的示例如下图所示。

提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像_第4张图片

UDD6数据集有训练集160张和验证集45张,没有测试集。各个作为基准的分割模型对UDD6数据的验证数据集测试效果如下图所示,可以看到效果最好的是DeeplabV3+,mIoU为73.18%,模型的size为731M。

提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像_第5张图片

UDD6数据集地址:

https://github.com/MarcWong/UDD

基于PaddleSeg

使用SegFormer分割航空遥感影像

下面我们开始在AI Studio平台上基于PaddleSeg套件使用SegFormer模型分割航空遥感影像。需要注意的是,AI Studio上是Notebook的环境,所以在运行cd命令的时候前面需要加上百分号“%”,运行其它shell命令的时候,前面需要加上叹号“!”。

点击阅读原文获得项目链接

⭐  欢迎大家fork&star ⭐

https://aistudio.baidu.com/aistudio/projectdetail/3565870

第一步 下载PaddleSeg套件

用户可以从Github下载PaddleSeg,为了便于国内用户下载,飞桨也提供了Gitee下载方式。

!git clone https://gitee.com/paddlepaddle/PaddleSeg

第二步 准备UDD6数据集

数据集已经挂载在项目上,通过以下命令进行数据集解压。

!mkdir work/UDD6
!unzip -oq data/data75675/UDD6.zip -d work/UDD6/

同时,由于UDD6数据中图像大小为 (4096, 2160) 所以训练之前先进行crop处理成(1024, 1024)小块的图像以减少IO的占用。切割的代码process_data.py的代码在work文件夹下,可以指定切割的大小、步长以及线程池的数量以加快效率,运行以下命令处理。

%cd work/
!python process_data.py --tag val  #处理验证集
!python process_data.py --tag train  #处理训练集

第三步 安装依赖项

由于我们在AI Studio中已经安装了paddlepaddle-gpu的库,所以接下来只需要运行以下命令安装和数据处理相关的依赖项即可。

%cd /home/aistudio/PaddleSeg
!pip install -r requirements.txt

第四步 数据集列表生成

由于PaddleSeg套件是根据文件名列表.txt文件来进行数据集的定义,所以需要生成训练集和验证集的列表文件。

套件中包含划分数据集生成文件名列表的代码。该代码使用帮助文档网址:

https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/data/marker/marker_cn.md

运行以下命令即可。

# 训练数据集txt生成
!python tools/split_dataset_list.py \
        ../work/UDD6 train_sub train_labels_sub \
        --split 1.0 0.0 0.0 \
        --format JPG png \
        --label_class Other Facade Road Vegetation Vehicle Roof

!mv ../work/UDD6/train.txt ../work/UDD6/train_true.txt # 修改文件名

# 验证数据集txt生成
!python tools/split_dataset_list.py \
        ../work/UDD6 val_sub val_labels_sub \
        --split 0.0 1.0 0.0 \
        --format JPG png \
        --label_class Other Facade Road Vegetation Vehicle Roof

!rm ../work/UDD6/train.txt #删除第二次运行生成的train.txt
!mv ../work/UDD6/train_true.txt ../work/UDD6/train.txt # 将文件名改回来

第五步 环境配置和YML文件准备

运行以下代码,指定一张可用的显卡。

!export CUDA_VISIBLE_DEVICES=0

我们使用的是SegFormer-B3这个模型,配置文件segformer_b3_UDD.yml在work文件夹下,可以修改batch_size、iters、learning_rate等超参数,运行以下命令将配置文件复制到configs文件夹中。

!cp ../work/segformer_b3_UDD.yml configs/

第六步 开始训练

执行如下命令调用train.py脚本启动训练,在训练过程中会将最佳模型保存在output/best_model文件夹下。

!python train.py \
       --config configs/segformer_b3_UDD.yml \
       --do_eval \
       --use_vdl \
       --save_interval 500 \
       --save_dir output

在训练过程中,验证集的mIoU指标变化情况如下图所示。

提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像_第6张图片

验证集的Acc指标变化情况如下图所示。

提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像_第7张图片

第七步 结果预测与评估

执行以下命令调用val.py,使用训练出来的权重对验证集进行预测和评估。

!python val.py \
       --config configs/segformer_b3_UDD.yml \
       --model_path ./output/best_model/model.pdparams

预测的结果在UDD6数据集中mIOU达到74.50% ,相较于原论文使用DeepLabV3+的mIOU为73.18%,高1.32%。

同时,可以使用训练好的权重对我们自己的航拍影像进行预测,执行如下命令即可。其中image_path是待预测图像所在文件夹路径。

!python predict.py \
       --config ../work/segformer_b3_UDD.yml \
       --model_path ./output/best_model/model.pdparams \
       --image_path ../work/demo \
       --save_dir ../work/result \
       --is_slide \
       --crop_size 1024 1024 \
       --stride 512 512

参考文献

[1] Wei Y M , Kang L , Yang B , et al. Applications of structure from motion: a survey[J]. 浙江大学学报:C卷英文版, 2013, 14(7):9.

[2] Yu C , Yao W , Peng L , et al. Large-Scale Structure from Motion with Semantic Constraints of Aerial Images[J]. Springer, Cham, 2018.

[3]Zhai R, Yuan Y. A Method of Vision Aided GNSS Positioning Using Semantic Information in Complex Urban Environment [J]. Remote Sens. 2022, 14, 869.

[4] Xie E , Wang W , Yu Z , et al. SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers[C]// 2021.

提升复杂场景三维重建精度 | 基于PaddleSeg分割无人机遥感影像_第8张图片

关注【飞桨PaddlePaddle】公众号

获取更多技术内容~

你可能感兴趣的:(python,机器学习,人工智能,深度学习,计算机视觉)