Deep Feature Interpolation for Image Content Changes(基于深度特征插值的图像属性转换方法)

引言:

我们提供了一种基于深度特征插值的方法,一种线性数据驱动的自动化高维空间转换的方法,就如名字所说的,DFI仅仅基于使用经过预训练的深度卷积特征简单的线性插值。我们发现虽然其方法比较简单,但是DFI能够显示高水准的风格转换例如在“脸部年轻化和衰老转化”,“戴眼镜”,“添加微笑”,和其他方式,效果极其好,甚至有些尤其好基本达到了艺术家的水平。这是非常想不到的结果,因为DFI不需要构建特别的网络甚至无需使用任何训练网络。DFI因此能够被认为是一个新的基准线去检测更多的复杂算法和提供一种特别的答案去解释一个在使用深度学习之后哪种图片转化任务依旧具有挑战性的问题。

3.深度特征插值:

在我们的设置中,我们提供了一组测试图像 x 用于转变成为可信的时尚图片。例如,一个没有胡须的人的图片,我们希望通过添加头发的方法修改图片,并且保留此人的原始信息。我们另外获取一组目标图片,带有目标属性。S t = {x t 1 , ..., x tn }(e.g.,带有胡须的人)和一组原始图片,另外,我们需要获取一个经过预先训练的预测网络,该网络是在足够丰富的对象分类任务上进行训练的,例如,一个在ImagetNet中训练的VGG16网络,我们可以使用这个卷积网络去获取一个图片的新的显示,例如我们希望转化x → φ(x)。向量x包含一系列有卷积神经网络应用于图片x中产生的一系列连续性激活,我们认为向量x是x在深度特征空间中的显示。

 

深度特征插值

深度特征插值能够被总结成为4个高维空间环节:

1.我们将原始图像和目标图像在使预训练模型的深度特征空间中的图像集合St和Ss进行捕获

2.我们为每一组图片计算平均特征值,φt和φs,并且设置他们之间的区别认为是二者的特征向量,w = φt - φs

3.我们将测试图片转化成为深度特征空间的向量x并且单独转变通过使用向量w,结果为φ(x) + φ(w)

4.我们能够重建转移的输出图片通过将转换向量z到φ(z) = φ(x) + αw.

虽然这个产品或许显得非常的简单,我们在图中证明这个方法具有很大的能力。下面我们将介绍一些非常重要的细节去使我们的工作可以复现:

选择 St 和 Ss:

DFI假设属性向量保存目标的转换信息,它指向x的具有目标属性转换的深度特征信息。如果例如图像z是1可以获得的,我们可以计算 w = φ(z) - φ(x) 去分离出确切的区别通过属性的改变。由于缺少确切的目标图片,我们通过使用目标数据集和原始数据集进行w的估计。因而两个数据集之间的内容需要经可能的相似,并且需要两者之间没有系统下的属性变化在两个数据集之间。比如,举个例子,所有目标数据集都是较为年长的人,二原始数据集都是年轻的个体,那么向量w将会无意中获取年龄之间的变化。并且,如果两个数据集与测试图片都有很大的区别,那么转化的图片将很难保证转化图片的原有属性不变。为了确保具有足够的相似度,我们限制 St 和Ss 到x的K个最近邻居,让Nt,k给予K个最近邻居:

这些邻居可以通过两种方法进行选择,主要基于可获取信息的总数。当属性区域是可以获取的,我们发现最近的图片通过计算匹配属性的数量。当属性区域是不可以获取的,或者作为一个第二选择标准,我们选择最近邻居通过深度特征空间的余弦函数。

 

KNN算法:

最简单最初级的分类器是间全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配的时候,便可以将其进行分类。但是找到一个完全匹配的的训练对象非常困难,并且可能存在多个匹配,导致一个训练对象被分到了多个类的问题,基于这些问题,就产生了KNN。

KNN的思路:如果一个样本在特征控件的K个最相似的(即特征空间中最临近)的样本中的大多数属于某个类别,则该样本额也属于这个类别,其中K通常是不大于20的整数(但是本文K为1000)。KNN算法中,所有选择的邻居都是已经正确分类的对象。改方法在定类决策上只依据最临近的一个或者几个样本的类别来决定待分样本所属的类别。

在KNN中,通过计算对象间的距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里的距离一般数用欧式距离或者曼哈顿距离:

同时,KNN通过一句K个对象中占优的类别进行决策,而不是单一的对象类别决策。这两点是KNN算法的优势。

接下来对KNN算法的思想总结:在训练几种书记标签已知的情况下,输入测试数据,将测试数据的特征与训练集中的特征进行相互比较,找到训练集中最为相似的前L个数据。则改测试书记对应的类别就是这L个数几种出现次数最多的那个分类,其算法描述为:

1)nisan测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

KNN原始代码如下: 

import numpy
import operator
from numpy import * 
def createDataSet():
    group = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
    labels = ['A','B','C','D']
    return group,labels

def classify(input,dataSet,label,k):
    dataSize = dataSet.shape[0]
    diff = tile(input,(dataSize,1)) - dataSet
    sqdiff = diff**2 
    squareDist = sum(sqdiff,axis = 1)
    dist = squareDist ** 0.5

    sortedDistIndex = argsort(dist) 

    classCount = {}
    for i in range(k):
        voteLabel = label[sortedDistIndex[i]]
        classCount[voteLabel] = classCount.get(voteLabel,0)+1 
    maxCount = 0
    
    for key,value in classCount.items():
         if value > maxCount:
             maxCount = value
             classes = key 
    return classes


dataSet,labels = createDataSet()
input = array ([0.1,3.3])
K = 3
output = classify(input,dataSet,labels,K)
print("testing dataset is :",input,"classify result is: ",output)

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值