Q0: Preliminary knowledge of Texture Synthesis

Baseline请见此处,下文所有的代码修改均建立此代码基础之上。

1. 纹理合成简述

​纹理合成(Texture Systhesis)技术主要应用于计算机图形学等领域,被用于模拟几何模型的表面细节、增强绘制模型的真实感。不同于传统的纹理映射(Texture Mapping)技术,纹理合成是从一个样本纹理中推导一个泛化的过程,并以此来生成具有那种纹理的任意的新图像,可有效解决纹理接缝和扭曲等问题。

​根据原理的不同,我们常常将纹理合成的方法划分为 过程纹理合成(Procedural Texture Synthesis,PTS)和 基于采样的纹理合成(Texture Synthesis from Samples,TSFS),具体区别如下。

PTS:通过对物理生成过程的仿真直接在曲面上生成纹理,如毛发、云雾、木纹等。这种方法可以逼真地生成纹理图案,前提是对该纹理的生成过程进行准确的物理建模,这显然是非常困难的,对于较为复杂的纹理生成问题,PTS行不通;

TSFS:通过分析给定样图的纹理特征来生成大面积纹理。TSFS技术既能保证纹理的相似性和连续性,又避免了PTS中物理模型建立的繁琐过程。其传统的算法主要有特征匹配算法、基于马尔可夫链随机场模型的合成算法以及基于纹理块拼接的纹理合成算法,而近些年发展较快的,则是基于深度学习的纹理合成方法,本次作业所涉及的《Texture Synthesis Using Convolutional Neural Networks》便属于此类。

2. 论文思想解读

2-1 基本架构

纹理分析:原始纹理传入卷积神经网络(作业采用的是VGG-16网络),计算其特征图之间的Gram矩阵;

纹理生成:初始化一张白噪声图像传入网络,计算包含纹理模型的每个层的损失函数,在每个像素值的总损失函数上使用梯度下降算法,最终训练生成Gram矩阵与原始纹理图像的Gram矩阵相同的纹理图像。

2-2 Gram矩阵

​Gram矩阵可以视为特征图之间的偏心协方差矩阵,即没有减去均值的协方差矩阵。其含义可可以这样理解——”在feature map中,每一个数字都来自于一个特定滤波器在特定位置的卷积,因此每个数字就代表一个特征的强度,而Gram计算的实际上是两两特征之间的相关性,哪两个特征是同时出现的,哪两个是此消彼长的等等,同时,Gram的对角线元素,还体现了每个特征在图像中出现的量。”(知乎 90后后生)下图左式为Gram矩阵的定义式,其实就是用矩阵的转置乘以矩阵自身来获取;右式为

Q1: Implementing Gram matrix and loss function.

Use the features extracted from all the 13 convolution layers, complete the baseline project with loss function based on gram matrix and run the training process.

q1-1. 代码

# Gram矩阵的计算

def get_gram_matrix(feature_map):

shape = feature_map.get_shape().as_list()

re_shape = tf.reshape(feature_map, (-1, shape[3]))

gram = tf.matmul(re_shape, re_shape, transpose_a=True) / (shape[1]*shape[2]*shape[3])

return gram

# L2损失函数的补充

def get_l2_gram_loss_for_layer(noise, source, layer):

source_feature = getattr(source, layer)

noise_feature = getattr(noise, layer)

Gram_s = get_gram_matrix(source_feature)

Gram_n = get_gram_matrix(noise_feature)

loss = tf.nn.l2_loss((Gram_s-Gram_n))/2

return loss

q1-2. 效果

图片生成的动态效果图请点击此处查看。

Origin

Generate

Q2: Training with non-texture images.

To better understand texture model represents image information, choose another non-texture image(such as robot.jpg in the ./images folder) and rerun the training process.

q2-1. 代码

​为了较好的训练效果,在Q2中,我给各层添加了递增的权重,以便更加清晰地对比不同纹理图片下网络的生成效果。具体代码如下。

def get_gram_loss(noise, source):

with tf.name_scope('get_gram_loss'):

# weight = np.logspace(0, len(GRAM_LAYERS)-1, len(GRAM_LAYERS), base=3.5)

