)
紅外圖像有個很有意思的矛盾它采集的是“看不見的光”卻總被我們用“看得見的灰度圖”來展示。結(jié)果就是即便你拿著全場最貴的紅外相機輸出的畫面在沒有訓(xùn)練過的人眼里還是和黑白監(jiān)控沒什么區(qū)別——屋頂是黑的、人是灰的、車輛和路面糊成一團。做安防、工業(yè)檢測、夜間巡檢的朋友應(yīng)該都有同感我們真正想看的不是“那里熱不熱”而是“那個東西到底是什么顏色、什么材質(zhì)”。而“基于擴散模型的紅外圖像彩色化”恰好解決的就是這個核心痛點——把單通道紅外強度圖轉(zhuǎn)換成符合自然色彩認知的彩色圖像讓機器視覺和人眼認知真正對齊。這篇文章我把整條路線從頭到尾梳理了一遍。從紅外圖像為什么難上色到擴散模型的核心原理拆解再到一份可以照著跑的實現(xiàn)流程最后整理了主流方法的前沿對比。適合正在做圖像生成的開發(fā)者、做紅外相關(guān)產(chǎn)品的算法工程師也適合打算用擴散模型做跨模態(tài)任務(wù)素描上色、深度圖轉(zhuǎn)彩色圖、夜視增強的研究者。我會盡量把每一步的“為什么”講透而不是只給一段代碼讓你復(fù)制。1. 為什么紅外圖像的“上色”比想象中難1.1 紅外圖像不是“黑白照片”而是熱量分布圖我第一次接觸紅外彩色化任務(wù)時第一反應(yīng)是這不就是灰度圖上色嗎后來才發(fā)現(xiàn)這個認知偏差害我不淺。紅外相機的輸出本質(zhì)上是場景熱輻射強度的分布像素明暗代表溫度高低而不是可見光的反射亮度。普通的灰度圖是可見光反射強度的單通道投影雖然也是“單通道”物理含義和紅外完全不同。這就帶來幾個非常麻煩的特性溫度相近但顏色完全不同的物體在紅外圖里幾乎看不出差別同一物體在不同熱狀態(tài)下紅外表現(xiàn)差異極大——剛熄火的汽車和行駛中的汽車紅外圖像是兩個樣子玻璃、水面、金屬表面對紅外線的反射和吸收規(guī)律與可見光完全不同紋理特征對不上。這些特性讓紅外彩色化成了一個典型的“病態(tài)問題”一個紅外輸入可能對應(yīng)多個合理顏色輸出。一輛紅色的汽車停在路邊熄火半小時后它在紅外圖里可能和旁邊藍色的車幾乎一模一樣。算法必須從周圍場景、車輛輪廓、路面位置等上下文信息推斷出“這應(yīng)該是一輛紅色的車”這已經(jīng)超過了一般像素級映射的范疇需要一定的語義理解能力。1.2 偽彩色可視化與真實彩色化的界限現(xiàn)在絕大多數(shù)紅外設(shè)備默認顯示的“彩色”都是偽彩色映射把單通道數(shù)值映射到Jet藍到紅漸變、Iron鐵紅、Rainbow等顏色查找表。偽彩色確實解決了人眼分辨層次少的問題——溫度從低到高對應(yīng)從藍到紅的漸變對比度大幅提升熱斑一眼就能看出來。但偽彩色不是彩色化。它沒有生成物體的固有色車依然是漸變色塊而不是“一輛紅色汽車”。真實彩色化的目標完全不同給定紅外輸入推斷場景在自然光下應(yīng)該呈現(xiàn)的顏色。這要求模型知道哪塊是天空、哪塊是草地、哪輛車是紅色。這也是為什么早期用簡單回歸模型做這個任務(wù)效果總是一片灰蒙蒙的。因為純像素級映射缺少對場景內(nèi)容的抽象能力網(wǎng)絡(luò)找不到顏色和紅外強度之間的穩(wěn)定規(guī)律——事實上它們之間確實沒有一個簡單穩(wěn)定的映射關(guān)系。而生成模型的價值就在于它可以在訓(xùn)練數(shù)據(jù)里學(xué)到“這種輪廓通常對應(yīng)什么顏色”的統(tǒng)計規(guī)律并以視覺合理的方式生成出來。2. 擴散模型憑什么能做好彩色化原理與選型拆解2.1 擴散模型的生成邏輯擴散模型的核心思想其實不復(fù)雜把一張圖片一點一點加噪聲加到最后變成純噪聲然后訓(xùn)練一個網(wǎng)絡(luò)學(xué)會逆向把這團噪聲一步步還原成圖片。前向加噪過程可以寫成x_t √(α_t) x_0 √(1-α_t) ε其中 x_0 是原始彩色圖α_t 是隨時間步 t 遞減的系數(shù)ε 是高斯噪聲。整個過程可以理解為“逐漸破壞”圖片t 越小x_t 越接近原圖t 越大x_t 越接近純噪聲。訓(xùn)練目標是讓網(wǎng)絡(luò)預(yù)測出加入的噪聲 ε損失函數(shù)是L E[||ε - ε_θ(x_t, t, c)||2]注意這里有一個額外的輸入 c也就是條件信息。在紅外彩色化任務(wù)中c 就是紅外圖像。網(wǎng)絡(luò)不僅看到帶噪聲的彩色圖 x_t 和時間步 t還看到對應(yīng)的紅外圖需要在這個條件的引導(dǎo)下完成去噪。推理時從一個隨機噪聲開始每步讓網(wǎng)絡(luò)預(yù)測并去除一部分噪聲迭代若干步后得到完整彩色圖。這就是“反向去噪”過程。用生活化的類比GAN 像一個一錘子買賣的畫家直接畫一張完整圖畫不好就靠判別器挑刺并反饋擴散模型像一個反復(fù)修改的雕塑師從一整塊噪聲材料開始每一步只去掉一點雜質(zhì)逐步成形。這個“逐步細化”的過程決定了擴散模型能保留更多紋理細節(jié)且輸出的變化空間更大。2.2 為什么不用 GAN 或 CNN 回歸不少做圖像翻譯的同學(xué)會問pix2pix 不是已經(jīng)能實現(xiàn)紅外到彩色的轉(zhuǎn)換嗎為什么還要用擴散模型確實能做但效果差異很大。傳統(tǒng) CNN 回歸用 L1/L2 損失直接訓(xùn)練一個映射網(wǎng)絡(luò)結(jié)果穩(wěn)定、速度快但輸出幾乎總是模糊的。因為 L2 損失天然傾向取平均值多模態(tài)問題一個輸入對應(yīng)多個顏色答案取平均之后只剩灰蒙蒙一片沒有高頻紋理。GAN 類方法如 pix2pix生成的圖像色彩鮮艷、細節(jié)豐富但訓(xùn)練不穩(wěn)定容易出現(xiàn)模式坍縮即生成器只學(xué)會幾種有限的風(fēng)格。此外GAN 的判別器容易“投機取巧”靠一些紅外圖里不存在的紋理偽影騙過判別器讓輸出看起來花哨但不真實。擴散模型訓(xùn)練穩(wěn)定沒有對抗平衡問題輸出多樣性高天然匹配彩色化這一多模態(tài)任務(wù)缺點也比較明顯——顯存占用大、推理速度慢。但質(zhì)量上限和可控性是最高的。簡單做了一張對比方法是否需配對數(shù)據(jù)訓(xùn)練穩(wěn)定性輸出多樣性主要問題CNN 回歸需要穩(wěn)定低結(jié)果模糊缺少紋理GANpix2pix 系列需要一般依賴調(diào)參中模式坍縮、易出偽影擴散模型條件擴散需要穩(wěn)定高顯存占用大推理慢我當(dāng)時選擇擴散模型還有一個重要考量這個任務(wù)的評價標準是“視覺合理”而不是“像素精確”。偽彩色已經(jīng)能準確表達溫度了如果彩色化結(jié)果在像素級上略有偏差但整體觀感自然、語義正確那它就是成功的。擴散模型恰恰在“讓人看起來合理”這件事上做得最好。3. 完整實現(xiàn)數(shù)據(jù)準備、模型構(gòu)建與訓(xùn)練細節(jié)3.1 數(shù)據(jù)集的構(gòu)建與預(yù)處理做任何條件生成任務(wù)數(shù)據(jù)都是命根子。紅外彩色化需要紅外-可見光圖像對。公開可選的數(shù)據(jù)集有 KAIST 多光譜數(shù)據(jù)集、FLIR 數(shù)據(jù)集等但如果你針對的是特定場景比如工業(yè)管道巡檢或特定型號的紅外相機最好自采數(shù)據(jù)做微調(diào)。數(shù)據(jù)準備有四個關(guān)鍵步驟配準。紅外相機與可見光相機通常視場角不同、安裝位置不同獲得的圖像在空間上不完全對齊。簡單的做法是先用棋盤格標定獲得剛性變換矩陣然后做透視變換把可見光圖映射到紅外圖的坐標系。裁剪。配準后圖像邊緣往往有無效區(qū)域統(tǒng)一裁剪掉。歸一化。紅外圖是單通道建議先做分位數(shù)歸一化比如把 2% 到 98% 分位的強度映射到 [-1, 1]可以抵抗個別高溫目標的極端值影響。數(shù)據(jù)增強。隨機水平翻轉(zhuǎn)、隨機裁剪、輕微的亮度和對比度抖動。注意不要做高級的顏色增強——彩色圖是監(jiān)督信號顏色信息不能隨意破壞。一個容易忽略的點紅外圖的熱分布受環(huán)境影響很大同一個場景白天和晚上拍出來的紅外圖差異明顯。如果訓(xùn)練集只有白天數(shù)據(jù)晚上推理效果會很差。有條件的話同一場景盡量覆蓋不同時段、不同季節(jié)。3.2 模型結(jié)構(gòu)設(shè)計要點模型主干用條件 UNet這是擴散模型的標準架構(gòu)。幾個關(guān)鍵設(shè)計點條件注入方式。最簡單的是通道拼接把紅外圖直接和帶噪彩色圖在通道維度拼接。這種方式實現(xiàn)簡單但也會讓網(wǎng)絡(luò)把紅外特征和彩色特征耦合得很緊稍有不對齊生成結(jié)果就容易出現(xiàn)色塊漂移。更推薦的做法是類似 ControlNet 的思路把紅外圖通過一個小型特征提取網(wǎng)絡(luò)以零卷積的方式注入到 UNet 的各個尺度層。這樣原始生成能力被保留條件信息作為“引導(dǎo)”加入訓(xùn)練更穩(wěn)定結(jié)果也更可控。增加交叉注意力層。在 UNet 的中間層加入交叉注意力讓彩色化過程能“關(guān)注”紅外圖上對應(yīng)的關(guān)鍵區(qū)域。這對于大范圍語義信息的傳遞比如判斷整體場景是室內(nèi)還是室外很有幫助。輸入輸出通道。紅外圖單通道彩色圖三通道。如果使用預(yù)訓(xùn)練的擴散模型權(quán)重注意輸入通道數(shù)變化后第一層卷積權(quán)重需要重新初始化。一個變通做法是把紅外圖復(fù)制成三通道再輸入保住預(yù)訓(xùn)練權(quán)重但會損失一些信息精確度。具體選哪種要看你的數(shù)據(jù)量數(shù)據(jù)多放開通道重新訓(xùn)練效果好數(shù)據(jù)少復(fù)制三通道更穩(wěn)妥。3.3 損失函數(shù)與訓(xùn)練超參數(shù)擴散模型的核心損失就是噪聲預(yù)測損失。但只靠這個損失生成結(jié)果可能在顏色上“跑偏”——比如天空變成綠色。我實際訓(xùn)練時加了兩個輔助損失感知損失LPIPS約束生成結(jié)果和真實彩色圖在特征空間上接近能顯著減少模糊感和結(jié)構(gòu)錯位。色彩直方圖損失計算生成圖與真實圖的 RGB 直方圖差異能有效抑制整體色偏。這個損失不用太強權(quán)重在 0.05 左右的量級就夠。參考的超參數(shù)配置圖像尺寸256×256兼顧顯存和細節(jié)批量大小8 到 16根據(jù)顯存調(diào)整優(yōu)化器AdamW學(xué)習(xí)率 1e-4帶 5000 步 warmup時間步1000采樣步數(shù)DDIM 50 步訓(xùn)練輪數(shù)大約 50 到 80 輪觀察驗證集 FID 收斂后提前停止訓(xùn)練擴散模型最忌諱上來就用大 batch 和超大學(xué)習(xí)率我在一開始就是這么做的結(jié)果 loss 直接發(fā)散。后來改成小 batch 低學(xué)習(xí)率 warmup訓(xùn)練才真正跑起來。另外混合精度訓(xùn)練AMP幾乎是必須的顯存占用能降一半訓(xùn)練速度提升不少。4. 實操過程從零跑通一個紅外彩色化 Demo4.1 環(huán)境搭建基礎(chǔ)環(huán)境是 Python 3.10、PyTorch 2.x、CUDA 11.8 及以上。需要的主要依賴有 torch、torchvision、diffusers或自寫的擴散采樣邏輯、lpips 等。如果你不想從零手寫擴散模型可以直接基于 diffusers 庫改造。但提醒一句diffusers 的抽象層次較高自定義條件注入時反而費勁。想深入理解原理、方便改結(jié)構(gòu)的話推薦手寫一個簡化版的 DDPM 訓(xùn)練循環(huán)。代碼量不多而且后期調(diào)試空間大。4.2 訓(xùn)練與推理流程核心訓(xùn)練循環(huán)偽代碼如下for epoch in range(epochs): for ir_img, rgb_img in dataloader: # ir_img: (B, 1, H, W), rgb_img: (B, 3, H, W) t torch.randint(0, timesteps, (B,)) # 隨機采樣時間步 noise torch.randn_like(rgb_img) x_t sqrt_alpha_bar[t] * rgb_img sqrt(1 - alpha_bar[t]) * noise pred_noise model(x_t, t, ir_img) # 條件輸入 loss mse(pred_noise, noise) # 可選加上 lpips 損失、直方圖損失 loss.backward() optimizer.step()這里每輪迭代隨機取一個時間步 t模型要在任意噪聲程度下都能正確去噪。訓(xùn)練時收斂的標志是 loss 明顯下降并穩(wěn)定在一個較低值。推理時的邏輯我強調(diào)一下# 從純噪聲開始帶條件逐步去噪 x torch.randn_like(rgb_img) for t in reversed(range(0, sampling_steps)): pred_noise model(x, t, ir_img) x denoise_step(x, pred_noise, t, ddimTrue)DDIM 采樣器把原來 1000 步的迭代壓縮到 50 步左右每步不再需要重新計算完整噪聲。我實測下來DDIM 50 步已經(jīng)能得到和 1000 步幾乎同等質(zhì)量的結(jié)果速度提升了大概 10 到 15 倍。如果對質(zhì)量要求不高20 步也可以接受。4.3 評估指標評估彩色化質(zhì)量不能只看像素誤差我的經(jīng)驗是組合使用多個指標FID衡量生成圖片分布與真實圖片分布的距離對人眼感知更友好。這是我最看重的指標。LPIPS衡量結(jié)構(gòu)感知相似度數(shù)值越小表示感知上越接近。SSIM/PSNR可以參考但不能作為唯一標準。彩色化是一個多模態(tài)任務(wù)PSNR 高不代表看起來自然反而可能意味著輸出偏保守、偏模糊。主觀評估找?guī)讉€人盲測打分對比不同方法的“自然感”和“語義正確性”。這步不能省。我自己的體會是FID 和 LPIPS 更可靠PSNR 容易騙人。有一次我調(diào)參把 PSNR 提了 2 個點結(jié)果人眼看起來整體偏灰、顏色發(fā)悶明顯不如之前的版本。5. 常見問題與排查技巧實錄5.1 訓(xùn)練不穩(wěn)定loss 波動大生成圖帶雪花噪點這是一個非常常見的問題尤其是在從零訓(xùn)練、沒有預(yù)訓(xùn)練權(quán)重的情況下。排查優(yōu)先級如下學(xué)習(xí)率太高。擴散模型的學(xué)習(xí)率通常要比常規(guī) CNN 訓(xùn)練低一檔1e-4 起步比較安全不要一上來就 5e-4。數(shù)據(jù)歸一化不一致。彩色圖和高斯噪聲的量級如果不是同一個范圍去噪任務(wù)就會很別扭。把所有圖像統(tǒng)一歸一化到 [-1, 1]噪聲采樣也在這個量級下構(gòu)建。batch size 太小導(dǎo)致噪聲預(yù)測的梯度估計方差太大。試試梯度累積等效 batch 達到 16 以上。我在調(diào)試中還發(fā)現(xiàn)warmup 步數(shù)太少也會有影響。建議至少 1000 到 5000 步的線性 warmup讓優(yōu)化器先把模型參數(shù)“穩(wěn)住”。5.2 生成結(jié)果嚴重偏綠或偏藍這個現(xiàn)象我印象最深刻。紅外圖像與顏色的關(guān)聯(lián)本來就是統(tǒng)計性的網(wǎng)絡(luò)很容易學(xué)到訓(xùn)練集中占主導(dǎo)的顏色分布整體色調(diào)偏移。一個有效的解決方法是加色彩直方圖損失強迫生成結(jié)果的全局顏色分布接近真實分布。注意權(quán)重不能太大否則會壓制細節(jié)多樣性。另一個思路是在推理時用無分類器引導(dǎo)Classifier-free guidance訓(xùn)練時按一定比例隨機丟棄條件推理時同時計算有條件和無條件的結(jié)果再插值放大條件影響。這個技巧能明顯增強生成結(jié)果與紅外輸入的對應(yīng)關(guān)系減少顏色漂移。5.3 顯存不夠用條件擴散模型的顯存占用相當(dāng)可觀256×256、batch 8 在 24GB 顯存上勉強跑得動。如果只有 12GB 顯存有幾個降級方案混合精度訓(xùn)練顯存直接減半使用梯度累積等效擴大 batch 但不增加顯存把圖像裁成 patch 訓(xùn)練比如 256 的圖裁成 4 個 128×128 的 patch改用潛在擴散模型Latent Diffusion先訓(xùn)練或使用一個 VAE 把圖像壓縮到低維潛在空間在潛在空間做擴散。這樣顯存占用大幅下降而且生成質(zhì)量幾乎不受影響這也是當(dāng)前主流做法。5.4 推理太慢實時性跟不上擴散模型推理慢是公認的短板。如果做的是離線處理50 步 DDIM 完全夠用。如果要接近實時可以考慮減少采樣步數(shù)到 20 步左右配合一個好的采樣器DPM-Solver 這類做蒸餾把多步采樣壓縮成少步甚至一步用潛在擴散模型減少每步的計算量將 UNet 量化到 8-bit用 TensorRT 做推理加速。把模型從 PyTorch 轉(zhuǎn)為 ONNX Runtime 或 TensorRT 后實測推理速度能提升 2 到 4 倍部署到邊緣設(shè)備問題不大。6. 前沿對比擴散模型 vs GAN vs 回歸方法6.1 主流方案橫向?qū)Ρ认旅孢@張表是我在項目方案評審時做的對比基本能覆蓋當(dāng)前主流路線方案輸出質(zhì)量理論速度訓(xùn)練成本適用場景傳統(tǒng)偽彩色映射中僅可視化實時無溫度分布觀察CNN 回歸低偏模糊實時低對清晰度要求不高的場景GANpix2pix較高快中需要快速生成、可接受偽影條件擴散模型高慢高離線高質(zhì)量彩色化、語義保真潛在條件擴散高中中顯存受限、需要平衡速度與質(zhì)量我自己的判斷是如果項目預(yù)算和算力有限、實時性要求高先用 CNN 回歸或偽彩色迭代出一個可用版本如果追求高質(zhì)量、可接受離線推理條件擴散模型是當(dāng)前最優(yōu)解。未來隨著蒸餾和推理加速技術(shù)成熟擴散模型的實時部署也會越來越可行。6.2 值得關(guān)注的前沿方向潛變量擴散是當(dāng)前絕對主流。相比像素空間直接做擴散潛在空間的計算量小一個量級而且可以復(fù)用大量公開的預(yù)訓(xùn)練權(quán)重。這個方案很適合紅外彩色化這類任務(wù)。條件注入的精細化也是一個大趨勢。ControlNet 推出后很多人用它做紅外圖引導(dǎo)效果比直接拼接通道好不少。它最大的優(yōu)勢是可以凍結(jié)基礎(chǔ)生成模型只訓(xùn)練條件注入分支訓(xùn)練成本和難度都大幅下降??缬蚍夯瘑栴}也不能忽視。不同廠家的紅外相機響應(yīng)曲線、分辨率、噪聲水平差異極大在 A 相機上訓(xùn)練好的模型換到 B 相機上效果往往打折。一個可行的思路是在訓(xùn)練時做“紅外風(fēng)格增強”對紅外圖做隨機亮度偏移、對比度變化、高斯模糊和加噪讓模型對這些變化不敏感。多模態(tài)融合是一個很有潛力的方向。如果場景中同時有紅外和可見光弱光圖像可以讓模型以兩者為條件互相補足。紅外對溫度敏感可見光弱光對紋理敏感融合后的彩色化結(jié)果往往比單一輸入更好。這個方向上擴散模型的多條件生成能力有天然優(yōu)勢。最后做個小結(jié)我在做這個項目的整個過程中比較深的體會是真正決定最終效果的往往不是模型結(jié)構(gòu)有多新而是數(shù)據(jù)和條件注入的細節(jié)有沒有做到位。紅外圖像歸一化方式、配準精度、條件特征的注入位置這些對結(jié)果的影響比換一個更大的 UNet 要顯著得多。調(diào)試階段給大家一個實用建議把紅外圖、真實彩色圖、生成彩色圖并排保存每訓(xùn)練幾百步就肉眼檢查一次。看 loss 曲線容易自我催眠直接看圖會直擊要害。很多時候你覺得模型“快要崩了”其實只是視覺對比的假象。這項技術(shù)后續(xù)還可以往下擴展的方向挺多把整個流程接到實時視頻流上或者把紅外和可見光兩個傳感器做統(tǒng)一的多模態(tài)框架都是可以深挖的點。如果這篇文章能幫你少走幾段彎路那就值了。