昇思MindSpore25天學習Day19:CycleGAN圖像風格遷移互換

@(TOC)[CycleGAN圖像風格遷移呼喚]

模型介紹

模型簡介

CycleGAN(Cycle Generative Adversaial Network)即循環對抗生成網絡,來自論文Link:Unpaired lmage-to-mage Translation using Cycle-Consistent AdvesairalNetworks該模型實現了—種在沒有配對示例的情況下學習將圖像從源域×轉換到目標域Y的方法。

該模型一個重要應用領城是域遷移(Dom in Adaptation),可以通俗地理解為圖像風格遷移。其實在CycieGAV之前,就已經有了域遷移模型,比以D Pi2Pk,但是Pi2Fik要求訓練數據必須是成對的,而現實生活中,要找到兩個城(畫風)中成對出現的圖片是相當困難的,因此 CyclCGAN誕生了,它只需要兩種域的數據,而不需要他們有嚴格對應關系,是一種新的無監督的圖像遷移網絡。

模型結構

CycleGAN網絡本質上是由兩個鏡像對稱的GAN網絡組成,其結構如下圖所示(圖片來源于原論文)∶

在這里插入圖片描述
為了方便理解,這里以蘋果和橘子為例介紹。上圖中 X X X可以理解為蘋果, Y Y Y為橘子; G G G為將蘋果生成橘子風格的生成器, F F F為將橘子生成的蘋果風格的生成器, D x D_x Dx? D x D_x Dx?為其相應判別器,具體生成器和判別器的結構可見下文代碼。模型最終能夠輸出兩個模型的權重,分別將兩種圖像的風格進行彼此遷移,生成新的圖像。

該模型一個很重要的部分就是損失函數,在所有損失里面循環一致損失(Cycle ConsistencyLoss)是最重要的。循環損失的計算過程如下圖所示(圖片來源于原論文)︰

在這里插入圖片描述
圖中蘋果圖片 x x x經過生成器 G G G得到偽橘子 Y ? \^Y Y?,然后將偽橘子 Y ? \^Y Y?結果送進生成器 F F F又產生蘋果風格的結果 x ? \^x x?,最后將生成的蘋果風格結果 x ? \^x x?與原蘋果圖片 x x x一起計算出循環一致損失,反之亦然。循環損失捕捉了這樣的直覺,即如果我們從一個域轉換到另一個域,然后再轉換回來,我們應該到達我們開始的地方。詳細的訓練過程見下文代碼。

1 數據集

本案例使用的數據集里面的圖片來源于Link:ImageNet,該數據集共有17個數據包,本文只使用了其中的蘋果橘子部分。圖像被統─縮放為256×256像素大小,其中用于訓練的蘋果圖片996張、橘子圖片1020張,用于測試的蘋果圖片266張、橘子圖片248張。
這里對數據進行了隨機裁剪、水平隨機翻轉和歸—化的預處理,為了將重點聚焦到模型,此處將數據預處理后的結果轉換為MindRecord格式的數據,以省略大部分數據預處理的代碼。

1.1 數據集下載

使用download 接口下載數據集,并將下載后的數據集自動解壓到當前目錄下。數據下載之前需要使用pip install download安裝download 包。

在這里插入圖片描述

1.2 數據集加載

使用MindSpore的MindDataset接讀取和解析數據集。
在這里插入圖片描述

1.3 可視化

通過create_dict_iterator函數將數據轉換成字典迭代器,然后使用matplotlib 模塊可視化部分訓練數據。
在這里插入圖片描述

2 構建生成器

本案例生成器的模型結構參考的ResNet模型的結構,參考原論文,對于128×128大小的輸入圖片采用6個殘差塊相連,圖片大小為256×256以上的需要采用9個殘差塊相連,所以本文網絡有9個殘差塊相連,超參數n_layers參數控制殘差塊數。
生成器的結構如下所示:
在這里插入圖片描述
具體的模型結構請參照下文代碼:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3 構建判別器

判別器其實是一個二分類網絡模型,輸出判定該圖像為真實圖的概率。網絡模型使用的是Patch大小為70x70的PatchGANs模型。通過一系列的Conv2d 、 BatchNorm2d和LeakyReLu層對其進行處理,最后通過Sigmoid 激活函數得到最終概率。
在這里插入圖片描述

4 優化器和損失函數

