537 lines
30 KiB
Python
537 lines
30 KiB
Python
import os
|
|
import cv2
|
|
import random
|
|
import torch
|
|
import numpy as np
|
|
from PIL import Image
|
|
import torch.nn.functional as F
|
|
import torch.utils.data as data
|
|
import torchvision.transforms as transforms
|
|
|
|
|
|
class MakeupDataset(data.Dataset):
|
|
def __init__(self, opts):
|
|
self.opts = opts
|
|
self.phase = opts.phase
|
|
self.data_root = opts.data_root
|
|
self.resize_size = opts.resize_size
|
|
self.crop_size = opts.crop_size
|
|
self.flip = opts.flip
|
|
self.semantic_dim = opts.semantic_dim
|
|
|
|
non_makeup_name = os.listdir(os.path.join(self.data_root, 'non_makeup'))
|
|
self.non_makeup_path = [os.path.join(self.data_root, 'non_makeup', x) for x in non_makeup_name]
|
|
|
|
makeup_name = os.listdir(os.path.join(self.data_root, 'makeup'))
|
|
self.makeup_path = [os.path.join(self.data_root, 'makeup', x) for x in makeup_name]
|
|
self.non_makeup_size = len(self.non_makeup_path)
|
|
self.makeup_size = len(self.makeup_path)
|
|
if self.phase == 'train' or self.phase=='1000_test':
|
|
self.data_size = self.non_makeup_size
|
|
# self.data_size = 10
|
|
else:
|
|
self.data_size = self.non_makeup_size * self.makeup_size
|
|
|
|
# Color perturbation has already been done here, so it's okay not to add color contrast loss
|
|
self.color_transform = transforms.Compose(
|
|
[transforms.transforms.ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.25),
|
|
transforms.ToTensor()])
|
|
|
|
self.type_transform = transforms.Compose(
|
|
[transforms.ToTensor()])
|
|
|
|
self.image_resnet_transform = transforms.Compose([transforms.ToTensor(),
|
|
transforms.Normalize(mean=[0.485, 0.456, 0.406],
|
|
std=[0.229, 0.224, 0.225])])
|
|
print('The size of dataset: ',self.data_size)
|
|
|
|
def load_img(self, path, angle=0):
|
|
img = cv2.imread(path)
|
|
img_color = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
|
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
img_color = self.rotate(img_color, angle)
|
|
img_gray = self.rotate(img_gray, angle)
|
|
return img_color, img_gray
|
|
|
|
def load_parse(self, path, angle=0):
|
|
parse = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
|
|
parse = self.rotate(parse, angle)
|
|
return parse
|
|
|
|
def rotate(self, img, angle):
|
|
img = Image.fromarray(img)
|
|
img = img.rotate(angle)
|
|
img = np.array(img)
|
|
return img
|
|
|
|
def preprocessing(self, color_img, gray_img, parse):
|
|
color_img = cv2.resize(color_img, (self.resize_size, self.resize_size))
|
|
gray_img = cv2.resize(gray_img, (self.resize_size, self.resize_size))
|
|
parse = cv2.resize(parse, (self.resize_size, self.resize_size), interpolation=cv2.INTER_NEAREST)
|
|
if np.random.random() > 0.5:
|
|
h1 = int(np.ceil(np.random.uniform(1e-2, self.resize_size - self.crop_size)))
|
|
w1 = int(np.ceil(np.random.uniform(1e-2, self.resize_size - self.crop_size)))
|
|
color_img = color_img[h1:h1 + self.crop_size, w1:w1 + self.crop_size]
|
|
gray_img = gray_img[h1:h1 + self.crop_size, w1:w1 + self.crop_size]
|
|
parse = parse[h1:h1 + self.crop_size, w1:w1 + self.crop_size]
|
|
if self.flip:
|
|
if np.random.random() > 0.5:
|
|
color_img = np.fliplr(color_img)
|
|
gray_img = np.fliplr(gray_img)
|
|
parse = np.fliplr(parse)
|
|
color_img = cv2.resize(color_img, (self.crop_size, self.crop_size))
|
|
gray_img = cv2.resize(gray_img, (self.crop_size, self.crop_size))
|
|
parse = cv2.resize(parse, (self.crop_size, self.crop_size), interpolation=cv2.INTER_NEAREST)
|
|
return color_img, gray_img, parse
|
|
|
|
def split_parse(self, parse):
|
|
# 0背景;1面部;2左眉毛;3右眉毛;4左眼;5右眼;6眼镜
|
|
# 7左耳朵;8右耳朵;9耳环;10鼻子;11口内部;12上嘴唇
|
|
# 13下嘴唇;14脖子;15项链;16衣服;17头发;18帽子
|
|
h, w = parse.shape
|
|
result = np.zeros([h, w, self.semantic_dim])
|
|
# 与面部无关的都是背景
|
|
result[:, :, 0][np.where(parse == 0)] = 1
|
|
result[:, :, 0][np.where(parse == 16)] = 1
|
|
result[:, :, 0][np.where(parse == 17)] = 1
|
|
result[:, :, 0][np.where(parse == 18)] = 1
|
|
result[:, :, 0][np.where(parse == 9)] = 1
|
|
result[:, :, 1][np.where(parse == 1)] = 1
|
|
result[:, :, 2][np.where(parse == 2)] = 1
|
|
result[:, :, 2][np.where(parse == 3)] = 1
|
|
result[:, :, 3][np.where(parse == 4)] = 1
|
|
result[:, :, 3][np.where(parse == 5)] = 1
|
|
result[:, :, 1][np.where(parse == 6)] = 1
|
|
result[:, :, 4][np.where(parse == 7)] = 1
|
|
result[:, :, 4][np.where(parse == 8)] = 1
|
|
# result[:, :, 4][np.where(parse == 9)] = 1
|
|
result[:, :, 5][np.where(parse == 10)] = 1
|
|
result[:, :, 6][np.where(parse == 11)] = 1
|
|
result[:, :, 7][np.where(parse == 12)] = 1
|
|
result[:, :, 8][np.where(parse == 13)] = 1
|
|
result[:, :, 9][np.where(parse == 14)] = 1
|
|
result[:, :, 9][np.where(parse == 15)] = 1
|
|
result = np.array(result)
|
|
return result
|
|
|
|
def local_masks(self, split_parse):
|
|
h, w, c = split_parse.shape
|
|
all_mask = np.zeros([h, w])
|
|
all_mask[np.where(split_parse[:, :, 0] == 0)] = 1
|
|
all_mask[np.where(split_parse[:, :, 3] == 1)] = 0
|
|
all_mask[np.where(split_parse[:, :, 6] == 1)] = 0
|
|
|
|
brow_mask = np.zeros([h, w])
|
|
brow_mask[np.where(split_parse[:, :, 2] == 1)] = 1
|
|
|
|
eye_mask = np.zeros([h, w])
|
|
eye_mask[np.where(split_parse[:, :, 3] == 1)] = 1
|
|
kernel = np.ones((30, 30), np.uint8)
|
|
if self.crop_size==512:
|
|
kernel = np.ones((60, 60), np.uint8)
|
|
if self.crop_size==1024:
|
|
kernel = np.ones((80, 80), np.uint8)
|
|
eye_maskall = cv2.dilate(eye_mask, kernel, iterations=1)
|
|
eye_mask = eye_maskall - eye_mask
|
|
eye_mask[np.where(all_mask == 0)] = 0
|
|
eye_mask[np.where(brow_mask == 1)] = 0
|
|
|
|
lip_mask = np.zeros([h, w])
|
|
lip_mask[np.where(split_parse[:, :, 7] == 1)] = 1
|
|
lip_mask[np.where(split_parse[:, :, 8] == 1)] = 1
|
|
|
|
face_mask = np.zeros([h, w])
|
|
face_mask[np.where(all_mask == 1)] = 1
|
|
face_mask[np.where(brow_mask == 1)] = 0
|
|
face_mask[np.where(eye_mask == 1)] = 0
|
|
face_mask[np.where(lip_mask == 1)] = 0
|
|
# 去掉脖子和耳朵
|
|
face_mask[np.where(split_parse[:, :, 4] == 1)] = 0
|
|
face_mask[np.where(split_parse[:, :, 9] == 1)] = 0
|
|
|
|
all_mask = np.expand_dims(all_mask, axis=2) # Expansion of the dimension
|
|
face_mask = np.expand_dims(face_mask, axis=2)
|
|
brow_mask = np.expand_dims(brow_mask, axis=2)
|
|
eye_mask = np.expand_dims(eye_mask, axis=2)
|
|
lip_mask = np.expand_dims(lip_mask, axis=2)
|
|
|
|
all_mask = np.concatenate((all_mask, all_mask, all_mask), axis=2)
|
|
face_mask = np.concatenate((face_mask, face_mask, face_mask), axis=2)
|
|
brow_mask = np.concatenate((brow_mask, brow_mask, brow_mask), axis=2)
|
|
eye_mask = np.concatenate((eye_mask, eye_mask, eye_mask), axis=2)
|
|
lip_mask = np.concatenate((lip_mask, lip_mask, lip_mask), axis=2)
|
|
|
|
return all_mask, face_mask, brow_mask, eye_mask, lip_mask
|
|
|
|
def affine_transform(self, x, theta):
|
|
theta = theta.view(-1, 2, 3)
|
|
grid = F.affine_grid(theta, x.size(), align_corners=True)
|
|
x = F.grid_sample(x, grid, mode='nearest', align_corners=True)
|
|
return x
|
|
|
|
def test_preprocessing(self, color_img, gray_img, parse):
|
|
color_img = cv2.resize(color_img, (self.resize_size, self.resize_size))
|
|
gray_img = cv2.resize(gray_img, (self.resize_size, self.resize_size))
|
|
parse = cv2.resize(parse, (self.resize_size, self.resize_size), interpolation=cv2.INTER_NEAREST)
|
|
h1 = (self.resize_size - self.crop_size) // 2
|
|
w1 = (self.resize_size - self.crop_size) // 2
|
|
|
|
color_img = color_img[h1:h1 + self.crop_size, w1:w1 + self.crop_size]
|
|
gray_img = gray_img[h1:h1 + self.crop_size, w1:w1 + self.crop_size]
|
|
parse = parse[h1:h1 + self.crop_size, w1:w1 + self.crop_size]
|
|
color_img = cv2.resize(color_img, (self.crop_size, self.crop_size))
|
|
gray_img = cv2.resize(gray_img, (self.crop_size, self.crop_size))
|
|
parse = cv2.resize(parse, (self.crop_size, self.crop_size), interpolation=cv2.INTER_NEAREST)
|
|
return color_img, gray_img, parse
|
|
|
|
def change_color_processing(self,image):
|
|
color_img = Image.fromarray(image.astype('uint8'))
|
|
color_img_change = self.color_transform(color_img).unsqueeze(0)
|
|
color_img_change = np.array(color_img_change.squeeze(0).data) * 255.
|
|
color_img_change = np.transpose(color_img_change, (1, 2, 0))
|
|
return color_img_change
|
|
|
|
def self_supervised_processing(self, color_img, parse):
|
|
color_img = Image.fromarray(color_img.astype('uint8'))
|
|
color_img_change = self.color_transform(color_img).unsqueeze(0)
|
|
|
|
parse = Image.fromarray((parse).astype('uint8'))
|
|
parse = self.type_transform(parse).unsqueeze(0)
|
|
|
|
# generate reference image
|
|
theta1 = np.zeros(9)
|
|
theta1[0:6] = np.random.randn(6) * 0.15
|
|
theta1 = theta1 + np.array([1, 0, 0, 0, 1, 0, 0, 0, 1])
|
|
affine1 = np.reshape(theta1, (3, 3))
|
|
affine1 = np.reshape(affine1, -1)[0:6]
|
|
affine1 = torch.from_numpy(affine1).type(torch.FloatTensor)
|
|
# print(reference_img_1.size())
|
|
color_img_change_warp = self.affine_transform(color_img_change, affine1)
|
|
|
|
color_img_change = np.array(color_img_change.squeeze(0).data) * 255.
|
|
color_img_change = np.transpose(color_img_change, (1, 2, 0))
|
|
color_img_change_warp = np.array(color_img_change_warp.squeeze(0).data) * 255.
|
|
color_img_change_warp = np.transpose(color_img_change_warp, (1, 2, 0))
|
|
|
|
parse_warp = self.affine_transform(parse, affine1)
|
|
parse_warp = np.array(parse_warp.squeeze(0).data) * 255.
|
|
parse_warp = np.transpose(parse_warp, (1, 2, 0))
|
|
parse_warp = parse_warp.astype('uint8') # 变换到[0,1]
|
|
return color_img_change, color_img_change_warp, np.round(parse_warp)
|
|
|
|
def __getitem__(self, index):
|
|
if self.phase == 'train':
|
|
# 需要加载:1未化妆图像;2未化妆图像的灰度图;3未化妆图像语义解析;4未化妆图像的局部mask
|
|
# 5化妆图像;6化妆图像的语义解析;7化妆图像的局部mask
|
|
# 8化妆图像color扰动,9化妆图像color扰动后的warp结果,10化妆图像color扰动后的warp结果的mask
|
|
# 11未化妆图像归一化图像;12化妆图像归一化图像;13化妆图像color扰动后的warp结果warp结果
|
|
non_makeup_index = index
|
|
makeup_index = random.randint(0, self.makeup_size - 1)
|
|
|
|
# 随机旋转
|
|
if random.random() > 0.2:
|
|
non_makeup_angle = np.random.randint(0, 60) - 30
|
|
makeup_angle = np.random.randint(0, 60) - 30
|
|
else:
|
|
non_makeup_angle = 0
|
|
makeup_angle = 0
|
|
# 加载color和gray图像
|
|
non_makeup_color_img, non_makeup_gray_img = self.load_img(self.non_makeup_path[non_makeup_index],
|
|
non_makeup_angle)
|
|
makeup_color_img, makeup_gray_img = self.load_img(self.makeup_path[makeup_index], makeup_angle)
|
|
|
|
# 加载parse
|
|
non_makeup_parse = self.load_parse(
|
|
self.non_makeup_path[non_makeup_index].replace('images', 'seg1')[:-4] + '.png',non_makeup_angle)
|
|
makeup_parse = self.load_parse(self.makeup_path[makeup_index].replace('images', 'seg1')[:-4] + '.png',makeup_angle)
|
|
|
|
# 数据增强
|
|
non_makeup_color_img, non_makeup_gray_img, non_makeup_parse = self.preprocessing(non_makeup_color_img,
|
|
non_makeup_gray_img,
|
|
non_makeup_parse)
|
|
makeup_color_img, makeup_gray_img, makeup_parse = self.preprocessing(makeup_color_img, makeup_gray_img,
|
|
makeup_parse)
|
|
|
|
# 数据增强,自监督
|
|
makeup_color_change_img, makeup_color_change_warp_img, makeup_warp_parse = self.self_supervised_processing(
|
|
makeup_color_img, makeup_parse)
|
|
makeup_warp_parse = np.squeeze(makeup_warp_parse, axis=-1)
|
|
|
|
makeup_color_change_img2 = self.change_color_processing(makeup_color_img)
|
|
makeup_color_change_img3 = self.change_color_processing(makeup_color_img)
|
|
makeup_color_change_img4 = self.change_color_processing(makeup_color_img)
|
|
|
|
# if random.random() > 0.5:
|
|
# makeup_color_change_warp_img = np.fliplr(makeup_color_change_warp_img)
|
|
# makeup_warp_parse = np.fliplr(makeup_warp_parse)
|
|
|
|
# 处理parse变为通道数为N的数据格式
|
|
non_makeup_split_parse = self.split_parse(non_makeup_parse)
|
|
makeup_split_parse = self.split_parse(makeup_parse)
|
|
# print(np.unique(makeup_warp_parse))
|
|
makeup_split_parse_warp = self.split_parse(makeup_warp_parse)
|
|
|
|
# 加载局部mask
|
|
non_makeup_all_mask, non_makeup_face_mask, non_makeup_brow_mask, non_makeup_eye_mask, non_makeup_lip_mask = self.local_masks(
|
|
non_makeup_split_parse)
|
|
makeup_all_mask, makeup_face_mask, makeup_brow_mask, makeup_eye_mask, makeup_lip_mask = self.local_masks(
|
|
makeup_split_parse)
|
|
|
|
makeup_all_warp_mask, makeup_face_warp_mask, makeup_brow_warp_mask, makeup_eye_warp_mask, makeup_lip_warp_mask = self.local_masks(
|
|
makeup_split_parse_warp)
|
|
|
|
# non_makeup_split_parse[:,:,-1]=non_makeup_eye_mask[:,:,0]
|
|
# makeup_split_parse[:, :, -1] = makeup_eye_mask[:, :, 0]
|
|
# makeup_split_parse_warp[:, :, -1] = makeup_eye_warp_mask[:, :, 0]
|
|
|
|
# 各种归一化
|
|
|
|
non_makeup_color_img_norm = Image.fromarray(non_makeup_color_img.astype('uint8'))
|
|
# print(np.unique(non_makeup_color_img_norm))
|
|
non_makeup_color_img_norm = self.image_resnet_transform(non_makeup_color_img_norm)
|
|
|
|
makeup_color_img_norm = Image.fromarray(makeup_color_img.astype('uint8'))
|
|
# print(np.unique(makeup_color_img_norm))
|
|
makeup_color_img_norm = self.image_resnet_transform(makeup_color_img_norm)
|
|
|
|
makeup_color_change_warp_img_norm = Image.fromarray(makeup_color_change_warp_img.astype('uint8'))
|
|
# print(np.unique(makeup_color_change_warp_img_norm))
|
|
makeup_color_change_warp_img_norm = self.image_resnet_transform(makeup_color_change_warp_img_norm)
|
|
|
|
# makeup_color_change_img[np.where(makeup_all_mask == 0)] = 0
|
|
makeup_color_change_img = makeup_color_change_img / 127.5 - 1
|
|
makeup_color_change_img = np.transpose(makeup_color_change_img, (2, 0, 1))
|
|
|
|
makeup_color_change_img2 = makeup_color_change_img2 / 127.5 - 1
|
|
makeup_color_change_img2 = np.transpose(makeup_color_change_img2, (2, 0, 1))
|
|
|
|
makeup_color_change_img3 = makeup_color_change_img3 / 127.5 - 1
|
|
makeup_color_change_img3 = np.transpose(makeup_color_change_img3, (2, 0, 1))
|
|
|
|
makeup_color_change_img4 = makeup_color_change_img4 / 127.5 - 1
|
|
makeup_color_change_img4 = np.transpose(makeup_color_change_img4, (2, 0, 1))
|
|
|
|
makeup_color_change_warp_img = makeup_color_change_warp_img / 127.5 - 1
|
|
makeup_color_change_warp_img = np.transpose(makeup_color_change_warp_img, (2, 0, 1))
|
|
makeup_split_parse_warp = np.transpose(makeup_split_parse_warp, (2, 0, 1))
|
|
makeup_all_warp_mask = np.transpose(makeup_all_warp_mask, (2, 0, 1))
|
|
makeup_face_warp_mask = np.transpose(makeup_face_warp_mask, (2, 0, 1))
|
|
makeup_brow_warp_mask = np.transpose(makeup_brow_warp_mask, (2, 0, 1))
|
|
makeup_eye_warp_mask = np.transpose(makeup_eye_warp_mask, (2, 0, 1))
|
|
makeup_lip_warp_mask = np.transpose(makeup_lip_warp_mask, (2, 0, 1))
|
|
|
|
non_makeup_color_img = non_makeup_color_img / 127.5 - 1
|
|
non_makeup_color_img = np.transpose(non_makeup_color_img, (2, 0, 1))
|
|
# non_makeup_gray_img[np.where(non_makeup_all_mask[:,:,0]==0)]=0
|
|
non_makeup_gray_img = np.expand_dims(non_makeup_gray_img, -1)
|
|
non_makeup_gray_img = non_makeup_gray_img / 127.5 - 1
|
|
non_makeup_gray_img = np.transpose(non_makeup_gray_img, (2, 0, 1))
|
|
|
|
non_makeup_split_parse = np.transpose(non_makeup_split_parse, (2, 0, 1))
|
|
non_makeup_all_mask = np.transpose(non_makeup_all_mask, (2, 0, 1))
|
|
non_makeup_face_mask = np.transpose(non_makeup_face_mask, (2, 0, 1))
|
|
non_makeup_brow_mask = np.transpose(non_makeup_brow_mask, (2, 0, 1))
|
|
non_makeup_eye_mask = np.transpose(non_makeup_eye_mask, (2, 0, 1))
|
|
non_makeup_lip_mask = np.transpose(non_makeup_lip_mask, (2, 0, 1))
|
|
|
|
makeup_color_img = makeup_color_img / 127.5 - 1
|
|
makeup_color_img = np.transpose(makeup_color_img, (2, 0, 1))
|
|
# makeup_gray_img[np.where(makeup_all_mask[:,:,0] == 0)] = 0
|
|
makeup_gray_img = np.expand_dims(makeup_gray_img, -1)
|
|
makeup_gray_img = makeup_gray_img / 127.5 - 1
|
|
makeup_gray_img = np.transpose(makeup_gray_img, (2, 0, 1))
|
|
|
|
makeup_split_parse = np.transpose(makeup_split_parse, (2, 0, 1))
|
|
makeup_all_mask = np.transpose(makeup_all_mask, (2, 0, 1))
|
|
makeup_face_mask = np.transpose(makeup_face_mask, (2, 0, 1))
|
|
makeup_brow_mask = np.transpose(makeup_brow_mask, (2, 0, 1))
|
|
makeup_eye_mask = np.transpose(makeup_eye_mask, (2, 0, 1))
|
|
makeup_lip_mask = np.transpose(makeup_lip_mask, (2, 0, 1))
|
|
|
|
data = {'non_makeup_color_img_norm': non_makeup_color_img_norm,
|
|
'makeup_color_img_norm': makeup_color_img_norm,
|
|
'makeup_color_change_warp_img_norm': makeup_color_change_warp_img_norm,
|
|
|
|
'non_makeup_color_img': torch.from_numpy(non_makeup_color_img).type(torch.FloatTensor),
|
|
'non_makeup_gray_img': torch.from_numpy(non_makeup_gray_img).type(torch.FloatTensor),
|
|
'non_makeup_split_parse': torch.from_numpy(non_makeup_split_parse).type(torch.FloatTensor),
|
|
'non_makeup_all_mask': torch.from_numpy(non_makeup_all_mask).type(torch.FloatTensor),
|
|
'non_makeup_face_mask': torch.from_numpy(non_makeup_face_mask).type(torch.FloatTensor),
|
|
'non_makeup_brow_mask': torch.from_numpy(non_makeup_brow_mask).type(torch.FloatTensor),
|
|
'non_makeup_eye_mask': torch.from_numpy(non_makeup_eye_mask).type(torch.FloatTensor),
|
|
'non_makeup_lip_mask': torch.from_numpy(non_makeup_lip_mask).type(torch.FloatTensor),
|
|
|
|
'makeup_color_img': torch.from_numpy(makeup_color_img).type(torch.FloatTensor),
|
|
'makeup_gray_img': torch.from_numpy(makeup_gray_img).type(torch.FloatTensor),
|
|
'makeup_split_parse': torch.from_numpy(makeup_split_parse).type(torch.FloatTensor),
|
|
'makeup_all_mask': torch.from_numpy(makeup_all_mask).type(torch.FloatTensor),
|
|
'makeup_face_mask': torch.from_numpy(makeup_face_mask).type(torch.FloatTensor),
|
|
'makeup_brow_mask': torch.from_numpy(makeup_brow_mask).type(torch.FloatTensor),
|
|
'makeup_eye_mask': torch.from_numpy(makeup_eye_mask).type(torch.FloatTensor),
|
|
'makeup_lip_mask': torch.from_numpy(makeup_lip_mask).type(torch.FloatTensor),
|
|
|
|
'makeup_color_change_img': torch.from_numpy(makeup_color_change_img).type(torch.FloatTensor),
|
|
'makeup_color_change_warp_img': torch.from_numpy(makeup_color_change_warp_img).type(
|
|
torch.FloatTensor),
|
|
'makeup_all_warp_mask': torch.from_numpy(makeup_all_warp_mask).type(torch.FloatTensor),
|
|
'makeup_face_warp_mask': torch.from_numpy(makeup_face_warp_mask).type(torch.FloatTensor),
|
|
'makeup_brow_warp_mask': torch.from_numpy(makeup_brow_warp_mask).type(torch.FloatTensor),
|
|
'makeup_eye_warp_mask': torch.from_numpy(makeup_eye_warp_mask).type(torch.FloatTensor),
|
|
'makeup_lip_warp_mask': torch.from_numpy(makeup_lip_warp_mask).type(torch.FloatTensor),
|
|
'makeup_split_parse_warp': torch.from_numpy(makeup_split_parse_warp).type(torch.FloatTensor),
|
|
|
|
'makeup_color_change_img2': torch.from_numpy(makeup_color_change_img2).type(torch.FloatTensor),
|
|
'makeup_color_change_img3': torch.from_numpy(makeup_color_change_img3).type(torch.FloatTensor),
|
|
'makeup_color_change_img4': torch.from_numpy(makeup_color_change_img4).type(torch.FloatTensor),
|
|
}
|
|
return data
|
|
|
|
elif self.phase == 'test_pair':
|
|
non_makeup_index = index // self.makeup_size
|
|
makeup_index = index % self.makeup_size
|
|
# non_makeup_angle = np.random.randint(0, 60) - 30
|
|
# makeup_angle = np.random.randint(0, 60) - 30
|
|
non_makeup_color_img, non_makeup_gray_img = self.load_img(self.non_makeup_path[non_makeup_index])
|
|
makeup_color_img, makeup_gray_img = self.load_img(self.makeup_path[makeup_index])
|
|
|
|
# 加载parse
|
|
non_makeup_parse = self.load_parse(
|
|
self.non_makeup_path[non_makeup_index].replace('images', 'seg1')[:-4] + '.png')
|
|
makeup_parse = self.load_parse(self.makeup_path[makeup_index].replace('images', 'seg1')[:-4] + '.png')
|
|
|
|
# # 加载parse
|
|
# non_makeup_parse = self.load_parse(
|
|
# self.non_makeup_path[non_makeup_index].replace('images', 'seg1'))
|
|
# makeup_parse = self.load_parse(self.makeup_path[makeup_index].replace('images', 'seg1'))
|
|
|
|
# 数据增强
|
|
non_makeup_color_img, non_makeup_gray_img, non_makeup_parse = self.test_preprocessing(non_makeup_color_img,
|
|
non_makeup_gray_img,
|
|
non_makeup_parse)
|
|
makeup_color_img, makeup_gray_img, makeup_parse = self.test_preprocessing(makeup_color_img, makeup_gray_img,
|
|
makeup_parse)
|
|
|
|
# 处理parse变为通道数为N的数据格式
|
|
non_makeup_split_parse = self.split_parse(non_makeup_parse)
|
|
makeup_split_parse = self.split_parse(makeup_parse)
|
|
|
|
# 加载局部mask
|
|
non_makeup_all_mask, non_makeup_face_mask, non_makeup_brow_mask, non_makeup_eye_mask, non_makeup_lip_mask = self.local_masks(
|
|
non_makeup_split_parse)
|
|
makeup_all_mask, makeup_face_mask, makeup_brow_mask, makeup_eye_mask, makeup_lip_mask = self.local_masks(
|
|
makeup_split_parse)
|
|
|
|
# 各种归一化
|
|
|
|
non_makeup_color_img_norm = Image.fromarray(non_makeup_color_img.astype('uint8'))
|
|
# print(np.unique(non_makeup_color_img_norm))
|
|
non_makeup_color_img_norm = self.image_resnet_transform(non_makeup_color_img_norm)
|
|
|
|
makeup_color_img_norm = Image.fromarray(makeup_color_img.astype('uint8'))
|
|
# print(np.unique(makeup_color_img_norm))
|
|
makeup_color_img_norm = self.image_resnet_transform(makeup_color_img_norm)
|
|
|
|
non_makeup_color_img = non_makeup_color_img / 127.5 - 1
|
|
non_makeup_color_img = np.transpose(non_makeup_color_img, (2, 0, 1))
|
|
# non_makeup_gray_img[np.where(non_makeup_all_mask[:,:,0]==0)]=0
|
|
non_makeup_gray_img = np.expand_dims(non_makeup_gray_img, -1)
|
|
non_makeup_gray_img = non_makeup_gray_img / 127.5 - 1
|
|
non_makeup_gray_img = np.transpose(non_makeup_gray_img, (2, 0, 1))
|
|
|
|
non_makeup_split_parse = np.transpose(non_makeup_split_parse, (2, 0, 1))
|
|
non_makeup_all_mask = np.transpose(non_makeup_all_mask, (2, 0, 1))
|
|
non_makeup_face_mask = np.transpose(non_makeup_face_mask, (2, 0, 1))
|
|
non_makeup_brow_mask = np.transpose(non_makeup_brow_mask, (2, 0, 1))
|
|
non_makeup_eye_mask = np.transpose(non_makeup_eye_mask, (2, 0, 1))
|
|
non_makeup_lip_mask = np.transpose(non_makeup_lip_mask, (2, 0, 1))
|
|
|
|
makeup_color_img = makeup_color_img / 127.5 - 1
|
|
makeup_color_img = np.transpose(makeup_color_img, (2, 0, 1))
|
|
# makeup_gray_img[np.where(makeup_all_mask[:,:,0] == 0)] = 0
|
|
makeup_gray_img = np.expand_dims(makeup_gray_img, -1)
|
|
makeup_gray_img = makeup_gray_img / 127.5 - 1
|
|
makeup_gray_img = np.transpose(makeup_gray_img, (2, 0, 1))
|
|
|
|
makeup_split_parse = np.transpose(makeup_split_parse, (2, 0, 1))
|
|
makeup_all_mask = np.transpose(makeup_all_mask, (2, 0, 1))
|
|
makeup_face_mask = np.transpose(makeup_face_mask, (2, 0, 1))
|
|
makeup_brow_mask = np.transpose(makeup_brow_mask, (2, 0, 1))
|
|
makeup_eye_mask = np.transpose(makeup_eye_mask, (2, 0, 1))
|
|
makeup_lip_mask = np.transpose(makeup_lip_mask, (2, 0, 1))
|
|
|
|
data = {'non_makeup_color_img_norm': non_makeup_color_img_norm,
|
|
'makeup_color_img_norm': makeup_color_img_norm,
|
|
|
|
'non_makeup_color_img': torch.from_numpy(non_makeup_color_img).type(torch.FloatTensor),
|
|
'non_makeup_gray_img': torch.from_numpy(non_makeup_gray_img).type(torch.FloatTensor),
|
|
'non_makeup_split_parse': torch.from_numpy(non_makeup_split_parse).type(torch.FloatTensor),
|
|
'non_makeup_all_mask': torch.from_numpy(non_makeup_all_mask).type(torch.FloatTensor),
|
|
'non_makeup_face_mask': torch.from_numpy(non_makeup_face_mask).type(torch.FloatTensor),
|
|
'non_makeup_brow_mask': torch.from_numpy(non_makeup_brow_mask).type(torch.FloatTensor),
|
|
'non_makeup_eye_mask': torch.from_numpy(non_makeup_eye_mask).type(torch.FloatTensor),
|
|
'non_makeup_lip_mask': torch.from_numpy(non_makeup_lip_mask).type(torch.FloatTensor),
|
|
|
|
'makeup_color_img': torch.from_numpy(makeup_color_img).type(torch.FloatTensor),
|
|
'makeup_gray_img': torch.from_numpy(makeup_gray_img).type(torch.FloatTensor),
|
|
'makeup_split_parse': torch.from_numpy(makeup_split_parse).type(torch.FloatTensor),
|
|
'makeup_all_mask': torch.from_numpy(makeup_all_mask).type(torch.FloatTensor),
|
|
'makeup_face_mask': torch.from_numpy(makeup_face_mask).type(torch.FloatTensor),
|
|
'makeup_brow_mask': torch.from_numpy(makeup_brow_mask).type(torch.FloatTensor),
|
|
'makeup_eye_mask': torch.from_numpy(makeup_eye_mask).type(torch.FloatTensor),
|
|
'makeup_lip_mask': torch.from_numpy(makeup_lip_mask).type(torch.FloatTensor)
|
|
}
|
|
return data
|
|
else:
|
|
raise ValueError(f'This mode {self.opt.phase} is currently not supported')
|
|
|
|
def __len__(self):
|
|
return self.data_size
|
|
|
|
|
|
if __name__ == '__main__':
|
|
def save_imgs(imgs, names, path):
|
|
if not os.path.exists(path):
|
|
os.mkdir(path)
|
|
for img, name in zip(imgs, names):
|
|
img = tensor2img(img)
|
|
img = np.array(img)
|
|
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
|
|
cv2.imwrite(os.path.join(path, name + '.jpg'), img)
|
|
|
|
|
|
def tensor2img(img):
|
|
img = img[0].cpu().float().numpy()
|
|
if img.shape[0] == 1:
|
|
img = np.tile(img, (3, 1, 1))
|
|
img = (np.transpose(img, (1, 2, 0)) + 1) / 2.0 * 255.0
|
|
return img.astype(np.uint8)
|
|
|
|
|
|
from options import Options
|
|
|
|
parser = Options()
|
|
opts = parser.parse()
|
|
opts.data_root='../MT-Dataset/images'
|
|
|
|
# data loader
|
|
print('\n--- load dataset ---')
|
|
dataset = MakeupDataset(opts)
|
|
train_loader = torch.utils.data.DataLoader(dataset, batch_size=opts.batch_size, shuffle=True,
|
|
num_workers=opts.nThreads)
|
|
|
|
data_names = ['non_makeup_color_img', 'non_makeup_all_mask', 'non_makeup_face_mask',
|
|
'non_makeup_brow_mask',
|
|
'non_makeup_eye_mask', 'non_makeup_lip_mask', 'makeup_color_img',
|
|
'makeup_all_mask', 'makeup_face_mask',
|
|
'makeup_brow_mask', 'makeup_eye_mask', 'makeup_lip_mask', 'makeup_color_change_img',
|
|
'makeup_color_change_warp_img', 'makeup_all_warp_mask']
|
|
|
|
print('dataset size:', len(train_loader))
|
|
for i, data in enumerate(train_loader):
|
|
if i > 5:
|
|
break
|
|
print(i)
|
|
imgs = [data[x] for x in data_names]
|
|
names = [str(i) + x for x in data_names]
|
|
save_imgs(imgs, names, path='./debug_load_dataset')
|