21小时上手深度学习2-开源项目之绘画

回复评论获得深度强化学习教学视频优质资源。

此教程也是博主的自我探索,适合数学基础不错(至少学过随机过程而且给学明白了拿B以上),编程的话至少熟练一种语言(sql不算哦),比如EECS还有各种工学院的同学我觉得没问题的啦。

如果不熟悉深度学习概念,请左转http://blog.csdn.net/TS1130/article/details/53244576 (原博在作业部落上) 花几个小时看看你就明白了。

另外声明~ 21小时只是说上手,就像你会玩一款新游戏,但是并不是说你就是游戏专家,可以代打或者可以参加战队参加国际比赛了不是这个意思~

开源项目清单之绘画领域

1)大家很喜欢的Prisma系列 , 使用的Neural Style

GitHub地址如下:

 (Pytorch)

 (Tensorflow)

论文在此A Neural Algorithm of Artistic Styleby Leon A. Gatys, Alexander S. Ecker, and Matthias Bethge.

觉得paper和源码懒得看看不懂的,请评论回复“Prisma” , 我可以私信分享我收藏的教程(当然不是我教的)

这里简单讲讲理论和代码,以tensorflow版本的代码为例子

Neural style的任务就是,我们有图A,图B。图A比如是一幅油画或者动画片的图,图B是我们的游客照,我们要把生成图C,C里面内容还是游客照,风格就是油画或者动画片了。是不是很酷!这样我们就获得了油画版本或者动画片版本的旅游照片了

图C继承了图A的风格(style),继承了图B的内容(content)

(While the global arrangement of the original photograph is preserved,the colors and local structures that compose the global scenery are provided by the artwork.)

这个需要如何数学表达和计算呢。

1)模型的loss function

我们给一个style loss function去帮助学习图A的风格,让图C和图A的style loss尽可能的小

同时有一个content loss function帮助学习图B的内容,让图C和图B的content loss同时也尽可能的小。

我们就在取其中的折中。当然,我们也可以自己设定多一些style loss还是多一些content loss

content loss是内容差异,所以用过了一层卷积之后的每个feature map, 对于特定的feature map, 算出 B和C之间每个像素差值平方和就可以了。

L(p,x,l)

x是生成的图像C,p是内容图像B

C经过第一层卷积比如产生了五个feature map, 我们叫他们 1C1, 1C2, 1C3, 1C4, 1C5.第一个1表示经过的是第一层卷积,C表示是图C产生的,12345是他们的编号。

对象的图B经过第一层卷积有五个feature map, 1B1,1B2,1B3,1B4,1B5(因为我们假设有五个filter)

这一层比如feature map 都是2*2的,那我们对位给feature map相减了以后求平方和

比如1C1是[1,2; 4,8] 1B1是[3,9;8,0] 那么他们对位减求平方和就是(1-0)^2+(2-9)^2+(4-8)^2+(8-0)^2

在论文里面为了减少计算,应该是把1C1这些矩阵都flatten了,就是说本来是2*2的矩阵,这里搞成4个数字组成的一个维度。反正也不影响计算。

相当于搞了一个结构叫1C。1C1是它的第一行。

所以1C的行数是feature map的个数,列数是一个feature map有多少个像素。

我们直接求 每个层的  0.5*(C(l)-B(l))^2 然后加起来就是content loss


例如

Style loss是风格差异,算的是卷积之后的每个feature map, 例如有n个feature map, 越抽象那风格差异应该就越小了

刚说了 1C 是生成图像C第一层的feature map的一个排布,每一行是一个feature map,每一列是一个feature map不同的维度(像素)

style loss怎么计算? 它很巧妙的计算的是, 对于一个特定图像,比如生成图像C,计算对于它特定的两两feature map之间的correlation

比如feature map 1 ,(也就是1C1) 和feature map 2 (1C2), 他们的值不是说好的 [1 4 2 8] 和 [ 3 9 8 0] 。这次我们不算他们的差值平方和,我们把他乘起来再相加。

也即是生成图像C第一层的feature map1和2的correlation是 1*3+4*9+2*8+8*0

我们叫这个值叫G12

同样也对图片A做这个操作,结果叫A12

对所有的feature map都这样做,得到一个gram matrix

(G12-A12)^2+(G23-A23)^2 + ........

