171 lines
4.5 KiB
Python
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,)
|