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

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增大时,生成图像的两侧会出现部分的颜色失真,尚不明其原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php使用jasperreport,php-报表引擎指南(Pentaho,JasperReports,BIRT)

我在各种论坛和他们的网站上花费了大约4-5个小时,研究可以帮助我发展的报告工具.我是使用这种工具的新手,可以使用一些特定的指导.我正在开发一个Web应用程序,该应用程序将托管在一台服务器上,但是多个用户可以通过登录进行访问.每个用户将拥有自己的帐户,并且只能访问仅与与其…

python中dlib库_python 基于dlib库的人脸检测的实现

本周暂时比较清闲,可以保持每日一更的速度。国外身份证项目新增需求,检测出身份证正面的人脸。最开始考虑mobilenet-ssd,经同事提醒,有现成的人脸库dlib,那就用传统方法尝试一下。dlib安装dlib的安装小费一波周折&…

php养老院管理系统,XYCMS养老院建站系统 v3.8

XYCMS养老院建站系统是一个专为养老院而设计的养老院建筑系统。中心信息管理:包括基本信息管理,添加,问答中心信息管理新闻动态管理:管理新闻信息内容,管理相关分类,添加或者删除生活环境内容管理&#xff…

php 修改文件访问时间,PHP中获取文件创建日期、修改日期、访问时间的方法

php获取文件创建时间、修改时间常用代码filemtime ( string filename )返回文件上次被修改的时间,出错时返回 FALSE。时间以 Unix 时间戳的方式返回,可用于 date()。例如:$afilemtime("log.txt");echo "修改时间:&…

超过响应缓冲区限制_Nginx如何限制并发连接数和连接请求数?

全网最全1500份Java学习资料、500份BAT面试真题:关注公众号,输入“面试题”,获取提取码!首先讲解两个算发:算法思想是:令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时&#xff0…

Php公钥加密data是空,php 生成加密公钥加密私钥实例详解

