我国利用卫星遥感监测数据开展土地卫片执法检查的历史可追溯到本世纪初。自2000年起,国土资源部启动了该方向的试点工作。到2010年为止,已经实现全国2859个城市全覆盖。2019年起,自然资源部增加了建筑物变化图斑的提取,每季度下发到各级执法部门,督促进行整改查处。作为遥感土地监测的主要技术之一,长期以来,建筑物变化检测在生产、生活中扮演至关重要的角色。
传统的遥感建筑物变化检测主要通过手动或半自动的方式进行,人工成本高,效率较低。随着人工智能技术的不断成熟和新模型的不断涌现,以人工智能手段辅助建筑物变化检测已经成为主流应用趋势。然而,基于深度学习的建筑物变化检测模型在很大程度上依赖于经过标注的大型数据集,而由于建筑物变化样本的稀有性和稀疏性,收集包含建筑物变化的大规模双时态图像既费时又费力。
为了解决这一问题,有研究者使用生成对抗网络(Generative Adversarial Network, GAN)对建筑物变化检测数据集进行数据生成相关的技术研究,从数量
[1]
和多样性
[2]
上对数据集进行扩展,以支撑下游任务,并取得令人瞩目的效果提升。
本项目基于飞桨生成对抗网络开发套件PaddleGAN提供的Pix2Pix模型实现对建筑物变化检测数据集的扩充,利用飞桨高性能遥感影像处理开发套件PaddleRS提供的RealSR、ESRGAN与LESRCNN模型实现对生成遥感影像的超分辨率重建。
Pix2Pix
[3]
是CGAN的一个变体,能够实现从标签(labels)到图像的映射。在原文中,作者利用CGAN完成了从标签到街景图像、立面图像和遥感影像的图像重建任务,也实现了图像上色、边缘重建图像以及从黑夜到白天的风格迁移。
图1. Pix2Pix[3]模型在各场景下图像重建效果
Pix2Pix网络由一个生成器G(U-Net结构)与一个判别器D(用于分类的全卷积网络结构),其训练过程可分为两部分:
将Label(一般是图像熵较低的数据)输入生成器G,输出重建后的图像Image-fake。在Image-fake与Image-Gt间计算L1损失并优化,以缩小两幅图像间的逐像素差距。
将Image-fake与Label、Image-Gt与Label分别组成图像对并输入判别器D,判别器D输出Image-fake或Image-Gt为真实图像的概率。使用Image-fake、Image-Gt、Label以及判别器D的输出计算GAN损失并优化,使生成器G生成图像的分布逼近真实影像的分布。GAN损失的公式为:
使用GDAL库读取矢量数据;
遍历每条矢量数据,根据第i个建筑物Bi坐标提取其周围的遥感影像块(尺寸为512*512),将其采样为栅格图,得到Gt;
将Gt中目标建筑物Bi范围内像素值设置为(0,0,0)。
def get_filePath_fileName_fileExt(fileUrl):
"""
获取文件路径, 文件名, 后缀名
:param fileUrl:
:return:
"""
filepath, tmpfilename = os.path.split(fileUrl)
shotname, extension = os.path.splitext(tmpfilename)
return filepath, shotname, extension
def gan_img(img_path, lab_path, save_dir, vis=False):
lab = cv2.imread(lab_path, -1)
img = cv2.imread(img_path, -1)
contours, hierarchy = cv2.findContours(lab, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):
# 计算面积,太小的去掉
area = cv2.contourArea(contours[i])
if area < 200:
continue
# 接边的建筑物去掉,仅保留轮廓完整的建筑物
if 0 in contours[i]:
continue
# 外接矩形框,没有方向角
x, y, w, h = cv2.boundingRect(contours[i])
# 可视化,调试用
if vis == True:
img_to_draw = img.copy()
cv2.drawContours(img_to_draw, contours, i, (0, 0, 0), thickness=-1)
cv2.rectangle(img_to_draw, (x, y), (x + w, y + h), (0, 255, 0), 2)
# cv2.rectangle(img_to_draw, (x - 5, y - 5), (x + w + 10, y + h + 10), (0, 255, 0), 2)
cv2.imshow("img_to_draw", img_to_draw)
cv2.waitKey(0)
# 每一个对象绘制一张图
os.makedirs(save_dir, exist_ok=True)
img_to_save = img.copy()
# (0, 0, 0)作为标记,需要生成建筑的部分
cv2.drawContours(img_to_save, contours, i, (0, 0, 0), thickness=-1)
# axis=0 按垂直方向,axis=1 按水平方向,左侧为目标图像,右侧为Label
img_dataset = np.concatenate((img, img_to_save), axis=1)
f, s, e = get_filePath_fileName_fileExt(img_path)
os.makedirs(os.path.join(save_dir, "pairs"), exist_ok=True)
cv2.imwrite(os.path.join(save_dir, "pairs", s + "_" + str(i) + ".jpg"), img_dataset)
os.makedirs(os.path.join(save_dir, "img"), exist_ok=True)
os.makedirs(os.path.join(save_dir, "lab"), exist_ok=True)
最终,从每一栋建筑物可以得到一组增强样本对。如下图所示,左侧为Gt,右侧为Image,Image中的黑色图斑是要生成建筑物的区域。可将Gt和Image拼接为facades数据集格式(左边A图右边B图水平拼接成一张宽1024高512的图像,A和B的定义在配置文件中需要明确,输入右图生成左图,因此是B to A)。
首先安利一波
:飞桨生成对抗网络开发套件--PaddleGAN为开发者提供经典及前沿的生成对抗网络高性能实现,并支撑开发者快速构建、训练及部署生成对抗网络,以供学术、娱乐及产业应用。
开发套件的一大优势是拿来即用,仅需修改配置文件中少量参数即可实现神经网络的训练。同时,AI Studio可以提供算力支持,每天16GB显存的A100显卡可用16小时,满足绝大多数网络的训练要求。
# 开始训练
!python -u PaddleGAN/tools/main.py --config-file work/pix2pix_buildings.yaml
# 中断后重新开始
# !python -u PaddleGAN/tools/main.py --config-file work/pix2pix_buildings.yaml --resume output_d
本项目(链接在文末)在
work/pix2pix_buildings.yaml
保存了独立的配置文件,对每一个字段进行说明,希望能给大家带来帮助。
PaddleGAN中,在tool文件夹下提供了inference.py文件,实现模型的推理,但其中实现pix2pix采用了facades数据集的结构,导致很多新手在使用模型推理时把数据拼接成facades格式后再推理,走了弯路。
其实想实现推理,关键点只有三个:
from ppgan.models.generators import UnetGenerator
g_net = UnetGenerator(3, 3, 8, 64, 'batch', False) #注释:参数在配置文件中
weight_path = "./work/epoch_200_weight.pdparams"
state_dicts = load(weight_path)['netG']
state_dicts = load(weight_path)['netG'] #注释:权重文件中包含了G与D的参数,这里是关键
g_net.set_state_dict(state_dicts)
g_net.eval()
transform = T.Compose([
T.Transpose(),
T.Normalize([127.5, 127.5, 127.5], [127.5, 127.5, 127.5])
]) #注释:参数在配置文件中test部分
推理文件保存于项目./work/predict预测.py路径。运行该文件,实现模型推理:
# p2p推理一下
!cp ./work/predict预测.py PaddleGAN/
!python PaddleGAN/predict预测.py
得到结果如下:
图7. 训练结果展示
结果保存在pair_results文件夹。
pix2pixHD模型是pix2pix的升级版,采用两个生成器G1与G2。简单理解,由G1生成低分辨率图像输入G2,从而得到一个更好的结果。本项目借鉴这个思路,使用飞桨高性能遥感影像处理开发套件PaddleRS提供的预训练的RealSR模型对生成的建筑物遥感影像进行超分辨率重建,以期望能提升影像的清晰度。
第二波安利:
PaddleRS是遥感科研院所、相关高校共同基于飞桨开发的遥感处理平台,支持遥感图像分类、目标检测、图像分割以及变化检测等常用遥感任务,能够帮助开发者更便捷地完成从训练到部署全流程遥感深度学习应用。
图11. PaddleRS架构图
使用work/Super_Resolution_pre.py文件,运行超分辨率方法,将分辨率提升至2w*2h。
代码如下:
# 进行图像超分处理
import os
import glob
import paddle
import numpy as np
from PIL import Image
from paddlers.models.ppgan.apps.drn_predictor import DRNPredictor
from paddlers.models.ppgan.apps.lesrcnn_predictor import LESRCNNPredictor
from paddlers.models.ppgan.apps.realsr_predictor import RealSRPredictor
# 输出预测结果的文件夹
output = r'./Super_Resolution_out'
# 待输入的低分辨率影像位置
input_dir = r"./gan_low_solution_sample"
# 设置GPU为推理设备
paddle.device.set_device("gpu:0")
# 实例化
DRNpredictor = DRNPredictor(output)
LESRpredictor = LESRCNNPredictor(output)
RealSRpredictor = RealSRPredictor(output)
# 生成文件列表
list_images = glob.glob(input_dir + "/*.**g")
#遍历文件列表,模型推理
for filename in list_images:
DRNpredictor.run(filename) # 预测
LESRpredictor.run(filename)
RealSRpredictor.run(filename)
1.张轶, et al., 一种面向地物变化检测的空间约束条件下生成对抗网络遥感影像样本扩充方法. 2020.
2.Chen, H., W. Li, and Z. Shi, Adversarial Instance Augmentation for Building Change Detection in Remote Sensing Images. IEEE Transactions on Geoscience and Remote Sensing, 2021. PP(99): p. 1-16.
3.Isola, P., et al., Image-to-Image Translation with Conditional Adversarial Networks. IEEE, 2016.
4.Guo, Y., et al., Closed-loop Matters: Dual Regression Networks for Single Image Super-Resolution. IEEE, 2020.