| import os
|
| import sys
|
| current_file_path = os.path.abspath(__file__)
|
| parent_dir = os.path.dirname(os.path.dirname(current_file_path))
|
| project_root_dir = os.path.dirname(parent_dir)
|
| sys.path.append(parent_dir)
|
| sys.path.append(project_root_dir)
|
|
|
| import cv2
|
| import random
|
| import yaml
|
| import torch
|
| import numpy as np
|
| from copy import deepcopy
|
| import albumentations as A
|
| from .abstract_dataset import DeepfakeAbstractBaseDataset
|
| from PIL import Image
|
|
|
| c=0
|
|
|
| class LRLDataset(DeepfakeAbstractBaseDataset):
|
| def __init__(self, config=None, mode='train'):
|
| super().__init__(config, mode)
|
| global c
|
| c=config
|
|
|
| def multi_pass_filter(self, img, r1=0.33, r2=0.66):
|
| rows, cols = img.shape
|
| k = cols / rows
|
|
|
| mask = np.zeros((rows, cols), np.uint8)
|
| x, y = np.ogrid[:rows, :cols]
|
| mask_area = (k * x + y < r1 * cols)
|
| mask[mask_area] = 1
|
| low_mask = mask
|
|
|
| mask = np.ones((rows, cols), np.uint8)
|
| x, y = np.ogrid[:rows, :cols]
|
| mask_area = (k * x + y < r2 * cols)
|
| mask[mask_area] = 0
|
| high_mask = mask
|
|
|
| mask1 = np.zeros((rows, cols), np.uint8)
|
| mask1[low_mask == 0] = 1
|
| mask2 = np.zeros((rows, cols), np.uint8)
|
| mask2[high_mask == 0] = 1
|
| mid_mask = mask1 * mask2
|
|
|
| return low_mask, mid_mask, high_mask
|
|
|
| def image2dct(self,img):
|
| img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
|
| img_gray = np.float32(img_gray)
|
| img_dct = cv2.dct(img_gray)
|
|
|
|
|
| low_mask, mid_mask, high_mask = self.multi_pass_filter(img_dct, r1=0.33, r2=0.33)
|
| img_dct_filterd = high_mask * img_dct
|
| img_idct = cv2.idct(img_dct_filterd)
|
|
|
| return img_idct
|
|
|
| def __getitem__(self, index):
|
| image_trans, label, landmark_tensors, mask_trans = super().__getitem__(index, no_norm=True)
|
|
|
| img_idct = self.image2dct(image_trans)
|
|
|
| img_idct = (img_idct / 255 - 0.5) / 0.5
|
|
|
|
|
|
|
| image_trans = self.normalize(self.to_tensor(image_trans))
|
| img_idct_trans = self.to_tensor(img_idct)
|
| mask_trans = torch.from_numpy(mask_trans)
|
| mask_trans = mask_trans.squeeze(2).permute(2, 0, 1)
|
| mask_trans = torch.mean(mask_trans, dim=0, keepdim=True)
|
| return image_trans, label, img_idct_trans, mask_trans
|
|
|
| def __len__(self):
|
| return len(self.image_list)
|
|
|
|
|
| @staticmethod
|
| def collate_fn(batch):
|
| """
|
| Collate a batch of data points.
|
|
|
| Args:
|
| batch (list): A list of tuples containing the image tensor and label tensor.
|
|
|
| Returns:
|
| A tuple containing the image tensor, the label tensor, the landmark tensor,
|
| and the mask tensor.
|
| """
|
| global c
|
| images, labels, img_idct_trans, masks = zip(*batch)
|
|
|
| images = torch.stack(images, dim=0)
|
| labels = torch.LongTensor(labels)
|
| masks = torch.stack(masks, dim=0)
|
| img_idct_trans = torch.stack(img_idct_trans, dim=0)
|
|
|
| data_dict = {
|
| 'image': images,
|
| 'label': labels,
|
| 'landmark': None,
|
| 'idct': img_idct_trans,
|
| 'mask': masks,
|
| }
|
| return data_dict
|
|
|
|
|
|
|
| if __name__ == '__main__':
|
| with open(r'H:\code\DeepfakeBench\training\config\detector\lrl_effnb4.yaml', 'r') as f:
|
| config = yaml.safe_load(f)
|
| with open(r'H:\code\DeepfakeBench\training\config\train_config.yaml', 'r') as f:
|
| config2 = yaml.safe_load(f)
|
| random.seed(config['manualSeed'])
|
| torch.manual_seed(config['manualSeed'])
|
| if config['cuda']:
|
| torch.cuda.manual_seed_all(config['manualSeed'])
|
| config2['data_manner'] = 'lmdb'
|
| config['dataset_json_folder'] = 'preprocessing/dataset_json_v3'
|
| config.update(config2)
|
| train_set = LRLDataset(config=config, mode='train')
|
| train_data_loader = \
|
| torch.utils.data.DataLoader(
|
| dataset=train_set,
|
| batch_size=4,
|
| shuffle=True,
|
| num_workers=0,
|
| collate_fn=train_set.collate_fn,
|
| )
|
| from tqdm import tqdm
|
| for iteration, batch in enumerate(tqdm(train_data_loader)):
|
| print(iteration)
|
| if iteration > 10:
|
| break |