weight = np.linspace(1, len(GRAM_LAYERS), len(GRAM_LAYERS), endpoint=True)

gram_loss = [get_l2_gram_loss_for_layer(noise, source, layer) for layer in GRAM_LAYERS ]

return tf.reduce_mean(tf.convert_to_tensor(list(map(lambda x,y:x*y, weight, gram_loss))))

q2-2. 效果

origin

epoch=1000,weight=1,2,3,4……

epoch=5000,weight=1,2,4,8……

red-peppers

robot

shibuya

stone

q2-3. 分析

​从实验结果来看,对于分布有一定规律的纹理图案,本网络的生成效果尚佳,如图red-peppers与图stone;但是对于非纹理图案来说,似乎效果并不理想,在生成的图像中,很难辨认出原图中的元素。

Q3: Training with less layers of features.

To reduce the parameter size, please use less layers for extracting features (based on which we compute the Gram matrix and loss) and explore a combination of layers with which we can still synthesize texture images with high degrees of naturalness.

q3-1. 代码

​分别将不同layer对应的weight设置为0,以从loss的计算中删除相应的layer。具体代码如下。

def get_gram_loss(noise, source):

with tf.name_scope('get_gram_loss'):

# weight = [1,1, 1,1, 1,1,1, 1,1,1, 1,1,1]

# weight = [0,0, 1,1, 1,1,1, 1,1,1, 1,1,1]

# weight = [1,1, 0,0, 1,1,1, 1,1,1, 1,1,1]

# weight = [1,1, 1,1, 0,0,0, 1,1,1, 1,1,1]

# weight = [1,1, 1,1, 1,1,1, 0,0,0, 1,1,1]

# weight = [1,1, 1,1, 1,1,1, 1,1,1, 0,0,0]

# weight = [10,10, 20,20, 30,30,30, 40,40,40, 50,50,50]

# weight = [50,50, 40,40, 30,30,30, 20,20,20, 10,10,10]

gram_loss = [get_l2_gram_loss_for_layer(noise, source, layer) for layer in GRAM_LAYERS ]

return tf.reduce_mean(tf.convert_to_tensor(list(map(lambda x,y:x*y, weight, gram_loss))))

q3-2. 效果

all

conv1

conv2

conv3

conv4

conv5

全部保留

删除conv1

删除conv2

删除conv3

删除conv4

删除conv5

weight ↗

weight ↘

[10,10, 20,20, 30,30,30, 40,40,40, 50,50,50]

[50,50, 40,40, 30,30,30, 20,20,20, 10,10,10]

q3-3. 分析

​在删除不同层的尝试中,对比实验结果可以发现第一层对图像特征的提取尤其关键;同时,单独删除conv2-5,对实验结果的影响不大。同时,我尝试着赋予向深层递增或递减的权重,通过结果的对比,发现权重递增的情况下生成图像纹理效果较优,这说明提高深层conv对网络的影响可以有效提高输出质量。综合考量之下,可选择删除conv2的feature Map来获得较优的效果。

Q4: Finding alternatives of Gram matrix.

We may use the Earth mover's distance between the features of source texture image and the generated image.

q4-1. 代码

​EMD(Earth Mover’s Distance)是基于内容的图像检索计算两个分布之间距离的度量标准。EMD可以直观地理解为线性规划中运输问题的最优解,即把一种分配转换为另一种分配所必须支付地最低成本,最早由Peleg等人针对某些视觉问题提出。基于EMD,我们可以构建如下的损失函数。

\[Loss = \sum_l w_l \sum_i (sorted(F_i)-sorted(\hat{F_i}))^2

\]

​具体代码如下所示。

def get_l2_emd_loss_for_layer(noise, source, layer):

noise_feature = getattr(noise, layer)

source_feature = getattr(source, layer)

shape = noise_feature.get_shape().as_list()

noise_re_shape = tf.reshape(noise_feature, (shape[1]*shape[2], shape[3]))

source_re_shape = tf.reshape(source_feature, (shape[1]*shape[2], shape[3]))

noise_sort = tf.sort(noise_re_shape, direction='ASCENDING')

source_sort = tf.sort(source_re_shape, direction='ASCENDING')

