VITON-Extends / VITON-Extends-Train /data /aligned_dataset.py
NguyenDinhHieu's picture
Add files using upload-large-folder tool
2bd5c7a verified
import os.path
from data.base_dataset import BaseDataset, get_params, get_transform
from data.image_folder import make_dataset
from PIL import Image
import torch
import json
import numpy as np
import os.path as osp
from PIL import ImageDraw
class AlignedDataset(BaseDataset):
def initialize(self, opt):
self.opt = opt
self.root = opt.dataroot
self.diction={}
if opt.isTrain or opt.use_encoded_image:
dir_A = '_A' if self.opt.label_nc == 0 else '_label'
self.dir_A = os.path.join(opt.dataroot, opt.phase + dir_A)
self.A_paths = sorted(make_dataset(self.dir_A))
self.fine_height=256
self.fine_width=192
self.radius=5
dir_B = '_B' if self.opt.label_nc == 0 else '_img'
self.dir_B = os.path.join(opt.dataroot, opt.phase + dir_B)
self.B_paths = sorted(make_dataset(self.dir_B))
self.dataset_size = len(self.A_paths)
if opt.isTrain or opt.use_encoded_image:
dir_E = '_edge'
self.dir_E = os.path.join(opt.dataroot, opt.phase + dir_E)
self.E_paths = sorted(make_dataset(self.dir_E))
if opt.isTrain or opt.use_encoded_image:
dir_C = '_color'
self.dir_C = os.path.join(opt.dataroot, opt.phase + dir_C)
self.C_paths = sorted(make_dataset(self.dir_C))
def __getitem__(self, index):
A_path = self.A_paths[index]
A = Image.open(A_path).convert('L')
params = get_params(self.opt, A.size)
if self.opt.label_nc == 0:
transform_A = get_transform(self.opt, params)
A_tensor = transform_A(A.convert('RGB'))
else:
transform_A = get_transform(self.opt, params, method=Image.NEAREST, normalize=False)
A_tensor = transform_A(A) * 255.0
B_path = self.B_paths[index]
B = Image.open(B_path).convert('RGB')
transform_B = get_transform(self.opt, params)
B_tensor = transform_B(B)
C_path = self.C_paths[index]
C = Image.open(C_path).convert('RGB')
C_tensor = transform_B(C)
E_path = self.E_paths[index]
E = Image.open(E_path).convert('L')
E_tensor = transform_A(E)
index_un = np.random.randint(14221)
C_un_path = self.C_paths[index_un]
C_un = Image.open(C_un_path).convert('RGB')
C_un_tensor = transform_B(C_un)
E_un_path = self.E_paths[index_un]
E_un = Image.open(E_un_path).convert('L')
E_un_tensor = transform_A(E_un)
pose_name =B_path.replace('.png', '_keypoints.json').replace('.jpg','_keypoints.json').replace('train_img','train_pose')
with open(osp.join(pose_name), 'r') as f:
pose_label = json.load(f)
try:
pose_data = pose_label['people'][0]['pose_keypoints']
except IndexError:
pose_data = [0 for i in range(54)]
pose_data = np.array(pose_data)
pose_data = pose_data.reshape((-1,3))
point_num = pose_data.shape[0]
pose_map = torch.zeros(point_num, self.fine_height, self.fine_width)
r = self.radius
im_pose = Image.new('L', (self.fine_width, self.fine_height))
pose_draw = ImageDraw.Draw(im_pose)
for i in range(point_num):
one_map = Image.new('L', (self.fine_width, self.fine_height))
draw = ImageDraw.Draw(one_map)
pointx = pose_data[i,0]
pointy = pose_data[i,1]
if pointx > 1 and pointy > 1:
draw.rectangle((pointx-r, pointy-r, pointx+r, pointy+r), 'white', 'white')
pose_draw.rectangle((pointx-r, pointy-r, pointx+r, pointy+r), 'white', 'white')
one_map = transform_B(one_map.convert('RGB'))
pose_map[i] = one_map[0]
P_tensor=pose_map
densepose_name = B_path.replace('.png', '.npy').replace('.jpg','.npy').replace('train_img','train_densepose')
dense_mask = np.load(densepose_name).astype(np.float32)
dense_mask = transform_A(dense_mask)
if self.opt.isTrain:
input_dict = { 'label': A_tensor, 'image': B_tensor, 'path': A_path, 'img_path': B_path ,'color_path': C_path,'color_un_path': C_un_path,
'edge': E_tensor, 'color': C_tensor, 'edge_un': E_un_tensor, 'color_un': C_un_tensor, 'pose':P_tensor, 'densepose':dense_mask
}
return input_dict
def __len__(self):
return len(self.A_paths) // (self.opt.batchSize * self.opt.num_gpus) * (self.opt.batchSize * self.opt.num_gpus)
def name(self):
return 'AlignedDataset'