教你使用CANN將照片一鍵轉換成卡通風格

摘要:這次是將AnimeGAN部署到Ascend 310,從而實現對自己想要圖片的一鍵轉換為我們想看到的卡通風格。

本文分享自華為雲社區《【CANN訓練營】CANN訓練營_昇騰AI趣味應用實現AI趣味應用(上)隨筆》,作者: Tianyi_Li。

前言

你喜歡動畫片,或者說卡通,動漫嗎?

我是挺喜歡的。

絢麗多彩的卡通世界從來沒有缺失過吸引力。手塚治虫畫筆下,那個可以上天入地的阿童木,在與邪惡世界的鬥爭中教會了我們勇敢與正義。漫畫工匠宮崎駿用清新的水彩勾勒出自然的鄉村景觀,不染一絲現實的塵土。美艷而不可方物的世界令人神往。從《大鬧天宮》到《大聖歸來》,從《哪吒鬧海》到《哪吒之魔童降世》,國漫的發展也不曾落下。恢弘的場景結合扣人心弦的故事,不僅有豐富視覺享受,同時也帶來了一個心靈慰藉的港灣。但是卡通世界的誕生需要日積月累的積澱,在一筆筆線條和色彩的勾勒下才能生成動人的場景。

而人工智能卻帶來了便捷的可能,現實世界的景色人物都可以一鍵定格為卡通風格。在儘可能保留顯示細節的同時也保持着藝術的風格化。

這次是將AnimeGAN部署到Ascend 310,從而實現對自己想要圖片的一鍵轉換為我們想看到的卡通風格。

參考實現: //github.com/TachibanaYoshino/AnimeGAN
參考論文: //link.springer.com/chapter/10.1007/978-981-15-5577-0_18

最終效果圖如下圖所示,左圖是輸入,右圖是輸出:

CANN介紹

Ascend 310是硬件,我們是基於在硬件上構建的軟件進行開發的,不會直接接觸到底層的硬件,這裡我們是基於CANN開發,CANN(Compute Architecture for Neural Networks)是華為公司針對AI場景推出的異構計算架構,通過提供多層次的編程接口,支持用戶快速構建基於昇騰平台的AI應用和業務。包括:

  • AscendCL:昇騰硬件的統一編程接口,包含了編程模型、硬件資源抽象、AI任務及內核管理、內存管理、模型和算子調用、媒體預處理接口、加速庫調用等一系列功能,充分釋放昇騰系統多樣化算力,使能開發者快速開發AI應用。
  • TBE算子開發工具:預置豐富API接口,支持用戶自定義算子開發和自動化調優,縮短工期,節省人力。
  • 算子庫:基於昇騰處理器,深度協同優化的高性能算子庫

這裡我們主要用到的還Ascend CL,也就是ACL,不過為了更加方便開發,減少對原生接口的數據對齊的瑣碎限制,我們使用官方推出的進一步封裝的acllite,相當於做了進一步封裝,更加方便開發者使用。acllite的主要接口如下圖所示:

具體的開發流程如下圖所示,不僅適用於本應用,也適用於所有的開發應用。

AnimeGAN網絡概述

AnimeGAN生成網絡結構如下,以Generative Adversarial Networks(GAN)為基礎,其架構包括一個生成器(Generator)用於將現實世界場景的照片轉換為動漫圖像,和一個判別器(Discriminator)區分圖像是來自真實目標域還是來自生成器產生的輸出,通過迭代訓練兩個網絡(即生成器和判別器),由判別器提供的對抗性損失可以生成卡通化的結果。同時將生成器替換為自編碼結構,使得生成器具有更強的生成能力。對於生成器,它希望生成樣本儘可能符合真實樣本的分佈,而判別器則希望儘可能的區分真實樣本與生成樣本。具體來說,判別器將真實樣本判斷為正確,記為1;而將生成結果判斷為錯誤,記為0。

AnimeGAN 的生成器可以被認為是一個對稱的編碼器-解碼器網絡。主要由標準卷積、深度可分離卷積、反向殘差塊(IRB),上採樣和下採樣模塊組成。 在生成器中,最後一個具有 1×1 卷積核的卷積層不使用歸一化層,後面是 tanh 非線性激活函數。Conv-Block 由具有 3×3 卷積核的標準卷積、實例歸一化層和 LRelu 激活函數組成。 DSConv 由具有 3 × 3 卷積核的深度可分離卷積、實例歸一化層和 LRelu 激活函數組成。反轉的殘差塊包含 Conv-Block、深度卷積、點卷積和實例歸一化層。

