基于昇騰CANN的卡通圖像生成可在線體驗啦!十分鐘帶你了解CANN應用開發全流程
2021年7月8日,第四屆世界人工智能大會在上海召開。華為輪值董事長胡厚崑在開幕式發表演講,其中提到:華為推出了異構計算架構CANN(Compute Architecture for Neural Networks),CANN作為昇騰AI處理器的發動機,支持業界多種主流的AI框架,包括MindSpore、TensorFlow、Pytorch、Caffe等,并提供1200多個基礎算子。同時,CANN具有開放易用的ACL(Ascend Computing Language)編程接口,并提供了網絡模型的圖級和算子級的編譯優化、自動調優等功能。CANN對上支持多種AI框架,對下服務AI處理器與編程,是提升昇騰AI處理器計算效率的關鍵平臺。
如何理解CANN,如何使用CANN,特別是如何基于CANN開放易用的ACL編程接口實現神經網絡的快速部署呢?
相信我們大部分開發者對于訓練一個模型并不陌生,但對于將該模型部署到邊緣側,做成一個應用落地,去產生價值(或者叫幫你賺錢?),可能就不是特別清楚了。但,一旦談到可以幫你去幫你賺錢,我相信你一定會感興趣的,對嗎?
什么?賺錢!說到這個事兒,我就知道你不困了哈!
我們發現在昇騰社區上已經提供了不少可在線體驗的案例,這些案例不但可以在線體驗效果,還可以進行在線實驗,同時開放了源代碼,可以通過開源社區提供的資源進行學習并給基于這些案例進行二次開發,真真正正的體驗、學習、開發三步走啊!
那么我們選擇一些有意思的案例帶大家學習下基于CANN的昇騰AI應用開發過程,今天要給大家介紹的就是這個能夠吸引到你的卡通圖像生成應用,無論是漂亮的小姐姐還是可愛的小萌寵都能幫你秒級生成,如下圖,選擇預置圖片或者是上傳自己的私照,點擊“立即生成”即可體驗。
首先介紹下如何找到該應用:
進昇騰社區https://www.hiascend.com/
開發者->應用案例,Ok,你已經可以看到那個狗狗了,案例標題是“卡通圖像生成”,點擊進去你就看到了。
體驗就不說了,左邊選擇需要處理的圖片,也可以上傳自己的圖片,然后點擊生成就可以了,圖片會上傳到華為云昇騰AI計算資源上,推理后再回傳到前端展示,相隔千里卻仍能提供秒級體驗,這里要給個大贊!
那么接下來言歸正傳,帶你了解基于CANN的應用開發流程。完整開發流程如下:
0) 工程準備
硬件:服務器及推理卡準備就緒, 安裝操作系統,配置網絡。
訓練后的模型:Caffe、MindSpore、TensorFlow模型;
1)模型轉換
離線模型:Ascend310算子列表, ATC轉換工具。
2) 算子開發及調試
自定義算子開發:TBE DSL,TBE TIK等算子開發工具。
3) 業務開發及調試
ACL接口:資源初始化,數據傳輸,數據預處理,模型推理,數據后處理等。
4)性能調優
性能優化:瓶頸分析,內存優化,模型優化等。
看起來還挺復雜的,對吧??但是我們呢,是來解決主要矛盾的(先完成應用開發),其他的優化過程(精度、性能等)留著以后慢慢消化,來日方長,不是么?
廢話不多說了,假定模型我們已經有了,也符合我們的需求,模型呢也是昇騰AI處理器已經支持的模型(無需做算子開發),我們現在要做的就是理解模型,分析其前處理過程(給模型準備數據),后處理過程(結果展示),進行模型轉換得到離線模型,然后就是代碼開發了(其實就是調用CANN ACL的各種API完成模型加載、推理的過程而已), 這里選用python,CANN的pyACL用起來。
總結一下,在本例中我們只需要搞定如下過程:
理解模型 2. 模型轉換 3. 基于CANN ACL接口進行代碼開發
1、理解模型
Yang Chen、Yong-Jin LIU等人提出的算法?CartoonGAN: Generative Adversarial Networks for Photo Cartoonization基于GAN網絡,迭代訓練生成器和判別器,由判別器提供的對抗性損失約束,最終將自然圖片轉換為具有卡通風格的圖片,效果驚艷。
下圖為卡通圖像生成的整體框架:
以Generative Adversarial Networks(GAN)為基礎,其架構包括一個生成器(Generator)和一個判別器(Discriminator),通過迭代訓練兩個網絡,由判別器提供的對抗性損失約束,最終使得網絡能夠將自然圖片轉換為具有卡通風格的圖片結果,并且保持原圖片的內容信息。
圖1 卡通圖像生成整體架構
生成器結構
生成器采用自編碼器,為全卷積結構,包括編碼器如圖3,解碼器如圖4。
圖3 編碼器結構
圖4 解碼器結構
編碼器輸入為真實圖片,其架構由7×7的卷積核,步長為1的卷積層開始,隨后緊跟兩個步長為2的降采樣塊,進行特征提取,對風格圖片生成有用的信息將在這個過程中被提取。然后緊接4個殘差塊(Residual Block),用來重建內容特征。
解碼器架構由5個殘差塊開始,通過兩個上采樣塊(步長為2)來實現對不同風格特征的重建,最后在添加一層使用7×7卷積核、步長為1的卷積層,得到最終輸出生成的卡通圖片結果。
由于當前我們的目標是將訓練好的模型做成一個AI應用,所以這里只需要了解生成器就夠了,從上面的結構中可以看出,該模型的輸入是圖像,輸出也是圖像,那么預處理和后處理過程呢?
原始模型預處理和后處理
在Github能夠找到其測試腳本:https://github.com/taki0112/CartoonGAN-Tensorflow/tree/890decc647fbfd90a5314290b2771c496562ada8
結合前面的理解,并通過對測試腳本的研讀,能夠理解其圖像預處理和后處理的方法
昇騰CANN軟件棧提供了兩套專門用于數據預處理的工具,其中一套叫做AIPP(AI Preprocessing) ;另一套叫做DVPP(Digital Vision Preprocessing)。
DVPP是CANN軟件棧中的數字視覺預處理模塊,昇騰310 AI處理器支持摳圖縮放、jpeg編解碼、視頻編解碼、png解碼等功能。詳細請參考昇騰社區文檔:
https://support.huaweicloud.com/devg-cannApplicationDev330/atlasapi_07_0131.html
AIPP用于在AI Core上完成圖像預處理,包括色域轉換(轉換圖像格式)、圖像歸一化(減均值/乘系數)和摳圖(指定摳圖起始點,摳出神經網絡需要大小的圖片)等,靜態AIPP可以在ATC模型轉換時通過設置參數完成,比較方便。詳細請參考昇騰社區文檔:https://support.huaweicloud.com/tg-cannApplicationDev330/atlasatc_16_0015.html
在這里,我們假設你已經了解了DVPP和AIPP,那么基于對原始模型的理解,在圖像預處理時DVPP和AIPP如下分工(分工的原則:DVPP+AIPP的處理要等價于原始模型的預處理過程):
DVPP:
1.解碼:JPEG圖片先解碼為YUV420SP,輸出寬128,高16對齊,例如:若輸入原始圖像大小為(500, 375) 經過解碼后圖像大小變為(512, 384)
2.圖像縮放:使用DVPP的VPC接口將圖像縮放為模型要求的大小(256,256),要求寬16,高2對齊,將(512,384)圖像中的有效數據(500,375)縮放到(256,256)
注:這里也可以考慮等比例縮放,但由于等比例縮放要涉及到用AIPP裁剪,后期再講。
AIPP:
1.色域轉換:YUV->RGB
2.圖像標準化,AIPP配置mean_chn=[127.5,127.5,127.5] min_chn=[0.5,0.5,0.5] var_reci_chn=[0.007874,0.007874,0.007874]
2)后處理
根據原始模型圖像后處理流程,將圖像像素轉換到[0,255],然后進行保存。該過程直接使用scipy庫實現。
2、模型轉換
原始網絡模型是TensorFlow框架模型,而昇騰CANN軟件棧需要的模型是.om離線模型,因此,需要通過ATC模型轉換工具將.pb文件轉換為Ascend 310處理器支持的Davinci模型文件。
ATC模型轉換指令:
atc --output_type=FP32 --input_shape="train_real_A:1,256,256,3" --input_format=NHWC --output="./cartoonization" --soc_version=Ascend310 --insert_op_conf=./insert_op.cfg --framework=3 --model="./cartoonization.pb" --precision_mode=allow_fp32_to_fp16
重要參數說明:
--model:原始模型文件路徑與文件名。
--output:轉換后的離線模型的路徑以及文件名。
--precision_mode=allow_fp32_to_fp16:設置網絡模型的精度模式,優先保持原圖精度,如果網絡模型中算子支持float32,則保留原始精度float32;如果網絡模型中算子不支持float32,則直接降低精度到float16。
--insert_op_conf:插入算子的配置文件路徑與文件名,例如AIPP預處理算子。
AIPP配置文件,根據原始模型需處理進行AIPP文件配置,本模型的配置文件見下圖:
更多參數介紹可閱讀:https://support.huaweicloud.com/atctool-cann502alpha5infer/atlasatc_16_0037.html
3、應用開發
應用采用了下圖所示的模塊化設計,通過各模塊之間的協調配合完成一張圖片的推理輸出。
其中各個模塊的主要功能點如下所示:
1.運行資源申請;
2.加載模型文件,申請模型輸入輸出內存;
3.數據獲取,獲取要進行推理的原始圖像;
4.數據預處理,模型的輸入圖像進行預處理;
5.模型推理,將預處理后的數據輸入到模型進行推理;
6.推理結果解析,將推理結果進行后處理。
源碼就不在這里show了,昇騰社區提供了更好的學習路徑,可以直接通過在線實驗學習開發過程,直接點擊右上側的在線實驗,即可免費體驗。
體驗完畢后,大家還可以移步開源倉庫去獲取源碼,如果有任何問題,鼓勵大家去提issue與開發人員直接交流。
https://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture
相關鏈接
模型論文參考鏈接如下:
https://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_CartoonGAN_Generative_Adversarial_CVPR_2018_paper.pdf
原始模型部署鏈接如下:
https://gitee.com/syz825211943/cartoonization
相關源碼可以在開源倉庫如下地址中獲取:
https://gitee.com/ascend/sample
MindSpore TensorFlow 昇騰
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。