「完美復(fù)刻」的人物肖像畫生成算法U^2-Net

一、前言
大家好,我是 Jack 。
今年提出的 U^2-Net 顯著性檢測(cè)算法,刷爆了 reddit 和 twitter,號(hào)稱是 2020 年「地表最強(qiáng)」的靜態(tài)背景分割算法,可以看下效果:

你以為今天要講分割?錯(cuò)!
U^2-Net?這兩天又出新活,在 U^2-Net 網(wǎng)絡(luò)架構(gòu)基礎(chǔ)上,實(shí)現(xiàn)了人物肖像畫的生成,細(xì)節(jié)「完美」復(fù)刻。

我用自己的「歪脖子照」測(cè)試了下效果。

萬年不變老規(guī)矩,繼續(xù)手把手教學(xué)。
算法原理、環(huán)境搭建、效果實(shí)現(xiàn),一條龍服務(wù),盡在下文!
二、U^2-Net
受 U-Net 網(wǎng)絡(luò)的啟發(fā),U^2-Net 也是一種類似編碼-解碼(Encoder-Decoder)的網(wǎng)絡(luò)結(jié)構(gòu)。
研究者在此基礎(chǔ)上,提出了新型殘差 U-block(ReSidual U-block, RSU),融合不同尺寸接受野的特征,以捕獲更多不同尺度的上下文信息。
RSU 網(wǎng)絡(luò)與現(xiàn)有卷積塊的結(jié)構(gòu)對(duì)比如下:

最右邊的結(jié)構(gòu),就是 RSU-L,L 表示編碼器中的層數(shù),C_in、C_out 分別表示輸入和輸出通道,M 表示 RSU 內(nèi)層通道數(shù)。
具體而言,RSU 主要有三個(gè)組成部件,分別是一個(gè)輸入卷積層、一個(gè)高度為 L 的類 U-Net 對(duì)稱編碼器 - 解碼器結(jié)構(gòu)以及一個(gè)通過求和來融合局部和多尺度特征的殘差連接。
為了更好地理解設(shè)計(jì)理念,研究者在下圖中對(duì) RSU 與原始?xì)埐顗K進(jìn)行了比較。

結(jié)果顯示,RSU 與原始?xì)埐顗K的最大區(qū)別在于 RSU 通過一個(gè)類 U-Net 的結(jié)構(gòu)替換普通單流卷積,并且通過一個(gè)由權(quán)重層轉(zhuǎn)換的局部特征替換原始特征。
更值得注意的是,得益于 U 形結(jié)構(gòu),RSU 的計(jì)算開銷相對(duì)較少,因?yàn)榇蠖鄶?shù)運(yùn)算在下采樣特征圖中應(yīng)用。下圖展示了 RSU 與其他特征提取模塊的計(jì)算成本曲線圖:

U^2-Net 的整體網(wǎng)絡(luò)架構(gòu)如下:

U^2-Net 主要由三部分組成:
6 階段編碼器;
5 階段解碼器;
與解碼器階段和最后編碼器階段相連接的顯著圖融合模塊。
說完網(wǎng)絡(luò)結(jié)構(gòu),再看下?lián)p失函數(shù),研究者使用了類似于整體嵌套邊緣檢測(cè)(HED)的深度監(jiān)督算法:

其中,M=6, 為 U^2-Net 的 Sup1, Sup2, ..., Sup6 stage。

為 Sup1, Sup2, ..., Sup6 輸出的顯著圖

的損失函數(shù)。

為最終融合輸出的顯著圖

的損失函數(shù)。

為每個(gè)損失函數(shù)的權(quán)重。
對(duì)于每個(gè) l ,采用標(biāo)準(zhǔn)的二值交叉熵?fù)p失函數(shù):

其中,(r, c) 為像素坐標(biāo);(H, W) 為圖像尺寸,height 和 width。

分別表示 GT 像素值和預(yù)測(cè)的顯著概率圖。
總的來說,U^2-Net 的設(shè)計(jì)構(gòu)建了具有豐富多尺度特征以及較低計(jì)算和內(nèi)存成本的深度架構(gòu)。
更詳細(xì)的內(nèi)容,可以直接看 paper:
https://arxiv.org/pdf/2005.09007.pdf
三、效果測(cè)試
Github 項(xiàng)目地址:https://github.com/NathanUA/U-2-Net
第一步:搭建測(cè)試環(huán)境。
很簡(jiǎn)單,沒啥特殊的庫(kù),安裝好 Pytorch、Numpy、Skimage 等基礎(chǔ)第三方庫(kù)即可。
第二步:下載訓(xùn)練好的模型權(quán)重文件。
我將程序和權(quán)重文件都進(jìn)行了打包,嫌麻煩,可以下載直接使用。
下載地址(提取碼:jack):
https://pan.baidu.com/s/1qwApU0xggsBRolAai3WYtA
第三步:在工程目錄,運(yùn)行程序。
python u2net_portrait_test.py
在 u2net_portrait_test.py 可以查看輸入圖片路徑和輸出圖片路徑:

最后再看下運(yùn)行效果:

四、絮叨
我是 Jack ,我們下期見。
文章持續(xù)更新,可以微信公眾號(hào)搜索【JackCui-AI】第一時(shí)間閱讀,本文 GitHub?https://github.com/Jack-Cherish/PythonPark?已經(jīng)收錄,有大廠面試完整考點(diǎn),歡迎Star。