mirror of
https://github.com/jantic/DeOldify.git
synced 2026-08-29 02:10:55 +08:00
152 lines
4.2 KiB
Python
152 lines
4.2 KiB
Python
from fastai.vision import *
|
|
from fastai.vision.learner import cnn_config
|
|
from .unet import DynamicUnetWide, DynamicUnetDeep
|
|
from .loss import FeatureLoss
|
|
from .dataset import *
|
|
|
|
# Weights are implicitly read from ./models/ folder
|
|
def gen_inference_wide(
|
|
root_folder: Path, weights_name: str, nf_factor: int = 2, arch=models.resnet101) -> Learner:
|
|
data = get_dummy_databunch()
|
|
learn = gen_learner_wide(
|
|
data=data, gen_loss=F.l1_loss, nf_factor=nf_factor, arch=arch
|
|
)
|
|
learn.path = root_folder
|
|
learn.load(weights_name)
|
|
learn.model.eval()
|
|
return learn
|
|
|
|
|
|
def gen_learner_wide(
|
|
data: ImageDataBunch, gen_loss, arch=models.resnet101, nf_factor: int = 2
|
|
) -> Learner:
|
|
return unet_learner_wide(
|
|
data,
|
|
arch=arch,
|
|
wd=1e-3,
|
|
blur=True,
|
|
norm_type=NormType.Spectral,
|
|
self_attention=True,
|
|
y_range=(-3.0, 3.0),
|
|
loss_func=gen_loss,
|
|
nf_factor=nf_factor,
|
|
)
|
|
|
|
|
|
# The code below is meant to be merged into fastaiv1 ideally
|
|
def unet_learner_wide(
|
|
data: DataBunch,
|
|
arch: Callable,
|
|
pretrained: bool = True,
|
|
blur_final: bool = True,
|
|
norm_type: Optional[NormType] = NormType,
|
|
split_on: Optional[SplitFuncOrIdxList] = None,
|
|
blur: bool = False,
|
|
self_attention: bool = False,
|
|
y_range: Optional[Tuple[float, float]] = None,
|
|
last_cross: bool = True,
|
|
bottle: bool = False,
|
|
nf_factor: int = 1,
|
|
**kwargs: Any
|
|
) -> Learner:
|
|
"Build Unet learner from `data` and `arch`."
|
|
meta = cnn_config(arch)
|
|
body = create_body(arch, pretrained)
|
|
model = to_device(
|
|
DynamicUnetWide(
|
|
body,
|
|
n_classes=data.c,
|
|
blur=blur,
|
|
blur_final=blur_final,
|
|
self_attention=self_attention,
|
|
y_range=y_range,
|
|
norm_type=norm_type,
|
|
last_cross=last_cross,
|
|
bottle=bottle,
|
|
nf_factor=nf_factor,
|
|
),
|
|
data.device,
|
|
)
|
|
learn = Learner(data, model, **kwargs)
|
|
learn.split(ifnone(split_on, meta['split']))
|
|
if pretrained:
|
|
learn.freeze()
|
|
apply_init(model[2], nn.init.kaiming_normal_)
|
|
return learn
|
|
|
|
|
|
# ----------------------------------------------------------------------
|
|
|
|
# Weights are implicitly read from ./models/ folder
|
|
def gen_inference_deep(
|
|
root_folder: Path, weights_name: str, arch=models.resnet34, nf_factor: float = 1.5) -> Learner:
|
|
data = get_dummy_databunch()
|
|
learn = gen_learner_deep(
|
|
data=data, gen_loss=F.l1_loss, arch=arch, nf_factor=nf_factor
|
|
)
|
|
learn.path = root_folder
|
|
learn.load(weights_name)
|
|
learn.model.eval()
|
|
return learn
|
|
|
|
|
|
def gen_learner_deep(
|
|
data: ImageDataBunch, gen_loss, arch=models.resnet34, nf_factor: float = 1.5
|
|
) -> Learner:
|
|
return unet_learner_deep(
|
|
data,
|
|
arch,
|
|
wd=1e-3,
|
|
blur=True,
|
|
norm_type=NormType.Spectral,
|
|
self_attention=True,
|
|
y_range=(-3.0, 3.0),
|
|
loss_func=gen_loss,
|
|
nf_factor=nf_factor,
|
|
)
|
|
|
|
|
|
# The code below is meant to be merged into fastaiv1 ideally
|
|
def unet_learner_deep(
|
|
data: DataBunch,
|
|
arch: Callable,
|
|
pretrained: bool = True,
|
|
blur_final: bool = True,
|
|
norm_type: Optional[NormType] = NormType,
|
|
split_on: Optional[SplitFuncOrIdxList] = None,
|
|
blur: bool = False,
|
|
self_attention: bool = False,
|
|
y_range: Optional[Tuple[float, float]] = None,
|
|
last_cross: bool = True,
|
|
bottle: bool = False,
|
|
nf_factor: float = 1.5,
|
|
**kwargs: Any
|
|
) -> Learner:
|
|
"Build Unet learner from `data` and `arch`."
|
|
meta = cnn_config(arch)
|
|
body = create_body(arch, pretrained)
|
|
model = to_device(
|
|
DynamicUnetDeep(
|
|
body,
|
|
n_classes=data.c,
|
|
blur=blur,
|
|
blur_final=blur_final,
|
|
self_attention=self_attention,
|
|
y_range=y_range,
|
|
norm_type=norm_type,
|
|
last_cross=last_cross,
|
|
bottle=bottle,
|
|
nf_factor=nf_factor,
|
|
),
|
|
data.device,
|
|
)
|
|
learn = Learner(data, model, **kwargs)
|
|
learn.split(ifnone(split_on, meta['split']))
|
|
if pretrained:
|
|
learn.freeze()
|
|
apply_init(model[2], nn.init.kaiming_normal_)
|
|
return learn
|
|
|
|
|
|
# -----------------------------
|