Files
2024-08-11 18:59:36 +07:00

171 lines
4.5 KiB
Python

from pathlib import Path
import torch
from comfy.utils import ProgressBar
from .module_convir.constants_convir import (
DEBLUR_DEFAULT,
DEBLUR_MODELS,
DEFOCUS_MODEL,
DEFOCUS_SIZES,
DEHAZE_DEFAULT,
DEHAZE_MODELS,
DEHAZE_SIZES,
DERAIN_MODEL,
DERAIN_SIZE,
DESNOW_DEFAULT,
DESNOW_MODELS,
DESNOW_SIZES,
MODEL_DIR,
SIZE_BASE,
SIZE_LARGE,
get_deblur_model,
get_defocus_model,
get_dehaze_model,
get_derain_model,
get_desnow_model,
)
from .module_convir.ConvIR import ConvIR
from .module_convir.convir_utils import preprocess_image
base_dir = Path(__file__).resolve().parent
def run_convir(src_img, model_name, model_size, model_file):
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
src_img, h, w = preprocess_image(src_img, device)
model = ConvIR(version=model_size, data=model_name)
checkpoint_path = f"{base_dir}/{MODEL_DIR}/{model_file}"
state_dict = torch.load(checkpoint_path)
model.load_state_dict(state_dict["model"])
model = model.to(device)
model.eval()
num_frames = src_img.size(0)
pbar = ProgressBar(num_frames)
result: list[torch.Tensor] = []
for i in range(num_frames):
image = src_img[i].unsqueeze(0)
pred = model.forward(image)[2]
pred = pred[:, :, :h, :w]
pred_clip = torch.clamp(pred, 0, 1)
result.append(pred_clip)
pbar.update_absolute(i, num_frames)
result_ts = torch.cat(result, dim=0).permute(0, 2, 3, 1)
return result_ts
class ConvIR_DeHaze:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"src_img": ("IMAGE",),
"model_name": (DEHAZE_MODELS, {"default": DEHAZE_DEFAULT}),
"model_size": (DEHAZE_SIZES, {"default": SIZE_BASE}),
},
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("res_img",)
FUNCTION = "todo"
CATEGORY = "FM_nodes/ConvIR"
def todo(self, src_img: torch.Tensor, model_name: str, model_size: str):
model_file, model_size = get_dehaze_model(model_name, model_size)
result_ts = run_convir(src_img, model_name, model_size, model_file)
return (result_ts,)
class ConvIR_DeRain:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"src_img": ("IMAGE",),
},
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("res_img",)
FUNCTION = "todo"
CATEGORY = "FM_nodes/ConvIR"
def todo(self, src_img: torch.Tensor):
model_file = get_derain_model()
result_ts = run_convir(src_img, DERAIN_MODEL, DERAIN_SIZE, model_file)
return (result_ts,)
class ConvIR_DeSnow:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"src_img": ("IMAGE",),
"model_name": (DESNOW_MODELS, {"default": DESNOW_DEFAULT}),
"model_size": (DESNOW_SIZES, {"default": SIZE_BASE}),
},
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("res_img",)
FUNCTION = "todo"
CATEGORY = "FM_nodes/ConvIR"
def todo(self, src_img: torch.Tensor, model_name: str, model_size: str):
model_file = get_desnow_model(model_name, model_size)
result_ts = run_convir(src_img, model_name, model_size, model_file)
return (result_ts,)
class ConvIR_MotionDeBlur:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"src_img": ("IMAGE",),
"model_name": (DEBLUR_MODELS, {"default": DEBLUR_DEFAULT}),
},
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("res_img",)
FUNCTION = "todo"
CATEGORY = "FM_nodes/ConvIR"
def todo(self, src_img: torch.Tensor, model_name: str):
model_file = get_deblur_model(model_name)
result_ts = run_convir(src_img, model_name, SIZE_LARGE, model_file)
return (result_ts,)
class ConvIR_DefocusDeblur:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"src_img": ("IMAGE",),
"model_size": (DEFOCUS_SIZES, {"default": SIZE_BASE}),
},
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("res_img",)
FUNCTION = "todo"
CATEGORY = "FM_nodes/ConvIR"
def todo(self, src_img: torch.Tensor, model_size: str):
model_file = get_defocus_model(model_size)
result_ts = run_convir(src_img, DEFOCUS_MODEL, model_size, model_file)
return (result_ts,)