為了避免最大池化導致的特徵信息丟失,使用Down-Conv作為下採樣模塊來降低特徵圖的分辨率。它包含步長為 2 的 DSConv 模塊和步長為 1 的 DSConv 模塊。在 Down-Conv 中,特徵圖的大小被調整為輸入特徵圖大小的一半。 Down-Conv 模塊的輸出是步長為 2 的 DSConv 模塊和步長為 1 的 DSConv 模塊的輸出之和。使用Up-Conv 用作上採樣模塊以提高特徵圖的分辨率。

為了有效減少生成器的參數數量,網絡中間使用了 8 個連續且相同的 IRB。與標準殘差塊 相比,IRB 可以顯着減少網絡的參數數量和計算工作量。生成器中使用的 IRB 包括具有 512 個內核的逐點卷積、具有 512 個內核的深度卷積和具有 256 個內核的逐點卷積。值得注意的是,最後一個卷積層沒有使用激活函數。

為了輔助生成器生成更好的結果,判別器需要判斷輸出圖像是否是真實的卡通圖片。因為判斷是否真實依賴於圖片本身特徵,不需要抽取最高層的圖片特徵信息,所以可以設計成較為淺層的框架。首先對輸入進行卷積核為3 x 3的卷積,然後緊接兩個步長為2的卷積塊來降低分辨率,並且提取重要的特徵信息。最後使用一個3 × 3的卷積層得到最終提取的特徵,再與真實標籤進行損失計算。如果輸入為256 × 256,則輸出為64 × 64的PatchGAN形式。這裡將Leaky ReLU的參數設置為0.2。

開發過程介紹

在拿到一個模型,我們希望做開發部署的時候,基本流程如下圖所示:

下面就來看看。

分析預處理代碼

模型轉換

獲取到原始模型後,需要使用昇騰CANN所提供的ATC模型轉換工具,將第三方框架的模型轉換為昇騰推理芯片所支持的om模型。模型轉換步驟可參考昇騰文檔中開發者文檔->應用開發->將已有模型通過ATC工具轉換(命令行)的指導進行轉換。該樣例通過不同分辨率的模型支持三種不同的輸入圖片,直接影響到生成圖片的質量。以下為模型轉換過程。

三種不同的模型輸入分辨率,分辨率越高,圖片質量越好,但模型推理時間也就越長,咱們用的是第一種256 * 256,如下圖所示:

測試

預處理代碼編寫

如果你想用Python,也沒問題,來看看Python版本的代碼:

使用DVPP對讀入圖片進行解碼,並縮放至256 × 256分辨率,以符合網絡輸入大小;在模型轉換時,使用AIPP功能,將unit8的數據轉換為fp16格式,將0~255的數值歸一化到-1~1,將BGR的圖片格式轉換為RGB格式。

執行推理

後處理

如果使用Python接口開發,代碼如下所示:

後處理模塊主要是對模型的推理結果進行格式變換,然後將變換結果反饋給用戶。主要過程是先將-1~1的值映射回0~255,然後將256 × 256的轉換結果縮放回原始圖像的尺寸大小。最後進行色域轉換將RGB格式的輸出轉換為BGR格式。

結果展示

整理流程圖如下圖所示:

1.運行管理資源申請:用於初始化系統內部資源,固定的調用流程。
2.加載模型文件並構建輸出內存:從文件加載離線模型AnimeGAN.om數據,需要由用戶自行管理模型運行的內存,根據內存中加載的模型獲取模型的基本信息包含模型輸入、輸出數據的數據buffer大小;由模型的基本信息構建模型輸出內存,為接下來的模型推理做好準備。
3.數據預處理:對讀入的圖像數據進行預處理,然後構建模型的輸入數據。
4.模型推理:根據構建好的模型輸入數據進行模型推理。
5.解析推理結果:根據模型輸出,解析模型的推理結果。使用OpenCV將轉換後的卡通畫數據轉化為JPEG。

(可選)優化加速

結語

圖片卡通化或者說動漫化,還是挺有意思的,算是AI一個娛樂性較強的應用了,可以讓每個普通人隨時隨地創造自己想要的卡通化Demo,很有意思,如果你想體驗的話,可以到昇騰開發者社區的在線體驗,上傳自己的圖片轉換,如果你想要代碼,那也沒問題,在線體驗提供了原始代碼,可以免費下載使用,奉上在線實驗鏈接://www.hiascend.com/zh/developer/mindx-sdk/cartoon/99172254img

最後奉上不同分辨率下的運行結果對比:

 

點擊關注,第一時間了解華為雲新鮮技術~