CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)
目录
利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦旧照/清末官员生活场景等案例)
相关文章
CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)
CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)实现
困难的部分是找到这个拐点。到目前为止,我已经通过制作一大堆模型保存checkpoints(每 0.1% 的数据迭代)来实现这一点,然后只是寻找图像看起来很棒的点,然后它们会完全变成橙色皮肤(总是第一件要做的事)。此外,此时生成器渲染会立即开始出现故障和不一致,这对于视频来说尤其不利。我真正想弄清楚的是,拐点的迹象是什么,可以很容易地自动作为早期停止点。不幸的是,我还没有发现任何确凿的证据。一方面,它发生在训练损失减少的中间——而不是在它变平的时候,这从表面上看似乎更合理。
关于NoGAN训练的另一个关键的事情是,你可以在初始GAN训练之后重复对生成的图像进行预训练critic ,然后以同样的方式重复GAN训练本身。这就是我如何使用“艺术”模型获得额外丰富多彩的结果。但这确实是有代价的 - 生成器的输出变得越来越不一致,您必须尝试渲染分辨率 (render_factor) 以获得最佳结果。但是渲染仍然没有小故障,而且比我用原始的DeOldify模型实现的更加一致。就我所知,在你得到收益递减之前,你可以做五次这样的重复循环,给予或接受。
请记住 - 我在弄清楚 NoGAN 中发生的一切方面并不是很严谨 - 我会把它留到一篇论文中。这意味着我很有可能在某些事情上是错的。但我认为它现在绝对值得推出,因为我发现它非常有用 - 它基本上解决了我在 DeOldify 中遇到的大部分剩余问题。
- from deoldify.visualize import *
-
- plt.style.use('dark_background')
- torch.backends.cudnn.benchmark=True
-
- import warnings
- warnings.filterwarnings("ignore", category=UserWarning, message=".*?Your .*? set is empty.*?")
-
- artistic_code=False True False
- if artistic_code:
- artistic_txt='Artistic'
- else:
- artistic_txt='Stable'
- colorizer = get_image_colorizer(artistic=artistic_code) Artistic 为布尔值, True 表示启用 Artistic 模式 ( False 启用 Stable 模式);
-
- render_factor=35
- render_factor=10 表示渲染因子,值越效果越好
- source_path = 'test_images/Einstein.jpg'
- result_path = 'test_images/Einstein_res_%s.jpg'%render_factor
- colorizer.plot_transformed_image(path=source_path, results_dir=result_path,render_factor=render_factor, compare=True)
- 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
-
-
- -----------------------------
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!