Introducción al contenido del conjunto de datos Urban3D
Las imágenes del conjunto de datos de Urban3D son imágenes RGB ortográficas con una resolución de 50 cm.
Utilice AWS para descargar datos de SpaceNet . La estructura de carpetas es:
|- 01-Provisional_Train
|- GT
|- GT中包含GTC,GTI,GTL.tif文件,GTL为ground truth building footprint。
|- Inputs
|- Inputs中包含DSM,DTM,RGB.tif文件,DSM为Digital Surface Models,DTM为Digital Terrain Models,normalized DSM (nDSM = DSM - DTM)
|- 02-Provisional_Test
|- 03-Sequestered_Test
|- 04-Unused_Data
|- AOI_polygons
|- Pretrained_Models
|- 包含前6名参赛团队的模型
El tamaño de cada .tif es 2048*2048.
Lectura de conjuntos de datos Urban3D
from torchvision import transforms
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import sys
rgb = Image.open("/01-Provisional_Train/Inputs/JAX_Tile_016_RGB.tif")
dsm = Image.open("/01-Provisional_Train/Inputs/JAX_Tile_016_DSM.tif")
gtl = Image.open("/01-Provisional_Train/GT/JAX_Tile_016_GTL.tif")
print(rgb.size, dsm.size, gtl.size) >> (2048, 2048) (2048, 2048) (2048, 2048)
print(np.array(rgb).shape, np.array(dsm).shape, np.array(gtl).shape) >> (2048, 2048, 3) (2048, 2048) (2048, 2048)
print(np.array(rgb).dtype, np.array(dsm).dtype, np.array(gtl).dtype) >> uint8 float32 uint8
fig = plt.figure()
plt.subplot(131)
plt.imshow(np.array(rgb))
plt.subplot(132)
plt.imshow(np.array(dsm))
plt.subplot(133)
plt.imshow(np.array(gtl))
print(np.max(gtl), np.min(gtl)) >> 6, 2
Procesamiento Pytorch del conjunto de datos Urban3D
El uso del aprendizaje profundo requiere recortar los datos de Urban3D, que se utilizan aquí torchvision.transforms.RandomCrop
. RandomCrop
Se puede aplicar directamente a archivos abiertos por PIL.Image y datos de tipo antorcha, pero no se puede aplicar a matrices numerosas. Para contenido específico, consulte numpy, PIL, tipo de tensor utilizado en torchvision.transforms
def type_convert(x):
x_ = np.array(x).astype(np.float32)
return x_
def to_tensor(x):
x_ = np.expand_dims(x, axis=0)
x_ = torch.from_numpy(x_)
return x_
trans = transforms.Compose([
transforms.RandomCrop(size=256),
transforms.Lambda(type_convert),
transforms.Lambda(to_tensor)
])
torch.random.manual_seed(16)
rgb_crop = trans(rgb)
torch.random.manual_seed(16)
dsm_crop = trans(dsm)
torch.random.manual_seed(16)
gtl_crop = trans(gtl)
print(rgb_crop.size(), dsm_crop.size(), gtl_crop.size())
fig = plt.figure()
plt.subplot(131)
plt.imshow(rgb_crop[0,:,:,0])
plt.subplot(132)
plt.imshow(dsm_crop[0,:,:])
plt.subplot(133)
plt.imshow(gtl_crop[0,:,:])
Al mismo tiempo, una cosa a tener en cuenta es que para garantizar la coherencia de los datos y las etiquetas después de RandomCrop, se debe establecer una semilla de número aleatorio. Para GTL, es necesario cambiar el valor de la etiqueta.
def type_convert_gtl(x):
x_ = np.array(x).astype(np.float32)
x_[x_==6]=1
x_[x_==2]=0
return x_