全解析:從傳統(tǒng)算法到深度學(xué)習(xí)實(shí)戰(zhàn))
1. 圖像摳圖到底在解決什么問題圖像摳圖Image Matting這個(gè)方向我在實(shí)際項(xiàng)目里斷斷續(xù)續(xù)接觸了快六年從最早用Photoshop插件批量處理商品圖到后來(lái)自己寫算法做視頻會(huì)議背景替換踩過的坑比想象中多得多。很多人第一次聽到“摳圖”會(huì)覺得這不就是把前景從背景里分離出來(lái)嗎聽起來(lái)跟語(yǔ)義分割差不多。但真正上手做過的人都知道這兩者的難度完全不在一個(gè)量級(jí)上。語(yǔ)義分割輸出的是每個(gè)像素屬于哪個(gè)類別的硬標(biāo)簽一個(gè)像素要么是前景要么是背景沒有中間地帶。而摳圖要解決的是一個(gè)更精細(xì)的問題每個(gè)像素到底有多少比例屬于前景。這就引出了摳圖領(lǐng)域最核心的數(shù)學(xué)表達(dá)——alpha合成公式I αF (1-α)B其中I是觀察到的圖像像素值F是前景顏色B是背景顏色α就是我們要估計(jì)的透明度值取值范圍在0到1之間。當(dāng)α1時(shí)像素完全屬于前景α0時(shí)完全屬于背景而0α1的區(qū)域就是所謂的“半透明區(qū)域”或者“混合區(qū)域”比如頭發(fā)絲、玻璃杯邊緣、煙霧、羽毛這些地方。這個(gè)公式看起來(lái)簡(jiǎn)單但它有一個(gè)致命的問題對(duì)于每個(gè)像素我們只有一個(gè)已知量I卻要求解α、F、B三個(gè)未知量。這是一個(gè)典型的欠定問題數(shù)學(xué)上是沒有唯一解的。所以所有摳圖算法的核心任務(wù)其實(shí)都是通過某種方式引入額外的約束或先驗(yàn)信息把這個(gè)欠定問題變成可解的。實(shí)際工程中這個(gè)約束通常來(lái)自兩個(gè)方面一是用戶提供的先驗(yàn)知識(shí)比如三分圖Trimap它把圖像粗略劃分為確定前景、確定背景和未知區(qū)域三部分二是算法自身對(duì)圖像結(jié)構(gòu)的假設(shè)比如顏色局部平滑、前景背景顏色聚類等。理解了這一點(diǎn)你就能明白為什么摳圖至今仍然是一個(gè)沒有完全解決的問題。那些看起來(lái)已經(jīng)很成熟的商業(yè)工具在處理復(fù)雜邊緣時(shí)依然需要人工干預(yù)根本原因就在于這個(gè)欠定問題的本質(zhì)沒有改變。2. 傳統(tǒng)方法的核心思路與經(jīng)典算法拆解2.1 傳統(tǒng)摳圖的三大流派傳統(tǒng)摳圖方法發(fā)展了幾十年積累了大量的經(jīng)典算法。我把它們大致分為三個(gè)流派每個(gè)流派解決欠定問題的思路完全不同。第一類是基于顏色采樣的方法。這類方法的核心思想很直接對(duì)于未知區(qū)域的每個(gè)像素從已知的前景區(qū)域和背景區(qū)域分別采樣一組候選顏色然后通過某種優(yōu)化策略找到最佳的(F, B, α)組合。最經(jīng)典的代表是Knockout方法它假設(shè)前景和背景顏色在局部區(qū)域內(nèi)是平滑變化的通過邊界附近的已知像素來(lái)推斷未知像素的前景和背景顏色。這類方法的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單、計(jì)算速度快缺點(diǎn)是對(duì)顏色分布復(fù)雜的圖像效果很差尤其是當(dāng)前景和背景顏色相近時(shí)采樣很容易出錯(cuò)。第二類是基于alpha傳播的方法。這類方法不直接估計(jì)F和B而是假設(shè)α值在圖像局部區(qū)域內(nèi)具有某種連續(xù)性或平滑性通過構(gòu)建一個(gè)大的稀疏線性系統(tǒng)來(lái)求解所有未知像素的α值。最著名的代表是Levin等人提出的Closed-form Matting它基于一個(gè)關(guān)鍵假設(shè)在局部窗口內(nèi)前景顏色F和背景顏色B可以用線性模型來(lái)近似從而推導(dǎo)出α的閉合解。這個(gè)方法的數(shù)學(xué)推導(dǎo)非常漂亮它把摳圖問題轉(zhuǎn)化成了一個(gè)類似泊松方程的求解問題最終只需要解一個(gè)稀疏線性系統(tǒng)就能得到全局最優(yōu)的α圖。我早期做商品圖批量摳圖時(shí)用的就是這個(gè)方法對(duì)于邊緣相對(duì)清晰的物體效果很好但遇到毛發(fā)這類高頻細(xì)節(jié)時(shí)就會(huì)力不從心。第三類是基于貝葉斯推理的方法。這類方法把摳圖看作一個(gè)概率推斷問題通過建立前景顏色、背景顏色和α的聯(lián)合概率分布用最大后驗(yàn)概率來(lái)估計(jì)最優(yōu)解。Bayesian Matting是這方面的開山之作它在前景和背景區(qū)域分別建立高斯混合模型然后在未知區(qū)域用這些模型來(lái)推斷每個(gè)像素的α值。這類方法的理論框架很完整但計(jì)算量通常比較大而且對(duì)模型假設(shè)比較敏感。2.2 三分圖傳統(tǒng)方法繞不開的輸入幾乎所有傳統(tǒng)摳圖方法都需要一個(gè)額外的輸入——三分圖。這個(gè)東西說(shuō)白了就是一張標(biāo)注圖把原圖分成三個(gè)區(qū)域確定是前景的、確定是背景的、以及不確定的。不確定的區(qū)域就是算法需要去猜的部分。為什么需要三分圖回到前面的欠定問題如果沒有三分圖算法面對(duì)整張圖完全不知道哪些像素可能是前景、哪些可能是背景求解空間太大了。三分圖的作用就是把求解范圍縮小到未知區(qū)域同時(shí)為顏色采樣提供可靠的參考源。但三分圖本身就是一個(gè)很尷尬的東西。對(duì)于簡(jiǎn)單圖像用戶手動(dòng)畫幾筆就能生成一個(gè)可用的三分圖但對(duì)于復(fù)雜圖像尤其是毛發(fā)、透明物體這類三分圖的繪制本身就非常困難。你很難判斷一根頭發(fā)絲的中間段到底應(yīng)該標(biāo)為前景還是未知區(qū)域。這就導(dǎo)致傳統(tǒng)方法在實(shí)際應(yīng)用中有一個(gè)很大的瓶頸三分圖的質(zhì)量直接決定了最終摳圖的質(zhì)量而高質(zhì)量的三分圖往往需要大量人工。我在實(shí)際項(xiàng)目中試過用形態(tài)學(xué)操作自動(dòng)生成三分圖比如對(duì)前景掩碼做膨脹和腐蝕膨脹后的減去腐蝕后的就是未知區(qū)域。這個(gè)方法對(duì)于邊緣清晰的物體還行但對(duì)于毛發(fā)類物體膨脹半徑稍微大一點(diǎn)就會(huì)把大量背景像素劃入未知區(qū)域?qū)е滤惴ㄔ谶@些區(qū)域胡亂猜測(cè)膨脹半徑小了又覆蓋不住真正的半透明區(qū)域。這個(gè)參數(shù)調(diào)起來(lái)非常痛苦基本上每換一批圖就得重新調(diào)。2.3 傳統(tǒng)方法的性能瓶頸在哪里傳統(tǒng)方法在特定場(chǎng)景下依然有不可替代的價(jià)值比如當(dāng)你有高質(zhì)量三分圖且圖像邊緣相對(duì)簡(jiǎn)單時(shí)Closed-form Matting這類方法的速度和效果都很不錯(cuò)。但它們的瓶頸也非常明顯。首先是對(duì)先驗(yàn)知識(shí)的強(qiáng)依賴。三分圖的質(zhì)量直接決定了上限而高質(zhì)量三分圖的獲取成本很高。其次是對(duì)復(fù)雜紋理的處理能力有限。傳統(tǒng)方法大多基于顏色局部平滑假設(shè)當(dāng)遇到前景和背景顏色分布重疊、或者前景本身有復(fù)雜紋理時(shí)很容易出現(xiàn)顏色泄漏或者邊緣斷裂。第三是泛化能力差。一個(gè)在商品圖上調(diào)好的參數(shù)組合換到人像頭發(fā)上可能完全不能用因?yàn)閮深悎D像的顏色分布和邊緣特性差異太大了。這些瓶頸的存在直接催生了后來(lái)深度學(xué)習(xí)方法的興起。3. 深度學(xué)習(xí)方法如何重塑摳圖流程3.1 從“解方程”到“學(xué)映射”的范式轉(zhuǎn)變深度學(xué)習(xí)給摳圖帶來(lái)的最大變化是思路的根本性轉(zhuǎn)變。傳統(tǒng)方法是在解一個(gè)數(shù)學(xué)方程需要顯式地建模F、B、α之間的關(guān)系深度學(xué)習(xí)方法則是在學(xué)一個(gè)映射函數(shù)直接從輸入圖像有時(shí)加上三分圖預(yù)測(cè)α圖。這個(gè)轉(zhuǎn)變的意義在于算法不再需要顯式地理解什么是前景、什么是背景、什么是半透明它只需要從大量標(biāo)注數(shù)據(jù)中學(xué)會(huì)“什么樣的輸入對(duì)應(yīng)什么樣的α輸出”。這就繞開了傳統(tǒng)方法中很多難以建模的復(fù)雜情況比如毛發(fā)邊緣的光學(xué)特性、透明物體的折射效果等。最早把深度學(xué)習(xí)引入摳圖的工作之一是Deep Image Matting它采用編碼器-解碼器結(jié)構(gòu)輸入是RGB圖像和三分圖拼接后的四通道數(shù)據(jù)輸出是預(yù)測(cè)的α圖。這個(gè)網(wǎng)絡(luò)還同時(shí)預(yù)測(cè)前景顏色F然后用一個(gè)refinement階段來(lái)優(yōu)化邊緣細(xì)節(jié)。這個(gè)兩階段的設(shè)計(jì)在當(dāng)時(shí)是很巧妙的因?yàn)橹苯踊貧wα圖在邊緣區(qū)域容易模糊而先預(yù)測(cè)F再結(jié)合α做refinement可以恢復(fù)更多細(xì)節(jié)。3.2 三分圖在深度學(xué)習(xí)時(shí)代還重要嗎這個(gè)問題我在不同項(xiàng)目里反復(fù)思考過。答案是取決于具體方法但整體趨勢(shì)是三分圖的依賴在減弱。早期深度學(xué)習(xí)方法基本都沿用傳統(tǒng)流程需要三分圖作為輸入。因?yàn)槿绻麤]有三分圖網(wǎng)絡(luò)面對(duì)整張圖完全不知道哪里該摳、哪里不該摳學(xué)習(xí)難度太大。三分圖在這里的作用從“縮小求解空間”變成了“提供位置先驗(yàn)”。但三分圖的問題依然存在獲取成本高、質(zhì)量不穩(wěn)定。所以后來(lái)的研究分成了兩條路。一條路是繼續(xù)優(yōu)化三分圖依賴的方法比如用更高效的網(wǎng)絡(luò)結(jié)構(gòu)、更好的損失函數(shù)來(lái)降低對(duì)三分圖精度的要求。另一條路是探索無(wú)三分圖的方法比如Background Matting系列它要求用戶提供一張純背景圖然后用背景圖作為額外的監(jiān)督信號(hào)來(lái)替代三分圖。還有一類方法是只給一個(gè)粗略的邊界框或者涂鴉讓網(wǎng)絡(luò)自己去推斷三分圖。在實(shí)際落地中我的經(jīng)驗(yàn)是如果應(yīng)用場(chǎng)景允許用戶提供額外輸入比如固定攝像頭場(chǎng)景可以提供背景圖那么無(wú)三分圖方法會(huì)大大降低使用門檻如果只能給單張圖那么三分圖依然是目前最可靠的先驗(yàn)形式但可以用交互式工具來(lái)降低標(biāo)注成本。3.3 主流網(wǎng)絡(luò)架構(gòu)的演進(jìn)脈絡(luò)深度學(xué)習(xí)摳圖的網(wǎng)絡(luò)架構(gòu)這幾年演進(jìn)很快我把它大致分為幾個(gè)階段。第一階段是編碼器-解碼器結(jié)構(gòu)。以Deep Image Matting為代表編碼器用卷積網(wǎng)絡(luò)提取多尺度特征解碼器逐步上采樣恢復(fù)分辨率。這個(gè)結(jié)構(gòu)的問題是邊緣細(xì)節(jié)容易丟失因?yàn)橄虏蓸舆^程中高頻信息被壓縮了。第二階段是引入跳躍連接和注意力機(jī)制。比如IndexNet用索引引導(dǎo)的方式來(lái)選擇有用的特征進(jìn)行上采樣GCA Matting用通道注意力來(lái)增強(qiáng)邊緣區(qū)域的特征響應(yīng)。這些改進(jìn)的核心目的都是讓網(wǎng)絡(luò)把更多的“注意力”放在半透明區(qū)域和邊緣上。第三階段是Transformer架構(gòu)的引入。比如MatteFormer用Transformer來(lái)建模長(zhǎng)距離依賴因?yàn)閾笀D任務(wù)中一個(gè)像素的α值不僅取決于局部顏色還取決于它和遠(yuǎn)處前景/背景區(qū)域的關(guān)系。Transformer的自注意力機(jī)制天然適合建模這種關(guān)系。第四階段是擴(kuò)散模型和生成式方法的探索。這類方法把摳圖看作一個(gè)條件生成問題用擴(kuò)散過程逐步去噪得到α圖。目前這類方法在效果上有潛力但推理速度是硬傷實(shí)際落地還需要時(shí)間。從我實(shí)際使用的感受來(lái)說(shuō)對(duì)于大多數(shù)工業(yè)級(jí)應(yīng)用基于編碼器-解碼器加注意力機(jī)制的方案在效果和速度之間取得了最好的平衡。Transformer方案效果確實(shí)更好但顯存占用和推理延遲也明顯更高需要根據(jù)具體場(chǎng)景權(quán)衡。4. 實(shí)操落地從數(shù)據(jù)準(zhǔn)備到模型部署的完整鏈路4.1 數(shù)據(jù)集的選擇與合成策略深度學(xué)習(xí)摳圖面臨的一個(gè)核心問題是真實(shí)標(biāo)注數(shù)據(jù)極其稀缺。因?yàn)橐@得一張圖的精確α圖需要專業(yè)人員在專業(yè)軟件里花大量時(shí)間精修成本極高。所以絕大多數(shù)方法都依賴合成數(shù)據(jù)來(lái)訓(xùn)練。目前常用的合成數(shù)據(jù)集主要有兩個(gè)來(lái)源。一個(gè)是Adobe提供的Composition-1k數(shù)據(jù)集包含1000張合成圖像前景和背景都來(lái)自真實(shí)照片α圖是通過專業(yè)流程生成的。另一個(gè)是Distinctions-646數(shù)據(jù)集規(guī)模稍小但質(zhì)量也很高。但只用這些數(shù)據(jù)集訓(xùn)練出來(lái)的模型在真實(shí)圖像上往往表現(xiàn)不佳因?yàn)楹铣蓴?shù)據(jù)和真實(shí)數(shù)據(jù)之間存在域差異。合成圖像的邊緣通常比較干凈而真實(shí)圖像的邊緣往往有噪聲、壓縮偽影、運(yùn)動(dòng)模糊等問題。我在實(shí)際項(xiàng)目中的做法是以合成數(shù)據(jù)為主進(jìn)行預(yù)訓(xùn)練然后用少量真實(shí)標(biāo)注數(shù)據(jù)做微調(diào)。真實(shí)標(biāo)注數(shù)據(jù)的獲取可以通過幾種方式一是用傳統(tǒng)方法生成粗略α圖然后人工精修二是用多個(gè)模型集成預(yù)測(cè)取一致性高的區(qū)域作為偽標(biāo)簽三是在特定場(chǎng)景下用綠幕拍攝獲取精確α圖。這里有一個(gè)很實(shí)用的技巧在合成數(shù)據(jù)時(shí)不要只做簡(jiǎn)單的前景背景疊加要模擬真實(shí)拍攝中的各種退化因素。比如給前景邊緣加高斯模糊、給整張圖加JPEG壓縮噪聲、模擬不同光照條件下的顏色偏移等。這樣訓(xùn)練出來(lái)的模型魯棒性會(huì)好很多。我試過在合成階段加入這些退化模型在真實(shí)商品圖上的邊緣誤差能降低20%以上。4.2 損失函數(shù)的設(shè)計(jì)與調(diào)參經(jīng)驗(yàn)摳圖任務(wù)的損失函數(shù)設(shè)計(jì)比一般分割任務(wù)要復(fù)雜因?yàn)棣林凳沁B續(xù)的而且不同區(qū)域的誤差重要性不一樣。最基礎(chǔ)的是alpha損失直接計(jì)算預(yù)測(cè)α和真實(shí)α之間的L1或L2距離。但只用這個(gè)損失會(huì)導(dǎo)致邊緣區(qū)域模糊因?yàn)檫吘壪袼卦谡麖垐D中的占比很小對(duì)總損失的貢獻(xiàn)有限。所以通常會(huì)加上合成損失用預(yù)測(cè)的α和真實(shí)的前景背景合成一張圖然后計(jì)算合成圖和原圖之間的差異。這個(gè)損失的好處是它間接約束了α的準(zhǔn)確性因?yàn)槿绻敛粚?duì)合成出來(lái)的圖就會(huì)和原圖對(duì)不上。還有一個(gè)很關(guān)鍵的是拉普拉斯損失它計(jì)算α圖的拉普拉斯金字塔之間的差異能夠更好地約束高頻細(xì)節(jié)。我在實(shí)際訓(xùn)練中發(fā)現(xiàn)拉普拉斯損失的權(quán)重需要仔細(xì)調(diào)權(quán)重太低邊緣不夠銳利權(quán)重太高又容易出現(xiàn)振鈴效應(yīng)。我的經(jīng)驗(yàn)值是讓alpha損失、合成損失和拉普拉斯損失的權(quán)重大致在1:1:0.5左右然后根據(jù)具體數(shù)據(jù)特點(diǎn)微調(diào)。另外梯度損失也很有用它約束預(yù)測(cè)α圖和真實(shí)α圖在邊緣處的梯度一致性。對(duì)于毛發(fā)這類高頻區(qū)域梯度損失能顯著提升細(xì)節(jié)恢復(fù)效果。4.3 訓(xùn)練策略與顯存優(yōu)化摳圖網(wǎng)絡(luò)的訓(xùn)練對(duì)顯存要求比較高因?yàn)檩斎敕直媛释ǔ2荒芴》駝t邊緣細(xì)節(jié)就丟失了。但高分辨率輸入意味著大顯存占用這是一個(gè)很現(xiàn)實(shí)的矛盾。我常用的策略是漸進(jìn)式訓(xùn)練先用低分辨率比如256×256或512×512訓(xùn)練一個(gè)基礎(chǔ)模型然后逐步增加分辨率進(jìn)行微調(diào)。這樣可以在有限顯存下訓(xùn)練出高分辨率模型。具體操作時(shí)可以先在512×512上訓(xùn)練到收斂然后把輸入裁剪成1024×1024繼續(xù)訓(xùn)練最后再用原圖分辨率微調(diào)。每一步的學(xué)習(xí)率都要相應(yīng)降低避免破壞已經(jīng)學(xué)好的特征。另一個(gè)技巧是用梯度累積來(lái)模擬大batch size。如果顯存只夠跑batch size 4但你知道batch size 16效果更好那就可以累積4次梯度再更新一次參數(shù)。這個(gè)操作在PyTorch里很容易實(shí)現(xiàn)只需要在loss.backward()之后不立即optimizer.step()而是等累積夠了再更新。還有一個(gè)容易被忽視的點(diǎn)是數(shù)據(jù)加載的效率。摳圖訓(xùn)練的數(shù)據(jù)增強(qiáng)比較復(fù)雜因?yàn)橐獙?duì)圖像、三分圖、α圖做完全一致的幾何變換。如果數(shù)據(jù)加載成為瓶頸GPU利用率會(huì)很低。我通常會(huì)用多進(jìn)程數(shù)據(jù)加載并且把一些耗時(shí)的增強(qiáng)操作比如隨機(jī)裁剪、縮放放在GPU上做這樣能顯著提升訓(xùn)練速度。4.4 推理優(yōu)化與工程部署模型訓(xùn)練好了怎么部署到實(shí)際業(yè)務(wù)中又是另一回事。摳圖模型的推理速度通常比較慢因?yàn)橐3指叻直媛瘦斎氩拍鼙WC邊緣質(zhì)量。我常用的優(yōu)化手段有幾種。第一是模型量化把FP32模型轉(zhuǎn)成FP16或INT8推理速度能提升1.5到3倍精度損失通常在可接受范圍內(nèi)。第二是TensorRT加速把模型轉(zhuǎn)成TensorRT引擎針對(duì)特定GPU做算子融合和內(nèi)核優(yōu)化速度提升很明顯。第三是輸入分辨率自適應(yīng)對(duì)于邊緣簡(jiǎn)單的圖像用低分辨率推理邊緣復(fù)雜的用高分辨率這樣可以在平均延遲和效果之間取得平衡。還有一個(gè)工程上的細(xì)節(jié)三分圖的生成也可以自動(dòng)化。在實(shí)際業(yè)務(wù)中如果每次都要用戶手動(dòng)畫三分圖體驗(yàn)太差了。我的做法是先用一個(gè)輕量級(jí)的分割模型比如基于MobileNet的DeepLab生成粗略的前景掩碼然后對(duì)掩碼做形態(tài)學(xué)處理生成三分圖再送入摳圖模型。這樣整個(gè)流程可以全自動(dòng)完成雖然三分圖質(zhì)量不如人工精修但對(duì)于大多數(shù)場(chǎng)景已經(jīng)夠用了。5. 常見問題排查與避坑指南5.1 邊緣出現(xiàn)顏色泄漏怎么辦顏色泄漏是摳圖中最常見的問題之一表現(xiàn)為前景邊緣帶上了背景的顏色。比如在綠幕前拍攝的人像頭發(fā)邊緣會(huì)泛綠。這個(gè)問題的根源在于alpha合成公式中的F估計(jì)不準(zhǔn)確。當(dāng)α值在邊緣區(qū)域處于中間值時(shí)如果F被錯(cuò)誤地估計(jì)為背景顏色合成出來(lái)的像素就會(huì)偏向背景色。解決方法有幾個(gè)方向。一是在損失函數(shù)中加強(qiáng)對(duì)F的約束比如加上前景顏色的一致性損失讓網(wǎng)絡(luò)預(yù)測(cè)的F在局部區(qū)域內(nèi)保持平滑。二是在后處理階段做顏色去污對(duì)于已知背景顏色的場(chǎng)景比如綠幕可以估計(jì)每個(gè)像素的綠色分量并減去。三是用更好的三分圖確保邊緣區(qū)域的未知范圍足夠?qū)捵尵W(wǎng)絡(luò)有足夠的空間去估計(jì)正確的F。我在實(shí)際項(xiàng)目中發(fā)現(xiàn)對(duì)于綠幕場(chǎng)景后處理去污的效果最直接、成本最低。具體做法是在HSV空間檢測(cè)綠色色調(diào)的像素然后降低其飽和度同時(shí)保持亮度不變。這個(gè)方法簡(jiǎn)單但很有效能把大部分可見的綠色溢出消除掉。5.2 毛發(fā)區(qū)域糊成一團(tuán)怎么破毛發(fā)是摳圖領(lǐng)域公認(rèn)的難點(diǎn)因?yàn)槊l(fā)區(qū)域的像素混合非常復(fù)雜一根頭發(fā)絲的寬度可能只有一兩個(gè)像素而且毛發(fā)之間的空隙也包含背景信息。傳統(tǒng)方法在毛發(fā)區(qū)域基本無(wú)能為力深度學(xué)習(xí)方法雖然好一些但如果訓(xùn)練數(shù)據(jù)中毛發(fā)樣本不足效果也會(huì)很差。我的經(jīng)驗(yàn)是毛發(fā)摳圖的關(guān)鍵在于訓(xùn)練數(shù)據(jù)。如果目標(biāo)場(chǎng)景是人像毛發(fā)那訓(xùn)練集中必須包含足夠多的高質(zhì)量毛發(fā)標(biāo)注樣本。Composition-1k里有一些毛發(fā)樣本但數(shù)量有限??梢钥紤]用一些專門的人像摳圖數(shù)據(jù)集來(lái)補(bǔ)充或者用數(shù)據(jù)合成的方式生成更多毛發(fā)樣本。另外網(wǎng)絡(luò)結(jié)構(gòu)上要保證高分辨率特征不丟失。編碼器下采樣太深會(huì)導(dǎo)致毛發(fā)細(xì)節(jié)被壓縮掉所以需要用跳躍連接或者空洞卷積來(lái)保持高分辨率特征。我在實(shí)踐中發(fā)現(xiàn)在解碼器的最后幾層加上額外的卷積層來(lái)細(xì)化邊緣對(duì)毛發(fā)效果提升很明顯。還有一個(gè)技巧是用多尺度推理。把同一張圖縮放到不同尺度分別推理然后把結(jié)果融合。大尺度能捕捉整體結(jié)構(gòu)小尺度能保留細(xì)節(jié)融合后效果通常比單尺度好。5.3 透明物體摳圖的特殊處理透明物體玻璃杯、塑料瓶、煙霧等的摳圖比毛發(fā)還要難因?yàn)橥该鲄^(qū)域的像素值同時(shí)受到前景和背景的影響而且透明物體的折射和反射會(huì)讓顏色關(guān)系更加復(fù)雜。對(duì)于這類場(chǎng)景傳統(tǒng)方法和深度學(xué)習(xí)方法都需要特殊處理。傳統(tǒng)方法中有一些專門針對(duì)透明物體的算法比如通過分析背景的扭曲來(lái)估計(jì)透明度。深度學(xué)習(xí)方法則需要大量透明物體的訓(xùn)練數(shù)據(jù)。我在處理透明物體時(shí)的一個(gè)經(jīng)驗(yàn)是不要試圖用同一個(gè)模型解決所有類型的摳圖。透明物體、毛發(fā)、普通物體這三類的圖像特性差異太大用一個(gè)模型硬扛效果往往不好。更好的做法是訓(xùn)練多個(gè)專用模型然后根據(jù)輸入圖像的特性選擇合適的模型或者用一個(gè)分類器來(lái)自動(dòng)路由。5.4 常見問題速查表問題現(xiàn)象可能原因排查方向解決建議邊緣顏色泄漏F估計(jì)不準(zhǔn)檢查三分圖邊緣寬度加寬未知區(qū)域加前景顏色約束毛發(fā)區(qū)域模糊高分辨率特征丟失檢查網(wǎng)絡(luò)下采樣倍數(shù)減少下采樣加邊緣細(xì)化層透明物體效果差訓(xùn)練數(shù)據(jù)不足檢查數(shù)據(jù)集中透明樣本比例補(bǔ)充透明物體數(shù)據(jù)專用模型推理速度慢輸入分辨率過高統(tǒng)計(jì)各階段耗時(shí)量化、TensorRT、自適應(yīng)分辨率三分圖依賴強(qiáng)方法本身限制評(píng)估無(wú)三分圖方案背景圖法、自動(dòng)三分圖生成合成數(shù)據(jù)域差異訓(xùn)練數(shù)據(jù)不真實(shí)對(duì)比合成和真實(shí)數(shù)據(jù)分布加退化增強(qiáng)真實(shí)數(shù)據(jù)微調(diào)6. 傳統(tǒng)方法與深度學(xué)習(xí)方法的選擇邏輯6.1 什么場(chǎng)景下傳統(tǒng)方法依然是最優(yōu)解雖然深度學(xué)習(xí)方法是當(dāng)前的主流但傳統(tǒng)方法在某些場(chǎng)景下依然有不可替代的優(yōu)勢(shì)。第一是極低算力場(chǎng)景。傳統(tǒng)方法中的一些簡(jiǎn)單算法比如基于顏色采樣的Knockout計(jì)算量很小可以在嵌入式設(shè)備或移動(dòng)端實(shí)時(shí)運(yùn)行。而深度學(xué)習(xí)模型即使經(jīng)過量化通常也需要一定的算力支持。第二是數(shù)據(jù)極度稀缺的場(chǎng)景。深度學(xué)習(xí)方法依賴大量訓(xùn)練數(shù)據(jù)如果目標(biāo)場(chǎng)景非常特殊比如某種罕見的工業(yè)零件收集足夠訓(xùn)練數(shù)據(jù)成本太高這時(shí)候用傳統(tǒng)方法加上人工調(diào)參可能更實(shí)際。第三是對(duì)可解釋性要求高的場(chǎng)景。傳統(tǒng)方法的每一步都有明確的數(shù)學(xué)含義出了問題容易排查。深度學(xué)習(xí)模型是黑盒調(diào)試起來(lái)困難得多。第四是作為深度學(xué)習(xí)方法的預(yù)處理或后處理。比如用傳統(tǒng)方法生成粗略三分圖再用深度學(xué)習(xí)模型精修或者用深度學(xué)習(xí)方法得到α圖后用傳統(tǒng)方法做邊緣平滑和去噪。6.2 深度學(xué)習(xí)方法的適用邊界深度學(xué)習(xí)方法也不是萬(wàn)能的它有明確的適用邊界。首先是對(duì)訓(xùn)練數(shù)據(jù)分布的依賴。如果一個(gè)模型只在人像數(shù)據(jù)上訓(xùn)練過你拿它去摳商品圖效果可能還不如傳統(tǒng)方法。因?yàn)榫W(wǎng)絡(luò)學(xué)到的是人像特有的特征換一個(gè)域就失效了。其次是對(duì)計(jì)算資源的要求。高分辨率摳圖模型的推理需要GPU支持如果業(yè)務(wù)場(chǎng)景是純CPU環(huán)境可能需要選擇輕量級(jí)模型或者傳統(tǒng)方法。第三是延遲敏感場(chǎng)景。實(shí)時(shí)視頻摳圖對(duì)延遲要求很高目前大多數(shù)深度學(xué)習(xí)模型還達(dá)不到實(shí)時(shí)高分辨率摳圖的要求需要在分辨率和幀率之間做取舍。我的建議是先明確業(yè)務(wù)場(chǎng)景的核心約束算力、延遲、數(shù)據(jù)、精度要求然后根據(jù)約束來(lái)選擇方法。不要盲目追求最新最復(fù)雜的模型適合的才是最好的。6.3 混合方案取長(zhǎng)補(bǔ)短的工程實(shí)踐在實(shí)際項(xiàng)目中我越來(lái)越多地采用混合方案把傳統(tǒng)方法和深度學(xué)習(xí)方法結(jié)合起來(lái)。一個(gè)典型的混合流程是這樣的先用傳統(tǒng)方法做快速預(yù)處理比如用GrabCut或者簡(jiǎn)單的顏色閾值分割生成初始前景掩碼然后用這個(gè)掩碼生成三分圖膨脹腐蝕得到未知區(qū)域接著用深度學(xué)習(xí)模型做精細(xì)摳圖最后用傳統(tǒng)后處理做邊緣平滑和顏色去污。這個(gè)流程的好處是傳統(tǒng)方法負(fù)責(zé)快速縮小范圍深度學(xué)習(xí)方法負(fù)責(zé)精細(xì)估計(jì)后處理負(fù)責(zé)修復(fù)殘余問題。每一部分都在做自己最擅長(zhǎng)的事。還有一個(gè)混合思路是用傳統(tǒng)方法生成訓(xùn)練數(shù)據(jù)。當(dāng)真實(shí)標(biāo)注數(shù)據(jù)不足時(shí)可以用傳統(tǒng)方法在大量無(wú)標(biāo)注圖像上生成粗略α圖然后人工篩選和精修一部分作為訓(xùn)練數(shù)據(jù)。雖然質(zhì)量不如純?nèi)斯?biāo)注但成本低很多而且能覆蓋更多樣的場(chǎng)景。7. 一些實(shí)操中的個(gè)人體會(huì)摳圖這個(gè)方向理論看起來(lái)很數(shù)學(xué)化但實(shí)際做起來(lái)有很多“只可意會(huì)”的經(jīng)驗(yàn)。我分享幾個(gè)自己踩坑后總結(jié)的點(diǎn)。關(guān)于三分圖的膨脹半徑很多人會(huì)設(shè)一個(gè)固定值比如10像素或20像素。但實(shí)際圖像中邊緣的模糊程度差異很大。我的做法是先估計(jì)圖像的模糊程度可以用拉普拉斯算子的方差來(lái)粗略估計(jì)然后根據(jù)模糊程度動(dòng)態(tài)設(shè)置膨脹半徑。模糊越嚴(yán)重膨脹半徑越大。這個(gè)自適應(yīng)策略比固定值效果好很多。關(guān)于模型集成我試過用多個(gè)不同架構(gòu)的摳圖模型分別推理然后把α圖做加權(quán)平均。權(quán)重可以根據(jù)每個(gè)模型在驗(yàn)證集上的表現(xiàn)來(lái)定也可以用簡(jiǎn)單的平均。集成通常能帶來(lái)1到2個(gè)百分點(diǎn)的精度提升但推理成本也成倍增加。如果業(yè)務(wù)對(duì)精度要求極高且不差算力集成是值得的。關(guān)于數(shù)據(jù)增強(qiáng)摳圖任務(wù)的數(shù)據(jù)增強(qiáng)要特別小心。幾何變換旋轉(zhuǎn)、縮放、裁剪必須同時(shí)作用于圖像、三分圖和α圖這個(gè)前面提過了。但顏色變換亮度、對(duì)比度、色調(diào)只能作用于圖像不能作用于α圖。而且顏色變換會(huì)改變前景和背景的顏色關(guān)系可能讓合成公式不再成立。我的經(jīng)驗(yàn)是顏色變換的幅度要控制得比較小或者只在背景區(qū)域做顏色變換。關(guān)于評(píng)估指標(biāo)常用的有SAD絕對(duì)差之和、MSE均方誤差、Gradient梯度誤差和Connectivity連通性誤差。SAD和MSE反映整體精度Gradient反映邊緣銳利度Connectivity反映結(jié)構(gòu)完整性。在實(shí)際調(diào)模型時(shí)我會(huì)同時(shí)看這四個(gè)指標(biāo)因?yàn)閱为?dú)看某一個(gè)容易被誤導(dǎo)。比如一個(gè)模型SAD很低但Gradient很高說(shuō)明整體α值準(zhǔn)但邊緣模糊這種模型在實(shí)際使用中體驗(yàn)并不好。關(guān)于推理時(shí)的分辨率很多人會(huì)把輸入縮放到固定尺寸比如512×512再推理然后縮放回原尺寸。這樣做的問題是如果原圖分辨率很高縮放會(huì)丟失大量細(xì)節(jié)如果原圖分辨率很低縮放會(huì)引入插值偽影。我的做法是保持原圖分辨率推理如果顯存不夠就用滑動(dòng)窗口分塊推理塊與塊之間留一定的重疊區(qū)域最后做加權(quán)融合。這樣能最大程度保留原始細(xì)節(jié)。關(guān)于模型更新?lián)笀D模型不是訓(xùn)練一次就一勞永逸的。業(yè)務(wù)場(chǎng)景變化、拍攝設(shè)備更新、用戶反饋積累都需要定期用新數(shù)據(jù)微調(diào)模型。我通常每季度會(huì)用新收集的數(shù)據(jù)做一次增量訓(xùn)練學(xué)習(xí)率設(shè)得很低比如初始學(xué)習(xí)率的十分之一只訓(xùn)練最后幾層這樣既能適應(yīng)新數(shù)據(jù)又不會(huì)遺忘舊知識(shí)。這個(gè)方向后續(xù)還可以往幾個(gè)方向擴(kuò)展一是視頻摳圖的時(shí)序一致性單幀摳圖效果再好如果幀與幀之間α圖抖動(dòng)視頻看起來(lái)也會(huì)很不自然二是少樣本甚至零樣本摳圖讓模型能快速適應(yīng)新的物體類型三是和生成式方法結(jié)合用生成模型來(lái)合成更真實(shí)的訓(xùn)練數(shù)據(jù)。這些方向目前都有不少研究在推進(jìn)實(shí)際落地效果也在逐步提升。