跳到主要內容

發表文章

目前顯示的是 12月, 2024的文章

CV Day 39 生成式資料增強:合成罕見樣本

 CV Day 39 生成式資料增強:合成罕見樣本 執行需求:Colab T4 可跑 。今天的任務很具體:把「長尾類別」(例如 MVTec AD 中只有 10–30 張樣本的瑕疵)透過 Stable Diffusion 擴充到 100–200 張,並用 CLIP score + 人工複核把「不像的」與「不能用的」過濾掉,留下真正能餵進下游分類器的合成樣本。流程包含四個關卡:用 SD v1.5 生成 200 張候選、CLIP 過濾掉 CLIP score 低於閾值的、視覺檢查淘汰「構圖怪異」的、把剩下的合成樣本併入 MVTec AD 訓練集並比較分類器表現。在 Colab T4 上,跑完整個流程約 25 分鐘(生成 12 分鐘 + CLIP 過濾 2 分鐘 + 訓練 ResNet-18 分類器 8 分鐘 + 評估 3 分鐘);讀完之後你應該能回答:「為什麼 CLIP score 比 FID 更適合當過濾閾值?」「合成樣本要怎麼與真實樣本混用才不會破壞分類器?」「長尾類別要合成到『平衡』還是『部分平衡』?」 引言 昨天我們把 FID、CLIP score、人工評估三條評估路徑整個跑過一遍,今天要把這套流程接到一個更實際的問題——長尾資料(long-tail data)。工業瑕疵檢測(也就是這個系列從 Day 25 開始、貫穿到最後一天的專案)有一個很現實的痛點:瑕疵樣本天生就是長尾分布。常見瑕疵(例如 PCB 板上的輕微刮痕)可能有上百張,但罕見瑕疵(例如電容破裂、特定角度的焊點瑕疵)可能只有 5–10 張甚至更少;當我們拿這種極度不平衡的資料去訓練分類器,模型會「傾向預測多數類別」——把少數類別誤判成多數類別,反而是瑕疵檢測最不能接受的方向。 傳統的解法是「資料增強」(data augmentation):對少數類別的影像做翻轉、旋轉、色彩抖動、CutMix、MixUp 等操作,靠「在現有影像上做變形」來增加樣本數。這些方法能緩解問題但天花板有限——它們只能在「已經存在的影像」上做幾何與色彩變換,無法創造「新構圖」、「新背景」、「新材質組合」。生成式資料增強(generative data augmentation)的想法是直接用 Stable Diffusion 生成「新的瑕疵影像」,繞過「只能在現有影像上變形」的限制。 但...

CV Day 38 生成品質評估:FID、CLIP score 與人工評估

 CV Day 38 生成品質評估:FID、CLIP score 與人工評估 執行需求:Colab T4 可跑 。今天的主角是「怎麼判斷一組生成影像夠不夠好」,把這個問題拆成三條互補的路徑:FID(Fréchet Inception Distance)量測「真實影像分布 vs. 生成影像分布」的距離,CLIP score 量測「圖與文字 prompt 的語意對齊程度」,人工評估則處理前面兩者都量不到的細節(瑕疵合理性、品牌一致性、構圖品味)。在 Colab T4 上,用 pytorch-fid 0.3.0 算 2,048 張 256×256 影像的 FID 約 6 分鐘;用 transformers 4.46 的 CLIPModel 算 CLIP score 約 3 分鐘;人工評估設計本身就是 5 分鐘的閱讀。讀完之後,你應該能回答:「FID 變小 5 分代表真的進步嗎?」「為什麼 CLIP score 對人物與風格詞特別敏感?」「什麼情況下 FID 與 CLIP 都不足以決定模型好壞?」 引言 前幾天我們把 VAE、DCGAN、Diffusion、Stable Diffusion 與 ControlNet/LoRA 跑過一輪;模型本身能「畫出東西」之後,下一個問題立刻浮上來——怎麼知道它畫得好不好?這件事在分類、偵測、分割任務裡相對單純:拿一個指標(accuracy、mAP、mIoU)對照 ground truth 就好;但生成任務沒有單一正確答案,「一張好圖」同時牽動分布、語意、美學三個層次,沒有任何單一指標能完整描述。 實務上業界通常會把三類評估組合起來看:第一,分布指標(FID、IS、KID)回答「生成影像看起來像不像真實影像」;第二,語意指標(CLIP score、CLIP-FID)回答「生成的影像有沒有符合 prompt 描述」;第三,人工評估(pairwise comparison、Likert scale、A/B test)回答「在真實情境裡,使用者覺得這個結果能不能用」。三者各有盲點,必須放在一起讀才看得見全貌。本系列貫穿的工業瑕疵檢測專案裡,「合成罕見瑕疵」的可信度直接決定下游分類器能不能學到東西,這時候 FID + CLIP + 人工複核三件套就是品質閘門。 今天我們會做一件很具體的事:先用 Sta...

CV Day 37 ControlNet 與 LoRA:控制與微調

CV Day 37 ControlNet 與 LoRA:控制與微調 執行需求:Colab T4 可跑 。本篇在 Colab 免費 T4(16 GB VRAM)上用 diffusers 0.31 載入 Stable Diffusion 1.5 + ControlNet(Canny 邊界控制, lllyasviel/control_v11p_sd15_canny ,2024 年仍可下載的官方 v11 checkpoint),示範「給一張邊界圖、生一張風格一致的影像」;最後用 Hugging Face peft 0.11 示範 LoRA 的低秩適配器概念(凍結 base model、只訓練 0.1% 參數)。單張 ControlNet 推論約 6 秒(DDIM 30 步)、VRAM 約 7.5 GB;LoRA 概念示範(不實際訓練)在 CPU 上也能跑。純 CPU 推論單張約 2.5 分鐘,不建議正式使用。 引言 Day 36 的內容中,我們把 Stable Diffusion 1.5 的基本推論工作流跑起來了——prompt、negative_prompt、guidance_scale、seed、scheduler 五個參數都有了具體的數值影響。今天要回答「Stable Diffusion 1.5 還缺什麼」——基本上是兩個問題:第一,純文字 prompt 很難精確控制構圖(「我要這個人的臉在左邊」這類指令常常失敗);第二,要讓模型學會「特定風格」或「特定主題」,需要全模型微調(finetune),但 SD 1.5 的 860M UNet 參數量即使在 24 GB A100 上也要跑好幾個小時。ControlNet 與 LoRA 是 2023–2024 年社群給出的兩個解法:ControlNet 用「邊界圖、深度圖、人體骨架」當作額外條件輸入到 UNet、LoRA 把全模型微調簡化為「凍結 base + 訓練 0.1% 低秩適配器」。 ControlNet(Zhang 等人,2023, Adding Conditional Control to Text-to-Image Diffusion Models ,ICCV 2023 最佳論文)的核心想法是「不重新訓練 SD 1.5、只加一個可訓練的副網路」。具體實作:把 SD 1.5 的 UNet 中間層(特...