# 李宏毅_生成式導論 2024_第17講:有關影像的生成式AI (上) — AI 如何產生圖片和影片 (Sora 背後可能用的原理) ###### tags: `Hung-yi Lee` `NTU` `生成式導論 2024` [課程撥放清單](https://www.youtube.com/watch?v=AVIKFXLCPY8&list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI) ## 第17講:有關影像的生成式AI (上) — AI 如何產生圖片和影片 (Sora 背後可能用的原理) [課程連結](https://www.youtube.com/watch?v=5H2bVEmYDNg&list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI&index=18) ### 與影像有關的生成式AI ![image](https://hackmd.io/_uploads/H1Gf67pVA.png) 影像相關的生成式AI大致有兩種,一種就是給定影像或是影片,然後由生成式AI生成文字說明。另一種則是給定條件,然後由生成式AI生成影像或是影片。 ### 與影像有關的生成式AI ![image](https://hackmd.io/_uploads/Hkn4pQpNR.png) 簡報上的範例就是給定照片,然後讓生成式AI生成文字描述。 ### 與影像有關的生成式AI ![image](https://hackmd.io/_uploads/HkzKTXTVR.png) 如果你真的要模型回答誰帥的話,它還是會說,而且說話技巧很不錯,好人卡,發。 ### 生成影像的生成式AI - 文字生影像 ![image](https://hackmd.io/_uploads/HJHvRX6EA.png) 課程會關注在給定條件的情況下讓模型生成影像或是影片。 目前最火熱的大概就是OpenAI發佈出來的Sora,不過目前並沒有真的開放使用就是。 ### 生成影像的生成式AI - 文字生影像(Sora) ![image](https://hackmd.io/_uploads/ryJ3Am6ER.png) ![image](https://hackmd.io/_uploads/SJa9JET4C.png) 這是Sora生成的範例,看課程中放出來的影片真的蠻驚人的,雖然細節上還是有點小問題就是。 ### 生成影像的生成式AI - 影像生影像 ![image](https://hackmd.io/_uploads/B1nleNpVR.png) 除了文字生成影像之外,也可以用影像來生影像,大致幾種: 1. 給定幾個frame,讓模型補完影片 2. style transfer 3. 畫質提升 ### 生成影像的生成式AI - 其他輸入生影像 ![image](https://hackmd.io/_uploads/HJ3YlE6N0.png) [參考論文_AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation](https://arxiv.org/abs/2403.17694) 另一種目前常見的方式就是使用Talking Head,在給定一段語音跟照片之後,模型會讓你的照片嘴巴動起來,就像照片中的人物在唸這段話的樣子。 ### 生成影像的生成式AI - 其他輸入生影像 [參考論文_Adding Conditional Control to Text-to-Image Diffusion Models](https://arxiv.org/abs/2302.05543) 這邊說明的是,給定一個草稿,讓模型幫忙補完。照片的第一個row是草稿,然後向下就是各草稿由模型補完的狀況。 這模型就是知名的ControlNet。 ### 圖片是由像素所構成 ![image](https://hackmd.io/_uploads/rJVq-VT4R.png) 繼續說下去之前,先來複習一下功課。 圖片是由像素所構成,像素愈多圖片愈清晰。簡報中左右圖很明顯的看的出差異。 ### 影片是由一張一張圖片所構成 ![image](https://hackmd.io/_uploads/SyRefVa4C.png) 像素構成圖片,多張圖片再構成影片,影片中的每一張圖片又稱為frame,中文為幀,fps指的就是每秒幀數。 ### 今日的人工智慧如何看影像 ![image](https://hackmd.io/_uploads/ry_mo_RN0.png) [參考論文_Masked Autoencoders Are Scalable Vision Learners](https://arxiv.org/abs/2111.06377) 最開始的作法也許是直接以像素提供給予機器,但這樣的作法真的太不行了,所以後來的作法會將照片經過編碼,可能會將一個64x64的照片先切割成4x4,然後經過編碼器之後再展開變成一個一維向量。 切割成4x4的每一個區域又稱為patch。 解碼器的部份則是以編碼展開後的一維向量做為輸入再還原回64x64的照片。 ### 今日的人工智慧如何看影像 ![image](https://hackmd.io/_uploads/rJ213dCN0.png) [參考論文_ViViT: A Video Vision Transformer](https://arxiv.org/abs/2103.15691) 影片的概念是差不多,差別在於,影像的部份單純的考慮長寬,而影片的部份則是多了一個時間維度。 所以在作法上可以將相鄰的frame合成一組,然後再做一次編碼再縮壓一次,最後再展平成一個一維向量。 ### 今日的人工智慧如何看影像 雖然openai沒有明著說,不過sora也許也是用著類似的技術。 ### 以文字生圖為例 ![image](https://hackmd.io/_uploads/ByWxCOC4R.png) 以文字生圖為例,我們就是希望模型可以看到一段文字然後生成對應的圖片。 ### 以文字生圖為例 ![image](https://hackmd.io/_uploads/r1wO0_04C.png) [開源資料集](https://laion.ai/blog/laion-5b) 目前來說已經有不少開源資料集可以提供我們做這類的模型訓練。 教授特別提到,laion特別說明,他們只有搜集資料,但這些資料他們是沒有所有權的,所以拿去訓練之後的法律風險就是自負的概念? ### 以文字生圖為例 ![image](https://hackmd.io/_uploads/ByiNyYAV0.png) 我們已經知道,圖片會被編碼器編碼成patch,然後展開變成一維向量。 也許搭配transformer的作法就是讓模型像文字接龍一樣把patch一個一個接出來。不過文字生圖很少用這種方式來處理就是。 這種文字接龍的作法也稱為Auto-Regressive。 ### 以文字生圖為例 ![image](https://hackmd.io/_uploads/SyGFeKCNR.png) 先前的課程中提過,文字生圖的部份一般我們會採用Non Auto-Regressive將所有的patch一次生成。 這是個概念說明圖,後面說明實際處理方式。 ### 以文字生圖為例 ![image](https://hackmd.io/_uploads/r1gH-F0E0.png) 實務上,如果我們要生成16個patch,那我們會讓transformer一開始就知道就是要生成16個patch,讓模型可以一次性的生成這16個patch。 這樣的作法多多少少還是可以利用到transformer內的attention,不至於讓各patch之間的生成毫無關聯。 不過即使如此還是無法完全避掉腦補問題就是,這下一堂課會有說明。 ### 如何評量影像生成的好壞 ![image](https://hackmd.io/_uploads/HJDdMYRNC.png) [參考論文_Learning Transferable Visual Models From Natural Language Supervision](https://arxiv.org/abs/2103.00020) 評量影像生成的好壞,雖然人才是最好的評分老師,不過人的時間實在有限,這種事還是交給機器來做。 大致作法就是,讓模型CLIP學習文字與影像的pair,當這個pair是正確的情況下就是給予高分,然後再讓影像跟其它的文字配對,給予低分。 ### 如何評量影像生成的好壞 ![image](https://hackmd.io/_uploads/Sy_pztA4C.png) 基本上CLIP是開源模型,所以現在不少生成模型都是拿CLIP來做為衡量工具,稱為CLIK Score。 ### 一張圖勝過千言萬語 ![image](https://hackmd.io/_uploads/H1wS7tR4C.png) ![image](https://hackmd.io/_uploads/ryyLXY04C.png) 這邊是教授感概,很多圖是文字難以描述,圖右是教授家的鐘,希望利用文字描述讓模型生成一樣的,不過,人生好難。 生命總是會自己找到出路。 ### 個人化的圖像生成 ![image](https://hackmd.io/_uploads/ByMuEFA4R.png) [參考論文_An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion](https://arxiv.org/abs/2208.01618) [參考論文_DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generationn](https://arxiv.org/abs/2208.12242) 如果我們真的希望可以個人化一些影像生成,我們可以拿一些平常沒有在用的符號,簡報範例為『S*』,來做為你希望個人化的影象。 接著讓文字生圖模型知道,只要你提到『S*』就是要生成你的個人化影像。 ### 個人化的圖像生成 ![image](https://hackmd.io/_uploads/BJia4FRN0.png) [參考論文_An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion](https://arxiv.org/abs/2208.01618) 根據參考論文中所述,只需要三到五張的各種不同角度的照片來微調模型,讓模型知道『S*』就是這個人化的照片,然後可以利用『S*』這個關鍵字來做各種生成。 ### 文字生影片的挑戰 ![image](https://hackmd.io/_uploads/SJ35A61r0.png) 本質上文字生影片跟文字生圖是差不多的,只是生成的是一大塊的patch。 生成影片的困難點在於簡報上所說明的那樣,每一分鐘要生成的patch大約有600萬個,而因為transformer中的self-attention,這兩兩之間的注意力計算就有600萬平方,也就是大約36兆次的計算。 ### 文字生影片的挑戰 ![image](https://hackmd.io/_uploads/SJJhyCJrC.png) ![image](https://hackmd.io/_uploads/rktkgCyrC.png) 也因為計算量真的太大了,所以目前的研究都是在於怎麼減化計算量。 上面簡報給的三種是不同的計算邏輯: * 3D:各patch、frame一起考慮 * 2D:不管前後frame,只自己frame的patch * 1D:只考慮時間維度的資訊,沒有空間維度的資訊 很明顯的,每一種都有它的缺點,最好的作法就是通通喇在一起。 ### 文字生影片的挑戰 ![image](https://hackmd.io/_uploads/rkX4eAkr0.png) 喇在一起之後的計算量很明顯的相差千倍。 ### 文字生影片的挑戰 ![image](https://hackmd.io/_uploads/ryrKeR1SC.png) 減少計算的方式還有一種,就是逐步的生成。 ### 文字生影片的挑戰 ![image](https://hackmd.io/_uploads/By8LWA1rR.png) [論文參考_Imagen Video: High Definition Video Generation with Diffusion Models](http://arxiv.org/abs/2210.02303) Imagen Video就是採用類似的作法。其中框框內的文字16x40x24表示,16個frames,40x24的長寬,然後3fps。 模型從一個很小很簡單的生成開始然後逐步的放大。 ### 延伸閱讀 ![image](https://hackmd.io/_uploads/BJCwb0JB0.png) ![image](https://hackmd.io/_uploads/B1Bu-0kr0.png) [論文參考_An Introduction to Vision-Language Modeling](http://arxiv.org/abs/2405.17247) [論文參考_Video Diffusion Models: A Survey](http://arxiv.org/abs/2405.03150)