Map-Detect / datasets /CD_dataset.py
justchenhao's picture
BIT
d43892c
Raw
History Blame Contribute Delete
4.09 kB
"""
变化检测数据集
"""
import os
from PIL import Image
import numpy as np
from torch.utils import data
from datasets.data_utils import CDDataAugmentation
"""
CD data set with pixel-level labels;
├─image
├─image_post
├─label
└─list
"""
IMG_FOLDER_NAME = "A"
IMG_POST_FOLDER_NAME = 'B'
LIST_FOLDER_NAME = 'list'
ANNOT_FOLDER_NAME = "label"
IGNORE = 255
label_suffix='.png' # jpg for gan dataset, others : png
def load_img_name_list(dataset_path):
img_name_list = np.loadtxt(dataset_path, dtype=np.str)
if img_name_list.ndim == 2:
return img_name_list[:, 0]
return img_name_list
def load_image_label_list_from_npy(npy_path, img_name_list):
cls_labels_dict = np.load(npy_path, allow_pickle=True).item()
return [cls_labels_dict[img_name] for img_name in img_name_list]
def get_img_post_path(root_dir,img_name):
return os.path.join(root_dir, IMG_POST_FOLDER_NAME, img_name)
def get_img_path(root_dir, img_name):
return os.path.join(root_dir, IMG_FOLDER_NAME, img_name)
def get_label_path(root_dir, img_name):
return os.path.join(root_dir, ANNOT_FOLDER_NAME, img_name.replace('.jpg', label_suffix))
class ImageDataset(data.Dataset):
"""VOCdataloder"""
def __init__(self, root_dir, split='train', img_size=256, is_train=True,to_tensor=True):
super(ImageDataset, self).__init__()
self.root_dir = root_dir
self.img_size = img_size
self.split = split # train | train_aug | val
# self.list_path = self.root_dir + '/' + LIST_FOLDER_NAME + '/' + self.list + '.txt'
self.list_path = os.path.join(self.root_dir, LIST_FOLDER_NAME, self.split+'.txt')
self.img_name_list = load_img_name_list(self.list_path)
self.A_size = len(self.img_name_list) # get the size of dataset A
self.to_tensor = to_tensor
if is_train:
self.augm = CDDataAugmentation(
img_size=self.img_size,
with_random_hflip=True,
with_random_vflip=True,
with_scale_random_crop=True,
with_random_blur=True,
)
else:
self.augm = CDDataAugmentation(
img_size=self.img_size
)
def __getitem__(self, index):
name = self.img_name_list[index]
A_path = get_img_path(self.root_dir, self.img_name_list[index % self.A_size])
B_path = get_img_post_path(self.root_dir, self.img_name_list[index % self.A_size])
img = np.asarray(Image.open(A_path).convert('RGB'))
img_B = np.asarray(Image.open(B_path).convert('RGB'))
[img, img_B], _ = self.augm.transform([img, img_B],[], to_tensor=self.to_tensor)
return {'A': img, 'B': img_B, 'name': name}
def __len__(self):
"""Return the total number of images in the dataset."""
return self.A_size
class CDDataset(ImageDataset):
def __init__(self, root_dir, img_size, split='train', is_train=True, label_transform=None,
to_tensor=True):
super(CDDataset, self).__init__(root_dir, img_size=img_size, split=split, is_train=is_train,
to_tensor=to_tensor)
self.label_transform = label_transform
def __getitem__(self, index):
name = self.img_name_list[index]
A_path = get_img_path(self.root_dir, self.img_name_list[index % self.A_size])
B_path = get_img_post_path(self.root_dir, self.img_name_list[index % self.A_size])
img = np.asarray(Image.open(A_path).convert('RGB'))
img_B = np.asarray(Image.open(B_path).convert('RGB'))
L_path = get_label_path(self.root_dir, self.img_name_list[index % self.A_size])
label = np.array(Image.open(L_path), dtype=np.uint8)
# 二分类中,前景标注为255
if self.label_transform == 'norm':
label = label // 255
[img, img_B], [label] = self.augm.transform([img, img_B], [label], to_tensor=self.to_tensor)
# print(label.max())
return {'name': name, 'A': img, 'B': img_B, 'L': label}