# 【生成式AI導論 2024】第17講:有關影像的生成式AI (上) — AI 如何產生圖片和影片 (Sora 背後可能用的原理) ## 今日的人工智慧如何看影像 現在的人工模型大多都不是直接拿像素來作為輸入 ![image](https://hackmd.io/_uploads/H1_6MLwbgl.png) 1. 會先將輸入的圖片切成一塊一塊的patch 2. 會將每個patch透過Encoder進行壓縮,可以將每個patch看成一個token。 3. 將patch拉直 4. 丟給人工模型 而生成影像時則是透過以下步驟 ![image](https://hackmd.io/_uploads/r1mWQ8vZel.png) 1. 逆向時則是由Pathc開始 2. 透過Decoder將Patch變回照片 ## 人工智慧如何看影片 * 當然可以將影片變成一張張的圖片,將每張圖片透過上面的步驟變成一堆token ![image](https://hackmd.io/_uploads/H13FmLwbxe.png) * 但是影片是有時間維度的,因此也可以在時間為肚上壓縮,例如將frame 1跟frame 2進行壓縮,我們也可以[使用另一個Encoder來完成](https://arxiv.org/abs/2103.15691)時間壓縮這件事情。 ![image](https://hackmd.io/_uploads/r1PBVLPbex.png) * 因此整體流程會長得像這樣,這就是現今人工智慧看影片的方法。對神經模型來說,影片就是一排patch。 ![image](https://hackmd.io/_uploads/rk6BI8wblg.png) ## 文字生圖 以文字生圖為開始,再漸漸推廣到文字生成影片。 1. 我們要為文字生圖準備相應的資料,因此我們需要準備圖片(這邊講的圖片都已經是轉為Patch的圖片)與其對應的文字。 ![image](https://hackmd.io/_uploads/ByDedLDZlx.png) 2. 透過文字與圖片,我們可以使用一個Transformer去產生文字與圖片的關係 ![image](https://hackmd.io/_uploads/H1v7dIwZgg.png) 3. 但是我們先前有講過AR的問題,因此會選用NAR來平行生成,典型的NAR應該會長得像這樣,不同pixel之間平行生成 ![image](https://hackmd.io/_uploads/HkgQCuIvWee.png) 4. 但實際上生成時,我們會將所有需要生成的pixel全部丟給Transformer,因此各pixel之間還是因為生成時的Attention而有一些關聯性。但是單純這樣操作,還是無法完全解決模型腦補不同步的狀況。 ![image](https://hackmd.io/_uploads/B1MXFUDZex.png) ## 評量影像生成的好壞 * 最好的評斷當然是由人評斷,但人的時間有限 * 因此[CLIP](https://arxiv.org/abs/2103.00020)是一個用於評分的模型 * CLIP的輸入是照片與文字敘述,如果匹配就給予高分,不匹配就給低分 * 訓練時給予的敘述與照片匹配,就要給高分的輸出 ![image](https://hackmd.io/_uploads/rkiNcUvZlx.png) * 如果隨機匹配的照片與文字,則要輸出低分 ![image](https://hackmd.io/_uploads/By0OqIPWgx.png) * 因此訓練生成結果時方法就是將輸入與模型輸出的照片給予CLIP,就可以得到生成的好壞 ![image](https://hackmd.io/_uploads/S17JsIPbll.png) ## 客製化圖片生成模型 [Src](https://arxiv.org/abs/2208.01618) * 我們可以用一個不常用的符號來代表要客製化(學習)的物體,例如將下面這張照片中的雕塑稱為`S*`。 ![image](https://hackmd.io/_uploads/S1vAi8wZlg.png) * 要用不常用的符號是為了避免意義的汙染,例如用狗就會將狗與這個雕塑搞混 * 透過學習,就可以學會了`S*`這個物件 ![image](https://hackmd.io/_uploads/rk-Ih8Dbex.png) ## 文字生影片的挑戰 * 兩者本質上沒有什麼不同,都是產生一大堆的Patch ![【生成式AI導論 2024】第17講:有關影像的生成式AI (上) — AI 如何產生圖片和影片 (Sora 背後可能用的原理) 38-14 screenshot](https://hackmd.io/_uploads/HyJh3UPbex.png) * 但是假設每個frame有64\*64個patches,一分鐘的24fps影片就有1440個frame,共有600萬個patch。因此所有patch間都要做Attention,因此會要做36兆次Attention ### 改造Attention * 第一個frame左上角的patch會跟最後一個frame左下角的patch相關嗎?也許我們根本不用計算這麼多的Attention * 因此我們要改良Attention的方法,減少Attention計算的次數 * 影片Attention的方法可以分為![image](https://hackmd.io/_uploads/SJiP0UD-ee.png) * Spatio-temporal Attention(3D): 使用原始Attention概念,所有frame的所有patch都做Attention * Spatial Attention(2D): 只做單一個frame中的所有patch做Attention,至少可以保證產生的單一frame沒有問題。 * Temporal Attention(1D): 只做同個pathc在不同時間的Attention。考慮時間,但是缺乏了同個平面的資訊 * 而現在影片生成大多採用了兩者交替使用,把2D和1D疊再一起交替使用,就可以製造出偽3D的Attention。![image](https://hackmd.io/_uploads/B14GkPvblx.png) ### 將生成分步驟進行 * 可以將生成影片的任務切成幾個步驟進行![image](https://hackmd.io/_uploads/S1gkGvw-lg.png) * 例如 * v1>v2專注於解析度提高![image](https://hackmd.io/_uploads/HyJeMPP-ee.png) * v2>v3專注於幀率提高![image](https://hackmd.io/_uploads/rJ-bfvPWxg.png) * Google的[Imagen Video](https://arxiv.org/abs/2210.02303)就是採取這樣的,提高解析度、提高幀數一步一步去進行![image](https://hackmd.io/_uploads/BkMUMPDWgg.png) ## 補充資料 * [語言模型如何將影像當成輸入](https://arxiv.org/abs/2405.17247) * [Diffusion Model怎麼產生影片](https://arxiv.org/abs/2405.03150)