一鍵智能摳圖-原理與實現
以下文章來源於CVPy ,作者CVPy冰不語
人臉識別、貓臉識別、C++實現神經網絡、Python給頭像加聖誕帽,OpenCV解九宮格數獨。分享原創CV和Python/C++實戰內容。

一鍵智能摳圖-原理實現
1. 效果秀
有些朋友已經體驗過了cvpy.net最近新上的一鍵智能摳圖和換背景的功能,智能判斷前景並自動摳圖,效果還是挺驚艷的,放幾張圖看看效果:

請注意看這位喵星人右側性感的胡須,摳的可謂是非常精細了。
有人說了,這張圖片的的背景是簡單的純色背景,體現不出難度來。
那我換一張我在路邊拍的一朵不知名的花(恕我孤陋寡聞...)的圖片,看看摳圖的效果,順便換個藍色的背景:

可以看到,模型成功識別出了前景區域,而且邊緣等細節識別的非常好。
再來看一張人物照的摳圖效果:

注意看左手指縫和肩膀后面的那一縷頭發,稱得上絲絲入扣了吧。
2. 體驗途徑
看到效果想要體驗一把的小伙伴可以通過網址https://cvpy.net/studio/cv/func/DeepLearning/matting/matting/page/前往體驗區體驗。
3. U^2-Net (U square net)
上述一鍵智能摳圖的所用的模型是Pattern Recognition 2020論文《U^2-Net: Going Deeper with Nested U-Structure for Salient Object Detection》提出的U^2-Net。
值得一提的是,最近外網很火的增強現實應用【隔空移物(AR Cut & Paste)】和 Object CutAPI都是基於CVPR2019的BASNet。而U^2-Net和BASNet的作者為同一位大佬-秦雪彬。
作者認為,目前顯著性目標檢測有兩種主流思路,一為多層次深層特征集成(multi-level deep feature integration),一為多尺度特征提取(Multi-scale feature extraction)。多層次深層特征集成方法主要集中在開發更好的多層次特征聚合策略上。而多尺度特征提取這一類方法旨在設計更新的模塊,從主干網獲取的特征中同時提取局部和全局信息。而幾乎所有上述方法,都是為了更好地利用現有的圖像分類的Backbones生成的特征映射。而作者另辟蹊徑,提出了一種新穎而簡單的結構,它直接逐級提取多尺度特征,用於顯著目標檢測,而不是利用這些主干的特征來開發和添加更復雜的模塊和策略。
作者首先介紹了提出的Residual U-blocks,然后介紹了基於Residual U-blocks構建的嵌套U型網絡結構。
3.1 Residual U-blocks

上圖為普通卷積block,Res-like block,Inception-like block,Dense-like block和Residual U-blocks的對比圖,明顯可以看出Residual U-blocks是受了U-Net的啟發。
Residual U-blocks由以下三部分組成:
- 一個輸入卷積層,它將輸入的
feature map x (H × W × C_in)轉換成中間feature map F_1(x),F_1(x)通道數為C_out。這是一個用於局部特征提取的普通卷積層。 - 一個
U-like的對稱的encoder-decoder結構,高度為L,以中間feature map F_1(x)為輸入,去學習提取和編碼多尺度文本信息U(F_1(x))。U表示類U-Net結構。更大L會得到更深層的U-block(RSU),更多的池操作,更大的感受野和更豐富的局部和全局特征。配置此參數允許從具有任意空間分辨率的輸入特征圖中提取多尺度特征。從逐漸降采樣特征映射中提取多尺度特征,並通過漸進上采樣、合並和卷積等方法將其編碼到高分辨率的特征圖中。這一過程減少了大尺度直接上采樣造成的細節損失。 - 一種殘差連接,它通過求和來融合局部特征和多尺度特征:
F_1(x) + U(F_1(x))。

RSU與Res block的主要設計區別在於RSU用U-Net結構代替了普通的單流卷積,用一個權重層(weight layer)形成的局部特征來代替原始特征。這種設計的變更使網絡能夠從多個尺度直接從每個殘差塊提取特征。更值得注意的是,U結構的計算開銷很小,因為大多數操作都是在下采樣的特征映射上進行的。
3.2 U^2-Net的結構
U^2-Net的網絡結構如下:

與U-Net的網絡結構做一個對比:

直觀上可以發現,U^2-Net的每一個Block都是一個U-Net結構的模塊,即上述Residual U-blocks。當然,你也可以繼續Going Deeper, 每個Block里面的U-Net的子Block仍然可以是一個U-Net結構,命名為U^3-Net。然后同理繼續...,正所謂:子又生孫,孫又生子;子又有子,子又有孫;子子孫孫無窮匱也!
4. 性能表現
作者所提出的模型是使用DUTS-TR數據集進行訓練,該數據集包含大約10000個樣本圖像,並使用標准數據增強技術進行擴充。研究人員在6個用於突出目標檢測的基准數據集上評估了該模型:DUT-OMRON、DUTS-TE、HKU-IS、ECSSD、PASCAL-S和SOD。評價結果表明,在這6個基准點上,新模型與現有方法具有相當好的性能。
U^2-Net的實現是開源的,並為兩種不同的方法提供了預訓練的模型:U^2-Net(176.3M的較大模型,在GTX 1080Ti GPU上為30 FPS)和一個僅為4.7mb的較小的U^2-Net版本,最高可達到40 FPS。
代碼和預訓練模型都可以在Github找到:
https://github.com/NathanUA/U-2-Net。
