---
# System prepended metadata

title: Diffusion 背後的套路
tags: [CV]

---

# Diffusion 背後的套路
###### tags: `CV`
Based on [大金影片](https://youtu.be/JbfcAaBT66U)

## Framework
![](https://hackmd.io/_uploads/r1W_lDhS3.png)
(1) 文字輸入變成向量 (藍色)
(2) 輸入雜訊 (粉紅色方塊) + 文字 encoder 出來的東西，經過生成模型(e.g., diffusion model)，得到中間產物(壓縮後的圖片)
(3) 過 decoder，還原回原始圖片

### Decoder
decoder 的訓練不需要文字資料，只要圖片就可以了！
decoder 訓練方式根據中間產物有所不同。若中間產物是小圖，那就讓 input 是小圖，output 是大圖，這樣來訓練 decoder。如果中間是 Latent represnetation，那變成要訓練 AE (encoder-decoder)，目標是讓輸入圖片跟輸出圖片越接近越好；若輸入是 H * W * 3，則 latent 通常是 h * w * c 
![](https://hackmd.io/_uploads/S1ZGMwnH2.png)

### Generation model
* Input: 文字 representation
* Output: 產生圖片中間產物
* Training 過程:
    1. encoder 吃圖片，產生中間產物
    2. sample noise，加到中間產物上，做好幾個 step
    ![](https://hackmd.io/_uploads/ByFOtOnrh.png)

    3. 訓練noise predictor:
        * Input: 文字 representation/xth step中間產物/x
        * Output: xth step noise
    ![](https://hackmd.io/_uploads/SkSKK_2H3.png)
* Testing 過程:
    從Normal distribution sample一個noise+文字 representation丟進denoise module(noise predictor)，逐步去除noise產生中間產物
    ![](https://hackmd.io/_uploads/rJRP5O3r2.png)

    
    

## DALL-E
架構跟上面介紹的一樣
生成模型使用 autoregressive (如果是要生成完整圖片，autoregressive會算太久，但現在只是要生成壓縮的圖片，所以可以) or diffusion model

## Imagen
diffusion 先生出 64x64 的小圖，再經過最後 super resolution diffusion 轉成大圖

## Metric
文字 encoder 
FID 越小，代表圖片生出來越好
clip score越高，代表文字跟圖片有關係
實驗發現 encoder 越大，效果越好；反之，U-Net 大小 (diffusion model size) 就沒什麼影響

## FID
評估影像生成模型的好壞的指標
生成出來的影像跟真實影像先各自丟到pretrained CNN，得到 hidden representation
去比較生成 跟 真實 hidden representation 的分布，計算 distance，兩個分布越接近，代表生成結果越好
這個方法需要大量 sample 才有辦法得到結果，像前一張投影片的結果就是需要 10k 張 image

## CLIP
![](https://hackmd.io/_uploads/r1oybDhrh.png)
Text encoder讀一段文字產生對應的vector
Image encoder讀一張圖片產生對應的vector
如果Text-image是同一個pair則兩個vector距離要近，否則要遠

