在计算机视觉中,input vector往往维度很高,将其直接应用于neural network很有可能会造成overfitting,以下图为例:
在“cat recognition”中,cat image为64643的vector,将其转换到一维空间,则其维度为12288,如此高维的input直接输入neural network会造成overfitting现象。
在“卷积神经网络”中,可以用convolution operation对原始input进行降维,从而防止neural network过拟合。
convolution operation除可用于“降维”,还可用于“边缘检测”,如下图所示:
在人脸识别中,convolution operation可以识别人脸的局部边界——人脸局部——整个人脸;
在object recognition中,convolution operation可以识别image中“垂直部分”和“水平部分”;
利用convolution operation进行边缘检测的原理如下:
值得一提的是,convolution operation除可进行“垂直检测”以外,也可进行任何“角度的检测”,具体方法如下图所示:
将filter中的各个元素设为未知数w_i,利用backward propagation求解参数w_i,使得output为某个角度的“边缘检测”。
在上一节中已经讲了convolution operation的原理,本节主要讲述一下convolution operation涉及的几个过程:
在convolution neural network中,其cost function为“最大似然函数”,如下图所示:
前面讲的convolution operation是在“二维空间”进行的,这节讲的convolution operation是在“三维空间”进行的,它与前面所讲的convolution operation操作相近,只是filter也从二维上升到了三维,如下图所示:
对于一个(6,6,3)的input,其filter为(n,n,3),二者的convolution operation,即:将filter与input相应位置的元素相乘然后进行加法运算,得到最终的output。
下图中,给input运用了2个filter(3,3,3),每个filter会得到一个output(4,4,1),将两个output叠加,即为最终的输出(4,4,2)。
在前几节中,我们所讲的convolution operation,filter都不会进行mirring action(flipping),严格来讲,在教科书中,这种操作叫做cross-correlation;
如果在进行convolution operation之前,首先将filter 翻转,然后在用flipped filter进行convolution operation,则可以将这种操作严格定义为convolution operation。这种filter flipping使得convolution operation有以下性质:(AB)C=A(BC);这种操作在“信号处理”中,可以取得better performance,但是In deep learning ,一般不需要刻意进行filter flipping,也可取得good performance;
filter flipping操作如下图所示:
首先将fiter在“垂直和水平方向”进行flipping,然后,对input和flipped filter进行convolution operation。
本节主要讲解一些经典的“卷积神经网络”(如下图所示),为读者构建自己的“卷积神经网络”提供一些参考。
残差网络块的构建
在普通的神经网络(plain neural network)中,要训练一个deep neural network是很难的,因为,deep neural network可能会导致weight exploding或weight vanishing的现象。"残差网络"能够很好的解决“deep neural network”中weight exploding or vanishing的现象。
残差网络:是由残差网络块 构成的,残差网络块 的构建如下:
在普通的神经网络中,a[l]到a[l+2]的构建过程如下:
z[l+1]=w[l+1]a[l]+b[l+1],a[l+1]=g(z[l+1]),
z[l+2]=w[l+2]a[l+1]+b[l+2],a[l+2]=g(z[l+2]);
在残差网络中,a[l]到a[l+2]的构建过程如下:
z[l+1]=w[l+1]a[l]+b[l+1],a[l+1]=g(z[l+1]),
z[l+2]=w[l+2]a[l+1]+b[l+2],a[l+2]=g(z[l+2]+a[l]);
可以看出,普通神经网络和残差神经网络的主要区别在于a[l+2]的构建,这种差异,可以防止在构建深层神经网络时,发生weight exploding or vanishing现象。
上图讲解了残差网络块的构建方法,下图中,给出了“普通神经网络(plain neural network)”和“残差神经网络”,随着layer 层数的增加,training error的变化情况:
如图所示:在plain neural network中,随着layer数量的增加,training error是呈现“先降低后增加”的趋势的,这与theory并不一致。而在ResNet中,随着layer数量的增加,training error是一直呈现“降低”趋势的。
造成plain neural network中,training error先降后增趋势的主要原因,是因为,构建“深层网络”的难度会逐渐加大。
为什么使用残差网络能够构建“深层神经网络”
“残差网络”之所以能够构建“深层神经网络”,是因为,随着layer数量的增加,对于plain neural network来说,为了不hurt neural network的performance,需要通过调节weight来使得a[l+2]与a[l]相同,这对于plain neural network来说,是很难办到的。而在“残差网络”中,为了使a[l+2]与a[l]相同,我们可以根据公式:a[l+2]=g(w[l+2]a[l+1]+b[l+2]+a[l]),使得w[l+2],b[l+2]都等于0,这样:a[l+2]=g(a[l]),由于active function是一个ReLu,因此,a[l+2]=g(a[l])=a[l]。“残差网络”利用这种办法,可以防止在layer较多时,performance下降,从而可以构建一个“深层神经网络”。
在上述公式:a[l+2]=g(z[l+2]+a[l])中,要保证z[l+2]和a[l]具有相同的维度,方法具体有如下两种:
1、可以利用ws矩阵来保证z[l+2]和ws*a[l]具有相同的维度,ws可以是未知数,用gradient descent求得;(ws中,多处的部分可以用0来填充,相当于0 padding)
2、使用“same convolution(即:卷积前后,维度相同)”,来保证z[l+2]和a[l]具有相同的维度。
将plain neural network变为ResNet
将plain neural network转化为ResNet,只需要每隔两层,将a[l]添加与a[l+2]的计算中,即:a[l+2]=g(z[l+2]+a[l]);(需确保z[l+2]和a[l]具有相同的维度)
11 convolution的实质,就是将一个number乘到各个input element上,并对channel方向上的各个“multiplication value”相加。
11 convolution的主要作用是控制output的channel dimension。
如下图所示:对于一个 6632的input,可以通过1132的filter,将其output的dimension降维:661,从而降低“电脑计算量”。
如下图所示,通过11 convolution可以给出任意channel的output。
下图中:2828192 input,与32个11192 filter,进行convolution operation之后,得到一个282832的output。
谷歌的inception network中便运用了11 convolution,具体看下节inception network。
inception neural network中,会利用11 convolution来降低input channel,从而减少计算量,如下图示:
将2828192 input,利用各种filter,得到output layer,最后将这些output layer 堆叠起来,便得到最终的output。在这个过程中,存在一个问题:input channel很大,因此,需要花费很多的计算量。为了降低计算量,我们可以通过引入11 convolution来解决。
(convolution operation中的各个数值如图示)
下图为引入11 convolution后,卷积神经网络的计算过程,从图中可以看出,引入16个11*192 convolution后,可以将input channel降低至16,在这个基础上,进行各种convolution operation,将极大的降低计算量。
上图中,展示了一个inception network block,其具体由几部分构成:1、利用11 convolution对input channel进行降维;2、对降维后的input进行各种convolution operation。
下图展示了一个简单的inception neural module:其convolution operation中,整合了很多的11 convolution的使用。
下图中为一个完整的inception network:
该inception network是由上述inception network module组合而成的,在这个inception network中,很多hidden layer直接应用了FC filter — softmax(output可以用于预测input的label)。这种做法可以使得inception在不同的layer 深度进行label的预测,从而有效防止overfitting。
利用github中已训练出的一些neural network,作为你训练工作的“初始点”,可以,帮助你更快的得到fitted model。此外,利用github中的这些neural network,也可以展开“迁移学习”。
可以将github中的一些“开源network”,应用于“迁移学习”中:
1、“小型数据”的“迁移学习”
将softmax function的output设为现在的number of classification label ,保持其它的neural network 不变。
在进行transfer learning时,可将原input -> last layer of network 的计算值保存在disk上,然后,根据最后一层Layer计算得出的feature vector,利用Gradient descent计算softmax function的参数。用于predict;
2、“中型数据”的“迁移学习”
可以冻结前几层layer的weight,修改softmax function。然后,训练后边的network的参数:1)后边network的训练,其初始值可以选用原来的weight。
2)后边network,可以使用自己自定义的network,然后,利用GD训练weight。
3、“大型数据”的“迁移学习”
可以使用原训练的weight,作为初始值,训练network。
Ps:记得修改softmax function;
在computer vision中,可利用transfer learning ,利用别人的code去训练自己的模型,往往能达到很好的效果;
在“计算机视觉”中,可用的training dataset往往较小,针对这种情况,可以用以下提及的“数据扩充方法”增加training dataset的size。
在data augmentation中,也有一些hyperparameter to tune,you can use open source ,but if you want to have more invariance in data augmentation ,you can also tune hyperparameter by yourself。
利用image classification可以识别“image”中的object;
而classification with localization能够锁定要识别的object,进而用于“目标检测”;
以下图为例说明:
在目标检测中:
首先将image中的object进行锁定,如图image中的red bound;
然后对锁定的object 进行classification;
在下述例子中,object的类别有4中,pedestrian,car,motorcycle,background;
用于锁定object的red bound可以用坐标表示:bx(中心点x坐标),by(中心点y坐标),bh(red bound的高度),bw(red bound的宽度);
Pc用于表示image中是否有object。
将image input输入 model,即可得到上述8个output的值,具体,见下一张PPT。
如下PPT中,展示了model的output{Pc,bx,by,bh,bw,C1,C2,C3},其中Pc={0:image中没有object,1:image中有object},bx,by,bh,bw为红框坐标值,C1,C2,C3为1时,分别表示image中存在pedestrian,car,motorcycle。
在“目标检测”中,cost function可以使用如下形式:
1)对于不同的output,其cost function的形式不同:
Pc:可以用logisitc/max likelihood;
bx,by,bw,bh:可以用“squared error”;
C1,C2,C3:可以用softmax/max likelihood;
将3种形式的cost function相加,即为model的cost function.
这种cost function在实际中比较常用;
2)除使用上述形式的cost function以外,对于不同的output,也可以统一使用“squared error cost function”。
在cost function计算中,如果:
Pc=1,则其他的output对于cost function比较重要,需要关注;
Pc=0,说明image中没有object,其他的output don’t care。
目标检测,可以应用于很多实际场景,如:
识别人的表情:通过标识人脸的关键部位(landmark)坐标,来判断一个人此时此刻的表情;
计算机图形化:如给人的头部加上一顶皇冠:同样的,首先识别人脸landmark的坐标,然后,根据该坐标值,判断皇冠的具体位置(坐标);
判断人现在的motion:标识人体关键部位的坐标,如:肩,手臂关节等,通过landmark的坐标值,判断人此时此刻的动作。
具体操作步骤:
step1:构建trainingdata{X:image input,y:人工标记的image中各个landmark的坐标}
step2:将training data投入“卷积神经网络”,训练network的参数;
step3:将一个test sample input投入训练好的“卷积神经网络”,即可得到test sample中各个landmark的坐标值。进而可以根据这些坐标值,判断image中人的面部表情,进行计算机图形绘制,人的motion等等。
我们执行目标检测的步骤如下:
step1:利用一个定常的bounding box,在image中移动,形成一个个小的image(cropped image);
step2:将这些cropped image输入已经训练好的ConvNet,判断其是否为object。
下图为car detection task:将image 以指定体积 切成多个sub_image,然后,将这些sub_image送入训练好的ConvNet,判断其是否为car。
在实际工作中,我们要将不同size的bounding box在image中以不同的sliding stride移动,从而得到若干sub_image,将这些sub_image送入以训练好的ConvNet,判定这些sub_image是否为object。
在实际应用中要注意,sliding stride不能太大,否则,可能会漏掉object。
由于要以不同size的bounding box游走整个image,并且将这些sub_image送入ConvNet中进行预测,因此,即便只是预测一个image,也会花费很大的计算量。为了克服这个难点,学者提出了“卷积的滑动窗口实现”。
在上一节中,我们提到,sliding window object detection的使用,会花费很多的计算量。为了解决这一问题,学者提出了“卷积的滑动窗口实现”,其核心思想是:将原input,利用ConvNet,进行降维预测,每一个output代表一个bounding box image的预测结果,通过这种方式,可以一次性的对image上的所有bounding box image进行object detection,从而大大降低了计算量。
具体实现,如下图所示:
虽然“卷积窗口的实现”与“sliding window object detection”相比,能够极大降低计算量,但是,他也有一个缺点,即:The position of bounding box is not that accurate(边界框的位置无法精确定位)。针对这一问题,学者提出了一种解决算法:YOLO algorithm。
通过YOLO algorithm可以得到the accurate position of bounding box。
下面介绍YOLO的核心思想:
YOLO的核心思想是将image切分成nn份sub_image(下图n=3),利用一个ConvNet同时预测nn个sub_image的label。
在下图中,其label为81的vector(Px,bx,by,bh,bw,c1,c2,c3)。
因此,如果将image切分成33的grid,ConvNet的output将为338,每个118为一个sub_image的label的预测值。在上述预测过程中,整个image为ConvNet的input,ConvNet的output为338 matrix。
与“sliding widow object detection”相比,YOLO能够更精确的定位bounding box的位置,而在"sliding window object detection"中,由于bounding box一直slide with a specific stride,因此无法准确定位某个bounding box的具体位置。除以以外,YOLO能够一次性的预测出所有bounding box sub_image的output(like 卷积窗口实现),而sliding window object detection中,每个sub_image都需要单独进行预测,计算量庞大。
在YOLO中,有以下几个注意事项:
1)当object位于多个bounding box中,将object中心点所在bounding box作为其所在bounding box。
2)在YOLO算法中,通过将切分粒度细化,可以防止同一个bounding box中,包含多个object。
上述例子中,bounding box中object的编码方法如下:
假设每个bounding box的upper left point坐标为(0,0),below right point坐标为(1,1)。根据这个坐标系来判断object中心点的位置(bx,by),然后,根据object占bounding box边长的比例,来确定bw,bh。
其中,bx,by取值[0,1]。bw,bh取值可以>1,因为object的size可能大于bounding box edge size。
在object detection中,可能存在这样的现象,即:多个bounding box都覆盖同一个object,为了避免overestimate object的数量,我们期望,每个object,只有一个bounding box,“非极大值限值”即可实现上述目的。
“非极大值限值”核心思想:
如下图所示,image中的两个car,均有很多bounding box覆盖他们,以image中right-hand car为例说明:为了使car 只有一个bounding box我们可以进行下述操作:
step1:利用ConvNet获得各个grid的probability;
step2:将probability
step4:选出一个最大的probability作为car的bounding box(记为B);
step5:计算其他的bounding box与B的IOU,当IOU>0.5(认为设定)时,将其他的bounding box去除;
step6:剩下的bounding box即为各个object的bounding box;
下述PPT为car detection的non-max suppression algorithm:
如果想要同时对image中的car,motor,pedstrain进行检测,则在进行Non-max suppression时,应该分开进行,即在上述algorithm的基础上在加一个for loop: for e in [car,motor,pedestrain],使得non-max suppression algorithm每次只针对一个object进行。
上述的object detection中,每个grid只能detect only one object,为了使得grid能够识别多个object,可以引入“anchor boxes”,如下节所示。
anchor boxes的核心思想是:对于给定的grid,赋予其两个预先定义好的(在本节例子中为2个,实际也可为>2个)anchor boxes。
如下图所示:middle point所在的grid同时覆盖两个object, 为了能够同时识别这两个object,我们引入预先设定的anchor boxes{anchor box1:代表行人,anchor box2:代表car},并用这两个anchor boxes去与grid的bounding box相比较,与anchor box1相似,说明有pedestrain,与anchor box2相似,说明有car。针对anchor box,将原output修改为(16,1),前8个output代表anchor box1的检测结果,后8个output代表anchor box2的检测结果。
上几节中,我们所讲的object detection与anchor box object detection区别如下PPT所示:
Note that:
当一个grid中包含3个object,或者2个object都全部覆盖于一个grid时,又或者一个anchor box同时与2个object相符合时,anchor box object detection效果不好,需要采取一些机制,smooth这些problem。
anchor box可以人为设定(如上例中,认为设定表示“行人”和“车”的anchor box shape),也可以利用一些algorithm形成(自己查阅文献)。
training
在利用YOLO算法训练时,我们要得到的是将training data切分为332 slice(In pratical :19195)(其中2指2个anchor box)后,每个slice的预测结果。
利用YOLO进行训练的具体操作如下:
step1:制作training data为:{X:1001003的image,y:人工标记好的332个slice的预测结果(3328)},target y包括每个grid下产生的bounding box的坐标,这些坐标由人工标注,用于training。
step2:利用这个training data训练一个ConvNet,使得输入一个test sample,输出为该image的332个slice的预测结果3328;
每一个111*8为一个grid cell(slice)的一个anchor box的预测结果;
需要注意的是,在output y 中,如果pc<0.5,说明没有object,则可不对其他的element进行预测;
解析:各个grid的output可以通过一个ConvNet实现,这些output包括(Pc,bounding box坐标,3个class的类别)。在每个grid上加入anchor box后,在进行人工标记时,会标注每个anchor box下的(Pc,bounding box,3个class的类别),note that,anchor box是人为设定的,给定一个grid时,其anchor box相当于是基于此grid的中心点,又设定了两个固定长宽的box。
根据上述的描述,每个grid的每个anchor box有一个bounding box,而object可能位于多个grid中,因而使得一个object可能有多个bounding box,为了解决这个问题,可以对每一类的object分别使用non-max suppression。
Note that:每一个grid的每一个anchor box的output为(Pc,bx,by,bh,bw,c1,c2,c3),因此,每个anchor box都会形成一个bounding box。这里bounding box也是output的一部分。
在训练阶段,训练样本中的image中各个grid的各个anchor box的bounding box的坐标是人工标注的。
prediction
在获得object detection的output之后,即可确定每个grid的probability,以及各个grid 的 bounding box,并且将概率值
上述解决方案为one object detection,对于multi object detection,在做non-max suppression时,需要对每一个object independently做,具体如下:
For loop(每一类object (如:car)):
在IOU>0.5的bounding boxes中,留下probability最大的那一个bounding box,去掉其他的bounding boxes,最终留下的bounding boxes即为各个car的bounding box。
output the non-max suppressed outputs
在anchor object detection中,对于每个grid会获得两个bounding boxes。
将image中所有的bounding box中probability
在“sliding window object detection”中,你需要花费很多时间对没有object的blank grid进行预测,这显然是非常低效的,为了改进这一downside,学者提出了“region proposals”的概念,如下图(3)所示:
region proposals的核心思想是:切分出可能有object的区域,然后,对这些区域进行分别预测,判断其是否为一个object,并且预测其bounding box的坐标。
在上述的"region proposals"方法中,有几个可以改进的点(如下图所示):
普通的R-CNN步骤:1)切分出regions;2)依次对每个region进行分类,输出label+bounding box;
Fast-R-CNN:1)切分出regions;2)用“卷积窗口实现”一次性对所有regions做出预测,输出所有region的label+bounding box;
Faster R-CNN:上述Fast-R-CNN的一个limitation是,region segmentation耗时较长,为了解决这一limitation,学者提出“利用 ConvNet 来切分regions”;
Note that:即便是Faster R-CNN,其对test sample的预测依然需要分两步进行,相比YOLO algorithm,其依然需要花费较高的时间复杂度。
AndrewNg personal view:比起R-CNN,“卷积窗口实现”在computer vision中更具前景,因为,他不需要分步进行,只用一个ConvNet便可对test sample进行预测。
下边的PPT讲述了“face verification”和“face recognition”的区别:
Face verification:
input image,name,algorithm会验证所输入的image是否是声称的人。
Face recognition:
输入image,如果database中有这个人,algorithm将返回其name/ID。
与Face verification相比,Face recognition难度更大。在Face verification中,如果algorithm精确度为99%,可用。而在Face recognition中,如果algorithm精确度为99%,其对于Face recognition ,精确度依然太低,不可用。造成这种差别的原因是因为:在face verification中,input:comparision object=1:1,当algorithm精确度为99%时,其错误率仅为1%。而在face recognition中,input:comparision object=1:k,当algorithm精确度为99%时,其错误率为k%。k为face recognition中database的image数量。
什么叫one-shot learning
for most face recognitions, you need to recognize a person given just one single image, or given just one example of that person’s face。
如下图所示:
在一个“人脸识别系统”中,database中每个人的image只有一张,要训练一个ConvNet,使得输入一张image,然后判断该image是否与database中的某一张image相似,这种做法是非常不可取的,原因如下:1)本身拥有的training data size过小;2)如果新来一个同事,database将又增加一个image,那么,我们将要重新训练PPT所示的ConvNet,效率过低。
One-shot learning的正确打开方式
一种学习One-shot learning的方式是:设计一个d(image1,image2)公式,计算像个image的距离,距离越小,说明相似度越大,越有可能是同一个人。
如下图所示:
对于给定的input image,计算其与database中的image2的d(image1,image2),如果d
Siamese network的主要工作是,对输入的image重新编码,使得该编码最能代表image。其内在机理如下图所示:
给定一个Siamese network,当输入x(i)时,其输出x(i)的编码f(x(i))。则两个image x(i),x(j)之间的距离可用 ||f(x(i))-f(x(j))||2 表示。
将face recognition看成是一个二分类问题
不同于上一节的Triplet loss function,本节中将face recognition看成是一个binary classification,利用logistic likelihood以及backward propogation来求解Siamese network parameter以及logistic中的parameter,具体过程如下所示:
1、首先说明“该二分类任务”的工作过程:
在model的前端为Siamese network,用来encode image,将2张image的编码输入到logistic regression(其公式为 g(w*d(image1,image2)+b)),求得logistic的预测值:{output=1 : 2个image为同一人,output=0 : 2个image为不同的人}。
需要注意的是:d(image1,image2)可以使用不同的公式来表示,如下PPT所示,可以使用欧几里得,也可以使用X2。
2、Siamese network和logistic 中参数的求解
个人理解:可以将“最大似然函数”作为“目标函数”,通过backward propagation求解model中所有参数;
3、face recognition 实际应用的一些技巧
在实际的face recognition task中,可以利用已经训练好的Siamese network将database中的image进行encode,并将其作为image的特征存储在database中(precomputed),这样在进行一个face recognition task时,只需要计算input image的Siamese encoding,而不用在去计算database中的image code,可以节省face recognition时间。
在该binary classification中,training data的创建方式
在该binary classification(face recognition)中,一个training sample是有“2张image”构成,其对应的target y为{0:different person,1:same person},如下图所示。
总结,2种实现one-shot learning的方式:
1、通过计算2个image的距离,判断二者是否为同一个人:
具体方法:利用Triplet loss训练一个Siamese network,利用该network给image编码,并将编码看作image的特征,利用该特征计算2个image的距离。
在Siamese network + Triplet loss中,为“unsupervised learning”,training data为(anchor,positive,negative);
2、通过拟合binary classification model (logistic),将2个image输入model中,利用output来预测2个image是否为同一个人:
具体方法:首先利用Siamses network给2个image编码,在将该编码喂给logistic,使其根据公式g(w*d(image1,image2)+b)对2个image是否相同进行预测。
个人理解:该model的目标函数为“最大似然估计”,求解方法为:backward propagation;
在Siamese network + logistic 中,为“supervised learning”,training data为{X:(image1,image2),y:{1:same thing,0:different things}}
如下图所示,我们将content和style作为input,可以output Generated image。这个过程称为“神经风格转换”。
在接下来的几节中,将具体讲述“神经风格转换”的实现方式。
在每层layer中,学习到的每个image patch都会最大化active function value。如下图所示:
在深度卷积网络中,shallow layer主要学习“small piece of image”,如:“边、颜色阴影”的。而在deeper layer会学习“large image region”,如:“animal,people,car”等,如下图所示:
neural style tansfer algorithm的cost fucntion形式如下图所示:
cost function :J(G)=alpha * Jcontent(content,generated) + beta * Jstyle(style,generated);我们要做的是,最小化J(G)的值,在cost function中,generated image vector为parameter。
generated image形成方式如下:
假设generated image为 1001003 的vector
step1:初始化generated image vector中各元素的值G;
step2:更新g的值:G := G - J’(G);
step3:重复step2直到达到收敛条件。
下图(right-hand)显示了generated image形成过程中,各个iteration中,generated image的样子:
在下面2节中,将具体讲述Jcontent和Jstyle的形式。
Jcontent =(1/2)* ||a[l][C] - a[l][G] ||2 ; Jcontent function中系数 1/2 并不重要。
a[l][C]:将content image输入pre-trained ConvNet,a[l][C]为ConvNet中l layer的active function value。
a[l][G]:将初始化的generated image 输入pre-trained ConvNet,a[l][G]为ConvNet中l layer的active function value。
上述的ConvNet可以是VGG等network;
note that:ConvNet hidden layer 层数l的选择,不要太大,也不要太小。
content cost function的具体计算过程如下PPT所示:
“风格”的定义
如下图所示:
将image输入到一个ConvNet中,假设你要用ConvNet的l hidden layer来评价image的风格,则所谓image的风格是指:其在l hidden layer中,各个channel的active function value的correlation。那么这里的correlation指的是什么呢?请看intuition about style of an image。
intuition about style of an image
在上一部分中提到的l hidden layer各个channel的 active function value的correlation的意义通过下图来讲解:
假设下图style image的red channel形成的activation为patch image中的第[1][2]个image patch。orange channel形成的activation为patch image中的第[2][1]个image patch。假设generated image与style image具有相同的风格,那么:generated image的red channel形成的activation也为patch image中的第[1][2]个image patch。orange channel形成的activation也为patch image中的第[2][1]个image patch。即:所谓correlation between channel,是指,在一种风格的image中,当channel1出现时,channel2也出现,此时,这两个channel相关度较高。
风格损失函数
风格损失函数求解过程:
step1:将style image 和 初始化的generated image输入到pre-trained的ConvNet中。
step2:以ConvNet的l hidden layer来计算“风格损失函数”。
step3:求l hidden layer中,style image和generated image 不同channel的correlation,具体公式如下:
G[l][s]kk’:style image在l hidden layer中不同channel之间的correlation;
G[l][G]kk’:generated image在l hidden layer中不同channel之间的correlation;
step4:风格损失函数 Jstyle(S,G) =系数* || G[l][s]kk’ - G[l][G]kk’||2 ;前面的系数并不重要;
具体公式如下图所示:
在实际应用中,我们可以用多个hidden layer来计算“风格损失函数”,每层hidden layer被赋予一个系数lambda,具体公式如下图所示:
在求得“风格损失函数”以后,联合上一节所讲的“内容损失函数”,即可求得neural style tranform algorithm 中的cost function J(G),其中G为generated image 的input vector的 element。