InstructPix2Pix: 動動嘴皮子,超越PS
摘要:InstructPix2Pix提出了一種使用文本編輯圖像的方法:給定輸入圖像和編輯指令,告訴模型要做什麼,模型將遵循這些指令來編輯圖像。
本文分享自華為雲社區《InstructPix2Pix: 動動嘴皮子,超越PS》,作者:杜甫蓋房子。
InstructPix2Pix: Learning to Follow Image Editing Instructions
InstructPix2Pix提出了一種使用文本編輯圖像的方法:給定輸入圖像和編輯指令,告訴模型要做什麼,模型將遵循這些指令來編輯圖像,如:

我們在ModelArts中發佈了一個notebook方便大家玩一玩,同時也將對模型的實現方法進行簡單介紹:

方法概覽
在InstructPix2Pix中,作者通過有監督的方法來實現文本編輯圖像。方法主要包括兩部分:
- 數據集生成:作者整合了語言模型GPT-3和文生圖模型Stable Diffusion,生成了一個用於圖像編輯的數據集;
- 模型訓練:作者使用生成的數據集訓練了一個條件擴散模型來實現文本編輯圖像:

在推理時,圖像在模型forward過程中被編輯,不需要微調,因此推理速度很快,可玩性較高。
數據準備
在數據準備時,首先通過GPT-3生成一些文本編輯指令,之後通過Stable Diffusion和Prompt-to-Prompt生成編輯前後文本圖像對。
生成文本編輯指令
作者使用了700條人工標註的文本編輯指令三元組微調GPT-3,之後使用微調過的GPT-3生成大規模的文本三元組。如下圖,文本三元組包括(1)輸入描述;(2)編輯指令;(3)編輯後的描述。
在使用GPT-3生成數據集時只需提供輸入描述,高亮的編輯指令與輸出描述都由GPT-3生成,這樣可以保證描述指令的多樣性。

生成圖像對
在得到描述對後,作者使用Stable Diffusion將編輯前與編輯後的描述轉換成圖像對。在這個過程中面臨了一個挑戰:即使輸入提示只有微小的不同,生成的圖像也無法保證內容的一致性,如分別使用“photograph of a girl riding a horse”和“photograph of a girl riding a dragon”為提示生成圖像,會得到下圖內容:

為了解決此問題,作者使用了Prompt-to-Prompt方法。該方法通過在擴散過程中注入原始圖像的注意力圖來控制編輯圖像的注意力映射,實現了內容一致的圖像生成。使用該方法與相同的提示詞,會得到下圖內容:

作者共生成 454,445 個樣本,生成的數據可以通過開源腳本下載。
條件擴散模型
InstructPix2Pix通過訓練條件擴散模型來實現根據輸入圖像和文本指令來編輯圖像的功能。作者使用預訓練的Stable Diffusion對模型進行初始化,同時在第一個卷積層增加了額外的條件通道來支持圖像編輯。在訓練時模型將輸入圖像xx編碼為隱向量z=E(x)z=E(x),在擴散過程中將噪聲tt添加到編碼向量zz中得到隱噪聲變量ztzt,其中噪聲等級隨時間提升。
訓練一個網絡ϵθϵθ來預測在給定的圖像條件cIcI和文本指令cTcT下的噪聲tt,目標函數:

為了平衡擴散模型生成的樣本的質量和多樣性,作者在InstructPix2Pix中引入了Classifier-free Guidance方法。當我們使用一個條件來生成圖像時,我們希望生成的圖像與該條件有較高的相關性,Classifier-free Guidance利用一個隱式分類器 pθ(c∣zt)pθ(c∣zt) 來對生成的樣本進行評分。其中,ztzt是一個編碼圖像的潛在表示,cc是一個條件,可以是一個文本描述或者其他圖像。這個分類器會對每個樣本分配一個相應的分數,表示該樣本與給定條件的相關性。訓練時,會通過噪聲引導使概率偏向那些隱式分類器得分高的數據點上,從而提高生成的樣本與給定條件的相關性。
對於文本編輯圖像任務,作者設計了評分網絡 eθ(zt,cI,cT)eθ(zt,cI,cT),對於圖像條件cIcI和文本指令cTcT設計了指導尺度sIsI和sTsT,可以調整網絡對輸入圖像和編輯指令的遵循程度:

針對不同的指導尺度作者給出了示例實驗結果:

更多實驗結果與侷限性討論可以在Project Page中查看。
案例介紹
上文提到,為了方便大家玩一玩,我們ModelArts中發佈了一鍵運行的notebook,除了可以免去複雜的環境適配步驟外,還可以享受免費GPU資源
開源模型下載好慢好慢,體貼的我也為大家將資源轉存到OBS中:

此外,預訓練模型只支持英文,哪裏有英語廢,哪裏就有翻譯,翻譯模型也準備好了,驚不驚喜,意不意外:

案例使用gradio搭建了一個小小的應用,一鍵運行後直接在應用框輸入圖片與中文編輯命令生成結果即可:

使用結束後不要忘記關閉哦:

- 使用卷積神經網絡實現圖片去摩爾紋
- 內核不中斷前提下,Gaussdb(DWS)內存報錯排查方法
- 簡述幾種常用的排序算法
- 自動調優工具AOE,讓你的模型在昇騰平台上高效運行
- GaussDB(DWS)運維:導致SQL執行不下推的改寫方案
- 詳解目標檢測模型的評價指標及代碼實現
- CosineWarmup理論與代碼實戰
- 淺談DWS函數出參方式
- 代碼實戰帶你瞭解深度學習中的混合精度訓練
- python進階:帶你學習實時目標跟蹤
- Ascend CL兩種數據預處理的方式:AIPP和DVPP
- 詳解ResNet 網絡,如何讓網絡變得更“深”了
- 帶你掌握如何查看並讀懂昇騰平台的應用日誌
- InstructPix2Pix: 動動嘴皮子,超越PS
- 何為神經網絡卷積層?
- 在昇騰平台上對TensorFlow網絡進行性能調優
- 介紹3種ssh遠程連接的方式
- 分佈式數據庫架構路線大揭祕
- DBA必備的Mysql知識點:數據類型和運算符
- 5個高併發導致數倉資源類報錯分析