|
import os |
|
import time |
|
import random |
|
import glog as log |
|
import numpy as np |
|
from typing import List |
|
|
|
from utils.io import read_image, write_processed_as_jpg, write_illuminant_estimation |
|
import ips |
|
|
|
expected_landscape_img_height = 768 |
|
expected_landscape_img_width = 1024 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def single_run( |
|
base_dir: str, |
|
img_names: List, |
|
out_dir: str, |
|
wb_method: str = "iwp", |
|
tmo_type: str = "nite", |
|
tv_weight: int = 20 |
|
): |
|
log.info( |
|
"Parameters:\n" |
|
f"WB Method: {wb_method}\n" |
|
f"TMO Type: {tmo_type}\n" |
|
f"Luma TV weight : {tv_weight}\n" |
|
) |
|
os.makedirs("./" + out_dir, exist_ok=True) |
|
|
|
infer_times = list() |
|
|
|
for i, img_name in enumerate(img_names): |
|
p = round(100 * (i+1) / len(img_names), 2) |
|
log.info(f"({p:.2f}%) Processing {i+1} of {len(img_names)} images, image name: {img_name}") |
|
path = os.path.join(base_dir, img_name) |
|
assert os.path.exists(path) |
|
|
|
raw_image, metadata = read_image(path) |
|
save_ill_est = metadata["wb_estimation"] is None |
|
metadata["exp_height"] = expected_landscape_img_height |
|
metadata["exp_width"] = expected_landscape_img_width |
|
metadata["wb_method"] = wb_method |
|
metadata["tv_weight"] = tv_weight |
|
metadata["tmo_type"] = tmo_type |
|
if tmo_type.lower() in ["flash", "storm"]: |
|
metadata["tmo_scale"] = 10 |
|
if tmo_type.lower() in ["storm", "nite"]: |
|
metadata["tmo_kernels"] = (1, 2, 4, 8, 16, 32) |
|
metadata["tmo_do_leap"] = True |
|
metadata["global_mc_beta"] = 1.2 |
|
metadata["scc_alpha"] = 0.5 |
|
metadata["scc_lambda"] = 0.9 |
|
|
|
out_path = os.path.join(out_dir, img_name.replace("png", "jpg")) |
|
if os.path.exists(out_path): |
|
continue |
|
start_time = time.time() |
|
out = ips.process(raw_image=raw_image, metadata=metadata) |
|
end_time = time.time() |
|
infer_times.append(end_time - start_time) |
|
|
|
if save_ill_est: |
|
ill_est_path = os.path.join(out_dir, img_name.replace(".png", "_wb.json")) |
|
write_illuminant_estimation(metadata["wb_estimation"], ill_est_path) |
|
write_processed_as_jpg(out, out_path) |
|
print(f"Average inference time: {np.mean(infer_times)} seconds") |
|
|
|
|
|
if __name__ == "__main__": |
|
import argparse |
|
parser = argparse.ArgumentParser(description='Night Photography Rendering Challenge - Team VGL OzU') |
|
parser.add_argument('-d', '--data_dir', type=str, default="data/", help="data directory") |
|
parser.add_argument('-o', '--output_dir', type=str, default="results/", help="output directory") |
|
parser.add_argument('-s', '--submission_name', type=str, default="vgl-ozu", help='submission name') |
|
args = parser.parse_args() |
|
|
|
data_dir = args.data_dir |
|
if not os.path.exists(data_dir) or len(os.listdir(data_dir)) == 0: |
|
log.info(f"Data does not exist, please put the data from given link into '{data_dir}'...") |
|
os.makedirs(data_dir, exist_ok=True) |
|
log.info("After this, please re-run.") |
|
else: |
|
base_dir = args.data_dir |
|
out_dir = args.output_dir |
|
img_names = os.listdir(base_dir) |
|
img_names = [img_name for img_name in img_names if ".png" in img_name] |
|
single_run(base_dir, img_names, out_dir) |