遥感图像建筑物检测AI模型制作教程
27 Nov 2023
遥感图像中的建筑物检测是一项具有重要应用价值的研究课题。现有的图像特征识别模型在一般的图像检测方面取得了较好的效果,但在遥感图像中存在一定的局限性。
GeoTIFF 是一种常用的遥感图像格式,它以像素为单位存储地表的图像数据。GeoTIFF 图像通常具有较高的分辨率,这使得检测其中的建筑物具有一定的挑战性。
本文将介绍如何做出一个可用于检测 GeoTIFF 中所有建筑物的 AI 模型。
数据集准备
训练模型的第一步需要准备训练和测试用的数据集。在图像特征检测领域中,比较常用的数据集是 Coco 数据集,所以我们也将使用 Coco 这种格式的数据集。
有两种方法可以准备数据集:
1. 使用现有的数据集
一个可用的现有数据集是 AiCrowd 的 Mapping Challenge 中提供的数据集。 该数据集包含了该数据集包含了 280741 张训练图像和 60317 张验证图像。
下载地址: https://www.aicrowd.com/challenges/mapping-challenge/dataset_files
2. 使用 GeoTIFF 文件制作数据集
如果您想使用自己的 GeoTIFF 文件制作数据集,可以使用 gdal2tiles 工具将 GeoTIFF 文件分割成小图片。
步骤 1:安装 gdal
在 Linux 中,您可以使用以下命令安装 gdal2tiles:
sudo apt-get install gdal-bin
步骤 2:将 GeoTIFF 文件分割成小图片
使用以下命令将 GeoTIFF 文件分割成小图片:
gdal2tiles demo.tif
这将生成一个名为 demo 的目录,其中包含了分割后的图片。
├── 17
├── 18
│ ├── 216364
│ │ ├── 159390.png
│ │ ├── 159394.png
│ │ └── 159405.png
├── 19
├── googlemaps.html
├── leaflet.html
├── openlayers.html
└── tilemapresource.xml
我们将使用ZOOM为18的图片
步骤 3:使用 coco-annotator 标注图片
下载 coco-annotator 并启动, https://github.com/jsbroks/coco-annotator
然后,创建一个名为 Buildings 的数据集。将 demo/18/下所有图片复制到 Buildings 数据集的目录中。
在 coco-annotator 中,打开 Buildings 数据集。然后,使用鼠标标注每个建筑物的位置。
步骤 4:下载 annotation 文件
标注完图片后,可以使用 coco-annotator 下载 annotation 文件。
模型选择
我们将使用 Mask R-CNN 模型进行训练。 Mask R-CNN 是一种用于目标检测和分割的卷积神经网络。 它具有较好的检测性能,并且可以生成建筑物的边界框和掩码。
模型训练
在本文中,我们使用 PyTorch 框架进行训练
训练过程部分代码如下:
加载数据集
dataset = datasets.CocoDetection(
'/path/to/coco-annotator/datasets/Buildings/',
'/path/to/Buildings-1.json',
transforms=get_transform(True)
)
dataset = datasets.wrap_dataset_for_transforms_v2(
dataset,
target_keys=("boxes", "labels", "masks","image_id", "area", "iscrowd")
)
选择优化器和学习率
params = [p for p in model.parameters() if p.requires_grad]
optimizer = torch.optim.SGD(
params,
lr=1e-3,
momentum=0.9,
weight_decay=0.0005
)
lr_scheduler = torch.optim.lr_scheduler.LinearLR(
optimizer,
start_factor = 1e-3,
total_iters = len(dataset_train) - 1,
verbose=False
)
模型评估
模型训练完成后,需要对模型进行评估。我们将使用 CocoEval 工具进行评估。
未来工作
在本文中,我们介绍了如何训练一个用于检测 GeoTIFF 中所有建筑物的 AI 模型。但是,该模型仍有一定的改进空间。
附录
合并Tiles结果为一张图片
如果想要把一个GEOTIF文件的所有TILES图合并为一张图片, 可以参考以下代码:
grid = torchvision.utils.make_grid(res, cols, 0)
torchvision.utils.save_image(grid, 'output.png')
在两张GeoTIFF中寻找不同的建筑物
如何在两张TIF中寻找不同的建筑物, 如新建的房屋, 已经拆除的房屋等
- 先找出图片中建筑物
- 使用IOU算法排除同一个位置的建筑物
- 标记出剩下的建筑物