根據不同模型需要單獨的設置優化器,這是訓練過程決定的。
對生成器 G G G及其判別器 D y Dy Dy ,目標損失函數定義為:
在這里插入圖片描述
其中 G G G試圖生成看起來與 Y Y Y中的圖像相似的圖像 G ( x ) G(x) G(x),而 D y D_y Dy?的目標是區分翻譯樣本 G ( x ) G(x) G(x)和真實樣本 y y y,生成器的目標是最小化這個損失函數以此來對抗判別器。即
在這里插入圖片描述
單獨的對抗損失不能保證所學函數可以將單個輸入映射到期望的輸出,為了進一步減少可能的映射函數的空間,學習到的映射函數應該是周期一致的,例如對于X的每個圖像x,圖像轉換周期應能夠將x帶回原始圖像,可以稱之為正向循環—致性,即
在這里插入圖片描述
對于 Y Y Y,類似的在這里插入圖片描述
可以理解采用了一個循環一致性損失來激勵這種行為。
循環一致損失函數定義如下:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

5 前向計算

搭建模型前向計算損失的過程,過程如下代碼。
為了減少模型振蕩[1],這里遵循Shrivastava等人的策略[2],使用生成器生成圖像的歷史數據而不是生成器生成的最新圖像數據來更新鑒別器。這里創建image_pool 函數,保留了一個圖像緩沖區,用于存儲生成器生成前的50個圖像。

在這里插入圖片描述
在這里插入圖片描述

6 計算梯度和反向傳播

其中梯度計算也是分開不同的模型來進行的,詳情見如下代碼:

在這里插入圖片描述

7 模型訓練

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

8 模型推理

下面我們通過加載生成器網絡模型參數文件來對原圖進行風格遷移,結果中第—行為原圖,第二行為對應生成的結果圖。

在這里插入圖片描述
在這里插入圖片描述

9 參考

[1] I.Goodfellow.NIPS 2016 tutorial: Generative ad-versarial networks. arXiv preprint arXiv:1701.00160,2016.2,4,5
[2]A.Shwivastava T.Pister,O. Tuzel, J.Susskind W.Wang, R.Webb.Learning from simulated and unsupervised images through adversarial training. In CVPR,2017.3,5,6,7

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42757.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42757.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42757.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從nginx返回404來看http1.0和http1.1的區別

序言 什么樣的人可以稱之為有智慧的人呢?如果下一個定義,你會如何來定義? 所謂智慧,就是能區分自己能改變的部分,自己無法改變的部分,努力去做自己能改變的,而不要天天想著那些無法改變的東西&a…

解析Java中的反射機制及其應用場景

解析Java中的反射機制及其應用場景 大家好,我是微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! Java的反射機制是指在運行時可以動態地獲取類的信息(如類名、方法、字段等),并…

麒麟桌面操作系統上網絡設置界面消失的解決方法

原文鏈接:麒麟桌面操作系統上網絡設置界面消失的解決方法 Hello,大家好啊!今天給大家帶來一篇關于麒麟桌面操作系統上網絡設置界面消失解決方法的文章。在使用麒麟桌面操作系統時,可能會遇到網絡設置界面突然消失的情況&#xff…

斯坦福CS224n深度學習培訓營課程

自然語言處理領域的經典課程涵蓋了從基礎知識到最新研究的全面內容。本培訓營將精選課程內容,結合實際案例和項目實踐,帶領學員深入探索自然語言處理的前沿,學習最先進的深度學習技術。 課程大小:2.6G 課程下載:http…

Softmax函數的意義

來自GPT,后期會再整理。。。 Softmax函數在深度學習中,特別是在多分類任務中,被廣泛用作輸出層的激活函數。它將模型的原始輸出(logits)轉化為概率分布,使得每個類別的概率總和為1。相比于簡單地使用“單個…

四自由度SCARA機器人的運動學和動力學matlab建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 針對SCARA 機器人系統進行了深入研究與探討,提出SCARA機器人的動力學模型和運動學模型,并以MATLAB軟件為仿真平臺,通過MATLAB Robotics Too…

java核心-泛型

目錄 概述什么是泛型分類泛型類泛型接口泛型方法 泛型通配符分類 泛型類型擦除分類無限制類型擦除有限制類型擦除 問題需求第一種第二種 概述 了解泛型有利于學習 jdk 、中間件的源碼,提升代碼抽象能力,封裝通用性更強的組件。 什么是泛型 在定義類、接…

二手閑置平臺小程序的設計

管理員賬戶功能包括:系統首頁,個人中心,用戶管理,賣家管理,商品分類管理,商品信息管理,商品購買管理,商品配送管理 微信端賬號功能包括:系統首頁,商品信息&a…

