CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)


称心向月光
称心向月光 2022-09-19 11:44:57 50043
分类专栏: 资讯

CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)

目录

利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦旧照/清末官员生活场景等案例)

算法步骤

输出结果

核心代码


相关文章
CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)
CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)实现

利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦旧照/清末官员生活场景等案例)

算法步骤

  • 第一步,首先以传统方式自行训练生成器,仅使用特征损失(feature loss)。
  • 第二步,从中生成图像,并训练critic区分这些输出和真实图像作为基本的二元分类器。
  • 第三步,在 GAN 设置中一起训练生成器和critic(在这种情况下从目标大小 192 像素开始)。现在是奇怪的部分:这里所有有用的 GAN 训练只发生在一个非常小的时间窗口内。有一个转折点,critic似乎已经转移了对生成器有用的一切。在这一点之后,图像质量会在拐点处获得的最佳或可预测的糟糕(橙色皮肤、过度红唇等)之间摇摆不定。在拐点之后似乎没有有效的训练。而这一点在于仅对 Imagenet 数据的 1% 到 3% 进行训练!这相当于在 192px 下进行大约 30-60 分钟的训练。

         困难的部分是找到这个拐点。到目前为止,我已经通过制作一大堆模型保存checkpoints(每 0.1% 的数据迭代)来实现这一点,然后只是寻找图像看起来很棒的点,然后它们会完全变成橙色皮肤(总是第一件要做的事)。此外,此时生成器渲染会立即开始出现故障和不一致,这对于视频来说尤其不利。我真正想弄清楚的是,拐点的迹象是什么,可以很容易地自动作为早期停止点。不幸的是,我还没有发现任何确凿的证据。一方面,它发生在训练损失减少的中间——而不是在它变平的时候,这从表面上看似乎更合理。
         关于NoGAN训练的另一个关键的事情是,你可以在初始GAN训练之后重复对生成的图像进行预训练critic ,然后以同样的方式重复GAN训练本身。这就是我如何使用“艺术”模型获得额外丰富多彩的结果。但这确实是有代价的 - 生成器的输出变得越来越不一致,您必须尝试渲染分辨率 (render_factor) 以获得最佳结果。但是渲染仍然没有小故障,而且比我用原始的DeOldify模型实现的更加一致。就我所知,在你得到收益递减之前,你可以做五次这样的重复循环,给予或接受。
         请记住 - 我在弄清楚 NoGAN 中发生的一切方面并不是很严谨 - 我会把它留到一篇论文中。这意味着我很有可能在某些事情上是错的。但我认为它现在绝对值得推出,因为我发现它非常有用 - 它基本上解决了我在 DeOldify 中遇到的大部分剩余问题。

输出结果

 

 

 

 

 ​​​