然后再做一些normalize处理就好了。 文章中的build是为了求导方便

这个神奇的loss function为什么管用。。我查了一下

在线性代数中,内积空间中一族向量

格拉姆矩阵(Gramian matrix 或 Gram matrix, Gramian)是内积的对称矩阵,其元素由 Gij= (vi| vj)给出。

一个重要的应用是计算线性无关:一族向量线性无关当且仅当格拉姆行列式(格拉姆矩阵的行列式)不等于零。

本文的 style transfer 思路很简单:在图像内容附近通过白噪声初始化一个输出的结果,然后通过网络对这个结果进行风格和内容两方面的约束进行修正。而在风格的表示中采用的是Gram Matrix。

我是这样理解为什么用Gram 矩阵的:度量各个维度自己的特性以及各个维度之间的关系。

style transfer 当中,什么是风格,存在自己特性的才叫做风格。因此如何去度量这个自己的特性勒,自己的特点越突出,别人的越不突出最好。因此论文当中这样去做:

这样我们知道:当同一个维度上面的值相乘的时候原来越小酒变得更小,原来越大就变得越大;二不同维度上的关系也在相乘的表达当中表示出来。

因此,最终能够在保证内容的情况下,进行风格的传输。

内积之后得到的多尺度矩阵中,对角线元素提供了不同特征图(a1,a2 ... ,an)各自的信息,其余元素提供了不同特征图之间的相关信息。

于是,在一个Gram矩阵中,既能体现出有哪些特征,又能体现出不同特征间的紧密程度。论文中作者把这个定义为风格。

------------------------------------

2)深度学习中的特征

我们要怎么设计让模型去发现,风格和内容特征呢。

其实原论文的第一部分就是在讲,怎么从图像中用CNN抽取出来风格或者内容特征。 (style representation & content representation)

内容特征

他们的想法是,对于内容,内容的意思就是说,随着卷积层的深入,一些像素丢失掉了,但是大的形状还是okay得

在CNN中,输入图像用一组已经过滤的图像集合来表征(就是feature map)。随着filter越来越多,层次越来越深,feature map也越来越小。这里是用反卷积实现的特征可视化,通过每一特定层得到的response(也就是feature map)来重构输入图像。文中用了原VGG网络的‘conv1 1’ (a), ‘conv2 1’ (b), ‘conv3 1’ (c), ‘conv4 1’ (d) and ‘conv5 1’ (e) 来重构。abc基本是复现了原有像素,d,e抽象能力比较好,有像素的丢失但是全局排布信息依然保存下来。所以用d和e作为内容表示. 

风格特征

对于风格,就是,细化放大来看,图片的纹理更加具有某种独特的特征了。这里借鉴了CNN发现纹理特征的一篇文章,文章在这里也很有意思。

和内容特征不同的是,风格特征可以包括多层神经网络。而内容特征是,比如从第一层提取的内容特征,第二层提取的,层level是一个自变量。

而风格特征可以是,一层的风格特征,两层(第一层,第二层)的风格特征,五层(第一层到第五层)的风格特征。

为什么会有这个区别呢?

因为内容是全局的。风格可以是局部的。在文中,内容代表的是global arrangement,风格是local textual feature & color. 这个local可以是一小块。也可以是一大块。

(we use a feature space originally designed to capture texture information. This feature space is built on top of the filter responses in each layer of the network. It consists of the correlations between the different filter responses over the spatial extent of the feature maps . By including the feature correlations of multiple layers, we obtain a stationary, multi-scale representation of the input image, which captures its texture information but not the global arrangement)

风格可以被一小部分的低层的神经元代表,只是说视觉感受不一样,但是还是有代表性的。但是匹配高层神经元代表的风格特征的时候,局部图形结构的匹配就得做的规模更大一些,这样视觉感受更加平稳也更连续。

浅层,浅层+深层

但是内容,如果是我们之前说的第一层,第二层抽出来的内容特征,和原图差别不大,没啥利用价值。

同样文中也做了风格特征的重构(style reconstruction)。从风格特征出发的重构产生了输入图片的纹理版本, 它get到了颜色和局部结构。重点来了。取自输入图像的局部图像结构的复杂度和大小, 是不是随着卷积神经网络的深度增加,变得越来越复杂!是的!这件事情反过来可以用引发卷积神经网络灵感的局部感受野理论来解释。感受野的大小和特征复杂度增加了,局部图像结构的复杂度和大小也就增加了。