return tf.reduce_sum(tf.math.square(noise_sort-source_sort))

def get_emd_loss(noise, source):

with tf.name_scope('get_emd_loss'):

emd_loss = [get_l2_emd_loss_for_layer(noise, source, layer) for layer in GRAM_LAYERS ]

return tf.reduce_mean(tf.convert_to_tensor(emd_loss))

q4-2. 效果

此时 loss 还未完全收敛,此为【e:3700 loss: 2575.86865】时的输出。我的小破电脑已经尽力了……

Origin

Generate

q4-3. 分析

​从实验结果来看,网络学习到了原始纹理图片的各个特征向量之间的相关性,生成的图片与原始图像的纹理走向相似。但很遗憾的是,更改loss函数为EMD-loss后,网络缺失了原始纹理图片的大多数颜色特征(可能与EMD计算过程中的sort操作有关),在色彩呈现上的表现非常不好。

Q5: Training with different weighting factor.

Use the configuration in Q3 as baseline. Change the weighting factor of each layer and rerun the training process.

q5-1. 代码

​根据Q3,使用递增的权重系数可获得较优的训练效果,于是,在Q5中,我设定了两种权重的递增序列:1)等差数列;2)等比数列。具体代码如下。

def get_gram_loss(noise, source):

with tf.name_scope('get_gram_loss'):

# weight = np.logspace(0, len(GRAM_LAYERS)-1, len(GRAM_LAYERS), base=2)

weight = np.linspace(1, 128*len(GRAM_LAYERS), len(GRAM_LAYERS), endpoint=True)

gram_loss = [get_l2_gram_loss_for_layer(noise, source, layer) for layer in GRAM_LAYERS ]

return tf.reduce_mean(tf.convert_to_tensor(list(map(lambda x,y:x*y, weight, gram_loss))))

q5-2. 效果

等比数列 - 递增 - \(q\) 为相邻项的比

q = 2

q = 2.5

q = 3

q = 3.5

等差数列 - 递增 - \(d\) 为相邻项的差

d = 1

d = 2

d = 4

d = 8

d = 16

d = 32

d = 64

d = 128

q5-3. 分析

​相对于等差递增的权重,在等比递增的权重下网络的表现更好。同时,当q或d不断增大时,生成图像的还原度也不断增高。结合这两种现象,可以得出初步的结论,通过扩大不同层layer权重的差异(即减小浅层layer的权重,增大深层layer的权重),可以有效地提高纹理图像的还原度;不同层权重的差异越大,网络生成纹理图像的效果越好,反之,则生成效果越差。

Q6. Some remaining problems.

1)Q4中EMD-loss效果并不理想,需要对loss函数进行调整以保留更多的纹理特征;

2)Q5中等比数列递增的权重下,当q增大时,生成图像的两侧会出现部分的颜色失真,尚不明其原因。

