摘要:都說人工智慧改變了生活,你感覺到了麼?AI的魔力就在你摳去路人甲的一瞬間來到了你身邊。今天就跟大家聊聊——神祕的“AI消除術”。
引語
旅途歸來,重溫美好卻被秀麗河山前的路人甲攪亂了心情;街拍打卡,造型已凹竟被不遠處幾個垃圾桶搶佔了C位;自拍臭美,表情到位但無奈於嘴角的痘痘太強勢太出境…
此時,你心急如焚,多希望能一鍵摳去照片中的多餘部分,不留痕跡。
救兵已來,接下來便是見證奇蹟的時刻:https://www.hiascend.com/zh/developer/mindx-sdk/imageInpainting
都說人工智慧改變了生活,你感覺到了麼?AI的魔力就在你摳去路人甲的一瞬間來到了你身邊。今天就跟大家聊聊——神祕的“AI消除術”。
基於昇騰CANN的影像消除應用
CANN(Compute Architecture for Neural Networks)是華為針對AI場景推出的異構計算架構,以提升使用者開發效率和釋放昇騰AI處理器澎湃算力為目標,憑藉全場景、低門檻、高效能的優勢,可滿足使用者全方位的人工智慧訴求。
基於CANN開發影像消除應用更是輕而易舉,這個應用中,我們實現了兩種消除功能。
點選模式下,系統會對影像中進行自動識別和分割,使用者直接選擇待去除的目標:
框選模式下,由使用者手工框選待去除的目標:
無論哪種模式,需要對相應區域進行圖片修復,使整體看上去自然美觀,因此整體邏輯結構如下所示:
智慧例項分割,自動畫出物體輪廓
點選模式下,消除路人甲的關鍵是如何智慧地將原圖進行例項分割,藉助例項分割演算法MaskRCNN便能自動確定圖片中各個目標的位置和類別,並且標識出目標物體的畫素位置,畫出物體輪廓(即mask區域)。
MaskRCNN是一種概念簡單、靈活、通用的目標例項分割框架,在檢測出影像中目標的同時,還為每一個例項生成高質量mask分割圖。它其實是一個兩級目標檢測網路,第一部分掃描並提取圖片特徵並生成目標的建議區(即可能包含一個目標的區域);第二部分,在FasterRCNN模型基礎上進行擴充套件,不僅能夠預測種類,還可進行畫素級分割,生成mask分割圖。
圖片出自https://arxiv.org/pdf/1703.06870.pdf
MaskRCNN模型使用的是COCO資料集訓練的,所以支援80類物體的檢測,本應用中主要針對人物進行消除,因此對識別目標做了選擇,僅保留人物目標。感興趣的小夥伴們也可以自己動手,根據想要識別的目標進行調整。
填補消除區域,使修復後的影像更自然
指定好待消除的mask區域後,還需要根據背景對消除的區域進行填充,最終生成自然清晰的圖片。
基於GAN模型的修復框架包括粗(Coarse network)和精(Refine network)兩個自編碼器網路架構。
上方部分是一個粗修自編碼器,用來生成待修復部分的影像的大體輪廓,自編碼器在訓練時記錄了大量的影像資訊,即使影像部分缺失,也具有重建影像的能力。但自編碼器生成的影像會模糊,這是自編碼器的固有缺陷,因此需要再將該影像送入到第二階的精修自編碼器進行修復質量提升。
下方部分是一個精修自編碼器,會對上面生成的Mask內的影像進行精細加工,使該區域影像變得清晰。該階自編碼器的原理是將影像切成一定數量的Patch(比如圖中對大小為512*512的原始影像切成32*32個相同大小的Patch,那麼每個Patch大小是16*16),並生成可以記錄patch間相似度的注意力矩陣,注意力矩陣記錄了圖片中兩兩patch的相似度,修復mask內的影像其實就是利用注意力矩陣,將待修復的patch與mask外patch相似度作為權重,將mask外所有patch的特徵與對應相似度加權求和之後的結果作為待修復的patch的特徵,經過這樣的操作後待修補的mask內的影像就能通過使用mask外的上下文資訊得到精修,生成更清晰的影像。
在這個基礎上,還可以對圖片進行一步增強,使之更接近於真實影像。上述的兩階自編碼器可作為GAN的生成器對圖片進行清晰度增強,而判別器則儘可能地區分真實樣本與生成樣本,生成器和判別器在相互博弈的過程中不斷提升自己,最終生成器能夠生成真實清晰的影像。
藉助CRA演算法實現高清修復
以往由於記憶體限制,基於GAN模型資料驅動的影像修復方法通常只能處理小於1k(1920*1080)的低解析度輸入,而目前主流相機拍照幾乎都已經超過了4k,單純對低解析度修復後的結果進行上取樣,只會產生較大但是模糊的結果,根本無法達到高清修復的效果。
Qiang Tang等人提出藉助CRA演算法(Contextual Residual Aggregation for Ultra High-Resolution Image Inpainting)實現高清修復。首先由GAN的生成器得到低解析度的修復好的影像,然後通過殘差聚合模組先得到高頻殘差即圖片的細節,再對圖片修復區域的細節進行增強,最後將增強的細節疊加到生成器輸出的圖片的修復區域得到高清修復的影像,最終的效果也相當驚豔。
簡單來說,就是用影像銳化的原理對影像修補的區域做進一步增強,即用平滑的模糊影像再加上影像的細節就能得到銳化後的清晰影像,主要分為如下兩步:
- 銳化處理首先需要獲取圖片的細節,通常影像的細節可以由原圖減去經過平滑處理的模糊的圖片得到,這裡平滑的圖片是將圖片先下采樣再上取樣處理得到的;
- 得到mask區域內細節圖後不能直接使用,需要利用mask區域外的上下文資訊再進一步增強細節圖片的mask內區域圖片,具體為:把細節圖片分成32*32個patch,再利用上面得到的注意力矩陣,加權求和mask外的細節特徵得到mask內的細節,修復後的mask內細節區域的圖片再拼接到修復後影像對應的mask內的區域,得到清晰的修復區域的圖片,最後再將以上處理修復後的圖片mask內區域與原圖mask外的區域合併組成一張完整的清晰自然的影像。
龐大的運算量,交給昇騰CANN來加速
以上過程中,我們不難發現,無論是MaskRCNN例項分割,GAN影像修復,還是CRA演算法的大矩陣乘操作,都是非常耗時的運算。例如CRA演算法中的矩陣乘計算,針對每個需要修復的畫素,需要取32*32個patch中的對應畫素值與1024個概率值乘加得到,如果影像尺寸是(3072,3072,3),那麼我們可以估算一下它背後的計算量:1024 * 3072 * 3072 * 3 = 28991029248 = 0.28T!就算是隻計算 mask 內的必要元素,但卻需要多次判斷該畫素是否在 mask 內,所以在 CPU 上計算將非常慢,大家可以試一下。
藉助昇騰310 AI處理器的強大的矩陣乘能力可對這部分運算進行加速。將注意力矩陣作為左矩陣(1024 * 1024);將32 * 32個patch中的每一個畫素取出來作為一列,因為每個patch是96行96列(3072 / 32=96)3通道,所以總共是96 * 96 * 3=27648列,所以最終是27648列的一個矩陣作為右矩陣(1024 x 27648)參與計算,通過numpy的reshape和transpose等操作就可以實現從3072 x 3072 x 3到1024 x 27648的轉換。。
同時,通過異構計算架構CANN的軟硬體協同優化,能進一步釋放昇騰AI處理器的澎湃算力,提升整個處理效率。CANN對上支援多種AI框架,對下服務AI處理器和程式設計,發揮承上啟下的關鍵作用,是提升昇騰AI處理器計算效率的關鍵平臺。通過CANN軟體棧對硬體資源的充分排程,可實現對網路模型進行圖級和運算元級的編譯優化、自動調優等功能,快速完成任意mask形狀的高清影像修復功能,即使對於4K影像也能達到秒級修復。
高效易用的程式設計介面,助力開發者快速構建AI應用
CANN不僅能充分釋放昇騰AI處理器澎湃算力,帶給使用者“飛”一般的極致效能體驗,還針對多樣化應用場景,提供了高效易用的AscendCL程式設計介面,遮蔽底層處理器差異,讓開發者無需關心計算資源優化的問題,便能輕鬆開發深度神經網路推理應用,從而快速構建基於昇騰平臺的AI應用和業務。
我們藉助AscendCL程式設計介面,採用下圖所示的模組化設計,通過各模組之間的協調配合完成圖片修復工作,下圖是本應用在昇騰310上部署的主要流程。
其中各個模組的主要功能點:
- 執行管理資源申請。
- 載入模型檔案,構建模型輸出記憶體。
- 如果是框選模式,通過標記框獲取要進行推理的原始影像和Mask影像;如果是點選模式,需要先進行MaskRCNN影像預處理(縮放),然後經過MaskRCNN推理生成目標mask,接著根據輸出畫素點座標獲取對應區域的mask資料。
- GAN影像修復之前,需要對輸入影像進行預處理操作。
- GAN影像修復模型推理,將資料輸入到模型進行推理得到修復後的影像。
- 得到經過GAN模型修復後的影像和注意力矩陣後,進行修復後處理,使修復區域影像更清晰。
- 執行管理資源釋放。
具體實現時,AI影像修復預處理部分首先使用OpenCV讀取原圖和Mask圖,將原圖和Mask圖進行大小縮放,縮放至3072*3072大小,之後再將原影像和Mask影像縮小到512*512用於送入模型進行推理,之所以將圖片縮小後送入模型推理是為了節省算力和記憶體空間,加速推理時間;將讀取到的影像資料拷貝至裝置側申請的記憶體空間中,為接下來構建模型輸入資料做好準備。最後分別得到3072*3072和512*512的圖片和Mask圖。
而後處理部分比較複雜,主要是對模型生成器修復的影像做進一步增強,增強方式是採用了影像銳化的原理,首先利用注意力矩陣對細節圖片的修復區域內做進一步加工,使得細節圖片包含更豐富的資訊,再將此細節圖片疊加到模型輸出的圖片上,最後再將以上處理修復後的圖片mask內區域與原圖mask外的區域合併組成一張完整的清晰自然的影像。
線上體驗
原始碼就不詳細解析了,登陸昇騰社群,通過以下三步曲可以完成深度體驗甚至是二次開發。
第一步:點選“立即修改”線上體驗效果
https://www.hiascend.com/zh/developer/mindx-sdk/imageInpainting?fromPage=1
第二步:點選“線上實驗”瞭解整個開發流程。
第三步:點選“gitee”進入專案開源倉獲取原始碼進行深度學習或者二次開發。
昇騰CANN“影像消消消”體驗活動火熱報名
中,通過“玩”、“學”、“練”、“寫”,可快速熟悉並掌握高清影像修復基本開發流程,完成任務還有大獎等你來拿。快來掃碼體驗吧!
相關連結:
GAN影像修復模型論文參考連結如下:
Contextual Residual Aggregation for Ultra High-Resolution Image Inpainting
GAN影像修復原始模型部署連結如下:
Image Inpainting Project based on CVPR 2020 Oral Paper on HiFill
MaskRCNN例項分割原始模型連結如下:
https://www.hiascend.com/zh/software/modelzoo/detail/C/5b5232e55ca04b81af264d9600cc8bd3
MaskRCNN例項分割相關參考連結如下:
https://arxiv.org/pdf/1703.06870.pdf
https://blog.csdn.net/wangdongwei0/article/details/83110305/
https://blog.csdn.net/qq_37392244/article/details/88844681
相關原始碼可以從昇騰開源倉中獲取:
https://gitee.com/ascend/samples/tree/master/python/level2_simple_inference/6_other/imageinpainting_hifill
應用案例可以到昇騰社群線上體驗:
https://www.hiascend.com/zh/developer/mindx-sdk/imageInpainting?fromPage=1