(We find that the local image structures captured by the style representation increase in size and complexity when including style features from higher layers of the network. This can be explained by the increasing receptive field sizes and feature complexity along the network’s processing hierarchy.)

所以我们使用 multi-scale representation as style representation.

文章的意思其实是,每张图片都有“风格”和“内容”,而这两个方面的特征是可以通过数学方法分离出来的。他使用了一个预训练的VGG来分离和抽取这些特征。

3)我们怎么去做训练的

固定权重W和b, 调整x

求loss function对x的偏导

VGG 用来抽特征,需要用W和b,用来做图像的表达(representation)

同时文章中还用了reconstruction 就是利用反卷积,对神经网络自动发现特征的过程进行的可视化,看每层都发现了些什么特征长啥样子。这个之前我提到过。论文在此。以后会详细分析。

a. 一个给定的输入图像被编码到预训练好的CNN的每一层中。然后我们固定权值(因为VGG是已经训练好的啊)改变我一开始随机生成的x直到它在某些层产生的response和图像B(内容图像) 是一样的。

b. 在每一层的CNN response之上,我们再造风格表示特征。它计算的是不同滤波器之间的correlation. 为了产生一个纹理来匹配咱已经弄好的风格重构的风格,我们用从白噪声开始的梯度下降法找到一个匹配风格图像A的风格的另外一个图像

where wl are weighting factors of the contribution of each layer to the total loss (see below for specific values of wl in our results). The derivative of El with respect to the activations in layer

l can be computed analytically

五个风格重构由这五组风格表示生成 ‘conv1 1’ (a), ‘conv1 1’ and ‘conv2 1’(b), ‘conv1 1’, ‘conv2 1’ and ‘conv3 1’ (c), ‘conv1 1’, ‘conv2 1’, ‘conv3 1’ and ‘conv4 1’ (d), ‘conv1 1’, ‘conv2 1’, ‘conv3 1’, ‘conv4 1’ and ‘conv5 1’ (e).

c.To generate the images that mix the content of a photograph with the style of a painting  we jointly minimise the distance of a white noise image from the content representation of the photograph in one layer of the network and the style representation of the painting in a number of layers of the CNN.

For the images shown in Fig 2 we matched the content representation on layer ‘conv4 2’ and the style representations on layers ‘conv1 1’, ‘conv2 1’, ‘conv3 1’, ‘conv4 1’ and ‘conv5 1’ (wl =1/5 in those layers, wl = 0 in all other layers) .


2)Neural Doodle

https://github.com/alexjc/neural-doodle

3) Image  Analogies

图像融合,和prisma有点像可以比较一下

awentzonline/image-analogies

4) Colornet

上色

Demo:Automatic Image Colorization・白黒画像の自動色付け

Paper:http://hi.cs.waseda.ac.jp/~iizuka/projects/colorization/data/colorization_sig2016.pdf

Code:satoshiiizuka/siggraph2016_colorization

Demo:https://deepart.io/

Paper:http://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Gatys_Image_Style_Transfer_CVPR_2016_paper.pdf

Let there be color 

https://github.com/satoshiiizuka/siggraph2016_colorization (Lua)

设想作业:可不可以根据衣服实物图生成设计图,根据设计图(手绘)生成实物图呢

5) srez:通过深度学习极大提高模糊图片的分辨率

https://github.com/david-gpu/srez

二、实现过程记录

1. Pytorch 安装

http://torch.ch/docs/getting-started.html

博主使用的是mac OS, El Captain。安装过程中碰到一些问题,多command line 了几次。最后提示

Not updating your shell profile.

You might want to

add the following lines to your shell profile:

. /Users/felicia/torch/install/bin/torch-activate

不过最后发现 弄了

source ~/.profile

一开始不行,反复了几下就Okay了。

一开始查了一些网上修复办法,都没有直接起到作用。不过也不知道有没有间接的帮助。其实如果再不行的话我打算在Mac上安装ubutun, 据说安装成功率100%

三、跑下开源项目

四、论文讲解

你可能感兴趣的:(21小时上手深度学习2-开源项目之绘画)