资讯专栏INFORMATION COLUMN

风格迁移(Style Transfer)首次学习总结

J4ck_Chan / 2026人阅读

摘要:写在前面最近看了吴恩达老师风格迁移相关的讲解视频,深受启发,于是想着做做总结。主要思想目的把一张内容图片的风格迁移成与另一张图片风格一致。那么,一张图片的矩阵定义如下图自吴恩达老师的课程其中,和代表两个不同的是指第层。

0、写在前面

最近看了吴恩达老师风格迁移相关的讲解视频,深受启发,于是想着做做总结。

1、主要思想

目的:把一张内容图片(content image)的风格迁移成与另一张图片(style image)风格一致。

(图自论文:A Neural Algorithm of Artistic Style

 方法:通过约束 Content Loss 和 Style Loss 来生成最终的图片。

1.0 activation(representation)、kernel(filter)、channel 和 input

用一个已经 pretrained 好的网络(如 Resnet-50)作为 backbone 来提取图片每一层的特征。

每一个 filter 用来检测该层 input 的某一种特征,如果有这种特征,那么输出(activation)中对应 channel 就会被“点亮”(数值大)。

比如:假设这个 pretrained 好的网络中第一层有一个 filter 用来检测图像中处于水平状态的边缘,那么,如果图片(input)左上角有一些水平的边缘,那这个图片在该层的输出(activation)中对应 channel 左上角的数值就会比较大。

 1.1 Content Loss

要保证 Style Transferred Image 和原 Content Image 的内容尽可能相似【即,原 Content Image 左上角有处于水平状态的边缘,那么 Style Transferred Image 左上角也要有处于水平状态的边缘】,就意味着 Content Image 和 Style Transferred Image 经过同一个 pretrained 好的网络后,其对应层的输出(activation)要尽可能一致。

比如 ,Content Image 左上角有一些水平的边缘,则 activation 中 channel i 的左上角数值就会比较大,那么,我们也希望 Style Transferred Image 的 activation 中 channel i 的左上角数值也比较大(尽可能接近)。

所以,Content Loss 定义如下:

 (图自论文:A Neural Algorithm of Artistic Style

公式中的 representation 就是 activation。

 

1.2 Style Loss

论文中关于 Style 的定义如下:

we built a style representation that computes the correlations between the different filter responses, where the expectation is taken over the spatial extend of the input imag

一张图片的 style 可以定义为某一层的 activation 里 channel 与 channel 之间的 correlation 矩阵

比如:某张 Style 图片里左上角部分全是红色水平边缘的元素。

那么检测水平边缘特征的 filter 得到的 channel i 和检测红色特征的 filter 得到的 channel j 高亮(数值大)的地方就都会在左上角,那么,这两个 channel 对应位置相乘得到的数值就会比较大(10 * 10 = 100)。

假如此时还有一个检测蓝色特征的 filter,那么其对应得到的 channel k 左上角部分就不怎么会被点亮(数值小)【因为左上角部分全是红色水平边缘的元素】。那么,检测水平边缘特征的 filter 得到的 channel i 和 检测蓝色特征的 filter 得到的 channel k 对应位置的乘积就可能会比较小(10 * 0.5 = 5)。

那么,一张图片的 style 矩阵定义如下:

 (图自吴恩达老师的课程 ppt)

其中,k 和 k" 代表两个不同的 channel;l 是指第 l 层。

那么要保证 Style Transferred Image 和 Style Image 的风格相近,也就是让两张图片的风格矩阵尽可能相似。所以 Style Loss 定义如下:

 (图自论文:A Neural Algorithm of Artistic Style

2、示例代码

我在 Github 上找了一个能跑得通的示例代码:https://github.com/Zhenye-Na/neural-style-pytorch

其中的核心代码如下:

Content Loss & Style Loss & Style Matrix

class ContentLoss(nn.Module):    """    Content Loss.    """    def __init__(self, target,):        """Initialize content loss"""        super(ContentLoss, self).__init__()        # we "detach" the target content from the tree used        # to dynamically compute the gradient: this is a stated value,        # not a variable. Otherwise the forward method of the criterion        # will throw an error.        self.target = target.detach()    def forward(self, inputs):        """Forward pass."""        self.loss = F.mse_loss(inputs, self.target)        return inputsclass StyleLoss(nn.Module):    """Style Loss."""    def __init__(self, target_feature):        """Initialize style loss."""        super(StyleLoss, self).__init__()        self.target = gram_matrix(target_feature).detach()    def forward(self, inputs):        """Forward pass."""        G = gram_matrix(inputs)        self.loss = F.mse_loss(G, self.target)        return inputsdef gram_matrix(inputs):    """Gram matrix."""    a, b, c, d = inputs.size()    # resise F_XL into /hat F_XL    features = inputs.view(a * b, c * d)    # compute the gram product    G = torch.mm(features, features.t())    return G.div(a * b * c * d)

train

for epoch in range(0, self.args.epochs):    def closure():        # correct the values of updated input image        input_img.data.clamp_(0, 1)        self.optimizer.zero_grad()        model(input_img)        style_score = 0        content_score = 0        for sl in style_losses:            style_score += sl.loss        for cl in content_losses:            content_score += cl.loss        style_score *= self.style_weight        content_score *= self.content_weight        loss = style_score + content_score        loss.backward()        if epoch % 5 == 0:            print("Epoch {}: Style Loss : {:4f} Content Loss: {:4f}".format(                        epoch, style_score.item(), content_score.item()))        return style_score + content_score    self.optimizer.step(closure)

优化器

def _init_optimizer(self, input_img):    """Initialize LBFGS optimizer."""    self.optimizer = optim.LBFGS([input_img.requires_grad_()])

注意!这里只更新 input image,网络是不进行学习的!

还有,这是一个我之前没用过的优化器:LBFGS,其中有一个参数:

max_iter (int): maximal number of iterations per optimization step (default: 20)

这也就是为什么训练结果里每一个 epoch 更新会有二十次打印信息(iteration)了,之前一直想不通,我还找半天代码里哪里有 20 这个数字。。。

运行结果

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121102.html

相关文章

  • Facebook贾扬清宣布新机器学习系统Caffe2Go

    摘要:这一新程序被称为,是一个完整的深度学习系统,它的架构已经嵌入手机中。因此,移动设备环境对机器学习系统提出了机遇和挑战。展望下一步,加上这样的研究工具链,是的机器学习产品的核心。 风格迁移一直是机器学习领域内的一项重要任务,很多研究机构和研究者都在努力打造速度更快、计算成本更低的风格迁移机器学习系统,比如《怎么让你的照片带上艺术大师风格?李飞飞团队开源快速神经网络风格迁移代码 》、《谷歌增强型...

    Rango 评论0 收藏0
  • 超火的漫画线稿上色AI出新版了!无监督训练,效果更美好

    摘要:不过,今年月问世的第一版其实效果还可以,实现了基于语义信息迁移的颜色提示,让上色效果更加和谐。生成过程迅速,效果尚好。作者在上回答说,和上一版相比,大部分训练都是纯粹无监督,甚至无条件的。 给喜欢的动漫形象建个了收藏夹,里面收集她的各种图片……懂,谁没几个喜欢的动漫萌妹呢。一些手绘线稿也很可爱,但黑白配色总会略显单调。请记住这张线稿半年前线稿上色AI style2paints的破壳曾让自动上...

    Julylovin 评论0 收藏0
  • Python+OpenCV 图像风格迁移(模仿名画)

    摘要:我最近才发现在的代码中就有图像风格迁移的示例原谅我的后知后觉,是基于论文中的网络模型实现。中值滤波的窗口大小,用来对结果图像进行平滑处理,这个对结果影响不大。 现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了 模仿名画风格 的功能,比如 prisma、versa 等,可以把你的照片变成 梵高、毕加索、蒙克 等大师的风格。 showImg(https:...

    DoINsiSt 评论0 收藏0
  • AI技术在智能海报设计中的应用

    摘要:所以,我们美团外卖技术团队尝试结合技术,来协助设计师避免这种低收益高重复的任务,同时低成本高效率高质量地完成海报图片的生成。图封面配色布局设计在设计领域的一些子问题上,可以用算法来挖掘出数据背后的规律如图所示。 背景 在视觉设计领域中,设计师们往往会因为一些简单需求付出相当多的时间,比如修改文案内容,设计简单的海报版式,针对不同机型、展位的多尺寸拓展等。这些工作需要耗费大量的时间、人力...

    wums 评论0 收藏0
  • 《DeepLearning.ai 深度学习笔记》发布,黄海广博士整理

    摘要:在这堂课中,学生将可以学习到深度学习的基础,学会构建神经网络,包括和等。课程中也会有很多实操项目,帮助学生更好地应用自己学到的深度学习技术,解决真实世界问题。 深度学习入门首推课程就是吴恩达的深度学习专项课程系列的 5 门课。该专项课程最大的特色就是内容全面、通俗易懂并配备了丰富的实战项目。今天,给大家推荐一份关于该专项课程的核心笔记!这份笔记只能用两个字形容:全面! showImg(...

    wenhai.he 评论0 收藏0

发表评论

0条评论

J4ck_Chan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<