式學(xué)習(xí):重疊指紋分離的圖像修復(fù)方案)
擴散模型Diffusion Model現(xiàn)在最常出現(xiàn)在文生圖工具里比如 stable diffusion、Midjourney大家習(xí)慣用它生成各種自然圖片。但這類模型的價值不止是畫圖另一個很實際的方向是圖像修復(fù)也就是 Inpainting。這篇要聊的是更垂直的場景把擴散模型用在圖像修復(fù)任務(wù)上分離重疊指紋Overlapped Fingerprints同時配合漸進(jìn)式學(xué)習(xí)Progressive Learning來提升穩(wěn)定性和還原質(zhì)量。指紋識別本身不算新方向但重疊指紋一直是實際痛點。采集指紋時兩枚手指疊在一起或者掃描舊紙質(zhì)檔案時指紋壓印互相交錯都會出現(xiàn)兩套脊線疊加在同一個區(qū)域內(nèi)的情況。傳統(tǒng)算法要同時完成分割、修復(fù)和識別很容易被另一枚指紋的紋理干擾。擴散模型的強項恰好在這里它擅長根據(jù)已知區(qū)域推算出合理的缺失紋理而不是簡單做濾鏡或去噪。加入漸進(jìn)式學(xué)習(xí)之后任務(wù)可以拆成由粗到細(xì)的多個階段比一步到位的生成方式更可控。這篇文章適合圖像生成方向的研究者、生物特征識別從業(yè)者以及剛接觸擴散模型、想找落地場景的人。最值得關(guān)注的點不是用了哪個現(xiàn)成模型而是“漸進(jìn)式學(xué)習(xí)”這個思路怎么讓模型在重疊指紋分離這種復(fù)雜任務(wù)里逐步逼近穩(wěn)定結(jié)果。下面按理解順序拆開講。1. 先說清楚“重疊指紋分離”到底難在哪1.1 重疊指紋不是簡單的圖像疊加很多人第一反應(yīng)是兩張指紋疊在一起把重疊區(qū)域去掉或者做一次去噪不就行了實際遠(yuǎn)沒有這么簡單。指紋圖像的核心信息是脊線走向、斷點位置和細(xì)節(jié)點分布。當(dāng)兩枚指紋重疊時兩個脊線系統(tǒng)在同一個像素區(qū)域交錯方向場互相干擾。有些地方的紋理看起來像某枚指紋的延續(xù)實際上可能是另一枚指紋的脊線。模型要做的不是把圖像“擦干凈”而是同時還原兩套完整的指紋結(jié)構(gòu)。真實場景里還要考慮更多因素按壓力度不同導(dǎo)致對比度不一樣指紋邊緣可能有模糊紙張上的背景紋理會帶來額外噪聲。再加上兩枚指紋之間沒有明確的先后關(guān)系模型不能天然知道“先分離哪一枚”。這些因素疊加起來讓重疊指紋分離比普通圖像分割難得多。1.2 為什么傳統(tǒng)方法和普通深度學(xué)習(xí)方法容易吃力傳統(tǒng)方法通常會先做方向場估計再根據(jù)方向場分割區(qū)域最后對每個區(qū)域做紋理修復(fù)。這個思路聽起來合理但如果重疊面積大、兩枚指紋的脊線走向接近方向場估計就會失效。兩套脊線被合并成一組平均方向后續(xù)的分割和修復(fù)都會跟著出錯。普通深度學(xué)習(xí)方法可以把這個任務(wù)建模成“圖像到圖像”的生成問題輸入重疊指紋輸出分離后的兩枚指紋。但一步到位生成需要模型同時學(xué)會多件事區(qū)分兩套紋理、補全被遮擋的脊線、保持邊界連續(xù)、輸出兩個清晰結(jié)果。單階段訓(xùn)練很容易生成出混合紋理看起來有點指紋影子但既不像第一枚也不像第二枚。擴散模型之所以適合這個任務(wù)是因為它本身就是一個強大的生成模型。它學(xué)習(xí)的是指紋圖像的紋理分布在修復(fù)時可以根據(jù)周圍脊線走勢推斷出被遮擋部分的合理結(jié)構(gòu)。關(guān)鍵是要把這種生成能力引導(dǎo)到“指紋分離”這個具體問題上。1.3 為什么用 Inpainting而不是只用分割分割可以告訴模型哪些像素屬于哪枚指紋但它沒有能力生成被遮擋的脊線。重疊指紋分離的難點就在“被遮擋部分怎么補全”上。如果只看重疊區(qū)域其中一枚指紋的脊線會被另一枚指紋的紋理蓋住。要得到一枚干凈的指紋不能只是把另一枚指紋的紋理刪掉還要把下面被遮住的脊線重新畫出來。這就是標(biāo)準(zhǔn)的圖像修復(fù)問題圖像里有一部分區(qū)域需要重建重建結(jié)果必須和周圍紋理無縫銜接。擴散模型做 Inpainting 的常用思路是在去噪過程中把已知區(qū)域保持原樣只對缺失區(qū)域做生成同時用已知區(qū)域的信息引導(dǎo)生成結(jié)果。對重疊指紋來說就是先把某個指紋當(dāng)作目標(biāo)另一枚指紋的紋理當(dāng)作“遮擋”然后修復(fù)目標(biāo)指紋被遮擋的區(qū)域再反過來做一次得到另一枚指紋。2. 擴散模型與圖像修復(fù)結(jié)合的底層邏輯2.1 擴散模型的基本過程前向加噪和反向去噪擴散模型的訓(xùn)練思路可以簡化成兩段。前向過程是往圖像里不斷加入高斯噪聲直到圖像變成接近純噪聲的分布。這個過程的目的是讓模型學(xué)會“圖像被破壞到什么程度”。反向過程則反過來讓模型學(xué)習(xí)從噪聲逐步還原出圖像。生成圖片的時候模型從純噪聲出發(fā)經(jīng)過很多步去噪每一步都比上一步更接近真實圖像。和 GAN 直接生成一張圖不同擴散模型的生成是多步迭代的。每一步都在修正前面的結(jié)果所以局部細(xì)節(jié)不容易出現(xiàn)明顯崩壞。對指紋這類需要細(xì)膩紋理的圖像來說這種多步修正是很有價值的。對應(yīng)到重疊指紋分離生成過程中每一步都可以結(jié)合已經(jīng)觀測到的重疊指紋區(qū)域做約束讓輸出結(jié)果既符合真實指紋的紋理分布又和已知區(qū)域保持一致。這樣模型在生成被遮擋的脊線時不是憑空編造而是反復(fù)參考周圍的紋理信息。2.2 Inpainting 怎么和擴散模型結(jié)合把擴散模型用在圖像修復(fù)上核心思路是引入 mask 控制。先準(zhǔn)備一張待修復(fù)圖像標(biāo)記出哪些區(qū)域是已知的、哪些區(qū)域需要生成。每一步去噪時把已知區(qū)域用真實像素覆蓋回去只對未知區(qū)域繼續(xù)執(zhí)行去噪。這樣模型始終能看見已知區(qū)域的真實信息生成出來的內(nèi)容會盡量和周圍環(huán)境保持一致。對重疊指紋任務(wù)可以這樣設(shè)計如果想把第一枚指紋分離出來就把第二枚指紋所在的紋理區(qū)域當(dāng)作“需要修復(fù)或者重新生成”的區(qū)域把第一枚指紋相對清晰的區(qū)域當(dāng)作已知區(qū)域。模型在去噪過程中不斷參考第一枚指紋的脊線走勢把被第二枚指紋干擾的部分重新生成成第一枚指紋的風(fēng)格。反過來再做一次就能得到第二枚指紋。如果模型設(shè)計成一次輸出兩枚指紋也可以讓網(wǎng)絡(luò)輸出兩個通道但這時要額外處理兩枚指紋之間的耦合關(guān)系模型容易在某個通道里把另一個通道的信息也混進(jìn)來。2.3 為什么不能直接把 stable diffusion 搬過來這兩年 stable diffusion 和 Midjourney 讓擴散模型變得非常普及很多人會想能不能直接拿 stable diffusion 做指紋分離從實際效果看直接搬現(xiàn)成模型大概率不穩(wěn)定。stable diffusion 是在大規(guī)模自然圖像上訓(xùn)練的它擅長生成照片、插畫、復(fù)雜場景但指紋圖像是單一紋理、結(jié)構(gòu)高度規(guī)則、灰度變化較慢的醫(yī)學(xué)或生物特征圖像。兩者的數(shù)據(jù)分布差異很大。直接用 stable diffusion 修復(fù)指紋可能在視覺上會生成“看起來像紋理”的結(jié)果但脊線細(xì)節(jié)可能不對細(xì)節(jié)點位置可能錯亂。更合理的做法是專門在指紋數(shù)據(jù)上訓(xùn)練或者做微調(diào)的擴散模型讓模型去學(xué)習(xí)指紋脊線本身的分布規(guī)律。標(biāo)題里強調(diào)“diffusion-based Inpainting Model”也說明重點在于領(lǐng)域?qū)S玫哪P投皇峭ㄓ梦纳鷪D模型。3. 漸進(jìn)式學(xué)習(xí)Progressive Learning的核心思路3.1 一步到位生成的問題在哪里如果直接訓(xùn)練一個模型輸入重疊指紋輸出兩枚分離后的指紋模型要同時學(xué)習(xí)的內(nèi)容就太多了。首先它要從混合紋理中把兩套方向場區(qū)分開。其次它要判斷每個像素更接近哪枚指紋。最后還要為被遮擋的區(qū)域生成合理的脊線。這些任務(wù)疊加在一起單階段訓(xùn)練的收斂壓力很大最終結(jié)果容易出現(xiàn)幾種常見問題生成結(jié)果模糊脊線走勢看起來差不多但細(xì)節(jié)經(jīng)不起檢查。兩枚指紋之間互相“串味”結(jié)果里出現(xiàn)混合紋理。邊界處理不好修復(fù)區(qū)域和已知區(qū)域之間有明顯斷層。擴散模型本身對訓(xùn)練穩(wěn)定性和采樣步數(shù)比較敏感如果任務(wù)太復(fù)雜訓(xùn)練過程中更容易出現(xiàn)不收斂。漸進(jìn)式學(xué)習(xí)的價值就是把這些復(fù)雜任務(wù)拆成由粗到細(xì)的多個階段讓模型在每一階段只專注一部分能力。3.2 漸進(jìn)式學(xué)習(xí)一般怎么設(shè)計階段漸進(jìn)式學(xué)習(xí)的本質(zhì)是“先易后難”這個概念和課程學(xué)習(xí)Curriculum Learning很接近。針對重疊指紋分離常見的拆分方式有三種。第一種方式是先訓(xùn)練單枚指紋的生成能力。讓模型先學(xué)清楚“一枚干凈指紋長什么樣”包括脊線間距、方向場、斷點結(jié)構(gòu)。這一步把問題簡化成純生成任務(wù)模型不需要考慮重疊干擾。訓(xùn)練穩(wěn)定后再切換到重疊指紋樣本。第二種方式是按照主指紋和次指紋拆分。先讓模型學(xué)會從重疊區(qū)域中分離出面積更大、對比度更高、紋理更清晰的那枚指紋等這個任務(wù)穩(wěn)定之后再學(xué)習(xí)分離被遮擋更嚴(yán)重的次指紋。這樣可以讓模型先建立一個穩(wěn)定的“主體拆分”能力再處理更難的情況。第三種方式是多階段由粗到細(xì)先做粗粒度分離比如區(qū)域劃分和方向場估計再在這個基礎(chǔ)上做細(xì)粒度修復(fù)比如逐段修復(fù)脊線、細(xì)節(jié)點增強。這種設(shè)計更貼近指紋識別里常用的處理流程也可以把中間結(jié)果可視化出來方便排查問題在哪一步失效。具體實現(xiàn)時不一定要嚴(yán)格套用單一方式可以根據(jù)數(shù)據(jù)情況組合使用。關(guān)鍵原則是階段之間的數(shù)據(jù)難度要平滑過渡不能直接從低難度跳到高難度否則模型還是容易崩。3.3 推理階段怎么保證兩枚指紋都能輸出訓(xùn)練時處理好了漸進(jìn)式學(xué)習(xí)推理階段還需要考慮輸出方式。如果模型設(shè)計成一次輸入、輸出兩枚指紋可以在網(wǎng)絡(luò)輸出層設(shè)計兩個分支也可以輸出一個雙通道特征圖。但這會讓損失函數(shù)和訓(xùn)練復(fù)雜度明顯上升需要對兩個輸出分別做監(jiān)督。另一種更穩(wěn)妥的做法是分開推理。先讓模型分離主要指紋再把剩余區(qū)域當(dāng)作下一枚指紋的輸入繼續(xù)做一次分離。這種方式的好處是每一輪生成條件更清晰模型只需要專注于一個目標(biāo)壞處是推理時間會翻倍而且第二枚指紋的效果受第一輪結(jié)果影響。如果兩枚指紋重疊度很高順序的影響會很明顯。我一般會建議先做一遍方向場估計判斷哪枚指紋在重疊區(qū)域里占據(jù)更多主導(dǎo)再把主導(dǎo)指紋放在第一輪處理。這樣至少能保證清晰度較高的一枚指紋先被穩(wěn)定分離出來。此外推理之后還要加后處理驗證??梢杂梅较驁鲆恢滦詸z查生成結(jié)果如果某個區(qū)域的脊線方向突然發(fā)生異常變化大概率是生成質(zhì)量有問題。也可以提取細(xì)節(jié)點和原始重疊指紋里的可見細(xì)節(jié)點做匹配判斷哪些部分是可信的。4. 復(fù)現(xiàn)和驗證這類方案時建議按什么流程走4.1 數(shù)據(jù)集怎么準(zhǔn)備擴散模型是數(shù)據(jù)驅(qū)動的方法數(shù)據(jù)質(zhì)量直接影響效果。做重疊指紋分離至少需要兩類樣本單枚指紋圖像和重疊指紋圖像。單枚指紋圖像比較容易獲取很多公開指紋數(shù)據(jù)集都可以使用。重疊指紋樣本相對難拿一個常見做法是合成數(shù)據(jù)把兩枚單枚指紋做隨機旋轉(zhuǎn)、縮放、平移再按不同透明度疊加在一起。這樣能得到大量訓(xùn)練樣本同時也能準(zhǔn)確記錄每個像素來自哪枚指紋方便構(gòu)造監(jiān)督標(biāo)簽。合成數(shù)據(jù)要注意兩點。第一不要只用簡單的固定透明度疊加真實場景里兩枚指紋的對比度、模糊程度、壓力分布都不一樣要加入隨機噪聲和模糊。第二驗證階段需要盡量加入真實重疊指紋樣本否則模型可能只在合成數(shù)據(jù)上效果好一到真實圖像就退化。如果一開始沒有足夠真實數(shù)據(jù)可以先靠合成數(shù)據(jù)把訓(xùn)練流程跑通再逐步加入少量真實樣本做微調(diào)。這樣比一上來就要幾萬張真實重疊指紋更現(xiàn)實。4.2 訓(xùn)練環(huán)境和參數(shù)建議擴散模型訓(xùn)練通常需要 GPU。如果沒有很好的硬件建議先從低分辨率開始比如 128×128 或 256×256先把網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練流程跑通再根據(jù)效果逐步提高分辨率。幾個關(guān)鍵參數(shù)需要重點關(guān)注圖像分辨率決定顯存占用和生成細(xì)節(jié)。batch size太大會爆顯存太小則訓(xùn)練不穩(wěn)定可以使用梯度累積折中。加噪步數(shù)論文里常見的設(shè)置可能從幾百步到上千步不等實際要按效果和訓(xùn)練成本權(quán)衡。采樣步數(shù)推理時可以比訓(xùn)練少但要觀察質(zhì)量下降程度。學(xué)習(xí)率擴散模型對學(xué)習(xí)率比較敏感建議先用較小的值觀察 loss 曲線再調(diào)整。訓(xùn)練流程的示意可以簡化為# 示意流程不代表具體框架 for step in range(total_steps): fp1, fp2 load_clean_fingerprints() overlap, mask synthesize_overlap(fp1, fp2) # 前向把重疊指紋作為待修復(fù)輸入mask 標(biāo)記目標(biāo)指紋區(qū)域 noise add_noise_to_target_region(overlap, mask, t) # 反向預(yù)測噪聲 predicted_noise diffusion_model(noisy_image, mask, condition, t) # 損失約束保證生成區(qū)域和真實指紋一致 loss noise_loss(predicted_noise, noise, mask) loss.backward() optimizer.step()注意這個代碼只是為了說明訓(xùn)練循環(huán)里要處理哪些信息。真正落地時還要考慮 dataset 加載、mask 格式、采樣策略、日志保存等細(xì)節(jié)。4.3 評估時看哪些指標(biāo)評估重疊指紋分離效果不能只看生成圖像“是否好看”。指紋圖像好不好看和能不能用于識別是兩回事。推薦從幾個維度評估圖像質(zhì)量指標(biāo)PSNR、SSIM 可以衡量分離結(jié)果和真實單枚指紋的接近程度。方向場誤差計算生成指紋的方向場和真實指紋的方向場做對比。方向場差異大說明脊線走勢沒還原正確。細(xì)節(jié)點一致性用細(xì)節(jié)點提取算法分別處理生成結(jié)果和真實指紋看細(xì)節(jié)點位置和類型能否對應(yīng)上。識別率更實際的驗證方法是把分離后的指紋交給指紋比對算法或識別系統(tǒng)看能否匹配到原始單枚指紋。這個指標(biāo)最能說明工程價值。評估時建議同時記錄單次推理耗時、顯存占用和失敗率。如果分離效果還行但速度太慢、顯存占用太高落地時就會遇到工程瓶頸。4.4 常見問題和排查順序遇到效果不好時不要急著改模型結(jié)構(gòu)。先按下面的順序排查先看輸入輸出輸入圖片是否清晰mask 是否和目標(biāo)區(qū)域?qū)R輸出是不是出現(xiàn)黑邊或空白區(qū)域。再看數(shù)據(jù)合成樣本是否太簡單真實性夠不夠標(biāo)簽有沒有錯誤。再看訓(xùn)練配置學(xué)習(xí)率、batch size、加噪步數(shù)是否合理loss 有沒有下降。最后才考慮模型設(shè)計是否需要加入方向場約束、細(xì)節(jié)點損失或者調(diào)整漸進(jìn)式學(xué)習(xí)的階段劃分。很多報錯表面上是模型問題實際是路徑、權(quán)限、依賴版本或輸入格式問題。訓(xùn)練腳本運行前先確認(rèn)數(shù)據(jù)集路徑、輸出目錄、mask 通道和圖像尺寸都匹配可以減少大量無效調(diào)試。如果顯存不足優(yōu)先降低分辨率和 batch size不要立刻換更復(fù)雜的網(wǎng)絡(luò)。如果生成結(jié)果模糊可以先增加訓(xùn)練步數(shù)或者采樣步數(shù)再考慮數(shù)據(jù)質(zhì)量問題。5. 這類方法在真實業(yè)務(wù)中的邊界5.1 哪些場景適合哪些場景不適合擴散模型做重疊指紋分離有它比較適合的場景也有明顯不適用的場景。適合的場景包括法醫(yī)檢驗輔助、離線指紋檔案整理、學(xué)術(shù)研究和指紋庫清理。這些任務(wù)的特點是單張圖片處理時間可以接受不需要在毫秒級完成且對精度有較高要求。不太適合的場景是實時采集和即時比對。擴散模型的多步采樣推理成本比較高如果系統(tǒng)要求用戶在幾秒內(nèi)看到結(jié)果壓力會很大。可以想辦法壓縮采樣步數(shù)或者先檢測出圖片是否存在重疊再決定是否調(diào)用完整修復(fù)模型。如果圖片里根本沒有重疊指紋強行跑一次擴散模型就是在浪費算力。重疊度過高的樣本也是一個邊界。如果兩枚指紋幾乎完全重合可用的信息太少任何生成模型都很難還原到可以識別的程度。此時應(yīng)該拒絕做自動分離輸出“樣本質(zhì)量不夠”的判斷而不是硬生成一個看起來合理的假結(jié)果。5.2 訓(xùn)練數(shù)據(jù)不足時怎么辦單獨一枚指紋的數(shù)據(jù)相對容易獲取重疊指紋數(shù)據(jù)是稀缺資源。當(dāng)真實數(shù)據(jù)不足時合成數(shù)據(jù)是主要出路。合成樣本不能太簡單。建議在疊加之外加入隨機旋轉(zhuǎn)、縮放、對比度變化、高斯模糊、局部失真和背景紋理。這樣模型在訓(xùn)練時見過更多變化對真實場景的適應(yīng)力會更強。還有一個小技巧先用單枚指紋數(shù)據(jù)訓(xùn)練擴散模型的生成能力讓模型充分理解指紋紋理分布。之后再切到重疊指紋分離任務(wù)訓(xùn)練時間可以縮短穩(wěn)定性也會更好。這個思路和漸進(jìn)式學(xué)習(xí)本身是一致的先解決容易問題再進(jìn)入困難問題。5.3 落地工程化要注意什么把方法從研究論文變成可用的服務(wù)還要做不少工程化工作。首先是輸入輸出規(guī)范。接口應(yīng)該明確約定輸入一張重疊指紋圖像輸出兩張分離后的單枚指紋圖像同時附帶置信度或質(zhì)量分?jǐn)?shù)。如果模型發(fā)現(xiàn)輸入圖片質(zhì)量太差可以直接返回失敗而不是輸出一個不可用的結(jié)果。其次是批量任務(wù)機制。如果要處理大量檔案圖片需要設(shè)計任務(wù)隊列、輸出命名規(guī)則、失敗重試機制。不能只跑一條樣例成功就認(rèn)為上線完成連續(xù)跑 100 張圖片時的穩(wěn)定性更重要。然后是日志和監(jiān)控。每張圖片要記錄輸入路徑、輸出路徑、耗時、是否成功、質(zhì)量分。圖像生成類任務(wù)經(jīng)常出現(xiàn)“偶爾一張效果很差”的情況沒有日志就很難復(fù)現(xiàn)和定位問題。最后是隱私和合規(guī)。指紋屬于敏感生物特征數(shù)據(jù)存儲和傳輸都要加密不能隨意放到公共云服務(wù)上。本地部署時也要做好訪問控制和操作審計。踩過幾次之后我發(fā)現(xiàn)很多問題不是工具能力不夠而是前置數(shù)據(jù)和輸入材料沒有處理干凈。擴散模型和漸進(jìn)式學(xué)習(xí)提供了很好的解決思路但真正落地時最該盯住的不是功能列表而是輸入格式、資源占用和失敗重試這三件事。把單任務(wù)跑穩(wěn)再考慮批量和接口化是一個更穩(wěn)妥的推進(jìn)方式。