def __init__(self, args, data_subset, transform=None, sample_inds=None): BaseDataset.__init__(self, args, data_subset) if transform is None: transform = BasicImagenetTransform(self.size, data_subset) datasets.ImageFolder.__init__(self, os.path.join(self.args.imagenet_data_path, data_subset), transform) if sample_inds is not None: self.samples = [self.samples[ii] for ii in sorted(sample_inds)]
def __init__(self, opt): """Initialize this dataset class. Parameters: opt (Option class) -- stores all the experiment flags; needs to be a subclass of BaseOptions """ BaseDataset.__init__(self, opt) self.A_paths = sorted(make_dataset(opt.dataroot, opt.max_dataset_size)) input_nc = self.opt.output_nc if self.opt.direction == 'BtoA' else self.opt.input_nc self.transform = get_transform(opt, grayscale=(input_nc == 1))
def __init__(self, train_file): BaseDataset.__init__(self, train_file) # original documents for test self.train_documents = [] # vectorizers to apply self.vectorizer = TfidfVectorizer(min_df=1, ngram_range=(1, 1)) # score functions for feature_selector # for extra features self.extra_features_names = ['0'] * len(self.EXTRA_FEATURES) # for extra features. We do not know in advance the number of instances self.extra_features_values = None self._load()
def __init__(self, opt): BaseDataset.__init__(self, opt) self.image_list = util.get_file_list( os.path.join(self.opt.data_dir, 'crop')) self.landmark_dict = self.load_landmark_dict() self.transforms_input = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.5141, 0.4074, 0.3588], std=[1.0, 1.0, 1.0]) ]) self.transforms_gt = transforms.ToTensor()
def __init__(self, opt): """Initialize this dataset class. Parameters: opt (Option class) -- stores all the experiment flags; needs to be a subclass of BaseOptions """ BaseDataset.__init__(self, opt) self.dir_A = os.path.join(opt.dataroot, 'trainA') # create a path '/path/to/data/trainA' self.dir_B = os.path.join(opt.dataroot, 'trainB') # create a path '/path/to/data/trainB' if os.path.exists(self.dir_A) and os.path.exists(self.dir_B): self.A_paths = sorted(make_dataset(self.dir_A, opt.max_dataset_size)) # load images from '/path/to/data/trainA' self.B_paths = sorted(make_dataset(self.dir_B, opt.max_dataset_size)) # load images from '/path/to/data/trainB' self.A_size = len(self.A_paths) # get the size of dataset A self.B_size = len(self.B_paths) # get the size of dataset B assert len(self.A_paths) == 1 and len(self.B_paths) == 1,\ "SingleImageDataset class should be used with one image in each domain" A_img = Image.open(self.A_paths[0]).convert('RGB') B_img = Image.open(self.B_paths[0]).convert('RGB') print("Image sizes %s and %s" % (str(A_img.size), str(B_img.size))) self.A_img = A_img self.B_img = B_img # In single-image translation, we augment the data loader by applying # random scaling. Still, we design the data loader such that the # amount of scaling is the same within a minibatch. To do this, # we precompute the random scaling values, and repeat them by |batch_size|. A_zoom = 1 / self.opt.random_scale_max zoom_levels_A = np.random.uniform(A_zoom, 1.0, size=(len(self) // opt.batch_size + 1, 1, 2)) self.zoom_levels_A = np.reshape(np.tile(zoom_levels_A, (1, opt.batch_size, 1)), [-1, 2]) B_zoom = 1 / self.opt.random_scale_max zoom_levels_B = np.random.uniform(B_zoom, 1.0, size=(len(self) // opt.batch_size + 1, 1, 2)) self.zoom_levels_B = np.reshape(np.tile(zoom_levels_B, (1, opt.batch_size, 1)), [-1, 2]) # While the crop locations are randomized, the negative samples should # not come from the same location. To do this, we precompute the # crop locations with no repetition. self.patch_indices_A = list(range(len(self))) random.shuffle(self.patch_indices_A) self.patch_indices_B = list(range(len(self))) random.shuffle(self.patch_indices_B)
def __init__(self, opt): """Initialize this dataset class. Parameters: opt (Option class) -- stores all the experiment flags; needs to be a subclass of BaseOptions A few things can be done here. - save the options (have been done in BaseDataset) - get image paths and meta information of the dataset. - define the image transformation. """ # save the option and dataset root BaseDataset.__init__(self, opt) # get the image paths of your dataset; self.image_paths = [ ] # You can call sorted(make_dataset(self.root, opt.max_dataset_size)) to get all the image paths under the directory self.root # define the default transform function. You can use <base_dataset.get_transform>; You can also define your custom transform function self.transform = get_transform(opt)
def __init__(self, opt): """Initialize this dataset class. Parameters: opt (Option class) -- stores all the experiment flags; needs to be a subclass of BaseOptions """ BaseDataset.__init__(self, opt) self.dir_A = os.path.join(opt.dataroot, opt.phase + 'A') # create a path '/path/to/data/trainA' self.dir_B = os.path.join(opt.dataroot, opt.phase + 'B') # create a path '/path/to/data/trainB' if opt.phase == "test" and not os.path.exists(self.dir_A) \ and os.path.exists(os.path.join(opt.dataroot, "valA")): self.dir_A = os.path.join(opt.dataroot, "valA") self.dir_B = os.path.join(opt.dataroot, "valB") self.A_paths = sorted(make_dataset(self.dir_A, opt.max_dataset_size)) # load images from '/path/to/data/trainA' self.B_paths = sorted(make_dataset(self.dir_B, opt.max_dataset_size)) # load images from '/path/to/data/trainB' self.A_size = len(self.A_paths) # get the size of dataset A self.B_size = len(self.B_paths) # get the size of dataset B
def get_loader(self, dataset_file, transforms, gpu, train=False): required_input = None if 'required_input' in self._conf: required_input = self._conf['required_input'] # import dataset class form /datasets/ dataset_class = import_shortcut('datasets', self._args.dataset) # create BaseDataset wrapper base_dataset = BaseDataset(self._args.subdataset, self._data_conf, dataset_file, dataset_class, self._conf, gpu, transforms, required_input, self._cache_manager, train == False, self._verbose) batch_size = self._conf['batch_size'] # batch size shuffle_images = True # whether to randomly shuffle images # no need to shuffle if not training if train is False: shuffle_images = False # batch size=-1 means that we use the whole dataset for a batch if batch_size == -1: batch_size = len(base_dataset) shuffle_images = False # no need to shuffle sampler = None # import the sampler from /samplers/ if 'sampler' in self._conf: sampler_class = import_shortcut('samplers', self._conf['sampler']) sampler = sampler_class(base_dataset, batch_size) # create pytorch dataloader if sampler is None: loader = torch.utils.data.DataLoader( base_dataset, batch_size=batch_size, shuffle=shuffle_images, num_workers=self._args.workers) else: loader = torch.utils.data.DataLoader( base_dataset, batch_sampler=sampler, num_workers=self._args.workers) # create a cache dataloader with batch size=1 # we use this to show progress with tqdm cache_loader = torch.utils.data.DataLoader( base_dataset, batch_size=1, shuffle=False, num_workers=self._args.workers) return base_dataset, loader, cache_loader
def run_evaluation(model, opt, options, dataset_name, log_freq=50): """Run evaluation on the datasets and metrics we report in the paper. """ device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') # Create SMPL model smpl = SMPL().to(device) if dataset_name == '3dpw' or dataset_name == 'surreal': smpl_male = SMPL(cfg.MALE_SMPL_FILE).to(device) smpl_female = SMPL(cfg.FEMALE_SMPL_FILE).to(device) batch_size = opt.batch_size # Create dataloader for the dataset if dataset_name == 'surreal': dataset = SurrealDataset(options, use_augmentation=False, is_train=False, use_IUV=False) else: dataset = BaseDataset(options, dataset_name, use_augmentation=False, is_train=False, use_IUV=False) data_loader = DataLoader(dataset, batch_size=opt.batch_size, shuffle=False, num_workers=int(opt.num_workers), pin_memory=True) print('data loader finish') # Transfer model to the GPU device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') model.to(device) model.eval() # Pose metrics # MPJPE and Reconstruction error for the non-parametric and parametric shapes mpjpe = np.zeros(len(dataset)) mpjpe_pa = np.zeros(len(dataset)) # Shape metrics # Mean per-vertex error shape_err = np.zeros(len(dataset)) # Mask and part metrics # Accuracy accuracy = 0. parts_accuracy = 0. # True positive, false positive and false negative tp = np.zeros((2, 1)) fp = np.zeros((2, 1)) fn = np.zeros((2, 1)) parts_tp = np.zeros((7, 1)) parts_fp = np.zeros((7, 1)) parts_fn = np.zeros((7, 1)) # Pixel count accumulators pixel_count = 0 parts_pixel_count = 0 eval_pose = False eval_shape = False eval_masks = False eval_parts = False joint_mapper = cfg.J24_TO_J17 if dataset_name == 'mpi-inf-3dhp' else cfg.J24_TO_J14 # Choose appropriate evaluation for each dataset if 'h36m' in dataset_name or dataset_name == '3dpw' or dataset_name == 'mpi-inf-3dhp': eval_pose = True elif dataset_name in ['up-3d', 'surreal']: eval_shape = True elif dataset_name == 'lsp': eval_masks = True eval_parts = True annot_path = cfg.DATASET_FOLDERS['upi-s1h'] if eval_parts or eval_masks: from utils.part_utils import PartRenderer renderer = PartRenderer() # Iterate over the entire dataset for step, batch in enumerate(tqdm(data_loader, desc='Eval', total=len(data_loader))): # Get ground truth annotations from the batch gt_pose = batch['pose'].to(device) gt_betas = batch['betas'].to(device) gt_vertices = smpl(gt_pose, gt_betas) images = batch['img'].to(device) curr_batch_size = images.shape[0] # Run inference with torch.no_grad(): out_dict = model(images) pred_vertices = out_dict['pred_vertices'] camera = out_dict['camera'] # 3D pose evaluation if eval_pose: # Get 14 ground truth joints if 'h36m' in dataset_name or 'mpi-inf' in dataset_name: gt_keypoints_3d = batch['pose_3d'].cuda() gt_keypoints_3d = gt_keypoints_3d[:, joint_mapper, :-1] gt_pelvis = (gt_keypoints_3d[:, [2]] + gt_keypoints_3d[:, [3]]) / 2 gt_keypoints_3d = gt_keypoints_3d - gt_pelvis else: gender = batch['gender'].to(device) gt_vertices = smpl_male(gt_pose, gt_betas) gt_vertices_female = smpl_female(gt_pose, gt_betas) gt_vertices[gender == 1, :, :] = gt_vertices_female[gender == 1, :, :] gt_keypoints_3d = smpl.get_train_joints(gt_vertices)[:, joint_mapper] # gt_keypoints_3d = smpl.get_lsp_joints(gt_vertices) # joints_regressor used in cmr gt_pelvis = (gt_keypoints_3d[:, [2]] + gt_keypoints_3d[:, [3]]) / 2 gt_keypoints_3d = gt_keypoints_3d - gt_pelvis # Get 14 predicted joints from the non-parametic mesh pred_keypoints_3d = smpl.get_train_joints(pred_vertices)[:, joint_mapper] # pred_keypoints_3d = smpl.get_lsp_joints(pred_vertices) # joints_regressor used in cmr pred_pelvis = (pred_keypoints_3d[:, [2]] + pred_keypoints_3d[:, [3]]) / 2 pred_keypoints_3d = pred_keypoints_3d - pred_pelvis # Absolute error (MPJPE) error = torch.sqrt(((pred_keypoints_3d - gt_keypoints_3d) ** 2).sum(dim=-1)).mean(dim=-1).cpu().numpy() mpjpe[step * batch_size:step * batch_size + curr_batch_size] = error # Reconstuction_error r_error = reconstruction_error(pred_keypoints_3d.cpu().numpy(), gt_keypoints_3d.cpu().numpy(), reduction=None) mpjpe_pa[step * batch_size:step * batch_size + curr_batch_size] = r_error # Shape evaluation (Mean per-vertex error) if eval_shape: if dataset_name == 'surreal': gender = batch['gender'].to(device) gt_vertices = smpl_male(gt_pose, gt_betas) gt_vertices_female = smpl_female(gt_pose, gt_betas) gt_vertices[gender == 1, :, :] = gt_vertices_female[gender == 1, :, :] gt_pelvis_mesh = smpl.get_eval_joints(gt_vertices) pred_pelvis_mesh = smpl.get_eval_joints(pred_vertices) gt_pelvis_mesh = (gt_pelvis_mesh[:, [2]] + gt_pelvis_mesh[:, [3]]) / 2 pred_pelvis_mesh = (pred_pelvis_mesh[:, [2]] + pred_pelvis_mesh[:, [3]]) / 2 # se = torch.sqrt(((pred_vertices - gt_vertices) ** 2).sum(dim=-1)).mean(dim=-1).cpu().numpy() se = torch.sqrt(((pred_vertices - pred_pelvis_mesh - gt_vertices + gt_pelvis_mesh) ** 2).sum(dim=-1)).mean(dim=-1).cpu().numpy() shape_err[step * batch_size:step * batch_size + curr_batch_size] = se # If mask or part evaluation, render the mask and part images if eval_masks or eval_parts: mask, parts = renderer(pred_vertices, camera) # Mask evaluation (for LSP) if eval_masks: center = batch['center'].cpu().numpy() scale = batch['scale'].cpu().numpy() # Dimensions of original image orig_shape = batch['orig_shape'].cpu().numpy() for i in range(curr_batch_size): # After rendering, convert imate back to original resolution pred_mask = uncrop(mask[i].cpu().numpy(), center[i], scale[i], orig_shape[i]) > 0 # Load gt mask gt_mask = cv2.imread(os.path.join(annot_path, batch['maskname'][i]), 0) > 0 # Evaluation consistent with the original UP-3D code accuracy += (gt_mask == pred_mask).sum() pixel_count += np.prod(np.array(gt_mask.shape)) for c in range(2): cgt = gt_mask == c cpred = pred_mask == c tp[c] += (cgt & cpred).sum() fp[c] += (~cgt & cpred).sum() fn[c] += (cgt & ~cpred).sum() f1 = 2 * tp / (2 * tp + fp + fn) # Part evaluation (for LSP) if eval_parts: center = batch['center'].cpu().numpy() scale = batch['scale'].cpu().numpy() orig_shape = batch['orig_shape'].cpu().numpy() for i in range(curr_batch_size): pred_parts = uncrop(parts[i].cpu().numpy().astype(np.uint8), center[i], scale[i], orig_shape[i]) # Load gt part segmentation gt_parts = cv2.imread(os.path.join(annot_path, batch['partname'][i]), 0) # Evaluation consistent with the original UP-3D code # 6 parts + background for c in range(7): cgt = gt_parts == c cpred = pred_parts == c cpred[gt_parts == 255] = 0 parts_tp[c] += (cgt & cpred).sum() parts_fp[c] += (~cgt & cpred).sum() parts_fn[c] += (cgt & ~cpred).sum() gt_parts[gt_parts == 255] = 0 pred_parts[pred_parts == 255] = 0 parts_f1 = 2 * parts_tp / (2 * parts_tp + parts_fp + parts_fn) parts_accuracy += (gt_parts == pred_parts).sum() parts_pixel_count += np.prod(np.array(gt_parts.shape)) # Print intermediate results during evaluation if step % log_freq == log_freq - 1: if eval_pose: print('MPJPE: ' + str(1000 * mpjpe[:step * batch_size].mean())) print('MPJPE-PA: ' + str(1000 * mpjpe_pa[:step * batch_size].mean())) print() if eval_shape: print('Shape Error: ' + str(1000 * shape_err[:step * batch_size].mean())) print() if eval_masks: print('Accuracy: ', accuracy / pixel_count) print('F1: ', f1.mean()) print() if eval_parts: print('Parts Accuracy: ', parts_accuracy / parts_pixel_count) print('Parts F1 (BG): ', parts_f1[[0, 1, 2, 3, 4, 5, 6]].mean()) print() # Print final results during evaluation print('*** Final Results ***') print() if eval_pose: print('MPJPE: ' + str(1000 * mpjpe.mean())) print('MPJPE-PA: ' + str(1000 * mpjpe_pa.mean())) print() if eval_shape: print('Shape Error: ' + str(1000 * shape_err.mean())) print() if eval_masks: print('Accuracy: ', accuracy / pixel_count) print('F1: ', f1.mean()) print() if eval_parts: print('Parts Accuracy: ', parts_accuracy / parts_pixel_count) print('Parts F1 (BG): ', parts_f1[[0, 1, 2, 3, 4, 5, 6]].mean()) print() # Save final results to .txt file txt_name = join(opt.save_root, dataset_name + '.txt') f = open(txt_name, 'w') f.write('*** Final Results ***') f.write('\n') if eval_pose: f.write('MPJPE: ' + str(1000 * mpjpe.mean())) f.write('\n') f.write('MPJPE-PA: ' + str(1000 * mpjpe_pa.mean())) f.write('\n') if eval_shape: f.write('Shape Error: ' + str(1000 * shape_err.mean())) f.write('\n') if eval_masks: f.write('Accuracy: ' + str(accuracy / pixel_count)) f.write('\n') f.write('F1: ' + str(f1.mean())) f.write('\n') if eval_parts: f.write('Parts Accuracy: ' + str(parts_accuracy / parts_pixel_count)) f.write('\n') f.write('Parts F1 (BG): ' + str(parts_f1[[0, 1, 2, 3, 4, 5, 6]].mean())) f.write('\n')
def __init__(self, opt, training): BaseDataset.__init__(self, opt, training) self.dirA = opt.dirA self.dirB = opt.dirB self.pathsA = file_utils.load_paths(self.dirA) self.pathsB = file_utils.load_paths(self.dirB)
def load_dataset(self): BaseDataset.load_dataset(self)
def __init__(self, configuration): BaseDataset.__init__(self, configuration)
def load_dataset(self): BaseDataset.load_dataset(self) if 'train_src_names' in self.configuration: self.y_train = np.asarray(self.y_train, dtype=np.float) elif 'test_src_names' in self.configuration: self.y_test = np.asarray(self.y_test, dtype=np.float)
from baseline.baseline_model import Seq2Seq from datasets.vocab import VocabEntry SEED = 1000 random.seed(SEED) np.random.seed(SEED) torch.manual_seed(SEED) torch.cuda.manual_seed(SEED) torch.backends.cudnn.deterministic = True device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') BATCH_SIZE = 4 dataset = BaseDataset(['kushman.json']) eqFlattened = [item for sublist in dataset.equations for item in sublist] quFlattened = [item for sublist in dataset.questions for item in sublist] eqFlattened.append('<unk>') quFlattened.append('<unk>') INPUT_DIM = len(set(quFlattened)) OUTPUT_DIM = len(set(eqFlattened)) src_vocab = VocabEntry(dict([(v, i) for i, v in enumerate(set(quFlattened))])) trg_vocab = VocabEntry(dict([(v, i) for i, v in enumerate(set(eqFlattened))])) train_size = int(len(dataset) * (3. / 10)) valid_size = int(len(dataset) * (1. / 10)) test_size = len(dataset) - train_size - valid_size
def __init__(self, opt, training): BaseDataset.__init__(self, opt, training) self.dir = opt.dir self.paths = file_utils.load_paths(self.dir)