| |
| import argparse |
| import cv2 |
| import numpy as np |
| import os, shutil |
| import sys |
| from multiprocessing import Pool |
| from os import path as osp |
| from tqdm import tqdm |
| import random |
| from collections import namedtuple |
|
|
| |
| root_path = os.path.abspath('.') |
| sys.path.append(root_path) |
| from degradation.ESR.usm_sharp import USMSharp |
|
|
|
|
| class worker: |
| def __init__(self, start_index=1): |
| |
| self.output_index = start_index |
| |
| def process(self, path, opt, usm_sharper): |
| ''' crop the image here (also do usm here) |
| Args: |
| path (str): path of the image |
| opt (dict): all setting in a dictionary |
| usm_sharper (class): usm sharpener |
| |
| Returns: |
| cropped_num (int): how many cropped images you have for this path |
| ''' |
|
|
| crop_size = opt['crop_size'] |
|
|
| |
| img = cv2.imread(path) |
| height, width = img.shape[0:2] |
|
|
| res_store = [] |
| crop_num = (height//crop_size)*(width//crop_size) |
| random_num = opt['crop_num_per_img'] |
|
|
| |
| shift_offset_h, shift_offset_w = 0, 0 |
|
|
| if random_num == -1: |
| |
| choices = [i for i in range(crop_num)] |
| shift_offset_h = 0 |
| shift_offset_w = 0 |
| else: |
| |
| num = min(random_num, crop_num) |
| choices = random.sample(range(crop_num), num) |
|
|
| for choice in choices: |
| row_num = (width//crop_size) |
| x, y = crop_size * (choice // row_num), crop_size * (choice % row_num) |
| |
| res_store.append((x, y)) |
|
|
| |
| |
| if opt['usm_save_folder'] != None: |
| sharpened_img = usm_sharper(img) |
| |
|
|
| for (h, w) in res_store: |
| cropped_img = img[h+shift_offset_h : h+crop_size+shift_offset_h, w+shift_offset_w : w+crop_size+shift_offset_w, ...] |
| cropped_img = np.ascontiguousarray(cropped_img) |
| cv2.imwrite(osp.join(opt['save_folder'], f'img_{self.output_index:06d}.png'), cropped_img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) |
|
|
| |
| if opt['usm_save_folder'] != None: |
| cropped_sharpened_img = sharpened_img[h+shift_offset_h : h+crop_size+shift_offset_h, w+shift_offset_w : w+crop_size+shift_offset_w, ...] |
| cropped_sharpened_img = np.ascontiguousarray(cropped_sharpened_img) |
| cv2.imwrite(osp.join(opt['usm_save_folder'], f'img_{self.output_index:06d}.png'), cropped_sharpened_img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) |
|
|
| self.output_index += 1 |
|
|
|
|
| cropped_num = len(res_store) |
| return cropped_num |
|
|
|
|
| def extract_subimages(opt): |
|
|
| |
| input_folders = opt['input_folders'] |
|
|
| |
| save_folder = opt['save_folder'] |
| usm_save_folder = opt['usm_save_folder'] |
|
|
| if osp.exists(save_folder): |
| print(f'Folder {save_folder} already exists. Program will delete this folder!') |
| shutil.rmtree(save_folder) |
|
|
| os.makedirs(save_folder) |
| if usm_save_folder != None: |
| if osp.exists(usm_save_folder): |
| print(f'Folder {usm_save_folder} already exists. Program will delete this folder!') |
| shutil.rmtree(usm_save_folder) |
|
|
| print("Use usm sharp") |
| os.makedirs(usm_save_folder) |
|
|
| |
| usm_sharper = USMSharp(type="cv2") |
|
|
| |
| start_index = 1 |
| for input_folder in input_folders: |
| print(input_folder, start_index) |
|
|
| |
| img_list = [] |
| for file in sorted(os.listdir(input_folder)): |
| if file.split(".")[-1] in ["png", "jpg"]: |
| img_list.append(osp.join(input_folder, file)) |
|
|
| |
| obj = worker(start_index=start_index) |
| for path in img_list: |
| if random.random() < opt['select_rate']: |
| cropped_num = obj.process(path, opt, usm_sharper) |
| start_index += cropped_num |
| print(start_index, path) |
| else: |
| print("SKIP") |
|
|
|
|
| print('All processes done.') |
|
|
|
|
| def main(args): |
| opt = {} |
|
|
| input_folders = [] |
| if type(args.input_folder) == str: |
| input_folders.append(args.input_folder) |
| else: |
| for input_folder in args.input_folder: |
| input_folders.append(input_folder) |
| print("input folders have ", input_folders) |
|
|
|
|
| opt['input_folders'] = input_folders |
| opt['save_folder'] = args.save_folder |
| opt['usm_save_folder'] = args.output_usm |
| opt['crop_size'] = args.crop_size |
| opt['crop_num_per_img'] = args.crop_num_per_img |
| opt['select_rate'] = args.select_rate |
|
|
| |
| extract_subimages(opt) |
|
|
|
|
| if __name__ == '__main__': |
| random.seed(777) |
|
|
| parser = argparse.ArgumentParser() |
| |
| parser.add_argument('-i', '--input_folder', nargs='+', type=str, default='datasets/all_Anime_hq_frames_resize', help='Input folder') |
| parser.add_argument('-o', '--save_folder', type=str, default='datasets/train_hr', help='Output folder') |
| parser.add_argument('--output_usm', type=str, help='usm sharpened hr folder') |
| parser.add_argument('--crop_size', type=int, default=360, help='Crop size') |
| parser.add_argument('--select_rate', type=float, default=1, help='(0-1): Proportion to keep; 1 means to keep them all') |
| parser.add_argument('--crop_num_per_img', type=int, default=-1, help='Crop size (int); -1 means use all possible sub-frames') |
| args = parser.parse_args() |
|
|
| main(args) |