diff --git a/README.md b/README.md index 59b3232..bc976b9 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- **基于飞桨框架开发的高性能遥感图像处理开发套件,端到端地完成从训练到部署的全流程遥感深度学习应用。** + **基于飞桨框架开发的高性能遥感图像处理开发套件,帮助您端到端地完成从训练到部署的全流程遥感深度学习应用。** [![license](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE) @@ -19,7 +19,7 @@ ## 简介 -PaddleRS是遥感科研院所、相关高校共同基于飞桨开发的遥感处理平台,支持遥感图像分类,目标检测,图像分割,以及变化检测等常用遥感任务,帮助开发者更便捷地完成从训练到部署全流程遥感深度学习应用。 +PaddleRS是遥感科研院所、相关高校共同基于飞桨开发的遥感处理平台,支持遥感图像分类,目标检测,图像分割,以及变化检测等常用遥感任务,能够帮助遥感领域科研从业者和致力于遥感影像处理算法落地的开发者便捷地完成从训练到部署的全流程遥感深度学习应用。
@@ -27,11 +27,17 @@ PaddleRS是遥感科研院所、相关高校共同基于飞桨开发的遥感处 ## 特性 -* **特有的遥感数据处理模块**:针对遥感行业数据特点,提供了大尺幅数据切片与拼接,支持读取`tif`、`png`、 `jpeg`、 `bmp`、 `img`以及 `npy`等格式,支持地理信息保存和超分辨率。 +PaddleRS具有以下五大特色: -* **覆盖任务广**:支持目标检测、图像分割、变化检测、参数反演等多种任务 +* **丰富的遥感特色模型**:支持FarSeg、BIT、ChangeStar等数十种遥感专用模型,覆盖图像分割、目标检测、变化检测等领域。 -* **高性能**:支持多进程异步I/O、多卡并行训练、评估等加速策略,结合飞桨核心框架的显存优化功能,可大幅度减少分割模型的训练开销,让开发者更低成本、更高效地完成图像遥感图像的开发和训练。 +* **面向遥感影像大幅面性质的针对性优化**:支持大幅面影像滑窗推理,使用内存延迟载入技术提升性能;支持对大幅面影像地理坐标信息的读写。 + +* **顾及遥感特性与地学知识的数据预处理**:针对遥感数据特点,提供对包含任意数量波段的数据以及多时相数据的预处理功能,支持影像配准、辐射校正、波段选择等遥感专有数据预处理方法。 + +* **对遥感专有任务的支持**:支持包括变化检测在内的遥感领域特色任务,提供完善的训练、部署教程以及丰富的实践案例。 + +* **工业级训练与部署性能**:支持多进程异步I/O、多卡并行训练等加速策略,结合飞桨核心框架的显存优化功能,可大幅度减少模型的训练开销,帮助开发者以更低成本、更高效地完成遥感的开发和训练。 ## 产品矩阵 @@ -71,7 +77,7 @@ PaddleRS是遥感科研院所、相关高校共同基于飞桨开发的遥感处
  • Faster R-CNN
  • YOLOv3
  • - 超分/去噪
    + 图像复原
    数据预处理
    @@ -150,31 +156,28 @@ PaddleRS是遥感科研院所、相关高校共同基于飞桨开发的遥感处 - ### 代码结构 -这部分将展示PaddleRS的文件结构全貌。文件树如下: +PaddleRS目录树中关键部分如下: ``` -├── deploy # 部署相关的文档和脚本 -├── docs # 整个项目文档及图片 +├── deploy # 部署相关文档与脚本 +├── docs # 项目文档 ├── paddlers -│ ├── rs_models # 遥感专用网络模型代码 -│ ├── datasets # 数据加载相关代码 -│ ├── models # 套件网络模型代码 -│ ├── tasks # 相关任务代码 -│ ├── tools # 相关脚本 -│ ├── transforms # 数据处理及增强相关代码 -│ └── utils # 各种实用程序文件 -├── tools # 用于处理遥感数据的脚本 +│ ├── rs_models # 遥感专用模型实现 +│ ├── datasets # 数据集接口实现 +│ ├── models # 视觉模型实现 +│ ├── tasks # 训练器实现 +│ └── transforms # 数据预处理/数据增强实现 +├── tools # 遥感影像处理工具集 └── tutorials - └── train # 训练教程 + └── train # 模型训练教程 ``` ## 技术交流 -* 如果你发现任何PaddleRS存在的问题或者是建议, 欢迎通过[GitHub Issues](https://github.com/PaddlePaddle/PaddleRS/issues)给我们提issues。 -* 欢迎加入PaddleRS 微信群 +* 如果您发现任何PaddleRS存在的问题或是对PaddleRS有建议, 欢迎通过[GitHub Issues](https://github.com/PaddlePaddle/PaddleRS/issues)向我们提出。 +* 欢迎加入PaddleRS微信群
    @@ -183,38 +186,39 @@ PaddleRS是遥感科研院所、相关高校共同基于飞桨开发的遥感处 * [快速上手PaddleRS](./tutorials/train/README.md) * 准备数据集 - * [遥感数据介绍](./docs/data/rs_data_cn.md) - * [遥感数据集](./docs/data/dataset_cn.md) - * [智能标注工具EISeg](https://github.com/PaddlePaddle/PaddleSeg/tree/release/2.4/EISeg) - * [遥感数据处理脚本](./docs/data/tools.md) + * [遥感数据介绍](./docs/data/rs_data.md) + * [遥感数据集整理](./docs/data/dataset.md) + * [智能标注工具EISeg](https://github.com/PaddlePaddle/PaddleSeg/tree/release/2.4/EISeg) + * [遥感影像处理工具集](./docs/data/tools.md) +* 组件介绍 + * [数据预处理/数据增强](./docs/intro/transforms.md) + * [模型库](./docs/intro/model_zoo.md) * 模型训练 - * [数据增强](./docs/apis/transforms.md) - * [模型库](./docs/apis/model_zoo.md) - * [模型训练说明](./docs/apis/model_zoo.md) - * 模型验证 -* 推理部署 - * 模型导出 - * 推理预测 -* 应用案例 - * [变化检测示例](./docs/cases/csc_cd_cn.md) - * [超分模块示例](./docs/cases/sr_seg_cn.md) + * [模型训练API说明](./docs/apis/train.md) +* 模型部署 + * [模型导出](./deploy/export/README.md) + * [模型推理API说明](./docs/apis/infer.md) +* 实践案例 + * [遥感影像变化检测案例](./docs/cases/csc_cd_cn.md) + * [遥感影像超分辨率重建案例](./docs/cases/sr_seg_cn.md) * 代码贡献 - * [PaddleRS代码注释规范](https://github.com/PaddlePaddle/PaddleRS/wiki/PaddleRS代码注释规范) - + * [贡献指南](./docs/CONTRIBUTING.md) + * [开发指南](./docs/dev/dev_guide.md) + * [代码注释规范](./docs/dev/docstring.md) ## 开源贡献 * 非常感谢国家对地观测科学数据中心、中国科学院空天信息创新研究院、北京航空航天大学、武汉大学、中国石油大学(华东)、中国地质大学、中国四维、航天宏图、中科星图、超图等单位对PaddleRS项目的贡献。注:排名不分先后。 -* 非常感谢[geoyee](https://github.com/geoyee)(陈奕州), [Bobholamovic](https://github.com/Bobholamovic)(林漫晖), [kongdebug](https://github.com/kongdebug)(孔远杭), [huilin16](https://github.com/huilin16)(赵慧琳)等开发者对PaddleRS项目的贡献。 -* PaddleRS欢迎来自开源社区的贡献。如果您想要为PaddleRS贡献源码/案例,请参考[贡献指南](docs/CONTRIBUTING.md)。 +* 非常感谢[geoyee](https://github.com/geoyee)(陈奕州), [kongdebug](https://github.com/kongdebug)(孔远杭), [huilin16](https://github.com/huilin16)(赵慧琳)等开发者对PaddleRS项目的贡献。 +* PaddleRS欢迎来自开源社区的贡献。如果您想要为PaddleRS贡献源码/案例,请参考[贡献指南](./docs/CONTRIBUTING.md)。 ## 许可证书 -本项目的发布受Apache 2.0 license许可认证。 +本项目的发布受[Apache 2.0 license](./LICENSE)许可认证。 ## 学术引用 -如果我们的项目在学术上帮助到你,请考虑以下引用: +如果我们的项目在学术上帮助到您,请考虑以下引用: ```latex @misc{paddlers2022, diff --git a/deploy/export/README.md b/deploy/export/README.md index d3e2eb7..04630d9 100644 --- a/deploy/export/README.md +++ b/deploy/export/README.md @@ -2,10 +2,10 @@ ## 目录 -* [模型格式说明](#1) - * [训练模型格式](#11) - * [部署模型格式](#12) -* [部署模型导出](#2) +- [模型格式说明](#1) + - [训练模型格式](#11) + - [部署模型格式](#12) +- [部署模型导出](#2) ##

    模型格式说明

    @@ -23,6 +23,7 @@ ###

    部署模型格式

    在服务端部署模型时,需要将训练过程中保存的模型导出为专用的格式。具体而言,在部署阶段,使用下述五个文件描述训练好的模型: + - `model.pdmodel`,记录模型的网络结构; - `model.pdiparams`,包含模型权重参数; - `model.pdiparams.info`,包含模型权重名称; @@ -33,7 +34,7 @@ 使用如下指令导出部署格式的模型: -```commandline +```shell python deploy/export/export_model.py --model_dir=./output/deeplabv3p/best_model/ --save_dir=./inference_model/ ``` @@ -51,11 +52,12 @@ python deploy/export/export_model.py --model_dir=./output/deeplabv3p/best_model/ 完整命令示例: -```commandline +```shell python deploy/export_model.py --model_dir=./output/deeplabv3p/best_model/ --save_dir=./inference_model/ --fixed_input_shape=[224,224] ``` 对于`--fixed_input_shape`选项,**请注意**: + - 在推理阶段若需固定分类模型的输入形状,请保持其与训练阶段的输入形状一致。 - 对于检测模型中的YOLO/PPYOLO系列模型,请保证输入影像的`w`和`h`有相同取值、且均为32的倍数;指定`--fixed_input_shape`时,R-CNN模型的`w`和`h`也均需为32的倍数。 - 指定`[w,h]`时,请使用半角逗号(`,`)分隔`w`和`h`,二者之间不允许存在空格等其它字符。 diff --git a/docs/README.md b/docs/README.md index 835a89a..7267d44 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1 @@ -# 开发规范 -请注意,paddlers/models/ppxxx系列除了修改import路径和支持多通道模型外,不要增删改任何代码。 -新增的模型需放在paddlers/models/下的seg、det、clas、cd目录下。 +# PaddleRS文档 diff --git a/docs/apis/infer.md b/docs/apis/infer.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/apis/model_zoo.md b/docs/apis/model_zoo.md deleted file mode 100644 index 18701fe..0000000 --- a/docs/apis/model_zoo.md +++ /dev/null @@ -1,33 +0,0 @@ -# 模型库 - -PaddleRS的基础模型库来自[PaddleClas](https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/algorithm_introduction/ImageNet_models.md)、[PaddleSeg](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.4/docs/model_zoo_overview_cn.md)、[PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.3/README_cn.md#模型库)以及[PaddleGAN](https://github.com/PaddlePaddle/PaddleGAN/blob/develop/README_cn.md#模型库),可以通过相关的链接进行查看。而在此之外,PaddleRS也针对遥感任务添加了一些特有的模型库,可用于遥感图像语义分割、遥感变化检测等。 - -## 遥感专用模型库 - -| 模型名称 | 用途 | -| --------------- | -------- | -| FarSeg | 语义分割 | -| BIT | 变化检测 | -| CDNet | 变化检测 | -| DSIFN | 变化检测 | -| STANet | 变化检测 | -| SNUNet | 变化检测 | -| DSAMNet | 变化检测 | -| FCEarlyFusion | 变化检测 | -| FCSiamConc | 变化检测 | -| FCSiamDiff | 变化检测 | - - -## 如何导入 - -模型均位于`paddlers/models`和`paddlers/rs_models`中,对于套件中的模型可以通过如下方法进行使用 - -```python -from paddlers.models import xxxx -``` - -而PaddleRS所特有的模型可以通过如下方法调用 - -```python -from paddlers.rs_models import xxxx -``` diff --git a/docs/apis/train.md b/docs/apis/train.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/apis/transforms.md b/docs/apis/transforms.md deleted file mode 100644 index f43b3e0..0000000 --- a/docs/apis/transforms.md +++ /dev/null @@ -1,53 +0,0 @@ -# 数据增强 - -PaddleRS将多种任务需要的数据增强进行了有机整合,均通过`Compose`进行使用,数据读取方面通过`DecodeImg`可以对不只三通道RGB图像进行读取,还可以对SAR以及多通道图像进行读取,提供有转为`uint8`的选项。此外提供以下数据增强的方法。 - -| 数据增强名称 | 用途 | 任务 | ... | -| -------------------- | ----------------------------------------------- | -------- | ---- | -| Resize | 调整输入大小 | 所有 | ... | -| RandomResize | 随机调整输入大小 | 所有 | ... | -| ResizeByShort | 调整输入大小,保持纵横比不变 | 所有 | ... | -| RandomResizeByShort | 随机调整输入大小,保持纵横比不变 | 所有 | ... | -| ResizeByLong | 调整输入大小,保持纵横比不变 | 所有 | ... | -| RandomHorizontalFlip | 随机水平翻转输入 | 所有 | ... | -| RandomVerticalFlip | 随机竖直翻转输入 | 所有 | ... | -| Normalize | 对输入中的图像应用最小-最大标准化 | 所有 | ... | -| CenterCrop | 对输入进行中心裁剪 | 所有 | ... | -| RandomCrop | 对输入进行随机中心裁剪 | 所有 | ... | -| RandomScaleAspect | 裁剪输入并重新调整大小至原始大小 | 所有 | ... | -| RandomExpand | 通过根据随机偏移填充来随机扩展输入 | 所有 | ... | -| Pad | 将输入填充到指定的大小 | 所有 | ... | -| MixupImage | 将两张图片和它们的`gt_bbbox/gt_score`混合在一起 | 目标检测 | ... | -| RandomDistort | 对输入进行随机色彩变换 | 所有 | ... | -| RandomBlur | 对输入进行随机模糊 | 所有 | ... | -| Dehaze | 对输入图像进行去雾 | 所有 | ... | -| ReduceDim | 对输入图像进行降维 | 所有 | ... | -| SelectBand | 选择输入图像的波段 | 所有 | ... | -| RandomSwap | 随机交换两个输入图像 | 变化检测 | ... | -| ... | ... | | ... | - -## 如何使用 - -以变化检测任务为例,其余任务的使用方法与此类似。 - -```python -import paddlers.transforms as T -from paddlers.datasets import CDDataset - - -train_transforms = T.Compose([ - T.DecodeImg(), - T.Resize(target_size=512), - T.RandomHorizontalFlip(), - T.Normalize( - mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]), - T.ArrangeChangeDetector('train') -]) - -train_dataset = CDDataset( - data_dir='xxx/xxx', - file_list='xxx/train_list.txt', - label_list='xxx/labels.txt', - transforms=train_transforms, - shuffle=True) -``` diff --git a/docs/cases/csc_cd_cn.md b/docs/cases/csc_cd_cn.md index 169fb10..b6f0678 100644 --- a/docs/cases/csc_cd_cn.md +++ b/docs/cases/csc_cd_cn.md @@ -588,5 +588,5 @@ Image.frombytes('RGB', fig.canvas.get_width_height(), fig.canvas.tostring_rgb()) ## 参考资料 -- [遥感数据介绍](https://github.com/PaddlePaddle/PaddleRS/blob/develop/docs/data/rs_data_cn.md) +- [遥感数据介绍](https://github.com/PaddlePaddle/PaddleRS/blob/develop/docs/data/rs_data.md) - [PaddleRS文档](https://github.com/PaddlePaddle/PaddleRS/blob/develop/tutorials/train/README.md) diff --git a/docs/data/coco_tools_cn.md b/docs/data/coco_tools.md similarity index 100% rename from docs/data/coco_tools_cn.md rename to docs/data/coco_tools.md diff --git a/docs/data/dataset.md b/docs/data/dataset.md new file mode 100644 index 0000000..0f8dc4c --- /dev/null +++ b/docs/data/dataset.md @@ -0,0 +1,19 @@ +# 遥感开源数据集 + +PaddleRS搜集汇总了遥感领域常用的**开源**深度学习数据集,提供每个数据集的以下信息:数据集说明,影像信息,标注信息,源地址,AI Studio备份链接。这些数据集按任务类型可分为**图像分类、图像分割、变化检测、目标检测、目标跟踪、多标签分类、图像生成**等多种类型。目前已收录的遥感数据集有: + +* 图像分类数据集32个; +* 目标检测数据集40个; +* 图像分割数据集70个; +* 变化检测数据集28个; +* 实例分割数据集7个; +* 多标签分类数据集3个; +* 目标跟踪数据集9个; +* 图像标题数据集3个; +* 图像生成数据集8个。 + +欢迎访问[遥感数据集汇总](./dataset_summary.md),以获取详细信息。 + +## 特别贡献数据集 + +* 2020年中国典型城市道路样本数据CHN6-CUG,由中国地质大学[朱祺琪](http://grzy.cug.edu.cn/zhuqiqi)教授提供。相关介绍和下载方式请参考[此处](http://grzy.cug.edu.cn/zhuqiqi/zh_CN/yjgk/32368/content/1733.htm)。 diff --git a/docs/data/dataset_cn.md b/docs/data/dataset_cn.md deleted file mode 100644 index 7242473..0000000 --- a/docs/data/dataset_cn.md +++ /dev/null @@ -1,20 +0,0 @@ -## 公开数据集 - -PaddleRS搜集汇总了 遥感影像领域 常用的 **开源**深度学习数据集,每个数据集信息包括:数据集说明,影像信息,标注信息,源地址,aistudio备份链接。这些数据集按任务类型可分为 **图像分类、图像分割、变化检测、目标检测、目标跟踪、多标签分类、图像生成** 等多种类型,目前已收录的遥感数据集: - -* 图像分类数据集32个; -* 目标检测数据集40个; -* 图像分割数据集70个; -* 变化检测数据集28个; -* 实例分割数据集7个; -* 多标签分类数据集3个; -* 目标跟踪数据集9个; -* 图像标题数据集3个; -* 图像生成数据集8个 - - -欢迎访问[遥感数据集汇总](./dataset_summary.md),获取详细数据集内容。 - -## 特别贡献数据集 - -* 2020年中国典型城市道路样本数据CHN6-CUG,由中国地质大学[朱祺琪](http://grzy.cug.edu.cn/zhuqiqi)教授提供,相关介绍和下载方式请参考[该地址](http://grzy.cug.edu.cn/zhuqiqi/zh_CN/yjgk/32368/content/1733.htm)。 diff --git a/docs/data/rs_data.md b/docs/data/rs_data.md new file mode 100644 index 0000000..33496d4 --- /dev/null +++ b/docs/data/rs_data.md @@ -0,0 +1,80 @@ +# 遥感数据介绍 + +广义上,遥感指的是"遥远的感知",即在不直接接触的情况下,对目标或自然现象进行远距离探测和感知。狭义上的遥感一般指电磁波遥感技术,即在某种平台(如飞机或卫星)上利用传感器探测电磁波的反射特性、并从中提取信息的过程。这个过程获取的影像数据被称作遥感数据,一般包括卫星和航空影像。遥感数据的用途广泛,在诸如空间分析等GIS任务中、或是包括场景分类、影像分割与目标检测在内的计算机视觉(Computer Vision, CV)领域都可以见到它们的身影。 + +相比航空影像,卫星影像的覆盖面积更广,因此得到了更加长足的应用。常见的卫星影像可能由商业卫星摄制,也可能来自NASA、ESA等机构的开放数据库。 + +## 遥感影像的分类 + +遥感影像具有覆盖面积广、波段数多、来源多样等特点。根据存储方式,可将遥感影像分为栅格数据和矢量数据两种类型;根据波段数,又可分为多光谱影像、高光谱影像等类型。本文档旨在为不具备遥感专业背景的开发者提供快速了解的途径,因此仅介绍几种常见的遥感影像类型。 + +### 栅格数据 + +栅格是一种基于像素的数据格式,可以有效地表示连续表面。栅格中的信息存储在网格结构中,每个信息单元或像素具有相同的大小和形状,但值不同。数码照片、正射影像和卫星影像都可以这种格式存储。 + +栅格格式非常适合用于查看空间和时间变化的分析,因为每个数据值都有一个基于网格的可访问位置。这使我们能够访问两个或多个不同栅格中的相同地理位置并比较它们的值。 + +当地球观测卫星拍摄照片时,传感器会读取并记录从沿电磁光谱的波长收集的反射率值,并利用反射率计算各个栅格像元的DN值(Digital Number),即遥感影像像元的亮度值,从而记录地物的灰度值。 + +通过DN值,可以反求地物的辐照率和反射率。它们之间的关系如以下公式所示,其中$gain$和$bias$分别指传感器的增益和偏移;$L$是辐射率,也称为辐射亮度值;$\rho$是地物反射率;$d_{s}$、$E_{0}$和$\theta$分别表示日地天文单位距离、太阳辐照度以及太阳天顶角。 + +$$ +L = gain * DN + bias \\ +\rho = \pi Ld^{2}_{s}/(E_{0}\cos{\theta}) +$$ + +电磁波谱是人类根据电磁波的波长或频率、波数、能量等的大小顺序进行排列的成果。在电磁波谱中人眼只能感受到一个很小的波段范围,这个范围被称为可见光,波长范围在0.38-0.76μm。这是因为我们的视觉进化为在太阳发出最多光的地方最敏感,并且广泛地局限于构成我们所谓的红色、绿色和蓝色的波长。但卫星传感器可以感知范围更广的电磁频谱,这使得我们能够与借助传感器感知更多的频谱范围。 + +![band](../images/band.jpg) + +电磁波谱范围很广,使用一个传感器同时收集所有波长的信息是不切实际的。在实际中,不同的传感器优先考虑从不同波长的光谱收集信息。由传感器捕获和分类的频谱的每个部分都被归类为一个信息带。信息带的大小各不相同,可以编译成不同类型的合成影像,每幅合成影像都强调不同的物理特性。同时,大多数遥感影像都为16位的图像,与传统的8位图像不同,它能表示更精细的光谱信息。 + +#### RGB影像 + +RGB影像与生活中常见的自然图像类似,其中显示的地物特征也符合人类的视觉常识(如树是绿色的、水泥是灰色的等),三个通道分别表示红、绿和蓝。下图展示了一幅RGB遥感影像: + +![rgb](../images/rgb.jpg) + +由于当前大多数CV任务的处理流程都是基于自然图像设计的,因此RGB类型的遥感数据集在CV领域使用较多。 + +#### MSI/HSI影像 + +MSI(Multispectral Image,多光谱影像)和HSI(Hyperspectral Image,高光谱影像)通常包括数个到数百个不等的波段,二者以不同的光谱分辨率(*光谱分辨率是指传感器所能记录的电磁波谱中某一特定的波长范围值,波长范围值越宽,则光谱分辨率越低*)进行区分。通常光谱分辨率在波长的1/10数量级范围内称为多光谱。MSI的波段数相对HSI较少,谱带较宽,空间分辨率较高;而HSI的波段数较多,谱带较窄,光谱分辨率较高。 + +在实际中常常根据应用需求选取MSI/HSI的一些特定波段:例如中红外波段的透射率在60%-70%,包含地物反射及发射光谱,可以用来探测火灾等高温目标;红边波段(*绿色植物在0.67-0.76μm之间反射率增高最快的点,也是一阶导数光谱在该区间内的拐点*)是指示绿色植物生长状况的敏感性波段,可以有效地监测植被的生长状况,用于研究植物养分、健康状态监测、植被识别和生理生化参数等信息等。 + +下面以天宫一号高光谱成像仪拍摄的北京大兴机场为例,简单介绍一下MSI/HSI处理中常见的波段组合、光谱曲线和波段选择的概念。天宫一号高光谱数据集根据波段信噪比和信息熵评价结果剔除信噪比和信息熵较低的波段,并结合影像实际目视结果剔除部分波段,共保留可见近红外谱段54个、短波红外谱段52个以及全色谱段数据。 + +**波段组合** + +波段组合是指在MSI/HSI中选择三个波段数据进行组合、代替RGB三个通道所得到的结果,称为彩色图(*使用真实的RGB三波段合成的结果称为真彩色图,否则称为假彩色图*)。不同波段的组合能够突出不同的地物特征,下图展示了几种不同组合的目视效果: + +![图片3](../images/band_combination.jpg) + +**光谱曲线解读** + +光谱信息往往能够反映地物特征,不同的波段反映的地物特征也不尽相同。以电磁波的波长或频率为横轴,反射率为纵轴,可以绘制光谱曲线。以植被的光谱曲线为例,如下图所示,植被在0.8μm波段反射率大于40%,相比在0.6μm波段10%左右的反射率明显更大,因此在成像时反射回更多的辐射能量。体现在图中,植被部分在0.8μm的影像中看起来更加明亮。 + +![band_mean](../images/band_mean.jpg) + +**波段选择** + +MSI/HSI包含的波段数量可能较多。一方面,并不是所有波段都适用于待处理的任务;另一方面,过多的波段数可能带来沉重的资源负担。在实际应用中,可以根据需求选用MSI/HSI的部分波段完成任务,也可以使用如PCA、小波变换等方法对MSI/HSI进行降维处理,以减少冗余,节省计算资源。 + +#### SAR影像 + +SAR(Synthetic Aperture Radar)指的是主动式侧视雷达系统。SAR的成像几何属于斜距投影类型,因此SAR影像与光学影像在成像机理、几何特征、辐射特征等方面都有较大的区别。 + +光学影像中不同波段的信息来自于不同波长电磁波的反射能量,而SAR影像则以二进制复数形式记录了不同极化(*即电磁波发射和接收的振动方向*)的回波信息。基于记录的复数数据,可将原始的SAR影像通过变换提取相应的振幅和相位信息。人类无法直接分辨相位信息,但可以直观地感知振幅信息,利用振幅信息可以得到强度图像,如下图所示: + +![sar](../images/sar.jpg) + +由于SAR影像的特殊成像机理,其分辨率相对较低,信噪比也较低,所以SAR影像中所包含的振幅信息远达不到光学影像的成像水平。这也是为什么SAR影像在CV领域中的应用较少。目前,SAR影像被主要用于基于相位信息的沉降检测反演、三维重建等。值得一提的是,由于SAR的波长较长,具有一定的云层和地表穿透能力,因此在部分应用场景中有其独特的优势。 + +#### RGBD影像 + +RGBD影像与RGB影像的区别在于多了一个D通道,即深度(depth)。深度影像类似于灰度图像,只是其中的每个像素值代表的是传感器距离物体的实际距离。通常RGBD影像中的RGB数据和深度数据是相互配准的。如下图所示为无人机航摄的RGBD影像,其中可以看出建筑物与地面之间的相对高度。 + +![rgbd](../images/rgbd.jpg) + +深度影像提供了RGB影像所不具有的高度信息,能够在某些下游任务中对一些光谱特征相似的地物起到一定的区分作用。 diff --git a/docs/data/rs_data_cn.md b/docs/data/rs_data_cn.md deleted file mode 100644 index 6e4e66c..0000000 --- a/docs/data/rs_data_cn.md +++ /dev/null @@ -1,80 +0,0 @@ -# 遥感数据介绍 - -广义上,遥感是指遥远的感知,是指在不直接接触的情况下,对目标或自然现象远距离探测和感知的一种技术。一般我们所说的遥感为电磁波遥感,即在某平台上利用传感器探测电磁波反射或发射,并从中提取信息的过程。这个过程获取的图像数据一般即为卫星和航空影像。遥感数据可以被用于各种应用程序中,为空间分析等提供数据源,也可以在包括场景分类、图像分割与检测等CV领域进行判别或提取。 - -目前常用的遥感影像来自各种商业卫星影像提供商如Google等,以及来自NASA、ESA等的开放数据。可以从它们的官网中找到更多信息。 - -## 图像的工作原理 - -卫星和航空图像来自各种来源的栅格数据,经过接收方的部分处理后进行发布,如几何校正、辐射校正、大气校正或者色彩校正等,使其可以进行较准确的定量分析或具有更加逼真的视觉效果。 - -### 栅格数据 - -所有卫星和航空图像都以光栅格式存储。栅格是一种基于像素的数据格式,可以有效地表示连续表面。栅格中的信息存储在网格结构中,每个信息单元或像素具有相同的大小和形状,但值不同。数码照片、正射影像和卫星图像都以这种格式存储。 - -栅格格式非常适合用于查看空间和时间变化的分析,因为每个数据值都有一个基于网格的可访问位置。这使我们能够访问两个或多个不同栅格中的相同地理位置并比较它们的值。 - -### 卫星栅格 - -当地球观测卫星拍摄照片时,传感器会读取并记录从沿电磁光谱的波长收集的反射率值,并利用反射率计算各个栅格像元的DN值(Digital Number),即遥感影像像元的亮度值,记录的地物的灰度值。 - -而利用遥感图像的目的之一就是使用DN值可以反算地物的辐照率和反射率。它们之间的关系如下公式所示,其中$gain$和$bias$分别指传感器的增益和偏移;$L$是辐射率,也称为辐射亮度值;$\rho$是地物反射率;$d_{s}$、$E_{0}$和$\theta$分别表示日地天文单位距离、太阳辐照度以及太阳天顶角。 - -$$ -L = gain * DN + bias \\ -\rho = \pi Ld^{2}_{s}/(E_{0}\cos{\theta}) -$$ - -电磁波谱是人类根据电磁波的波长或频率、波数、能量等的大小顺序进行排列的成果。在电磁波谱中人眼只能感受到一个很小的波段范围,这个范围被称为可见光,波长范围在0.38-0.76μm。这是因为我们的视觉进化为在太阳发出最多光的地方最敏感,并且广泛地局限于构成我们所谓的红色、绿色和蓝色的波长。但卫星传感器可以感知范围更广的电磁频谱,这使得我们能够与借助传感器感知更多的频谱范围。 - -![band](../images/band.jpg) - -电磁波谱范围很广,传感器同时收集所有波长的信息是不切实际的。相反,不同的传感器优先考虑从不同波长的光谱收集信息。由传感器捕获和分类的频谱的每个部分都被归类为一个信息带。信息带的大小各不相同,可以编译成不同类型的合成图像,每个图像都强调不同的物理特性。同时,大多数遥感图像都为16位的图像,与传统的8位图像不同,它能表示更精细的光谱信息。 - -#### RGB - -RGB图像与我们常见的自然图像类似,也符合人类的视觉常识(如树是绿色的、水泥是灰色的等),三个通道分别表示红、绿和蓝。一般的RGB数据来自于无人机影像、各种电子地图下载器等,如下图所示。 - -![rgb](../images/rgb.jpg) - -由于当前大多数CV任务的流程都是基于自然图像进行设计的,因此RGB类型的遥感数据集依然是使用较多的。 - -#### MSI/HSI - -MSI(*Multispectral Image,多光谱图像*)和HSI(*Hyperspectral Image,高光谱图像*)均是一种波段数均大于3的遥感影像,其波段由几个到几百个不等,以不同的光谱分辨率(*光谱分辨率是指传感器所能记录的电磁波谱中,某一特定的波长范围值,波长范围值越宽,光谱分辨率越低*)进行区分。通常光谱分辨率在波长的1/10数量级范围内称为多光谱。其中多光谱影像的波段较少,谱带较宽,空间分辨率较高;而高光谱影像的波段较多,谱带较窄,光谱分辨率较高。 - -在使用中,MSI/HSI有一些常用波段具有不同的作用,例如中红外波段的透射率在60%-70%,包含地物反射及发射光谱,可以用来探测火灾等高温目标;红边波段(*绿色植物在0.67-0.76μm之间反射率增高最快的点,也是一阶导数光谱在该区间内的拐点*)是指示绿色植物生长状况的敏感性波段,可以有效地监测植被的生长状况,用于研究植物养分、健康状态监测、植被识别和生理生化参数等信息等。 - -下面以天宫一号高光谱成像仪拍摄的北京大兴机场为例,简单介绍一下波段组合和光谱曲线。天宫一号高光谱数据集根据波段信噪比和信息熵评价结果,剔除信噪比和信息熵较低的波段,结合图像实际目视结果,剔除了部分波段,共有可见近红外谱段54 个;短波红外谱段 52 个以及1个全色谱段数据。 - -##### 波段组合 - -波段组合是指在MSI/HSI中选择三个波段数据进行组合,代替RGB三个通道所得到的结果,称为彩色图(*RGB三波段的合成图称为真彩色图,任意非RGB波段的合成图称为假彩色图*)。不同彩色图的组合能够突出不同的地物特征,下图展示了不同的几种组合的效果。 - -![图片3](../images/band_combination.jpg) - -##### 光谱曲线解读 - -不同的光谱能够突出不同的地物特征,以植物的光谱曲线为例,如下图所示,植被在0.8μm波段,反射率大于40%,相比在0.6μm波段10%左右的反射率明显更大,因此在成像时反射回更多的辐射能量。所以成像时0.8μm波段的植被亮度大于0.6μm波段的植被亮度,也就是图上看起来就更明亮了。 - -![band_mean](../images/band_mean.jpg) - -了解MSI/HSI的波段后,可以根据资源使用不同数量和不同组合方式的使用MSI/HSI完成各类任务,也可以使用如PCA、小波变换等方法对MSI/HSI进行降维处理,以减少冗余,使用更少的计算资源完成任务。 - -#### SAR - -SAR(Synthetic Aperture Radar)是主动式侧视雷达系统,且成像几何属于斜距投影类型。因此SAR图像与光学图像在成像机理、几何特征、辐射特征等方面都有较大的区别。 - -与光学图像不同,光学图像不同波段的信息来自不不同波长的电磁波反射,以便于识别目标和分类提取;SAR图像则记录了不同极化(*即电磁波发射和接收的振动方向*)的回波信息,以二进制复数形式记录下来,并且基于每个像素的复数数据可变换提取相应的振幅和相位信息。相位信息人类无法直接分辨,但振幅信息可以,利用振幅信息可以得到强度图像如下图所示。 - -![sar](../images/sar.jpg) - -由于SAR图像的成像机理的不同,SAR影像分辨率相对较低、信噪比较低,所以SAR影像中所包含的振幅信息远达不到同光学影像的成像水平,因此在CV领域使用较少。而其的主要作用在于基于相位信息可以进行沉降检测反演、三维重建等,同时SAR卫星波长较长,具有一定的云层和地表穿透能力,有其独特的使用优势。 - -#### RGBD - -RGBD与RGB图像的区别在于多了一个D通道,即深度。深度图像类似于灰度图像,只是它的每个像素值是传感器距离物体的实际距离。通常RGB图像和深度图像是配准的,因而两幅图像对应于同一空间位置的点是一一对应的。如下图所示为部分无人机航摄的RGBD图像,其中可以看出建筑物与地面之间的相对高度。 - -![rgbd](../images/rgbd.jpg) - -深度图像提供了RGB图像所不具有的高度信息,能够在下游任务中对一些光谱特征相似的地物起到一定的区分作用。 diff --git a/docs/data/tools.md b/docs/data/tools.md index 8d4793f..fac56f9 100644 --- a/docs/data/tools.md +++ b/docs/data/tools.md @@ -1,102 +1,85 @@ -# 工具箱 +# 遥感影像处理工具集 -工具箱位于`tools`文件夹下,目前有如下工具: +PaddleRS在`tools`目录中提供了丰富的遥感影像处理工具,包括: -- `coco2mask`:用于将geojson格式的分割标注标签转换为png格式。 -- `mask2shp`:用于对推理得到的png提取shapefile。 -- `mask2geojson`:用于对推理得到的png提取geojson。 -- `geojson2mask`:用于从geojson和原图中提取mask作为训练标签。 -- `matcher`:用于在推理前匹配两个时段的影响。 -- `spliter`:用于将大图数据进行分割以作为训练数据。 -- `coco_tools`:用于统计处理coco类标注文件。 +- `coco2mask.py`:用于将COCO格式的标注文件转换为png格式。 +- `mask2shape.py`:用于将模型推理输出的.png格式栅格标签转换为矢量格式。 +- `mask2geojson.py`:用于将模型推理输出的.png格式栅格标签转换为GeoJSON格式。 +- `match.py`:用于实现两幅影像的配准。 +- `split.py`:用于对大幅面影像数据进行切片。 +- `coco_tools/`:COCO工具合集,用于统计处理COCO格式标注文件。 -后期将根据DL和RS/GIS方面的前后处理需求增加更多的工具。 +## 使用示例 -## 如何使用 - -首先需要`clone`此repo并进入到`tools`的文件夹中: +首先请确保您已将PaddleRS下载到本地。进入`tools`目录: ```shell -git clone https://github.com/PaddlePaddle/PaddleRS.git -cd PaddleRS\tools +cd tools ``` ### coco2mask -`coco2mask`的主要功能是将图像以及对应json格式的分割标签转换为图像与png格式的标签,结果会分别存放在`img`和`gt`两个文件夹中。相关的数据样例可以参考[中国典型城市建筑物实例数据集](https://www.scidb.cn/detail?dataSetId=806674532768153600&dataSetType=journal)。保存结果为单通道的伪彩色图像。使用代码如下: +`coco2mask.py`的主要功能是将图像以及对应的COCO格式的分割标签转换为图像与.png格式的标签,结果会分别存放在`img`和`gt`两个目录中。相关的数据样例可以参考[中国典型城市建筑物实例数据集](https://www.scidb.cn/detail?dataSetId=806674532768153600&dataSetType=journal)。对于mask,保存结果为单通道的伪彩色图像。使用方式如下: ```shell -python coco2mask.py --raw_folder xxx --save_folder xxx +python coco2mask.py --raw_dir {输入目录路径} --save_dir {输出目录路径} ``` 其中: -- `raw_folder`:存放原始数据的文件夹,图像存放在`images`文件夹中,标签以`xxx.json`进行保存。 -- `save_folder`:保存结果文件的文件夹,其中图像保存在`img`中,png格式的标签保存在`gt`中。 +- `raw_dir`:存放原始数据的目录,其中图像存放在`images`子目录中,标签以`xxx.json`格式保存。 +- `save_dir`:保存输出结果的目录,其中图像保存在`img`子目录中,.png格式的标签保存在`gt`子目录中。 -### mask2shp +### mask2shape -`mask2shp`的主要功能是将推理得到的png格式的分割结果转换为shapefile格式,其中还可以设置不生成多边形的索引号。使用代码如下: +`mask2shape.py`的主要功能是将.png格式的分割结果转换为shapefile格式(矢量图)。使用方式如下: ```shell -python mask2shp.py --srcimg_path xxx.tif --mask_path xxx.png [--save_path output] [--ignore_index 255] +python mask2shape.py --srcimg_path {带有地理信息的原始影像路径} --mask_path {输入分割标签路径} [--save_path {输出矢量图路径}] [--ignore_index {需要忽略的索引值}] ``` 其中: -- `srcimg_path`:原始图像的路径,需要带有地理信息,以便为生成的shapefile提供crs等信息。 -- `mask_path`:推理得到的png格式的标签的路径。 +- `srcimg_path`:原始影像路径,需要带有地理坐标信息,以便为生成的shapefile提供crs等信息。 +- `mask_path`:模型推理得到的.png格式的分割结果。 - `save_path`:保存shapefile的路径,默认为`output`。 -- `ignore_index`:忽略生成shp的索引,如背景等,默认为255。 +- `ignore_index`:需要在shapefile中忽略的索引值(例如分割任务中的背景类),默认为255。 ### mask2geojson -`mask2geojson`的主要功能是将推理得到的png格式的分割结果转换为geojson格式。使用代码如下: - -```shell -python mask2geojson.py --mask_path xxx.tif --save_path xxx.json [--epsilon 0] -``` - -其中: - -- `mask_path`:推理得到的png格式的标签的路径。 -- `save_path`:保存geojson的路径。 -- `epsilon`:opencv的简化参数,默认为0。 - -### geojson2mask - -`geojson2mask`的主要功能是从原图和geojson文件中提取mask图像。使用代码如下: +`mask2geojson.py`的主要功能是将.png格式的分割结果转换为GeoJSON格式。使用方式如下: ```shell -python geojson2mask.py --image_path xxx.tif --geojson_path xxx.json +python mask2geojson.py --mask_path {输入分割标签路径} --save_path {输出路径} ``` 其中: -- `image_path`:原图像的路径。 -- `geojson_path`:geojson的路径。 +- `mask_path`:模型推理得到的.png格式的分割结果。 +- `save_path`:保存GeoJSON文件的路径。 -### matcher +### match -` matcher`的主要功能是在进行变化检测的推理前,匹配两期影像的位置,并将转换后的`im2`图像保存在原地址下,命名为`im2_M.tif`。使用代码如下: +`match.py`的主要功能是在对两个时相的遥感影像进行空间配准。使用方式如下: ```shell -python matcher.py --im1_path xxx.tif --im2_path xxx.xxx [--im1_bands 1 2 3] [--im2_bands 1 2 3] +python match.py --im1_path [时相1影像路径] --im2_path [时相2影像路径] --save_path [配准后时相2影像输出路径] [--im1_bands 1 2 3] [--im2_bands 1 2 3] ``` 其中: -- `im1_path`:时段一的图像路径,该图像需要存在地理信息,且以该图像为基准图像。 -- `im2_path`:时段二的图像路径,该图像可以为非遥感格式的图像,该图像为带匹配图像。 -- `im1_bands`:时段一图像所用于配准的波段,为RGB或单通道,默认为[1, 2, 3]。 -- `im2_bands`:时段二图像所用于配准的波段,为RGB或单通道,默认为[1, 2, 3]。 +- `im1_path`:时相1影像路径。该影像必须包含地理信息,且配准过程中以该影像为基准图像。 +- `im2_path`:时相2影像路径。该影像的地理信息将不被用到。配准过程中将该影像配准到时相1影像。 +- `im1_bands`:时相1影像用于配准的波段,指定为三通道(分别代表R、G、B)或单通道,默认为[1, 2, 3]。 +- `im2_bands`:时相2影像用于配准的波段,指定为三通道(分别代表R、G、B)或单通道,默认为[1, 2, 3]。 +- `save_path`: 配准后时相2影像输出路径。 -### spliter +### split -`spliter`的主要功能是在划分大的遥感图像为图像块,便于进行训练。使用代码如下: +`split.py`的主要功能是将大幅面遥感图像划分为图像块,这些图像块可以作为训练时的输入。使用方式如下: ```shell -python spliter.py --image_path xxx.tif [--mask_path None] [--block_size 512] [--save_folder output] +python split.py --image_path {输入影像路径} [--mask_path {真值标签路径}] [--block_size {图像块尺寸}] [--save_dir {输出目录}] ``` 其中: @@ -108,13 +91,13 @@ python spliter.py --image_path xxx.tif [--mask_path None] [--block_size 512] [-- ### coco_tools -目前coco_tools共有6个文件,各文件及其功能如下: +目前`coco_tools`目录中共包含6个工具,各工具功能如下: -* json_InfoShow: 打印json文件中各个字典的基本信息; -* json_ImgSta: 统计json文件中的图像信息,生成统计表、统计图; -* json_AnnoSta: 统计json文件中的标注信息,生成统计表、统计图; -* json_Img2Json: 统计test集图像,生成json文件; -* json_Split: json文件拆分,划分为train set、val set -* json_Merge: json文件合并,将多个json合并为1个json +- `json_InfoShow.py`: 打印json文件中各个字典的基本信息; +- `json_ImgSta.py`: 统计json文件中的图像信息,生成统计表、统计图; +- `json_AnnoSta.py`: 统计json文件中的标注信息,生成统计表、统计图; +- `json_Img2Json.py`: 统计test集图像,生成json文件; +- `json_Split.py`: 将json文件中的内容划分为train set和val set; +- `json_Merge.py`: 将多个json文件合并为1个。 -详细使用方法与参数见[coco_tools说明](coco_tools_cn.md) +详细使用方法请参见[coco_tools使用说明](coco_tools.md)。 diff --git a/docs/intro/model_zoo.md b/docs/intro/model_zoo.md new file mode 100644 index 0000000..75ff472 --- /dev/null +++ b/docs/intro/model_zoo.md @@ -0,0 +1,34 @@ +# 模型库 + +PaddleRS的基础模型库来自Paddle-CV系列套件:[PaddleClas](https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/algorithm_introduction/ImageNet_models.md)、[PaddleSeg](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.4/docs/model_zoo_overview_cn.md)、[PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.3/README_cn.md#模型库)以及[PaddleGAN](https://github.com/PaddlePaddle/PaddleGAN/blob/develop/README_cn.md#模型库)。除此之外,PaddleRS也包含一系列遥感特色模型,可用于遥感影像分割、变化检测等。 + +## PaddleRS支持的模型列表 + +PaddleRS支持的全部模型如下(标注\*的为遥感专用模型): + +| 任务 | 模型 | +|--------|---------| +| 变化检测 | \*BIT | +| 变化检测 | \*CDNet | +| 变化检测 | \*DSAMNet | +| 变化检测 | \*DSIFN | +| 变化检测 | \*SNUNet | +| 变化检测 | \*STANet | +| 变化检测 | \*FC-EF | +| 变化检测 | \*FC-Siam-conc | +| 变化检测 | \*FC-Siam-diff | +| 场景分类 | HRNet | +| 场景分类 | MobileNetV3 | +| 场景分类 | ResNet50-vd | +| 场景分类 | CondenseNetV2 | +| 图像复原 | DRN | +| 图像复原 | ESRGAN | +| 图像复原 | LESRCNN | +| 目标检测 | Faster R-CNN | +| 目标检测 | PP-YOLO | +| 目标检测 | PP-YOLO Tiny | +| 目标检测 | PP-YOLOv2 | +| 目标检测 | YOLOv3 | +| 图像分割 | DeepLab V3+ | +| 图像分割 | UNet | +| 图像分割 | \*FarSeg | diff --git a/docs/intro/transforms.md b/docs/intro/transforms.md new file mode 100644 index 0000000..4f08b2b --- /dev/null +++ b/docs/intro/transforms.md @@ -0,0 +1,27 @@ +# 数据预处理/数据增强 + +PaddleRS对不同遥感任务需要的数据预处理/数据增强策略进行了有机整合,设计统一的算子,并通过`paddlers.transforms.DecodeImg`对各种格式的遥感影像进行读取。PaddleRS提供的所有数据预处理/数据增强算子如下表: + +| 数据预处理/数据增强算子名 | 用途 | 任务 | ... | +| -------------------- | ------------------------------------------------- | -------- | ---- | +| Resize | 调整输入影像大小 | 所有任务 | ... | +| RandomResize | 随机调整输入影像大小 | 所有任务 | ... | +| ResizeByShort | 调整输入影像大小,保持纵横比不变(根据短边计算缩放系数) | 所有任务 | ... | +| RandomResizeByShort | 随机调整输入影像大小,保持纵横比不变(根据短边计算缩放系数) | 所有任务 | ... | +| ResizeByLong | 调整输入影像大小,保持纵横比不变(根据长边计算缩放系数) | 所有任务 | ... | +| RandomHorizontalFlip | 随机水平翻转输入影像 | 所有任务 | ... | +| RandomVerticalFlip | 随机竖直翻转输入影像 | 所有任务 | ... | +| Normalize | 对输入影像应用标准化 | 所有任务 | ... | +| CenterCrop | 对输入影像进行中心裁剪 | 所有任务 | ... | +| RandomCrop | 对输入影像进行随机中心裁剪 | 所有任务 | ... | +| RandomScaleAspect | 裁剪输入影像并重新缩放到原始尺寸 | 所有任务 | ... | +| RandomExpand | 根据随机偏移扩展输入影像 | 所有任务 | ... | +| Pad | 将输入影像填充到指定的大小 | 所有任务 | ... | +| MixupImage | 将两幅影像(及对应的目标检测标注)混合在一起作为新的样本 | 目标检测 | ... | +| RandomDistort | 对输入施加随机色彩变换 | 所有任务 | ... | +| RandomBlur | 对输入施加随机模糊 | 所有任务 | ... | +| Dehaze | 对输入图像进行去雾 | 所有任务 | ... | +| ReduceDim | 对输入图像进行波段降维 | 所有任务 | ... | +| SelectBand | 对输入影像进行波段选择 | 所有任务 | ... | +| RandomSwap | 随机交换两个时相的输入影像 | 变化检测 | ... | +| ... | ... | ... | ... | diff --git a/docs/quick_start.md b/docs/quick_start.md deleted file mode 100644 index 3be27ba..0000000 --- a/docs/quick_start.md +++ /dev/null @@ -1,42 +0,0 @@ - -## 环境准备 - -- [PaddlePaddle安装](https://www.paddlepaddle.org.cn/install/quick) -* 版本要求:PaddlePaddle>=2.1.0 - -- PaddleRS安装 - - -PaddleRS代码会跟随开发进度不断更新,可以安装develop分支的代码使用最新的功能,安装方式如下: - -``` -git clone https://github.com/PaddlePaddle/PaddleRS -cd PaddleRS -git checkout develop -pip install -r requirements.txt -python setup.py install -``` - -## 开始训练 -* 在安装PaddleRS后,使用如下命令开始训练,代码会自动下载训练数据, 并均使用单张GPU卡进行训练。 - -```commandline -export CUDA_VISIBLE_DEVICES=0 -python tutorials/train/semantic_segmentation/deeplabv3p_resnet50_multi_channel.py -``` - -* 若需使用多张GPU卡进行训练,例如使用2张卡时执行: - -```commandline -python -m paddle.distributed.launch --gpus 0,1 tutorials/train/semantic_segmentation/deeplabv3p_resnet50_multi_channel.py -``` -使用多卡时,参考[训练参数调整](../../docs/parameters.md)调整学习率和批量大小。 - - -## VisualDL可视化训练指标 -在模型训练过程,在`train`函数中,将`use_vdl`设为True,则训练过程会自动将训练日志以VisualDL的格式打点在`save_dir`(用户自己指定的路径)下的`vdl_log`目录,用户可以使用如下命令启动VisualDL服务,查看可视化指标 -```commandline -visualdl --logdir output/deeplabv3p_resnet50_multi_channel/vdl_log --port 8001 -``` - -服务启动后,使用浏览器打开 https://0.0.0.0:8001 或 https://localhost:8001 diff --git a/tools/raster2geotiff.py b/tools/mask2geojson.py similarity index 88% rename from tools/raster2geotiff.py rename to tools/mask2geojson.py index d7614c2..bc4da0b 100644 --- a/tools/raster2geotiff.py +++ b/tools/mask2geojson.py @@ -60,11 +60,11 @@ def convert_data(image_path, geojson_path): parser = argparse.ArgumentParser() -parser.add_argument("--raster_path", type=str, required=True, \ - help="Path of original raster image.") -parser.add_argument("--geotiff_path", type=str, required=True, \ - help="Path to store the geotiff file (the coordinate system is WGS84).") +parser.add_argument("--mask_path", type=str, required=True, \ + help="Path of mask data.") +parser.add_argument("--save_path", type=str, required=True, \ + help="Path to store the GeoJSON file (the coordinate system is WGS84).") if __name__ == "__main__": args = parser.parse_args() - convert_data(args.raster_path, args.geotiff_path) + convert_data(args.raster_path, args.geojson_path) diff --git a/tools/raster2vector.py b/tools/mask2shape.py similarity index 93% rename from tools/raster2vector.py rename to tools/mask2shape.py index a76ea92..4f108ba 100644 --- a/tools/raster2vector.py +++ b/tools/mask2shape.py @@ -1,105 +1,105 @@ -# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import os.path as osp -import argparse - -import numpy as np -from PIL import Image -try: - from osgeo import gdal, ogr, osr -except ImportError: - import gdal - import ogr - import osr - -from utils import Raster, save_geotiff, time_it - - -def _mask2tif(mask_path, tmp_path, proj, geot): - dst_ds = save_geotiff( - np.asarray(Image.open(mask_path)), tmp_path, proj, geot, - gdal.GDT_UInt16, False) - return dst_ds - - -def _polygonize_raster(mask_path, vec_save_path, proj, geot, ignore_index, ext): - if proj is None or geot is None: - tmp_path = None - ds = gdal.Open(mask_path) - else: - tmp_path = vec_save_path.replace("." + ext, ".tif") - ds = _mask2tif(mask_path, tmp_path, proj, geot) - srcband = ds.GetRasterBand(1) - maskband = srcband.GetMaskBand() - gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES") - gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8") - ogr.RegisterAll() - drv = ogr.GetDriverByName("ESRI Shapefile" if ext == "shp" else "GeoJSON") - if osp.exists(vec_save_path): - os.remove(vec_save_path) - dst_ds = drv.CreateDataSource(vec_save_path) - prosrs = osr.SpatialReference(wkt=ds.GetProjection()) - dst_layer = dst_ds.CreateLayer( - "POLYGON", geom_type=ogr.wkbPolygon, srs=prosrs) - dst_fieldname = "CLAS" - fd = ogr.FieldDefn(dst_fieldname, ogr.OFTInteger) - dst_layer.CreateField(fd) - gdal.Polygonize(srcband, maskband, dst_layer, 0, []) - # TODO: temporary: delete ignored values - dst_ds.Destroy() - ds = None - vec_ds = drv.Open(vec_save_path, 1) - lyr = vec_ds.GetLayer() - lyr.SetAttributeFilter("{} = '{}'".format(dst_fieldname, str(ignore_index))) - for holes in lyr: - lyr.DeleteFeature(holes.GetFID()) - vec_ds.Destroy() - if tmp_path is not None: - os.remove(tmp_path) - - -@time_it -def raster2vector(srcimg_path, mask_path, save_path, ignore_index=255): - vec_ext = save_path.split(".")[-1].lower() - if vec_ext not in ["json", "geojson", "shp"]: - raise ValueError( - "The extension of `save_path` must be 'json/geojson' or 'shp', not {}.". - format(vec_ext)) - ras_ext = srcimg_path.split(".")[-1].lower() - if osp.exists(srcimg_path) and ras_ext in ["tif", "tiff", "geotiff", "img"]: - src = Raster(srcimg_path) - _polygonize_raster(mask_path, save_path, src.proj, src.geot, - ignore_index, vec_ext) - src = None - else: - _polygonize_raster(mask_path, save_path, None, None, ignore_index, - vec_ext) - - -parser = argparse.ArgumentParser() -parser.add_argument("--mask_path", type=str, required=True, \ - help="Path of mask data.") -parser.add_argument("--save_path", type=str, required=True, \ - help="Path to save the shape file (the extension is .json/geojson or .shp).") -parser.add_argument("--srcimg_path", type=str, default="", \ - help="Path of original data with geoinfo. Default to empty.") -parser.add_argument("--ignore_index", type=int, default=255, \ - help="The ignored index will not be converted to a value in the shape file. Default value is 255.") - -if __name__ == "__main__": - args = parser.parse_args() - raster2vector(args.srcimg_path, args.mask_path, args.save_path, - args.ignore_index) +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import os.path as osp +import argparse + +import numpy as np +from PIL import Image +try: + from osgeo import gdal, ogr, osr +except ImportError: + import gdal + import ogr + import osr + +from utils import Raster, save_geotiff, time_it + + +def _mask2tif(mask_path, tmp_path, proj, geot): + dst_ds = save_geotiff( + np.asarray(Image.open(mask_path)), tmp_path, proj, geot, + gdal.GDT_UInt16, False) + return dst_ds + + +def _polygonize_raster(mask_path, vec_save_path, proj, geot, ignore_index, ext): + if proj is None or geot is None: + tmp_path = None + ds = gdal.Open(mask_path) + else: + tmp_path = vec_save_path.replace("." + ext, ".tif") + ds = _mask2tif(mask_path, tmp_path, proj, geot) + srcband = ds.GetRasterBand(1) + maskband = srcband.GetMaskBand() + gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES") + gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8") + ogr.RegisterAll() + drv = ogr.GetDriverByName("ESRI Shapefile" if ext == "shp" else "GeoJSON") + if osp.exists(vec_save_path): + os.remove(vec_save_path) + dst_ds = drv.CreateDataSource(vec_save_path) + prosrs = osr.SpatialReference(wkt=ds.GetProjection()) + dst_layer = dst_ds.CreateLayer( + "POLYGON", geom_type=ogr.wkbPolygon, srs=prosrs) + dst_fieldname = "CLAS" + fd = ogr.FieldDefn(dst_fieldname, ogr.OFTInteger) + dst_layer.CreateField(fd) + gdal.Polygonize(srcband, maskband, dst_layer, 0, []) + # TODO: temporary: delete ignored values + dst_ds.Destroy() + ds = None + vec_ds = drv.Open(vec_save_path, 1) + lyr = vec_ds.GetLayer() + lyr.SetAttributeFilter("{} = '{}'".format(dst_fieldname, str(ignore_index))) + for holes in lyr: + lyr.DeleteFeature(holes.GetFID()) + vec_ds.Destroy() + if tmp_path is not None: + os.remove(tmp_path) + + +@time_it +def mask2shape(srcimg_path, mask_path, save_path, ignore_index=255): + vec_ext = save_path.split(".")[-1].lower() + if vec_ext not in ["json", "geojson", "shp"]: + raise ValueError( + "The extension of `save_path` must be 'json/geojson' or 'shp', not {}.". + format(vec_ext)) + ras_ext = srcimg_path.split(".")[-1].lower() + if osp.exists(srcimg_path) and ras_ext in ["tif", "tiff", "geotiff", "img"]: + src = Raster(srcimg_path) + _polygonize_raster(mask_path, save_path, src.proj, src.geot, + ignore_index, vec_ext) + src = None + else: + _polygonize_raster(mask_path, save_path, None, None, ignore_index, + vec_ext) + + +parser = argparse.ArgumentParser() +parser.add_argument("--mask_path", type=str, required=True, \ + help="Path of mask data.") +parser.add_argument("--save_path", type=str, required=True, \ + help="Path to save the shape file (the extension is .json/geojson or .shp).") +parser.add_argument("--srcimg_path", type=str, default="", \ + help="Path of original data with geoinfo. Default to empty.") +parser.add_argument("--ignore_index", type=int, default=255, \ + help="The ignored index will not be converted to a value in the shape file. Default value is 255.") + +if __name__ == "__main__": + args = parser.parse_args() + mask2shape(args.srcimg_path, args.mask_path, args.save_path, + args.ignore_index) diff --git a/tutorials/train/README.md b/tutorials/train/README.md index 0328607..377f134 100644 --- a/tutorials/train/README.md +++ b/tutorials/train/README.md @@ -1,6 +1,6 @@ # 使用教程——训练模型 -本目录下整理了使用PaddleRS训练模型的示例代码。代码中均提供了示例数据的自动下载,并均使用GPU对模型进行训练。 +本目录中整理了使用PaddleRS训练模型的示例代码。代码中均提供对示例数据的自动下载,并均使用GPU对模型进行训练。 |示例代码路径 | 任务 | 模型 | |------|--------|---------| @@ -27,22 +27,16 @@ |semantic_segmentation/deeplabv3p.py | 图像分割 | DeepLab V3+ | |semantic_segmentation/unet.py | 图像分割 | UNet | - - ## 环境准备 -- [PaddlePaddle安装](https://www.paddlepaddle.org.cn/install/quick) - * 版本要求:PaddlePaddle>=2.2.0 ++ [PaddlePaddle安装](https://www.paddlepaddle.org.cn/install/quick) + - 版本要求:PaddlePaddle>=2.2.0 -- PaddleRS安装 ++ PaddleRS安装 PaddleRS代码会跟随开发进度不断更新,可以安装develop分支的代码使用最新的功能,安装方式如下: -``` +```shell git clone https://github.com/PaddlePaddle/PaddleRS cd PaddleRS git checkout develop @@ -50,47 +44,49 @@ pip install -r requirements.txt python setup.py install ``` -- \*GDAL安装 ++ (可选)GDAL安装 -PaddleRS支持多种类型的卫星数据IO以及地理处理等,可能需要使用GDAL,可以根据需求进行安装,安装方式如下: +PaddleRS支持对多种类型卫星数据的读取。完整使用PaddleRS的遥感数据读取功能需要安装GDAL,安装方式如下: - Linux / MacOS 推荐使用conda进行安装: -``` +```shell conda install gdal ``` - Windows -Windows用户可以通过[这里](https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal)下载对应Python和系统版本的二进制文件(\*.whl)到本地,以*GDAL‑3.3.3‑cp39‑cp39‑win_amd64.whl*为例,进入下载目录进行安装: +Windows用户可以在[此站点](https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal)下载与Python和系统版本相对应的.whl格式安装包到本地,以*GDAL‑3.3.3‑cp39‑cp39‑win_amd64.whl*为例,使用pip工具安装: -``` -cd download +```shell pip install GDAL‑3.3.3‑cp39‑cp39‑win_amd64.whl ``` ## 开始训练 -* 在安装PaddleRS后,使用如下命令进行单卡训练。代码会自动下载训练数据。以DeepLab V3+图像分割模型为例: -```commandline ++ 在安装完成PaddleRS后,使用如下命令执行单卡训练。脚本将自动下载训练数据。以DeepLab V3+图像分割模型为例: + +```shell # 指定需要使用的GPU设备编号 export CUDA_VISIBLE_DEVICES=0 python tutorials/train/semantic_segmentation/deeplabv3p.py ``` -* 如需使用多块GPU进行训练,例如使用2张显卡时,执行如下命令: ++ 如需使用多块GPU进行训练,例如使用2张显卡时,执行如下命令: -```commandline +```shell python -m paddle.distributed.launch --gpus 0,1 tutorials/train/semantic_segmentation/deeplabv3p.py ``` ## VisualDL可视化训练指标 -将传入`train`方法的`use_vdl`参数设为`True`,则模型训练过程中将自动把训练日志以VisualDL的格式存储到`save_dir`(用户自己指定的路径)目录下名为`vdl_log`的子目录中。用户可以使用如下命令启动VisualDL服务,查看可视化指标。同样以DeepLab V3+模型为例: -```commandline + +将传入`train()`方法的`use_vdl`参数设为`True`,则模型训练过程中将自动把训练日志以VisualDL的格式存储到`save_dir`(用户自己指定的路径)目录下名为`vdl_log`的子目录中。用户可以使用如下命令启动VisualDL服务,查看可视化指标。同样以DeepLab V3+模型为例: + +```shell # 指定端口号为8001 visualdl --logdir output/deeplabv3p/vdl_log --port 8001 ``` -服务启动后,使用浏览器打开 https://0.0.0.0:8001 或 https://localhost:8001 +服务启动后,使用浏览器打开 https://0.0.0.0:8001 或 https://localhost:8001 即可进入可视化页面。