qt中connect函數的使用方法

bool QObject::connect(const QObject *sender, const char *signal,const QObject *receiver, const char *method,Qt::ConnectionType type Qt::AutoConnection);1.sender: 一個指向信號發送者的QObject指針。這是發出信號的對象,可以是任何繼承自QObject的類的實…

【linux服務器】大語言模型實戰教程:LLMS大模型部署到個人服務器或嵌入式開發板(保姆級教學)

🎬 鴿芷咕:個人主頁 🔥 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! 引言 說到大語言模型相信大家都不會陌生,大型語言模型(LLMs)是人工智能文本處理的主要類型,也現在最流行的人工智能…

基于Java+SpringMvc+Vue技術智慧校園系統設計與實現--60頁及以上論文參考

博主介紹:碩士研究生,專注于信息化技術領域開發與管理,會使用java、標準c/c等開發語言,以及畢業項目實戰? 從事基于java BS架構、CS架構、c/c 編程工作近16年,擁有近12年的管理工作經驗,擁有較豐富的技術架…

網絡基礎:園區網絡架構

園區網絡 園區網絡(Campus Network)是指在一個相對較大的區域內,如大學校園、企業園區或政府機關等,建立的計算機網絡系統。園區網絡根據規模的不同,可以分為以下幾種類型: ①小型園區網絡:通常…

WebKit中Websockets的全面支持:實現高效實時通信

WebKit中Websockets的全面支持:實現高效實時通信 Websockets是一種網絡通信協議,它允許在單個TCP連接上進行全雙工通信,從而實現服務器與客戶端之間的實時數據交換。WebKit作為許多流行瀏覽器的底層引擎,對Websockets提供了全面的…

Java 多線程工具類 Semaphore

引言 在多線程編程中,控制對共享資源的訪問是一個關鍵問題。Java 提供了多種同步機制來解決這個問題,其中 Semaphore 是一種常用的工具類,用于限制可以同時訪問某個資源的線程數。本文將詳細介紹 Semaphore 的概念、使用方法和實際應用場景。…

ARM GEC6818 LCD繪圖 實心圓 三角形 五角星 任意區域矩形以及旗幟

要在ARM上實現LCD繪圖,可以按照以下步驟進行: 硬件初始化:初始化LCD控制器和相關引腳,配置時鐘、分辨率和顏色深度等。 內存映射:將LCD顯示區域映射到ARM的內存地址空間中,可以通過ARM的內存映射機制來實現。 繪圖函數:實現繪制基本圖形的函數,如點、線、矩形、圓等。可…

【系統架構設計師】八、系統工程基礎知識(系統工程|系統性能)

目錄 一、系統工程 1.1 系統工程的方法 1.1.1 霍爾的三維結構 1.1.2 切克蘭德方法 1.1.3 并行工程方法 1.1.4 綜合集成法 1.1.5.WSR 系統方法。 二、系統工程生命周期 2.1 系統工程生命周期7階段 2.2 生命周期方法 三、基于模型的系統工程(MBSE) 四、系統性能 4.1…

vb.netcad二開自學筆記6:第一個繪制線段命令

.net編寫繪制直線已完全不同于ActiveX的(VBA)的方式,過程更類似于arx程序,需要通過操作AutoCAD 數據庫添加對象!下面的代碼是在以前代碼基礎上添加了一個新myline命令。 AutoCAD 數據庫結構 myline命令代碼 Imports A…

YoloV9改進策略:Block改進|輕量實時的重參數結構|最新改進|即插即用(全網首發)

摘要 本文使用重參數的Block替換YoloV9中的RepNBottleneck,GFLOPs從239降到了227;同時,map50從0.989漲到了0.99(重參數后的結果)。 改進方法簡單,只做簡單的替換就行,即插即用,非常…

使用ndoe實現自動化完成增刪改查接口

使用ndoe實現自動化完成增刪改查接口 最近工作內容比較繁瑣,手里需要開發的項目需求比較多,常常在多個項目之間來回切換,有時候某些分支都不知道自己開發了什么、做了哪些需求, 使用手寫筆記的方式去記錄分支到頭來也是眼花繚亂&a…

vscode調試教程

VSCode調試 VSCode Debuggers VSCode使用launch.json進行細粒度的控制,可以啟動程序或將其附加到復雜的調試場景中 打開Run and Debug視圖Ctrl Shift D 點擊create a launch.json file,選擇C(GDB/LLDB) 會在工作目錄自動創建.vscode/launch.json文…