深度学习AI美颜系列---AutoRetouch端到端美颜方案

Posted Trent1985

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习AI美颜系列---AutoRetouch端到端美颜方案相关的知识,希望对你有一定的参考价值。

AI美颜的其中一种模式,就是直接使用端到端的训练模式。

这里详细介绍一种端到端的美颜算法,使用的论文是:AutoRetouch:Automatic Professional Face Retouching

这篇论文是一个典型的端到端美颜模式,即原图输入网络,美颜后的效果图输出,这种模式基本上都是使用Pix2Pix类似的GAN网络架构来实现。此类模式,非常适合美颜类特效的处理。理论上,只要有成对的有规律的数据,使用Pix2Pix就是个不错的选择。这也是一种偷懒的方式,因为你不必理会效果中缩包含的复杂的算法,你缩担心的问题只有数据。

原版的Pix2Pix有些问题,比如清晰度不够,无法生成高清图像等,因此有了Pix2PixHD版本,这些内容大家可以到网上自行了解,这里要讲的是论文算法。

论文的网络结构:G和D网络

D网络使用了Pix2Pix的原版D网络;

G网络如下:

 

这个网络也比较简单,截图来自论文,输入3通道的原图,输出美颜后的效果图。原图输入后先做了一个大核7X7的卷积,通道扩增为64,然后是LeakyReLU层,接着是卷积下采样(这里下采样通道数好像写错了,应该是64-128),下采样之后是个15层的Resblock模块,每个模块中包含两次卷积+BN+LeakyReLU,最后是跳跃层Add。Resblock之后,是卷积和上采样,同时与前面对应层进行连接Add,在卷积输出效果图。整体上看是一个极简单的Unet结构,只是用了一次下采样,一次连接层。论文中说这样做的目的是为了更好的保留细节纹理。

有了G和D网络,剩下的就是LOSS,这篇论文依旧采用很普遍的LOSS:

LOSS使用的是标准GAN 的LOSS和感知LOSS以及MSE三者的加权,权重选择如上所示。单独使用 MSE 损失可以得到平滑的图像,加入 perceptual loss(感知损失)可以改善这种情况。但是,感知损失仍然不能保留精细的细节。加上 adversarial loss 可以促使网络对图像进行尽可能少的改变。

整体上看,这篇论文是个中规中矩的GAN网络训练论文,本文只是借此来说一下这种美颜的模式。

论文效果图如下:

论文使用的数据集是FFHQR Dataset,地址:https://github.com/skylab-tech/ffhqr-dataset

 

论文地址:

https://link.zhihu.com/?target=https%3A//openaccess.thecvf.com/content/WACV2021/papers/Shafaei_AutoRetouch_Automatic_Professional_Face_Retouching_WACV_2021_paper.pdf

本人复现的代码如下:

def resblock(self, inputs, out_channel = 32):
        x = Conv2D(out_channel, kernel_size = (3,3), padding = "same")(inputs)
        x = BatchNormalization(momentum=0.8)(x)
        x = LeakyReLU(alpha = 0.2)(x)
        x = Conv2D(out_channel, kernel_size = (3,3), padding = "same")(x)
        x = BatchNormalization(momentum=0.8)(x)
        x = LeakyReLU(alpha = 0.2)(x)
        return Add()([x, inputs])
    #G网络定义
    def build_generator(self,input_shape=(None,None,3)):
        inputs = Input(shape = input_shape, name="inputs")
        channel = 64
        x = Conv2D(channel, kernel_size = (7,7),strides = (1,1), padding = "same")(inputs)   #1024*1024
        x = LeakyReLU(alpha = 0.2)(x)
        x0 = x        
        x = Conv2D(channel * 2, kernel_size = (3,3),strides = (2,2), padding = "same")(x)   #512*512
        for idx in range(15):
            x = self.resblock(inputs = x, out_channel = channel * 2)
        x = Conv2D(channel, kernel_size = (3,3),strides = (1,1), padding = "same")(x)   #512*512
        x = LeakyReLU(alpha = 0.2)(x)
        x = UpSampling2D((2,2))(x)
        x = Add()([x, x0])
        x = Conv2D(3, kernel_size = (3,3), padding = "same", activation='tanh')(x)
        model = Model(inputs, x)
        model.summary()
        return model
    #D网络定义
    def build_discriminator(self):
        # layer 0
        def d_layer(layer_input, filters, f_size=4, bn=True):
            """Discriminator layer"""
            d = Conv2D(filters, kernel_size=f_size, strides=2, padding='same')(layer_input)
            d = LeakyReLU(alpha=0.2)(d)
            if bn:
                d = BatchNormalization(momentum=0.8)(d)
            return d
        img_A = Input(shape=self.img_shape)
        img_B = Input(shape=self.img_shape)
        # Concatenate image and conditioning image by channels to produce input
        combined_imgs = Concatenate(axis=-1)([img_A, img_B])
        d1 = d_layer(combined_imgs, self.df, bn=False)
        d2 = d_layer(d1, self.df*2)
        d3 = d_layer(d2, self.df*4)
        d4 = d_layer(d3, self.df*8)
        validity = Conv2D(1, kernel_size=4, strides=1, padding='same')(d4)
        model = Model([img_A, img_B], validity)
        model.summary()
        return model

这里说下本人实现时遇到的问题,本人用了FFHQR中前面两万张数据进行训练,但是网络无法收敛,经常模型坍塌,后来发现有两个原因:

①数据太少,应该把7万数据都拿来训练,才能学到规律;

②数据中有些样本效果有问题,比如脸上的痘印,有些图去除的很干净,相反有些图却没有去掉,这种样本较多,导致了样本的无规律性,因此,如果样本数量较少,无法学到规律;

举例如下图所示:左边为效果图,右边为原图,可以看到左边效果图中的人脸痘痘根本没有去除;

上述就是端到端通用解决方案的介绍,完整的代码工程下载:关注微信公众号“SF图像算法”,回复“AutoRetouch"即可获取免费下载连接!

本人QQ:1358009172,AI美颜算法交流群:600926436,欢迎技术交流!

 

以上是关于深度学习AI美颜系列---AutoRetouch端到端美颜方案的主要内容,如果未能解决你的问题,请参考以下文章

教程专知-PyTorch手把手深度学习教程系列完整版

中美摩擦之下,如何选择适合中国开发者的移动端深度学习框架?

AI 开发者看过来,主流移动端深度学习框架大盘点

AI学习移动端深度学习框架盘点

深度学习系列一起来参加百度 PaddlePaddle AI 大赛吧!

专知国庆特刊-PyTorch手把手深度学习教程系列01一文带你入门优雅的PyTorch