「完美復刻」的人物肖像畫生成演算法
一、前言
大家好,我是 Jack 。
今年提出的 U^2-Net 顯著性檢測演算法,刷爆了 reddit 和 twitter,號稱是 2020 年「地表最強」的靜態背景分割演算法,可以看下效果:
你以為今天要講分割?錯!
U^2-Net 這兩天又出新活,在 U^2-Net 網路架構基礎上,實現了人物肖像畫的生成,細節「完美」復刻。
我用自己的「歪脖子照」測試了下效果。
萬年不變老規矩,繼續手把手教學。
演算法原理、環境搭建、效果實現,一條龍服務,盡在下文!
二、U^2-Net
受 U-Net 網路的啟發,U^2-Net 也是一種類似編碼-解碼(Encoder-Decoder)的網路結構。
研究者在此基礎上,提出了新型殘差 U-block(ReSidual U-block, RSU),融合不同尺寸接受野的特徵,以捕獲更多不同尺度的上下文資訊。
RSU 網路與現有卷積塊的結構對比如下:
最右邊的結構,就是 RSU-L,L 表示編碼器中的層數,C_in、C_out 分別表示輸入和輸出通道,M 表示 RSU 內層通道數。
具體而言,RSU 主要有三個組成部件,分別是一個輸入卷積層、一個高度為 L 的類 U-Net 對稱編碼器 – 解碼器結構以及一個通過求和來融合局部和多尺度特徵的殘差連接。
為了更好地理解設計理念,研究者在下圖中對 RSU 與原始殘差塊進行了比較。
結果顯示,RSU 與原始殘差塊的最大區別在於 RSU 通過一個類 U-Net 的結構替換普通單流卷積,並且通過一個由權重層轉換的局部特徵替換原始特徵。
更值得注意的是,得益於 U 形結構,RSU 的計算開銷相對較少,因為大多數運算在下取樣特徵圖中應用。下圖展示了 RSU 與其他特徵提取模組的計算成本曲線圖:
U^2-Net 的整體網路架構如下:
U^2-Net 主要由三部分組成:
-
6 階段編碼器;
-
5 階段解碼器;
-
與解碼器階段和最後編碼器階段相連接的顯著圖融合模組。
說完網路結構,再看下損失函數,研究者使用了類似於整體嵌套邊緣檢測(HED)的深度監督演算法:
其中,M=6, 為 U^2-Net 的 Sup1, Sup2, …, Sup6 stage。為 Sup1, Sup2, …, Sup6 輸出的顯著圖
的損失函數。
為最終融合輸出的顯著圖
的損失函數。
為每個損失函數的權重。
對於每個 l ,採用標準的二值交叉熵損失函數:
其中,(r, c) 為像素坐標;(H, W) 為影像尺寸,height 和 width。
分別表示 GT 像素值和預測的顯著概率圖。
總的來說,U^2-Net 的設計構建了具有豐富多尺度特徵以及較低計算和記憶體成本的深度架構。
更詳細的內容,可以直接看 paper:
//arxiv.org/pdf/2005.09007.pdf
三、效果測試
Github 項目地址://github.com/NathanUA/U-2-Net
第一步:搭建測試環境。
很簡單,沒啥特殊的庫,安裝好 Pytorch、Numpy、Skimage 等基礎第三方庫即可。
第二步:下載訓練好的模型權重文件。
我將程式和權重文件都進行了打包,嫌麻煩,可以下載直接使用。
下載地址(提取碼:jack):
//pan.baidu.com/s/1qwApU0xggsBRolAai3WYtA
第三步:在工程目錄,運行程式。
python u2net_portrait_test.py
在 u2net_portrait_test.py 可以查看輸入圖片路徑和輸出圖片路徑:
最後再看下運行效果:
四、絮叨
本期內容就是這樣啦~我是 Jack ,我們下期見。
文章持續更新,可以微信公眾號搜索【JackCui-AI】第一時間閱讀,本文 GitHub //github.com/Jack-Cherish/PythonPark 已經收錄,有大廠面試完整考點,歡迎Star。