极市导读 来自虎牙直播AI基础技术部的刘虹雨算法工程师,为我们介绍他团队在如何结合深度神经网络进行有效的图像修复和编辑这两个问题上的探索工作,两份工作都已经被CVPR2021收录。 >>加入极市CV技术交流群,走在计算机视觉的最前沿 导读虎牙公司的研究员刘虹雨在CVPR 2021入选两篇poster论文,首先感谢co-authors的通力合作,希望在未来能做出更好的研究。此次研究解决了视觉内容可控性和多样性问题,将提升虎牙直播在视觉上的应用效果,可用于如虎牙数字人、虚拟形象及相关直播游戏的制作,提升直播互动体验。 先为大家分享第一篇文章:DeFLOCNet: Deep Image Editing via Flexible Low-level Controls,这篇文章比较偏工程,做法比较直接。有GUI可直接体验效果,代码后续也会尽快分享。 DeFLOCNet任务介绍这篇文章做的task是基于底层视觉控制的图像编辑(low-level controls based image editing),其中底层视觉控制代表线条或者颜色(sketch or color),该任务的目标是对孔洞区域进行编辑,并且编辑的内容是由用户提供的底层视觉信息控制,如图1所示。 Motivation在过去,底层视觉控制的图像编辑方法一般是把底层数据信息与输入的孔洞图像拼接在一起,然后放入到网络中。这个拼接的过程一般在pixel层实现,这种方式虽然非常直观,但是由于low-level control相对来说比较稀疏,所以在层层的CNNS之后有些信息就被过滤掉了,对于最后的结果控制不够好。所以,如何更好的注入底层级视觉控制信息是我们需要解决的问题。很自然,由于直接在pixel层注入控制信息不好,我们就在features上注入信息。那么如何优雅的在feature上注入底层视觉信息呢,Spade Norm可以有效地帮助我们在feature上注入信息,在注入信息的时候模仿艺术家的画图方式:
Methods: 基于以上三点,我们设计了Structure generation block, 把线条以及色彩看作孔洞区域的结构信息,并通过Spade Norm注入到feature中。同时,设计了Texture generation branch 辅助纹理的生成。最终,我们提出了DeFLOCNet,并在图像编辑任务上取得了不错的效果。 Pipeline整个网络是encoder-decoder的架构,输入是一张带mask的图像,图像经过encoder后得到各层的feature,这些feature会被送入structure generation block,并输出带有low-level control的特征,同时bottle-neck的feature会被送入到texture generation block中,并输出纹理refine之后的feature。最后,两个输出会在decoder拼接一起,完整structure以及texture。 Structure generation block SGB分为三个branch,分别是sketch line generation branch、 fusion branch和color propagation branch,其结构如图3所示。无论是sketch还是color都是通过injection function注入到feature中,injection就是我前面提到的spade norm,整个过程如公式1所示:
在sketch line generation branch中,我们先把input通过AVG pool变成channel为1的feature,接着将sketch lines以及noise通过injection function注入到feature中得到Fs1, 接着Fs1通过Sigmoid之后在fusion与input点乘。用这种方式是因为sketch的值在归一化后都是1,那么直观来说在feature上越靠近数值越靠近1越代表sketch。所以,我们利用sigmoid来凸显sketch,可以说越靠近1的地方sketch就越明显。当然,由于input与sigmoid(Fs1)点乘之后,只是把sketch放到了Input上,input中的其他信息其实被磨掉了,因此我们采用short-connection做成一个残差的模式。 通过以上操作得到了带sketch的特征,接下来是color的注入。在color propagation branch中,color和noise先通过CNN提取feature,然后将该feature与1-Sigmoid(Fs1)做点乘并得到Fc1,这一步的目的是为了达到我上面所说的颜色不能跨过sketch,否则会造成色彩混乱和串色。接着Fc1会在fusion branch被注入到input feature,最终通过对input feature注入sketch和color信息,我们得到输出F1。 对于不同的layer,我们的block数量也不同,对于最上层的layer(resolution为128×128)我们的block数量为6,而最底层的数量则为1。
Texture generation branch 这个branch相对来说比较简单,只是一个简单的decoder,但是其输出是原始的bottle neck feature,这个feature不带任何sketch以及color的信息,所以在end to end的过程中,texture generation branch输出的feature会更倾向于让纹理真实不smooth,这在后面的ablation study中也有实验可以验证。 Experiments:Loss function大家可以在原论文中查看,都是一些比较经典的loss function。我们这里针对最高层的layer做了可视化,如图4。其中,Fi对应的就是fusion branch中feature,可以看到线条是逐渐清晰的,同时颜色由扩散-扩散到sketch外面,最后被阻断在sketch里。 State-of-the-art comparisons 如下图5所示,我们的方法对比其他baseline数据,都取得了优秀的效果。 Ablation Study 我们对injection process 的次数,block在每层的数量,是否需要用sketch去阻断color的传播,以及是否需要texture分支都做了数值和视觉上的ablation study。如下图表所示:
Conclusion我们做的GUI借鉴了FEGAN,可以很好地与用户交互,同时让用户体验编辑的效果。整个文章的做法比较直接,比较工程,就是为了尽量把效果做好。我们原计划做动漫的编辑,但是由于一开始投了NIPS,reviewer可能对动漫的domain不感兴趣,所以最后用了常用的数据集。哈哈,可惜最后没中NIPS,中了CVPR。总的来说,这算是inpainting的上游任务了,因为有guide,对比inpainting相对简单一点,但还是非常有意思。最后,inpainting应该与人有交互,才可以更好的进行落地应用。 PD-GAN任务介绍回到老本行inpainting,我以前的工作一直是在做single-solution的方法,也就是针对一个masked image只输出一个结果。但是,inpainting本质上是一个ill-posed的任务,其输出的结果不应该被限制,应该是多样的(diverse),只要合理自然就应该是好的修复结果。 Motivation基于这个出发点,我们提出一种非常自然的prior,也是我们的motivation,那就是越靠近孔洞的中心其多样性越高,diverse越强,越靠近孔洞边缘其多样性越低越应该与上下文consistent起来,保证无缝链接,这样整个生成的图像就可以多样并且不突兀。同时,我认为inpainting这个task由于是ill-posted的,并没有一个完美的ground-truth,所以应该要往GAN上面去靠往生成的方法想去靠,抛开传统的image to image的框架,用GAN的想法去做,才是未来的一个比较好的方向,所以我们这里采用vanilla GAN的框架,利用latent code对来影响孔洞内容,利用前面提到的prior我们很好地保证了GAN的特性就是多样性,同时也保证了生成内容能够与上下文融为一体。 MethodsPipeline: 我们的pipeline如下图所示,先通过一个简单的PConv网络得到一个 coarse prediction P, 接下来我们利用P去调制z来做生成任务,对于P我们基于前面提到的prior,越靠近孔洞中心越多样也就是越不相信P的内容,而越靠近边缘则越相信P的内容,这样在孔洞的中心则z会发生足够的作用会保证多样性,而越靠近边缘z的作用的越小我们越相信P的作用。其实整个PD-GAN是conditional 和 unconditional生成的一种balance。为了实现以上的操作,我们设计并提出了spatially probabilistic diversity normalization来调制z. Spatially probabilistic diversity normalization 我们修改了传统的Spade Norm并设计了probabilistic diversity map来控制P的内容置信度,具体来说我们设计了两种SPDNorm,一种是soft SPDNorm,一种是hard SPDNorm,并且最终组合成了SPDNorm ResBlock, 如下图所示: 其中 Hard SPDNorm 中的 就是我们的 hard probabilistic diversity map, D 是通过 dilation operation 去实现的, 越往中心走数值越靠近 0 越往边界走则越靠进 1 , background 区域的 数值则为 1 , 整个 如下图所示 ![]() 我们在实验中设置k为4,对于不同的层我们采用dilation次数不一样,从低像素层到高像素层分别是2,2,4,4,4。 Soft SPDNorm 中的 就是我们的 soft probabilistic diversity map, 是通过 自己学 习的,学习方式如下公式: 其中 为 binary mask, 为 经过 后学习到的 feature . 之所以要学 soft probabilistic diversity map, 是因为 Hard SPDNorm 对于训练来说不够稳定,容易造成 artifact,我们让 网络自己学习一个调节机制帮助最后的结果生成的更加合理。 的可视化如下图所示: ![]() 可以看到 是比较 smooth 并且靠近 的, 所以这对 Hard SPDNorm 有一个调节作用。最后我们把 hard 和 soft SPDNorm 做成了一个残差模块,把 Soft SPDNrom 的输出作为残 差加入到 Hard SPDnorm 中。 其实大家可以看到,当hard和soft probabilistic diversity map里的数值都变为1时,就会变成标准的Spade Norm。 Perceptual diversity loss 我们利用了reconstruction loss来训练网络,但是reconstruction loss对于diversity有致命的影响,所以我们尝试使用一种已有diversity loss来解决这个问题,如下所示 其中Iout1和Iout2 是网络通过 和 生成的结果,可以看出这个 loss 要求不同的 生成的图 像差距越大,保证 diverse。但是这个 loss 直接用到我们的任务中非常不 work,首先直接 对全图算 会导致背景区域都变化,同时由于 Iout1 和 Iout2 都是被归一化到 , 这两个的差值要尽量大会导致一个图无限变白(数值往 1 靠近) 一个图无限变黑 (数值往 0 靠 近)。基于以上两点我们设计了更有效的损失函数叫做 perceptual diversity loss: 其中 代表的是 VGG 的第 层 feature, 代表 binary mask。首先用 VGG 提取输出图像 特征有利于防止最后输出往 1 或者 两个极端值靠近,同时乘 可以保证只影响生成区域 而不影响到背景区域,最后上面只有 1 而不是两个 相减是因为 是没有 spatial 信息的无 法与 相乘,如果上面还是 的差值那么我们发现最后仍然会影响到背景区域。 ExperimentsState-of-the-art Comparisons ![]() ![]() ![]() ![]() Ablation study ![]() ![]() 总结这份工作不同以往的inpainting,稍微拜托了一些image to image的框架,利用GAN的框架来做diverse的生成,我觉得这是一个不错的启发,希望对后面做inpainting的小伙伴们有一定启发,相比于editing那篇文章我更喜欢这篇哈哈,因为比较insightful! 这里提一下我最近比较喜欢的两份工作,一份是我好兄弟wanziyu的High-Fidelity Pluralistic Image Completion with Transformers以及清华的Shengyu Zhao 的Co-mod-gan。High-Fidelity Pluralistic Image Completion with Transformers采用transformer把image to image的问题转换成了一个概率问题应该说是搜索问题,是一个可以follow的work,而且效果非常不错。Co-mod-gan 的idea我在做PD-GAN的时候有过一个基本很像的,但没做出来哈哈,Co-mod-gan这个idea是用z去调制masked image和我们这个是想反的,但是Co-mod-gan没用l1-loss,我觉得是一个非常巧妙的idea。 虎牙公司成立于2016年8月,是一家以游戏直播为核心业务、致力于打造全球领先的直播平台的技术驱动型内容公司。虎牙公司在直播前沿技术上持续探索,目前已具备业内领先的实时内容创作和直播互动能力,包括了数字人、虚实互动、实时AI驱动、实时内容理解、实时渲染等技术,推出了超分超高清直播、赛事实时AI打点回放、游戏智能弹幕等产品功能。 如果觉得有用,就请分享到朋友圈吧! |
|