摘要:写在前面最近看了吴恩达老师风格迁移相关的讲解视频,深受启发,于是想着做做总结。主要思想目的把一张内容图片的风格迁移成与另一张图片风格一致。那么,一张图片的矩阵定义如下图自吴恩达老师的课程其中,和代表两个不同的是指第层。
最近看了吴恩达老师风格迁移相关的讲解视频,深受启发,于是想着做做总结。
目的:把一张内容图片(content image)的风格迁移成与另一张图片(style image)风格一致。
(图自论文:A Neural Algorithm of Artistic Style)
方法:通过约束 Content Loss 和 Style Loss 来生成最终的图片。
用一个已经 pretrained 好的网络(如 Resnet-50)作为 backbone 来提取图片每一层的特征。
每一个 filter 用来检测该层 input 的某一种特征,如果有这种特征,那么输出(activation)中对应 channel 就会被“点亮”(数值大)。
比如:假设这个 pretrained 好的网络中第一层有一个 filter 用来检测图像中处于水平状态的边缘,那么,如果图片(input)左上角有一些水平的边缘,那这个图片在该层的输出(activation)中对应 channel 左上角的数值就会比较大。
要保证 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。
论文中关于 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)
我在 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
摘要:这一新程序被称为,是一个完整的深度学习系统,它的架构已经嵌入手机中。因此,移动设备环境对机器学习系统提出了机遇和挑战。展望下一步,加上这样的研究工具链,是的机器学习产品的核心。 风格迁移一直是机器学习领域内的一项重要任务,很多研究机构和研究者都在努力打造速度更快、计算成本更低的风格迁移机器学习系统,比如《怎么让你的照片带上艺术大师风格?李飞飞团队开源快速神经网络风格迁移代码 》、《谷歌增强型...
摘要:不过,今年月问世的第一版其实效果还可以,实现了基于语义信息迁移的颜色提示,让上色效果更加和谐。生成过程迅速,效果尚好。作者在上回答说,和上一版相比,大部分训练都是纯粹无监督,甚至无条件的。 给喜欢的动漫形象建个了收藏夹,里面收集她的各种图片……懂,谁没几个喜欢的动漫萌妹呢。一些手绘线稿也很可爱,但黑白配色总会略显单调。请记住这张线稿半年前线稿上色AI style2paints的破壳曾让自动上...
摘要:我最近才发现在的代码中就有图像风格迁移的示例原谅我的后知后觉,是基于论文中的网络模型实现。中值滤波的窗口大小,用来对结果图像进行平滑处理,这个对结果影响不大。 现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了 模仿名画风格 的功能,比如 prisma、versa 等,可以把你的照片变成 梵高、毕加索、蒙克 等大师的风格。 showImg(https:...
摘要:所以,我们美团外卖技术团队尝试结合技术,来协助设计师避免这种低收益高重复的任务,同时低成本高效率高质量地完成海报图片的生成。图封面配色布局设计在设计领域的一些子问题上,可以用算法来挖掘出数据背后的规律如图所示。 背景 在视觉设计领域中,设计师们往往会因为一些简单需求付出相当多的时间,比如修改文案内容,设计简单的海报版式,针对不同机型、展位的多尺寸拓展等。这些工作需要耗费大量的时间、人力...
摘要:在这堂课中,学生将可以学习到深度学习的基础,学会构建神经网络,包括和等。课程中也会有很多实操项目,帮助学生更好地应用自己学到的深度学习技术,解决真实世界问题。 深度学习入门首推课程就是吴恩达的深度学习专项课程系列的 5 门课。该专项课程最大的特色就是内容全面、通俗易懂并配备了丰富的实战项目。今天,给大家推荐一份关于该专项课程的核心笔记!这份笔记只能用两个字形容:全面! showImg(...
阅读 1321·2021-11-25 09:43
阅读 3826·2021-11-22 13:53
阅读 768·2021-11-22 09:34
阅读 3460·2021-11-19 11:29
阅读 2027·2021-09-26 09:55
阅读 1018·2021-09-08 09:35
阅读 2928·2020-12-03 17:26
阅读 398·2019-08-29 16:06