Brief Summary of Bokeh Effect Rendering
注:本文无任何商业用途
1. 前言
在之前一些厂商的人像背景虚化效果中,能够明显看到其是对人像进行了分割,之后再单独将背景进行虚化,最后将人像区域与虚化之后的背景融合起来(这里面需要处理很多画质相关的细节问题)。其效果在目前看来已经有了较大的进步,下图是最新发布的VIVO X70处理出来的虚化结果(注:图片来源于网络,侵删):
可以看到其参照莱卡相机的虚化效果,对应对输入的图像进行虚化处理,这样的效果在外行人看来已经像那么回事了(尽管还会存在一些badcase,但是相信明天会更好。。。)。
单反相机拍摄的背景虚化效果一直是手机相机希望达到的,现在已经有一些工作围绕这个主体展开,并且也取得了相当不错的效果,比如上文中提到的VIVO和Google Pixel 2等。就技术角度来讲现在的背景虚化算法包含了基于传统的图像滤波器背景虚化,以及基于深度学习的背景虚化上来了。但是其背景虚化的终极目标还是希望达到单反相机的效果,下图展示真实的单反相机背景虚化样张(注:图片源自网络,侵删):
对此也有一些学者开展这方面的研究以及相关的竞赛,如:AIM 2020,其包含的挑战内容就包含:
对此,本篇文章从深度学习的角度对bokeh effect的生成进行了研究,在研究的过程中找到一些文章,这里对其进行简要说明,希望对大家在进行该项目的时候在思维上有所启发。
PS: 下面文献中的一些方法没有开放完全代码,需要复现需慎重,但是可以提供一些思路作为参考。
2. 文献
2.1 PyNet
论文名称:《Rendering Natural Camera Bokeh Effect with Deep Learning》
参考代码:PyNET-PyTorch
这篇文章使用未虚化的图像与虚化的图像构建pair对,之后使用一个U型的编解码网络完成对虚化的拟合。在这个过程中为了提升虚化效果的鲁棒性,还可以选择使用深度估计作为额外的guidance,使得最后生成的结果更加准确。下图是其网络结构图:
其监督的损失函数使用的是L1、SSIM和content-loss(style transfer中的content loss)组成,不过在不同的输出stage上略有不同,其损失函数的组合形式为:
Lleveli=αiLL1+βi(1−LSSIM)+σiLcontent\mathcal{L}_{level_i}=\alpha_i\mathcal{L}_{L1}+\beta_i(1-\mathcal{L}_{SSIM})+\sigma_i\mathcal{L}_{content}Lleveli=αiLL1+βi(1−LSSIM)+σiLcontent
PS: 具体的实现细节可以参考其放出的代码实现,不过需要留意的是其训练的过程是有点繁琐。。。
2.2 BGGAN
论文名称:《BGGAN:Bokeh-Glass Generative Adversarial Network for Rendering Realistic Bokeh》
参考代码:null
这篇文章使用的是级联的双U型结构去优化bokeh效果,其网络结构也很简单,可以参考下图:
其对应的损失函数先是包含了bokeh预测结果的L1、SSIM和content-loss。这里需要指出的一点是其content-loss使用了L1的形式:
Lcontent=1HWC∑i=1H∑j=1W∑k=1C∣∣F(G(I)i,j,k−F(Ci,j,k))∣∣1\mathcal{L}_{content}=\frac{1}{HWC}\sum_{i=1}^H\sum_{j=1}^W\sum_{k=1}^C||F(G(I)_{i,j,k}-F(C_{i,j,k}))||_1Lcontent=HWC1i=1∑Hj=1∑Wk=1∑C∣∣F(G(I)i,j,k−F(Ci,j,k))∣∣1
除此之外呢,文章还通过引入GAN损失的形式去监督生成的bokeh结果,从而使得生成bokeh结果更加贴近自然,这里使用了WGAN-GP和PatchGAN的形式,它们的判别器结构见下图所示:
对于GAN部分的损失函数,将其描述为:
Ladv=−1HW∑i=1H∑j=1WD(F(I)i,j)\mathcal{L}_{adv}=-\frac{1}{HW}\sum_{i=1}^H\sum_{j=1}^WD(F(I)_{i,j})Ladv=−HW1i=1∑Hj=1∑WD(F(I)i,j)
因而,总的损失函数描述为:
L=0.5∗L1+0.05∗Lssim+0.1∗Lcontent+Ladv\mathcal{L}=0.5*\mathcal{L}_1+0.05*\mathcal{L}_{ssim}+0.1*\mathcal{L}_{content}+\mathcal{L}_{adv}L=0.5∗L1+0.05∗Lssim+0.1∗Lcontent+Ladv
比较可惜的是这篇文章的代码没有开源,在实际炼丹过程中还需多调试。
2.3 Depth-aware Blending
论文名称:《Depth-aware Blending of Smoothed Images for Bokeh Effect Generation》
参考代码:null
在一张具有虚化效果的单反拍摄图片中,其实其中的区域是按照虚化程度划分是可以被划分为多个区域的,那么一个很自然的方式就是去估计这些分量的组成,之后再将其组合起来,那么深度学习网络部分就是去预测这些不同分量的权重的。对其文章的方法在深度估计网络的基础上构建一个虚化权重估计头,从而对不同分量进行加权组合得到最后结果,其网络结构见下图:
上图中的权重参数(w0,w1,w2,w3)(w_0,w_1,w_2,w_3)(w0,w1,w2,w3)就是分区域组合的权重,那么最后虚化的结果其组成描述为:
Ibokeh=w0⊙Iorg+∑i=1nwi⊙B(Iorg,ki)I_{bokeh}=w_0\odot I_{org}+\sum_{i=1}^nw_i\odot B(I_{org},k_i)Ibokeh=w0⊙Iorg+i=1∑nwi⊙B(Iorg,ki)
其中,B(Iorg,ki)B(I_{org},k_i)B(Iorg,ki)代表的是不同kernel大小的高斯滤波器,并且在每个像素点上其加权参数应该满足∑i=0nwi[x,y]=1\sum_{i=0}^nw_i[x,y]=1∑i=0nwi[x,y]=1。
对于损失函数部分,其损失函数被描述为:
L=α∗L1+β∗Lssim\mathcal{L}=\alpha*\mathcal{L}_1+\beta*\mathcal{L}_{ssim}L=α∗L1+β∗Lssim
2.4 Stacked DMSHN
论文名称:《Stacked Deep Multi-Scale Hierarchical Network for Fast Bokeh Effect Rendering from a Single Image》
参考代码:Stacked_DMSHN_bokeh
这篇文章的方法使用了更加复杂的编解码网络结构,并且还是级联优化的形式,其使用的网络结构见下图所示:
在这篇文中中除了较为复杂的编解码网络结构之外,还通过级联优化的形式优化最后结果,自然其训练的过程被划分为了2个阶段,在不同阶段会使用不同的损失函数。在第一个阶段中其损失函数被描述为:
Lst1=L1+αLssim\mathcal{L}_{st1}=\mathcal{L}_1+\alpha\mathcal{L}_{ssim}Lst1=L1+αLssim
在训练的第二阶段,其损失函数描述为:
Lst2=LMS−SSIM\mathcal{L}_{st2}=\mathcal{L}_{MS-SSIM}Lst2=LMS−SSIM
3. 结语
综上,是近期看了VIVO X70之后对其虚化算法作出的一些思考,望随着技术的进步手机拍摄的效果越拍越好。
Brief Summary of Bokeh Effect Rendering相关推荐
- Animated Eye Candy for Programmers
作者采用vs2008编译,c#代码 Animated Eye Candy for Programmers By Phillip Piper | 17 Apr 2010 A class library ...
- 哪些iPhone具有纵向模式?
Kevin Parrish 凯文·帕里什 Smartphones may never replace a good DSLR or analog camera, but they're still a ...
- [实用超分网络大赏]《Real-Time Quantized Image Super-Resolution on Mobile NPUs, Mobile AI 2021 Challenge》
摘要:图像超分是最流行的计算机视觉问题之一,它在移动手机设备上有许多重要的应用.虽然针对该任务已经出现了许多解决方案,这些方案通常不能直接在智能手机的AI硬件上使用,更不用提有更多限制的智能TV平台, ...
- 35个让人惊讶的 CSS3 动画效果演示
本文收集了35个惊人的 CSS3 动画演示,它们将证明 CSS3 Transform 和 Transition 属性的强大能力.CSS 是网页设计非常重要的一部分,随着越来越多的浏览器对 CSS3 支 ...
- 手把手教用XNA开发winphone7游戏(五)大结局
Alien Game逻辑 在这最有一个部分你将创建game-specific logic和 helper方法和类.胜利就在眼前,你的第一个winphone7程序就要出现了,加油加油!!(感谢http: ...
- CV Papers|计算机视觉论文推荐周报20200601期
6月第一周的周末,分享几篇本周CV领域的论文,其中上海交大实时语义分割模型LRNNet和Facebook借助NAS得到的主干网模型FBNetV3很吸引人. 其中含四篇综述文章,一篇来自自动驾驶的3D感 ...
- camerax_Android CameraX概述
camerax In this tutorial, we'll be discussing at length upon Android CameraX API. CameraX was one of ...
- 人工智能/数据科学比赛汇总 2019.8
内容来自 DataSciComp,人工智能/数据科学比赛整理平台. Github:iphysresearch/DataSciComp 本项目由 ApacheCN 强力支持. 微博 | 知乎 | CSD ...
- 人工智能/数据科学比赛汇总 2019.9
内容来自 DataSciComp,人工智能/数据科学比赛整理平台. Github:iphysresearch/DataSciComp 本项目由 ApacheCN 强力支持. 微博 | 知乎 | CSD ...
- vs2017旗舰版_2017年的所有旗舰手机都有明显的妥协。 这是他们告诉我们有关设计的信息。...
vs2017旗舰版 by Teo Yu Siang 张玉祥 2017年的所有旗舰手机都有明显的妥协. 这是他们告诉我们有关设计的信息. (All of 2017's flagship phones h ...
最新文章
- 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
- Windows Server 2012 R2工作文件夹⑤:创建工作文件夹
- 浅谈单片机程序设计中的“分层思想”
- IIS 使用域账户访问SQL 需要配置
- oracle11g sp 1503,Oracle11g操作ASM权限问题
- kubernetes-Pod定义
- JPA数据库架构生成
- lua 获取网络时间_Lua脚本引擎教程:学习路线
- Unity2018新功能抢鲜 | ShaderGraph入门教程
- AGP与PCI-E的区别 PCI-E接口与PCI接口的区别
- (七)图像处理中常用算子Laplacian\Sobel\Roberts\Prewitt\Kirsch
- LeetCode-14.最长公共前缀(字符串的erase()函数)
- 朋友圈入驻360云盘?这么赤果果微信造吗?
- opencv使用trackbar调控美颜程度
- Android Studio创建侧滑菜单使用心得
- 软件测试工程师简历项目经验怎么写?一千个软件测试简历范文模板
- Ajax 异步显示订单详情总结
- Android studio 中的AVD manger启动失败原因解决方法
- bootstrap4学习路线
- 阿拉伯数字转换英文,适用于英文合同和国际贸易单证
热门文章
- 图标快速定位工具 ElementUI FontAwesome iView
- 使用esp8266前的网络基础
- php解决商品超卖,商品超卖问题,你用PHP如何解决?
- 去除Ubuntu 20桌面图标的快捷方式箭头
- 〖Python零基础入门篇㊿〗- Python中的 sys 模块
- 终端服务器安全层在协议流中检测到错误,智能卡远程登录AD域环境下win7/2008,返回STATUS_LOGON_TYPE_NOT_GRANTED错误...
- 2018 中国Linux内核开发者大会
- 渗透测试之信息收集漏洞库篇
- 设置背景图片自动适应屏幕
- Linux内存管理专题