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.pswp.cn/news/534836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534836.shtml
英文地址,請注明出處:http://en.pswp.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. 滿…