
簡介一套基于深度學習算法的虛擬試衣鏡Python實現(xiàn)面向計算機視覺、姿態(tài)估計與圖像生成方向的開發(fā)者與學習者。程序整合人體姿態(tài)估計、人體分割、幾何匹配和GAN四類模型僅依賴OpenCV庫即可完成推理適合虛擬換裝、電商試衣等場景的快速驗證。壓縮包包含24個文件其中20張為測試樣圖3個Python腳本分別承擔主流程、人體解析和公共模塊另附1份Markdown項目說明整體僅120KB便于對照圖片與源碼理解實現(xiàn)細節(jié)。這套實現(xiàn)中涉及自定義層CorrelationLayer需手動編碼而onnxruntime等推理引擎并不直接支持自定義層反過來凸顯了OpenCV方案的靈活性與可玩性。目前已有408人學習下載源碼結(jié)構(gòu)清晰從主程序到解析腳本均可直接閱讀配合項目說明能幫助想深挖多模型組合與部署細節(jié)的讀者少走彎路。1. 虛擬試衣鏡不是濾鏡這個 Python 項目到底在解決什么問題把一張平鋪的服裝圖“穿”到一張人物照片上前后不過三秒背后卻是深度學習算法里至少三個方向的協(xié)作人體解析、姿態(tài)估計與圖像生成。虛擬試衣鏡這類項目輸入是“人物圖 服裝圖”輸出是換裝后的自然人像它要解決的問題很具體——電商模特圖拍攝成本高、直播試穿展示麻煩、線下門店試衣鏡互動性弱。適合兩類人一類是做視覺落地的工程師想把這個方向改造成自己的商品圖批量生成工具另一類是拿它當課題的學生需要一套能跑通、能講清原理的 python 源碼工程。拿到這份源碼和模型包先別急著跑它的推理管線、數(shù)據(jù)格式和參數(shù)約定有不少默認前提下面按“拆原理 → 跑 demo → 讀代碼 → 排坑”的順序過一遍最后聊聊怎么把它變成能用的東西。2. 虛擬試衣鏡的技術(shù)棧拆解分割、姿態(tài)估計與圖像合成各管哪一段虛擬試衣鏡的常規(guī)實現(xiàn)不是單一網(wǎng)絡而是由三到四個模塊串起來的推理管線。最常見做法是參考 VITON、VITON-HD、HR-VITON 這一系列工作的思路先對人物圖做人體解析再做姿態(tài)估計接著把服裝圖變形對齊到人體上最后用生成器完成換裝合成。理解這條管線才能看懂源碼里每個文件存在的意義也才能在出問題時準確定位是哪一環(huán)掉了鏈子。2.1 先拆任務為什么換裝不能直接“貼圖”很多人第一次拿到虛擬試衣鏡項目時第一反應是直接把服裝圖按位置貼到人身上不就行了實際做一次就會翻車。原因有三層。第一人物是有姿態(tài)的。站著、坐著、抬手、叉腰同一件衣服在不同姿態(tài)下形變完全不同矩形貼圖只能做到平移縮放袖子、下擺、領口全部對不上。第二存在遮擋關系。手臂會壓在衣服前面頭發(fā)會垂到肩膀位置人臉、頸部、手部這些區(qū)域必須原樣保留只有衣服覆蓋的區(qū)域可以被替換這要求算法先知道“哪里是衣服、哪里不是”。第三服裝圖本身是平鋪拍攝的光照、褶皺、邊緣陰影和人物圖完全不同直接貼上去會有明顯的“貼紙感”這也是虛擬試衣鏡必須用生成式模型而不是簡單圖像處理的原因。所以標準方案把任務拆成四條支線人體解析負責逐像素分類姿態(tài)估計負責關鍵點定位服裝形變負責幾何對齊圖像合成負責光影與紋理融合。每條支線由一個獨立模型承擔彼此之間通過 mask 和特征圖傳遞信息。后面所有參數(shù)調(diào)整都是在這四個環(huán)節(jié)上分別做文章。2.2 人體解析與姿態(tài)估計給算法一張“人體結(jié)構(gòu)圖”人體解析Human Parsing是對人物圖的每個像素做分類。常見類別包括背景、頭發(fā)、臉、左上衣、右上衣、左腿、右腿、左臂、右臂、裙子、腰帶等不同方案類別數(shù)從 10 類到 20 類不等。這一階段常用的深度學習方法有基于語義分割的 Schp、Graphonomy以及帶注意力機制的解析網(wǎng)絡。它們輸出一張與輸入同尺寸的分割圖每個像素值對應該位置的人體部件類別。姿態(tài)估計Pose Estimation負責輸出人體關鍵點坐標常用 OpenPose 或 HRNet關鍵點數(shù)量一般是 18 或 20 個覆蓋頭、頸、肩、肘、腕、髖、膝、踝。對虛擬試衣鏡來說姿態(tài)關鍵點的核心作用有兩個一是給服裝形變提供對齊錨點比如肩點對應服裝的肩縫位置二是判斷人物姿態(tài)是否適合試穿側(cè)身 90 度的圖強行試穿通常效果很差。把兩路結(jié)果合起來就能構(gòu)造出“去衣人物表示”clothing-agnostic person representation把原圖中的衣服區(qū)域挖掉保留臉、手、頭發(fā)、背景和身體輪廓再把這份表示和形變后的服裝圖一起喂給生成器。這一步是整個項目最關鍵的地方因為生成器要學的不是“從零畫人”而是“把新衣服補進一個已知的人”。2.3 服裝形變TPS 薄板樣條是怎么把衣服“穿”上去的服裝圖是平鋪矩形人體是立體的因此必須有一個幾何變換把服裝 warp 到適合當前姿態(tài)的狀態(tài)。早期方案用仿射變換效果很差——仿射只能做旋轉(zhuǎn)、縮放、平移和切變對袖子這種需要局部彎曲的區(qū)域無能為力?,F(xiàn)在絕大多數(shù)方案采用薄板樣條Thin Plate SplineTPS做粗對齊再由可變形卷積或空間變換網(wǎng)絡做精對齊。TPS 的基本思路是在服裝圖和人體姿態(tài)之間定義一組控制點比如肩膀兩個點、腋下兩個點、下擺幾個點通過薄板樣條插值得到整個平面的平滑變形場??刂泣c越多變形自由度越大但也越容易出現(xiàn)局部過度拉伸。實現(xiàn)層面TPS 通常由一個輕量的 warping 網(wǎng)絡預測控制點位移再用 PyTorch 的 grid_sample 對服裝圖采樣。grid_sample 有個容易忽略的參數(shù) align_corners它決定采樣網(wǎng)格是否對齊像素中心。在虛擬試衣鏡源碼里訓練和推理階段的 align_corners 必須完全一致否則會整體偏移幾個像素領口袖口對不上。2.4 生成器與判別器VITON/HR-VITON 類方案的完整流程把前面幾個模塊串起來就是核心流程先對人物圖做人體解析和姿態(tài)提取構(gòu)造去衣人物表示再把服裝圖通過 TPS 變形到目標姿態(tài)最后把去衣人物表示和變形后的服裝圖在維度上拼接送入一個 U-Net 結(jié)構(gòu)的深度卷積網(wǎng)絡CNN生成器輸出換裝結(jié)果。生成器編碼器提取人物和服裝的語義特征解碼器逐級恢復分辨率并生成 RGB 圖像。訓練階段還有判別器形成 GAN 結(jié)構(gòu)判別器判斷生成的換裝圖是“真”是“假”逼生成器提升細節(jié)真實感。損失函數(shù)通常由三部分構(gòu)成L1 重建損失保證像素接近感知損失用預訓練 VGG 特征約束高層語義一致對抗損失提升紋理真實感。優(yōu)化器一般配 Adamweight_decay 即 L2 正則項常見取 5e-4 到 1e-3這個參數(shù)在自建數(shù)據(jù)上微調(diào)時很關鍵。分辨率是復現(xiàn)時最需要關注的變量。VITON 原版工作在 256×192VITON-HD 提升到 1024×768HR-VITON 支持任意分辨率。分辨率直接決定顯存占用和推理耗時后面跑 demo 時我會給出參數(shù)怎么設。3. 在本地跑通最小 demoPython 環(huán)境、權(quán)重放置與第一條推理命令拿到“源碼 模型 項目說明”這套包之后最先做的不是讀代碼而是把環(huán)境對齊。虛擬試衣鏡對 Python、PyTorch、CUDA 三者的版本組合非常敏感版本不匹配時往往不直接報錯而是在推理時出現(xiàn)顏色偏差、張量維度對不上這類隱蔽問題。先把地基打牢后面才能少返工。3.1 Python 環(huán)境與 CUDA 版本對齊先解決“裝不上”的問題常見做法是用 conda 單獨建環(huán)境不要污染系統(tǒng) Python。虛擬試衣鏡這類項目大多基于 PyTorch選型時要注意源碼是 PyTorch 1.x 還是 2.x對應的 torchvision 版本必須匹配。下面是一套兼容性很廣的組合conda create -n viton python3.8 -y conda activate viton pip install torch1.13.1 torchvision0.14.1 --index-url https://download.pytorch.org/whl/cu117 pip install opencv-python4.8.1.78 numpy1.24.4 pillow tqdm scipy tensorboard幾個參數(shù)要解釋清楚。python3.8 是大多數(shù)虛擬試衣鏡源碼兼容性最好的版本3.10 以上容易出現(xiàn) torchvision 的 C 擴展編譯問題。torch 1.13.1 配 torchvision 0.14.1、CUDA 11.7是 30 系和 40 系顯卡都能正常用的組合。opencv-python 固定到 4.8.1.78是因為新版 OpenCV 對部分后端做了調(diào)整可能影響圖像讀寫行為。numpy 固定 1.24.4是為了避免 numpy 2.x 與舊版 PyTorch 在數(shù)據(jù)類型上出兼容問題。提示環(huán)境裝好后先執(zhí)行python -c import torch; print(torch.__version__)確認導入正常再繼續(xù)下一步。如果 pip 下載超時把--index-url換成國內(nèi) PyPI 源即可版本號不要變。沒有 NVIDIA 顯卡的話把 cu117 換成 cpu 版本也能跑推理只是 512×768 的圖可能要等十幾秒。另外提醒一句裝完 opencv 后import cv2報錯多半是 numpy 版本沖突按上面固定版本重裝一次就能解決。3.2 模型權(quán)重與數(shù)據(jù)準備項目包里 .pth 文件該怎么放這個項目包自帶模型權(quán)重拿到手后先看 checkpoints 目錄下的 .pth 文件是否齊全。按最常見的工程結(jié)構(gòu)需要三類權(quán)重人體解析權(quán)重、姿態(tài)估計權(quán)重、換裝生成器權(quán)重。有些實現(xiàn)把姿態(tài)和解析合在一個模型里但目錄結(jié)構(gòu)基本一致。建議項目根目錄按下述結(jié)構(gòu)組織項目根目錄/ ├── checkpoints/ │ ├── parsing.pth │ ├── pose.pth │ └── generator.pth ├── data/ │ ├── person.jpg │ ├── cloth.jpg │ └── result.jpg ├── models/ ├── utils/ └── run.py測試圖像有硬性要求。人物圖最好是直立全身照分辨率不低于 512×768背景盡量簡單衣服和背景顏色差異要大深色衣服配深色背景會讓解析邊界非常難分。服裝圖要求白底或透明底的平鋪服裝完整露出領口、袖口和下擺。測試圖不符合這個分布后面換裝效果會明顯變差這不是模型的問題是輸入分布和訓練集差太多。我一般會用一段極簡代碼先驗證權(quán)重能否加載避免進到主線才發(fā)現(xiàn)路徑不對import torch ckpt torch.load(checkpoints/generator.pth, map_locationcpu) print(ckpt.keys()) if isinstance(ckpt, dict) and state_dict in ckpt: print(找到 state_dict共, len(ckpt[state_dict]), 個張量)這段代碼只做一件事確認 .pth 里到底是裸的 state_dict 還是被包了一層。很多項目保存權(quán)重時習慣性套了{state_dict: ...}加載時沒取對層就會報 missing keys 或 unexpected keys這是最典型的“權(quán)重加載失敗”場景。3.3 跑通第一張換裝圖一條命令和它的參數(shù)清單大多數(shù)虛擬試衣鏡項目包都會提供推理入口可能是 run.py 或 inference.py。最常見的調(diào)用方式如下python run.py \ --person data/person.jpg \ --cloth data/cloth.jpg \ --output data/result.jpg \ --load_size 512 \ --gpu_id 0這條命令把人物圖和服裝圖送入由三個模型組成的推理管線最終把換裝結(jié)果寫到 result.jpg。核心參數(shù)見下表參數(shù)常見默認值作用注意事項--person無人物圖路徑全身照背景簡單--cloth無服裝圖路徑白底或透明底--outputresult.jpg輸出路徑所在目錄必須存在--load_size512輸入短邊長度調(diào)到 768 效果更細顯存和耗時約翻倍--gpu_id0GPU 編號無 GPU 時改用 --cpu跑之前先讀項目包里的項目說明重點看兩件事。第一權(quán)重加載路徑是否寫死很多源碼里load_state_dict的路徑是硬編碼的和你的目錄結(jié)構(gòu)不對應時要在 run.py 里改第二輸入歸一化方式多數(shù)項目用 ImageNet 的 mean/std少數(shù)用 [-1,1] 歸一化這個不一致會導致出圖顏色整體偏差明顯。如果項目說明里給出了環(huán)境版本要求以說明為準不要用我的推薦值硬套。第一張圖哪怕效果一般只要跑通流程就說明環(huán)境沒問題。之后的調(diào)參都建立在“管線通了”這個前提下否則出了問題你會分不清是環(huán)境還是算法。4. 核心代碼走讀從人體解析、TPS 形變到圖像融合的三段實現(xiàn)跑通 demo 只是開始。要改出自己的效果必須把三段核心代碼讀明白人體解析、服裝形變、圖像合成。下面按虛擬試衣鏡最常見的實現(xiàn)方式給出關鍵代碼骨架你可以對照項目包里的源碼逐段對應。4.1 人體解析與姿態(tài)關鍵點把“人”結(jié)構(gòu)化人體解析模型的推理邏輯和普通語義分割幾乎一樣預處理、前向、argmax 取類別。需要特別小心的是 mask 的尺寸還原一定要用最近鄰插值。import torch import cv2 import numpy as np # 以 Schp 風格解析模型為例輸出類別數(shù) NUM_CLASSES20 MEAN (0.485, 0.456, 0.406) STD (0.229, 0.224, 0.225) def infer_parsing(model, img_bgr): h, w img_bgr.shape[:2] # 按比例縮放到模型訓練尺寸再用 padding 補邊避免拉伸變形 scale 512.0 / max(h, w) resized cv2.resize(img_bgr, (int(w * scale), int(h * scale))) ph, pw resized.shape[:2] canvas np.zeros((512, 512, 3), dtypenp.float32) canvas[:ph, :pw] resized[:, :, ::-1] / 255.0 canvas (canvas - MEAN) / STD tensor torch.from_numpy(canvas.transpose(2, 0, 1)).unsqueeze(0).float() with torch.no_grad(): logits model(tensor) # [1, 20, 512, 512] mask torch.argmax(logits, dim1) # 每個像素取概率最大的類別 mask mask.squeeze(0).cpu().numpy().astype(np.uint8) # 還原到原圖尺寸類別圖不能用線性插值 mask cv2.resize(mask[:ph, :pw], (w, h), interpolationcv2.INTER_NEAREST) return mask邏輯說明預處理先按比例縮放再補邊是為了避免直接拉伸導致人體比例失真argmax得到的是每個像素的類別 id 矩陣而不是概率圖。最后一步 resize 必須用INTER_NEAREST如果用雙線性3 和 5 會被插值成 4 這種既有錯意義又模糊的類別邊界全亂。參數(shù)上最需要注意的是 MEAN/STD 必須與訓練時完全一致ImageNet 均值和自訓練均值的差異會直接反映在邊界質(zhì)量上。姿態(tài)估計的代碼結(jié)構(gòu)類似輸出從[1, 20, 512, 512]變成[1, N_KEYPOINTS, H, W]的熱力圖再對每張熱力圖求 argmax 得到坐標。關鍵點數(shù)量一般是 18 或 20源碼里會定義一個 keypoint order 列表后續(xù)服裝形變按索引取肩、肘、腕等點這個索引順序千萬不能改一旦和模型訓練時不一致整條對齊線就偏了。4.2 TPS 服裝形變把平鋪服裝圖像到人體姿態(tài)上服裝形變是整個項目里最“玄學”的部分效果好壞七分靠它。常見做法分兩步先由輕量網(wǎng)絡預測 TPS 控制點再對服裝圖做網(wǎng)格采樣。控制點通常是 5×5 或 6×6 的均勻網(wǎng)格落在服裝圖的關鍵位置。import torch.nn.functional as F def tps_warp(cloth, theta, out_h256, out_w192): cloth: [B, 3, H, W] 平鋪服裝圖 theta: [B, 2, num_ctrl] TPS 控制點位移num_ctrl 通常為 25 或 36 grid build_tps_grid(theta, out_h, out_w) # [B, out_h, out_w, 2] warped F.grid_sample( cloth, grid, modebilinear, padding_modeborder, align_cornersTrue, ) return warped參數(shù)說明theta 是網(wǎng)絡預測出來的[B, 2, N]2 表示 x、y 兩個方向的位移。build_tps_grid內(nèi)部先構(gòu)造基準網(wǎng)格再用薄板樣條插值把控制點位移擴散到整個平面不同項目的實現(xiàn)細節(jié)差異很大但對外接口基本一致。grid_sample的 mode 用 bilinear 保留平滑紋理padding_mode用 border 而不是 zeros否則服裝邊緣會有一圈黑邊。align_cornersTrue和 False 的差別只有半個像素量級但如果和訓練時不一致袖口領口會整體錯位非常隱蔽。這個階段最容易踩的坑是控制點初始位置和服裝圖尺寸不匹配導致服裝被裁掉一大塊。建議每次調(diào)試都把 warp 結(jié)果可視化把變形后的服裝疊加在人物圖上確認領口對準脖子、袖口對準手臂再進入下一步合成。4.3 圖像合成與后處理mask 融合和邊緣羽化最后一步是把形變后的服裝合入人物圖。這里不能直接覆蓋要先保護臉、手、頭發(fā)區(qū)域再對服裝邊緣做羽化過渡。# 以 20 類解析為例5左上衣, 6右上衣這里按常見 id 示意 garment_mask np.isin(parsing, [5, 6]).astype(np.float32) # 對衣服區(qū)域做輕度膨脹防止原衣服邊角從新衣服邊緣漏出來 garment_mask cv2.dilate(garment_mask, np.ones((3, 3), np.uint8), iterations1) # 高斯羽化讓邊緣過渡自然ksize 根據(jù)輸出分辨率調(diào)整 kernel cv2.getGaussianKernel(5, 1.5) feather_mask cv2.filter2D(garment_mask, -1, kernel, borderTypecv2.BORDER_CONSTANT) # 合成人物原圖與變形服裝按羽化權(quán)重加權(quán) result person_bgr * (1 - feather_mask[..., None]) warped_bgr * feather_mask[..., None]邏輯說明garment_mask來自解析結(jié)果先膨脹是為了把換裝區(qū)域向外擴一圈覆蓋原衣服可能露出的邊緣。feather_mask是羽化后的權(quán)重從邊緣的 0 漸變到內(nèi)部區(qū)域的 1合成時兩個圖按權(quán)重做逐像素加權(quán)。合成后可以對邊緣再做一次輕微模糊但注意別波及衣服內(nèi)部紋理。兩個細節(jié)值得注意。第一臉、脖子、手這些區(qū)域的 mask 要單獨從保護列表里取換裝時完全保留原像素第二如果解析把頭發(fā)誤判成衣服羽化會把發(fā)絲也帶進融合導致發(fā)梢糊掉這是下一章要展開的常見坑之一。5. 虛擬試衣鏡避坑指南5 個高頻問題的現(xiàn)象、原因與排查順序環(huán)境通了、管線跑了之后真正花時間的是調(diào)效果。下面 5 個坑是這類項目里出現(xiàn)頻率最高的每條都按“現(xiàn)象 → 原因 → 解決”三步寫方便你直接對號入座。建議按 5.3 → 5.4 → 5.1 → 5.5 → 5.2 的順序排查先確保輸入結(jié)構(gòu)正確再看幾何對齊最后查顏色和資源占用。5.1 現(xiàn)象換上的衣服邊緣發(fā)虛像貼上去的貼紙現(xiàn)象衣服與人臉、手臂交界處有一圈半透明過渡帶紋理模糊整體合成感很強。原因主要有兩個一是解析 mask 分辨率不夠原圖 1024 寬時對 512×512 的 mask 做雙線性上采樣邊界類別被插值成灰色過渡帶二是沒做膨脹或羽化硬邊界在合成結(jié)果上表現(xiàn)為銳利裁切線。解決mask 上采樣固定用INTER_NEAREST對garment_mask先做 12 像素膨脹再羽化如果仍然發(fā)虛把--load_size從 512 提到 768讓解析階段保留更多邊界細節(jié)。注意膨脹迭代次數(shù)不要超過 2否則衣服會向臉和手方向溢過去遮住鎖骨和手腕。5.2 現(xiàn)象訓練時顯存爆掉batch size 調(diào)到 1 還是 OOM現(xiàn)象CUDA out of memory反復出現(xiàn)有時甚至把整個進程 kill 掉。原因生成器是 U-Net判別器還有輔助分支兩個網(wǎng)絡同時前向和反向512×768 分辨率下特征圖占用很輕松突破 12GB而且 batch size 1 時 BatchNorm 統(tǒng)計量不穩(wěn)定還會影響訓練效果屬于兩難。解決先確認是不是真的在訓練很多項目包的 run.py 默認開了訓練模式推理時要把--mode test或?qū)_關打開訓練用混合精度torch.cuda.amp顯存能降到約一半還不行就把分辨率降到 256×192 這類原版小尺寸跑通再往上加。推理階段不要加載判別器權(quán)重能省出一大塊顯存。5.3 現(xiàn)象人體解析把袖子當背景或把手當衣服現(xiàn)象換裝結(jié)果里手臂區(qū)域出現(xiàn)了衣服紋理或者袖口位置露出了背景色。原因解析模型的訓練集以正面直立模特為主測試圖一旦出現(xiàn)手插兜、抬臂、側(cè)身這類動作解析邊界就會出錯另一個常見原因是測試圖分辨率太低手腕和袖口只有幾十個像素類別置信度不夠。解決測試圖盡量選與訓練集分布一致的正身直立姿勢如果必須處理特殊姿勢可以在送入解析前先做姿勢篩查關鍵點角度超過閾值就提示不適合試穿有的項目包提供了姿態(tài)引導的解析后處理開關打開后能用關鍵點位置強制修正部分類別邊界效果明顯但會額外占幾十毫秒需要自己權(quán)衡。5.4 現(xiàn)象服裝形變后領口、袖口錯位衣服歪向一邊現(xiàn)象warp 后的服裝領口和人物脖子對不上袖子偏離肩膀十幾像素整體像“掛”上去的。原因多數(shù)是服裝圖預處理時被直接 resize 成正方形寬高比變了控制點語義位置全部偏移也可能 warp 網(wǎng)絡訓練分辨率和推理分辨率不一致控制點是歸一化坐標分辨率變了對應像素位置就偏了。解決檢查服裝預處理是否保持寬高比用補邊而不是拉伸把 warp 輸出疊加在原圖上可視化對領口、腋下、下擺三處逐一檢查如果只是整體平移幾個像素可以在后處理里給 warped 結(jié)果加一個全局平移修正這是最快見效的后悔藥我在項目里經(jīng)常用它救回 5 像素以內(nèi)的錯位。超過 10 像素就別硬修了回去查控制點網(wǎng)絡輸入。5.5 現(xiàn)象出圖顏色整體偏灰或偏黃像壞了白平衡現(xiàn)象黑色衣服變成深灰白色衣服泛黃膚色也悶了一層。原因十有八九是歸一化和反歸一化不一致。訓練時用 [-1,1] 歸一化推出結(jié)果后忘了乘 0.5 加 0.5直接把輸出當 [0,1] 乘 255 保存就會整體發(fā)灰反過來則會發(fā)黑。另一個常見原因是用 cv2.imwrite 保存時輸入超出 [0,255] 范圍不做裁剪。解決在源碼里搜 mean、std、normalize 三個關鍵詞確認訓練和推理預處理完全一致輸出保存前把數(shù)值統(tǒng)一np.clip(out, 0, 255)。注意 PyTorch 的save_image會自動裁剪但 cv2.imwrite 不會換用不同保存方式的人最容易栽在這。6. 把 demo 變成可用的試衣鏡效果驗證、提速與落地技巧6.1 效果驗證指標之外一定要人工看圖如果要把這個項目用在商品圖或者門店場景驗證不能只看一兩個指標。我常用的做法是準備 100 組測試圖覆蓋正身、微側(cè)身、淺色衣、深色衣、復雜背景各 20 組跑完后算 FID、SSIM、LPIPS 三個指標但更重要的是把這 100 張圖按順序翻一遍人工打分。FID 降了不代表紋理清楚這是拿顯存換來的血淚經(jīng)驗。人工評估時重點看四類區(qū)域領口貼合度、袖口與手腕交界、下擺邊緣、頭發(fā)與肩膀過渡。6.2 三步提速輕量模型、半精度與批量推理先做模型輕量化。解析和姿態(tài)這兩個前置模塊是整條管線最耗時的部分常見做法是把 HRNet 主干換成 MobileNet 類輕量主干精度下降有限耗時能降一半以上。再做半精度推理model.half()加上輸入張量轉(zhuǎn) fp16在 30 系和 40 系顯卡上速度提升明顯注意 BN 層在 fp16 下偶爾不穩(wěn)定出圖有噪點時對 BN 層保持 fp32。最后做批量推理門店場景多個用戶同時試穿時把多組請求組合成一個 batch 送進網(wǎng)絡比單張循環(huán)調(diào)用快得多這也是后端服務在 GPU 資源調(diào)度上最常見的優(yōu)化手段。我最初做這套東西時只盯指標結(jié)果 FID 很好看放大一看全是糊的紋理后來才把人工看圖變成固定流程。先通管線再校準輸入分布最后才談指標——這個順序我踩過坑后才定下來希望幫到你。本文還有配套的精品資源點擊獲取