php 生成加密公钥加密私钥实例详解生成公钥私钥 win下必须要openssl.cof支持 liunx一般已自带安装$config array(//"digest_alg" > "sha512","private_key_bits" > 512, //字节数 512 1024 2048 4096 等"private_key_type" >…

python句柄无效_subprocess.Popen 运行windows命令出现“句柄无效”报错的解决方法

【代码笔记】iOS-关于UIFont的一些define一,效果图. 二,工程图. 三,代码. RootViewController.h #import interface RootViewController ...JQuery Datatables Dom 和 Language 参数详细说明http://linleizi.iteye.com/blog/2086435 *********************************** Data …

java日期函数精确到日,java日期时间函数分享

前言:对于新手程序员的我来说,写业务代码是现在的日常,在此过程中经常需要对日期时间进行处理,我挑了几个较有用的日期处理函数分享给大家。正文:1、将某格式的时间字符串转化成毫秒时间戳表示的字符串:pub…

python变量区变量保存与加载_python – Flask:使用全局变量将数据文件加载到内存中...

我有一个大的XML文件,它被打开,加载到内存中,然后由Python类关闭.简化示例如下所示:class Dictionary():def __init__(self,filename):f open(filename)self.contents f.readlines()f.close()def getDefinitionForWord(self,word):# returns a word,using etree p…

php 顺丰接口实例,顺丰BSP接口PHP开发注意事项

1&#xff0c;xml报文不用附加"<?xml version"1.0" encoding"UTF-8" ?>"&#xff0c;不支持&#xff0c;会报格式错误。2&#xff0c;提交服务器时要重点注意。直接使用curl方式的&#xff0c;一定要把数据做http_build_query&#xff0…

跨域产生的原因和解决方法_板式家具开料机加工过程产生崩边原因及解决方法...

家具厂数控开料机加工材料的时候会遇到材料崩边的问题&#xff0c;下面我们系统的分析下产生的原因以及解决的办法产生崩边现象的原因&#xff1f;其一是材料本身问题。目前除了实木家具&#xff0c;目前使用较多的就是 板式贴皮的材料&#xff0c;板材的优点就是标准化生产&am…

facade 门面 php,php设计模式之门面(Facade)模式

该模式属于结构型模式什么是门面模式&#xff1f;定义&#xff1a;门面模式(有时候也称为外观模式)是指提供一个统一的接口去访问多个子系统的多个不同的接口&#xff0c;它为子系统中的一组接口提供一个统一的高层接口。外部与子系统的通信是通过一个门面(Facade)对象进行。其…

架构师一般做到多少岁_《迷茫中的我们该如何突破瓶颈——成长为一名架构师》...

如何成长为一名架构师&#xff1f;架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展&#xff0c;为目标客户提供更为全面的需求清单。很多程序员想成为一名架…

php-fpm初始化失败,FPM的初始化 - [ PHP7的内核剖析 ] - 在线原生手册 - php中文网

FPM的初始化接下来看下fpm的启动流程&#xff0c;从main()函数开始&#xff1a;//sapi/fpm/fpm/fpm_main.cint main(int argc, char *argv[]){... //注册SAPI:将全局变量sapi_module设置为cgi_sapi_modulesapi_startup(&cgi_sapi_module);... //执行php_module_staru…

python 高级语言特性_Pytohon学习笔记(一)Python编程语言历史及特性

Python编程语言历史及特性编程语言:用户:问题空间计算机: 解决问题解空间抽象机器代码-->微码编程-->高级语言shell编程:ptyhon控制语言:胶水语言适合领域:web,Django字节码:bytecode面向过程:以指令为中心&#xff0c;由指令处理数据 如何组织代码结局问题面向对象:以数…

php laravel 返回统一格式,封装的统一的Laravel响应类,返回数据类

封装的统一的Laravel返回数据类namespace App\Library;class Response{const OK 0;const BAD_REQUEST 1000;const PARAM_ERROR 1001;const SQL_ERROR 4000;const FORBIDDEN 4003;const SERVER_ERROR 5000;public static $errMsg [self::BAD_REQUEST > 请求错误,self:…

python3连接数据库步骤_Python3连接Mysql8.0遇到的问题及处理步骤

最近在使用Python开发系统&#xff0c;需连接mysql数据库&#xff0c;我用的是Python3连接MySQL8.0&#xff0c;其中老是报错以下问题&#xff1a;网上给了各种各样的方法&#xff0c;大多是通过各种方式修改密码。最简单的方法是更换了root密码的认证方式解决的&#xff0c;新…

360手柄摇杆漂移修复_彻底解决你的Switch手柄摇杆问题,最省钱的完美修复。

我想很多Switch的消费者都遇到了一个问题&#xff0c;用久了之后的手柄失灵&#xff0c;移动不精准&#xff0c;卡顿&#xff0c;自动位移等现象。玩个游戏都非常的糟心。动一下摇杆角色都会自动移动...这些问题的出现主要原因是摇杆内部进了灰尘&#xff0c;才导致各种现象的出…

libzdb 连接mysql,数据库连接池库libzdb使用教程

Libzdb挺强大&#xff0c; 支持Mysql Oracle SQLite PostgreSQL&#xff0c;支持C和C Object C&#xff0c;不能在Window下用(看源码是因为基于Linux线程机制编写实现)。遗憾的是找个资料太费劲&#xff0c;只能到Libzdb官网&#xff1a;点此进入 &#xff0c;今正看着上面英文…

请给出计算231-1的python表达式_【填空题】计算2 32 -1的Python表达式可以书写为____...

【填空题】计算2 32 -1的Python表达式可以书写为____更多相关问题【判断题】军队和国防建设指导思想实行战略转变的实质是:从立足于早打、大打、打核战争的临战准备状况,转到和平时期建设的轨道上来。【单选题】社会学家认为,一门专业必须具有专业特征,护理专业的特征是( )A. 满…