核心代码

  1. from deoldify.visualize import *
  2. plt.style.use('dark_background')
  3. torch.backends.cudnn.benchmark=True
  4. import warnings
  5. warnings.filterwarnings("ignore", category=UserWarning, message=".*?Your .*? set is empty.*?")
  6. artistic_code=False True False
  7. if artistic_code:
  8. artistic_txt='Artistic'
  9. else:
  10. artistic_txt='Stable'
  11. colorizer = get_image_colorizer(artistic=artistic_code) Artistic 为布尔值, True 表示启用 Artistic 模式 ( False 启用 Stable 模式);
  12. render_factor=35
  13. render_factor=10 表示渲染因子,值越效果越好
  14. source_path = 'test_images/Einstein.jpg'
  15. result_path = 'test_images/Einstein_res_%s.jpg'%render_factor
  16. colorizer.plot_transformed_image(path=source_path, results_dir=result_path,render_factor=render_factor, compare=True)
  1. from fastai.vision import *
  2. from fastai.vision.learner import cnn_config
  3. from .unet import DynamicUnetWide, DynamicUnetDeep
  4. from .loss import FeatureLoss
  5. from .dataset import *
  6. Weights are implicitly read from ./models/ folder
  7. def gen_inference_wide(
  8. root_folder: Path, weights_name: str, nf_factor: int = 2, arch=models.resnet101) -> Learner:
  9. data = get_dummy_databunch()
  10. learn = gen_learner_wide(
  11. data=data, gen_loss=F.l1_loss, nf_factor=nf_factor, arch=arch
  12. )
  13. learn.path = root_folder
  14. learn.load(weights_name)
  15. learn.model.eval()
  16. return learn
  17. def gen_learner_wide(
  18. data: ImageDataBunch, gen_loss, arch=models.resnet101, nf_factor: int = 2
  19. ) -> Learner:
  20. return unet_learner_wide(
  21. data,
  22. arch=arch,
  23. wd=1e-3,
  24. blur=True,
  25. norm_type=NormType.Spectral,
  26. self_attention=True,
  27. y_range=(-3.0, 3.0),
  28. loss_func=gen_loss,
  29. nf_factor=nf_factor,
  30. )
  31. The code below is meant to be merged into fastaiv1 ideally
  32. def unet_learner_wide(
  33. data: DataBunch,
  34. arch: Callable,
  35. pretrained: bool = True,
  36. blur_final: bool = True,
  37. norm_type: Optional[NormType] = NormType,
  38. split_on: Optional[SplitFuncOrIdxList] = None,
  39. blur: bool = False,
  40. self_attention: bool = False,
  41. y_range: Optional[Tuple[float, float]] = None,
  42. last_cross: bool = True,
  43. bottle: bool = False,
  44. nf_factor: int = 1,
  45. **kwargs: Any
  46. ) -> Learner:
  47. "Build Unet learner from `data` and `arch`."
  48. meta = cnn_config(arch)
  49. body = create_body(arch, pretrained)
  50. model = to_device(
  51. DynamicUnetWide(
  52. body,
  53. n_classes=data.c,
  54. blur=blur,
  55. blur_final=blur_final,
  56. self_attention=self_attention,
  57. y_range=y_range,
  58. norm_type=norm_type,
  59. last_cross=last_cross,
  60. bottle=bottle,
  61. nf_factor=nf_factor,
  62. ),
  63. data.device,
  64. )
  65. learn = Learner(data, model, **kwargs)
  66. learn.split(ifnone(split_on, meta['split']))
  67. if pretrained:
  68. learn.freeze()
  69. apply_init(model[2], nn.init.kaiming_normal_)
  70. return learn
  71. ----------------------------------------------------------------------
  72. Weights are implicitly read from ./models/ folder
  73. def gen_inference_deep(
  74. root_folder: Path, weights_name: str, arch=models.resnet34, nf_factor: float = 1.5) -> Learner:
  75. data = get_dummy_databunch()
  76. learn = gen_learner_deep(
  77. data=data, gen_loss=F.l1_loss, arch=arch, nf_factor=nf_factor
  78. )
  79. learn.path = root_folder
  80. learn.load(weights_name)
  81. learn.model.eval()
  82. return learn
  83. def gen_learner_deep(
  84. data: ImageDataBunch, gen_loss, arch=models.resnet34, nf_factor: float = 1.5
  85. ) -> Learner:
  86. return unet_learner_deep(
  87. data,
  88. arch,
  89. wd=1e-3,
  90. blur=True,
  91. norm_type=NormType.Spectral,
  92. self_attention=True,
  93. y_range=(-3.0, 3.0),
  94. loss_func=gen_loss,
  95. nf_factor=nf_factor,
  96. )
  97. The code below is meant to be merged into fastaiv1 ideally
  98. def unet_learner_deep(
  99. data: DataBunch,
  100. arch: Callable,
  101. pretrained: bool = True,
  102. blur_final: bool = True,
  103. norm_type: Optional[NormType] = NormType,
  104. split_on: Optional[SplitFuncOrIdxList] = None,
  105. blur: bool = False,
  106. self_attention: bool = False,
  107. y_range: Optional[Tuple[float, float]] = None,
  108. last_cross: bool = True,
  109. bottle: bool = False,
  110. nf_factor: float = 1.5,
  111. **kwargs: Any
  112. ) -> Learner:
  113. "Build Unet learner from `data` and `arch`."
  114. meta = cnn_config(arch)
  115. body = create_body(arch, pretrained)
  116. model = to_device(
  117. DynamicUnetDeep(
  118. body,
  119. n_classes=data.c,
  120. blur=blur,
  121. blur_final=blur_final,
  122. self_attention=self_attention,
  123. y_range=y_range,
  124. norm_type=norm_type,
  125. last_cross=last_cross,
  126. bottle=bottle,
  127. nf_factor=nf_factor,
  128. ),
  129. data.device,
  130. )
  131. learn = Learner(data, model, **kwargs)
  132. learn.split(ifnone(split_on, meta['split']))
  133. if pretrained:
  134. learn.freeze()
  135. apply_init(model[2], nn.init.kaiming_normal_)
  136. return learn
  137. -----------------------------
文章知识点与官方知识档案匹配,可进一步学习相关知识

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=2144
赞同 0
评论 0 条
称心向月光L0
粉丝 0 发表 6 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2944
【软件正版化】软件正版化工作要点  2863
统信UOS试玩黑神话:悟空  2823
信刻光盘安全隔离与信息交换系统  2718
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1251
grub引导程序无法找到指定设备和分区  1217
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  164
点击报名 | 京东2025校招进校行程预告  162
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  161
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  157
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!