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