python cnn 实例_基于CNN的纹理合成实践【附python实现】相关推荐

  1. python降维方法_机器学习数据降维方法总结(附python代码)

    介绍 在机器学习实战时,如果面对一个数据集具有上千个特征,那么对于模型训练将是一个巨大的挑战.面对如此多的数据变量,如果我们认真的去分析每一个变量将耗费我们几周甚至几个月的时间,那么你估计也要被开除了 ...

  2. python插值程序_计算方法(2)——插值法(附Python程序)

    给定一些数据,生成函数的方式有两种:插值,回归. 插值而得到的函数通过数据点,回归得到的函数不一定通过数据点. 下面给出拉格朗日插值,牛顿插值和Hermite插值的程序, 具体原理可参考课本,不再赘述 ...

  3. 基于块的纹理合成 matlab程序,基于块的纹理合成方法和装置制造方法

    基于块的纹理合成方法和装置制造方法 [专利摘要]本发明公开了一种基于块的纹理合成方法和装置.其中,该方法包括:查找候选纹理块集合中的每个候选纹理块与在目标纹理图中已合成纹理块的重叠区:将已合成纹理块中 ...

  4. python中文文本分析_基于CNN的中文文本分类算法(可应用于垃圾邮件过滤、情感分析等场景)...

    基于cnn的中文文本分类算法 简介 参考IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW实现的一个简单的卷积神经网络,用于中文文本分类任 ...

  5. python医疗影像_基于PyRadiomics的医疗影像纹理获取原型系统集成

    董建民 刘建新 摘 要:针对计算机辅助诊断中医学影像纹理计算相对复杂.商业分析软件功能相对固定和成本较高等问题,以目前主流的Python语言为开发工具,将其对应的PyRadiomics模块.Simpl ...

  6. cnn生成图像显著图_基于CNN与图像前背景分离的显著目标检测

    基于 CNN 与图像前背景分离的显著目标检测 东野长磊 ; 万文鑫 [期刊名称] <软件导刊> [年 ( 卷 ), 期] 2020(019)001 [ 摘 要 ] 为 了 解 决 计 算 ...

  7. python关键词对联_keras基于CNN和序列标注的对联机器人

    动手 # "对对联",我们可以看成是一个句子生成任务,可以用seq2seq完成 分析 # 然而,我们再细想一下就会发现,相对于一般的句子生成任务,"对对联"有规 ...

  8. 如何使用CNN进行物体识别和分类_基于CNN目标检测方法(RCNN系列,YOLO,SSD)

    转载自:基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测 一.研究意义 卷积神经网络(CNN)由于其强大的特征提取能力,近年 ...

  9. python 建筑建模_基于CityEngine的建筑物自动化建模

    近年来, 全国很多城市都在进行数字城市建设, 推进城市信息化进程[.数字城市是运用3S.遥测.仿真-虚拟等技术,以计算机技术.多媒体技术和大规模存储技术为基础,以宽带网络为纽带,实现对城市多尺度.多时 ...

最新文章

  1. LUA脚本调用C场景,使用C API访问脚本构造的表
  2. Revit二次开发之“使用ElementTransformUtils.MoveElement()移动元素”
  3. vue-springboot项目 mybatis条件查询结果为null时解决方案 @Param @RequestParam 的参数传递
  4. Scrapy 和 scrapy-redis的区别
  5. 神州八号利用计算机,说到科技,我想大部分的人想到的是神州八号
  6. java mongocollection_MongoDb完结笔记-与java结合
  7. 大数据之-Hadoop之HDFS的API操作_文件夹_以及文件删除案例---大数据之hadoop工作笔记0059
  8. 全网首发:制作LINUX安装软件包,要处理哪些系统目录和文件(2)
  9. 直播流播放器 html,rtmp直播视频流播放器(ckplayer)使用方法
  10. 2014.10.6模拟赛【魔兽争霸】
  11. matplotlib.pyplot如何绘制多张子图
  12. 怎样用电池给铁锅作防锈
  13. web页面中实现局部页面的刷新
  14. python|简单实现英文单词大小写转化
  15. 涅槃重生!字节大牛力荐大型分布式手册,凤凰架构让你浴火成神
  16. 洛杉矶租车房车超强攻略,让房车旅行不麻烦
  17. 文件与异常及其相关函数(os模块)
  18. 暴风雨中的幸福——记我敬爱的米老师
  19. 自动化工程师必备的效率工具-第②期
  20. 智能家居(2)-工厂模式代码编写以及的灯光连接

热门文章

  1. 利用python做一个小游戏_如何使用python做一个简单的猜数字的小游戏
  2. BugkuCTF-MISC题乌云邀请码
  3. java socket ftp登录_基于java socket的简单FTP功能实现
  4. 10进制转换16进制补足0_信息技术教师资格必考内容——进制换算(一)
  5. 2021中卫一中高考成绩查询,2021年宁夏高中排名及分数线 高考本科升学率排行榜...
  6. java背景图片加上组件_关于 java swing组件加背景图片的问题
  7. java spring 多数据库_java – 使用多个数据源/数据库的Spring-Hibernate
  8. 已达成计算机的连接数最大值无法再,已达到计算机的连接数最大值,无法再同此远程计算机连接...
  9. 清华大学计算机系男女比v,清华男女生比例惊人,但找女朋友却不愁,这是为什么?...
  10. linux定时器无法重启pm2,pm2无法自动重启