Skip to content

Latest commit

 

History

History
203 lines (144 loc) · 8.09 KB

File metadata and controls

203 lines (144 loc) · 8.09 KB

建筑物提取全流程案例

PaddleRS提供遥感模型训练和推理能力,结合EISeg提供的标注能力和GeoView提供的部署与展示能力,即可全流程地完成遥感图像分割任务。本案例基于Docker环境,在Windows 10系统使用上述工具实现对卫星影像建筑物提取任务从标注到训练再到部署的全流程开发。

〇、准备

  • 构建PaddleRS基础Docker镜像,详细过程请参考PaddleRS关于Docker镜像构建的文档
  • 为使用GeoView提供的遥感影像智能解译功能,可在PaddleRS基础镜像基础上使用本案例提供的Dockerfile构建GeoView镜像。若PaddleRS基础镜像名称为<imageName>,需要将Dockerfile中的FROM paddlers:latest改为FROM <imageName>,然后构建镜像:
docker build -t geoview:latest -f Dockerfile .

基于构建的镜像创建并运行Docker容器。

docker run -it -v <本机文件夹绝对路径>:<容器文件夹绝对路径> [--gpus all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all] geoview:latest /bin/bash

-v选项指定的<本机文件夹绝对路径>可用于在Docker容器和宿主机之间共享文件。

为便于说明,本案例提供一幅青岛地区tif影像作为示例数据。在Docker容器中执行如下指令下载数据并解压到/usr/qingdao目录:

wget https://paddlers.bj.bcebos.com/datasets/qingdao.zip
unzip -d /usr/qingdao qingdao.zip

一、数据标注

  • 切换到/opt/GeoView/PaddleRS目录,安装PaddleRS。
python setup.py install
  • 切分图像。虽然EISeg可以直接读取大图并进行分块标注和保存,但为了控制标注的数量,可以先使用PaddleRS提供的工具预先对图像进行切分。
cd tools/
python split.py --image_path /usr/qingdao/qingdao.tif --block_size 512 --save_dir /usr/qingdao/dataset/

eiseg

  • 加载模型和数据后标注情况如下。关于EISeg的使用方法请参考这里

eiseg_labeling

  • 标注后产生的结果如下。

annotation

二、模型训练

标注完成后,可参考PaddleRS的训练文档进行模型训练。

  • 对于标注好的数据,在EISeg的保存目录中存储为如下结构:
dataset
  ├- label
  |    └- A.tif
  └- A.tif

需要变更为如下结构:

dataset
  ├- label
  |    └- A.tif
  └- image
       └- A.tif
  • 接着,生成对应的列表文件。可以创建一个Python脚本文件,填充如下内容并执行:
import os
import os.path as osp
import random

if __name__ == "__main__":
    data_dir = "/usr/qingdao/dataset"
    img_dir = osp.join(data_dir, "images")
    lab_dir = osp.join(data_dir, "labels")
    img_names = os.listdir(img_dir)
    random.seed(888)  # 随机种子
    random.shuffle(img_names)  # 打乱数据
    with open("/usr/qingdao/dataset/train.txt", "w") as tf:
        with open("/usr/qingdao/dataset/eval.txt", "w") as ef:
            for idx, img_name in enumerate(img_names):
                img_path = osp.join("images", img_name)
                lab_path = osp.join("labels", img_name.replace(".tif", "_mask.tif"))
                if idx % 10 == 0:  # 划分比列
                    ef.write(img_path + " " + lab_path + "\n")
                else:
                    tf.write(img_path + " " + lab_path + "\n")

/usr/qingdao/dataset中创建labels.txt文件,填入如下内容:

background
building
  • 上述步骤完成后,数据集已被处理为PaddleRS要求的格式。接下来需要编写训练脚本,或者可以选择对PaddleRS提供的示例脚本进行修改。以FarSeg模型为例,可对FarSeg训练示例脚本(位于/opt/GeoView/PaddleRS/tutorials/train/semantic_segmentation/farseg.py)进行修改,调整路径参数,并注释或去除数据下载部分。本案例使用的示例影像波段数量等于3,故无需使用波段选择算子(T.SelectBand),去除之。对于波段数量大于3的情况,可以使用该算子挑选作为模型输入的波段。
# 数据集存放目录
DATA_DIR = '/usr/qingdao/dataset/'
# 训练集`file_list`文件路径
TRAIN_FILE_LIST_PATH = '/usr/qingdao/dataset/train.txt'
# 验证集`file_list`文件路径
EVAL_FILE_LIST_PATH = '/usr/qingdao/dataset/eval.txt'
# 数据集类别信息文件路径
LABEL_LIST_PATH = '/usr/qingdao/dataset/labels.txt'
# 实验目录,保存输出的模型权重和结果
EXP_DIR = '/usr/qingdao/output/farseg/'

# 下载和解压多光谱地块分类数据集
# pdrs.utils.download_and_decompress(
#     'https://paddlers.bj.bcebos.com/datasets/rsseg.zip', path='./data/')

# T.SelectBand([1, 2, 3]),

除上述修改外,也可以根据实际需求对模型训练使用的超参数、数据变换算子等进行修改。

  • 切换到训练脚本所在目录,使用下列命令执行脚本:
python farseg.py

train

三、可视化

  • 在另一个终端中启动Docker容器,将训练好的模型存放路径挂载到容器内:
docker run --name <containerName> -p 5008:5008 -p 3000:3000 -it -v <本机模型存放路径>:<容器内挂载绝对路径> [--gpus all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all] geoview:latest /bin/bash
  • 启动MySQL:
service mysql start
mysql -u root
  • 创建MySQL用户并赋予权限:
CREATE USER 'paddle_rs'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'paddle_rs'@'localhost';
FLUSH PRIVILEGES;
quit;
  • 切换到backend目录,根据实际情况修改.flaskenv
vim .flaskenv
vim ../config.yaml
  • 参考GeoView文档进行模型准备,将模型导出为部署格式。具体而言,执行如下命令:
cd /opt/GeoView/
mkdir -p backend/model/semantic_segmentation
cd /opt/GeoView/PaddleRS/
python deploy/export/export_model.py --model_dir=/usr/qingdao/output/farseg/best_model/ --save_dir=/opt/GeoView/backend/model/semantic_segmentation/farseg/
  • 启动后端:
python app.py
  • 在另一个终端中根据<containerName>启动前端:
docker exec -it <containerName> bash -c "cd frontend && npm run serve"
  • 在浏览器打开http://localhost:3000/,如果在地物分类的可选模型中未包含先前训练的模型,需要确认是否已将模型存放在backend/model/semantic_segmentation

geoview

  • 根据GeoView文档上传图像,得到建筑物提取结果。