【深度學習】PuLID: Pure and Lightning ID Customization via Contrastive Alignment

論文:https://arxiv.org/abs/2404.16022
代碼:https://github.com/ToTheBeginning/PuLID

文章目錄

  • Abstract
  • Introduction
  • Related Work
  • Methods

Abstract

我們提出了一種新穎的、無需調整的文本生成圖像ID定制方法——Pure and Lightning ID customization(PuLID)。通過將Lightning T2I分支與標準擴散分支結合,PuLID引入了對比對齊損失和準確ID損失,最大程度地減少了對原始模型的干擾,確保了高ID保真度。實驗表明,PuLID在ID保真度和可編輯性方面都表現出色。PuLID的另一個吸引人的特性是,在插入ID前后,圖像的元素(例如背景、光照、構圖和風格)盡可能保持一致。代碼和模型將會發布在https://github.com/ToTheBeginning/PuLID。

Introduction

作為一種特定類別的定制化文本生成圖像(T2I)方法【5, 30, 12, 17, 40, 42】,身份(ID)定制允許用戶適配預訓練的T2I擴散模型,以符合他們的個性化ID。一類方法【5, 30, 12, 17】通過在用戶提供的同一ID的若干圖像上微調某些參數,從而將ID嵌入到生成模型中。這些方法催生了許多流行的AI肖像應用程序,如PhotoAI和EPIK。

盡管基于微調的解決方案取得了可觀的成果,但每個ID的定制需要耗費數十分鐘的微調時間,因此使個性化過程經濟成本較高。另一類方法【41, 42, 2, 36, 20, 19, 38】則放棄了每個ID微調的必要性,轉而在一個龐大的肖像數據集上預訓練一個ID適配器【11, 24】。這些方法通常利用編碼器(例如CLIP圖像編碼器【27】)提取ID特征。然后,將提取的特征以特定方式(例如嵌入到交叉注意力層中)整合到基礎擴散模型中。盡管這些無需微調的方法效率極高,但面臨兩個顯著挑戰。

  • ID插入會破壞原始模型的行為。一個純粹的ID信息嵌入應具有兩個特征。首先,理想的ID插入應僅改變與ID相關的方面,如面部、發型和膚色,而與特定身份不直接相關的圖像元素,如背景、光照、構圖和風格,應該與原始模型的行為保持一致。據我們所知,以前的工作并未關注這一點。盡管一些研究【42, 38, 20】展示了生成風格化ID的能力,但與ID插入前的圖像相比,風格明顯退化(如圖1所示)。具有較高ID保真度的方法往往會導致更嚴重的風格退化。

其次,在ID插入后,仍應保持原始T2I模型遵循提示的能力。在ID定制的背景下,這通常意味著能夠通過提示改變ID屬性(例如年齡、性別、表情和發型)、方向和配件(例如眼鏡)。為了實現這些特性,目前的解決方案通常分為兩類。第一類涉及增強編碼器。IPAdapter【42, 1】從早期版本的CLIP提取網格特征轉向利用面部識別骨干【4】提取更抽象和相關的ID信息。盡管編輯性有所改善,但ID保真度還不夠高。InstantID【38】通過包括一個額外的ID和標志控制網【43】來進行更有效的調節。盡管ID相似性顯著提高,但卻犧牲了一定程度的編輯性和靈活性。第二類方法【20】通過構建按ID分組的數據集支持非重建訓練以增強編輯性;每個ID包含若干圖像。然而,創建這樣的數據集需要付出巨大的努力。而且,大多數ID對應于有限數量的名人,這可能會限制其對非名人的效果。

  • 缺乏ID保真度。考慮到我們對面部的高度敏感性,在ID定制任務中保持高度的ID保真度至關重要。受GAN時代【7】面部生成任務【29, 39】成功經驗的啟發,提高ID保真度的一個直接想法是在擴散訓練中引入ID損失。然而,由于擴散模型的迭代去噪特性【10】,實現準確的x0需要多個步驟。以這種方式訓練所消耗的資源可能高得令人望而卻步。因此,一些方法【2】直接從當前時間步預測x0,然后計算ID損失。然而,當當前時間步較大時,預測的x0往往嘈雜且有缺陷。在這種條件下計算ID損失顯然不準確,因為面部識別骨干【4】是在照片級真實感圖像上訓練的。盡管提出了一些變通方法,如僅在噪聲較小的時間步計算ID損失【25】或通過額外的推理步驟預測x0【45】,但仍有改進空間。

在這項工作中,為了在減少對原始模型行為影響的同時保持高ID保真度,我們提出了PuLID,一種通過對比對齊實現的純粹和快速的ID定制方法。具體而言,我們引入了一個Lightning T2I分支以及標準擴散去噪訓練分支。利用最近的快速采樣方法【23, 32, 21】,Lightning T2I分支可以在有限且可控的步驟內從純噪聲生成高質量圖像。通過這個額外的分支,我們可以同時解決上述兩個挑戰。首先,為了最小化對原始模型行為的影響,我們構建了一個對比對,其中包括相同提示和初始潛在變量,有和沒有ID插入。在Lightning T2I過程中,我們在語義上對齊對比對的UNet特征,指導ID適配器如何插入ID信息而不影響原始模型的行為。其次,由于我們現在在ID插入后有了精確和高質量的生成x0,我們可以自然地提取其面部嵌入并與真實面部嵌入計算準確的ID損失。值得一提的是,這種x0生成過程與實際測試環境一致。我們的實驗表明,在這種情況下優化ID損失可以顯著提高ID相似性。

貢獻總結如下:(1) 我們提出了一種無需調整的方法,即PuLID,在減輕對原始模型行為影響的同時保持高ID相似性。(2) 我們引入了一個Lightning T2I分支和常規擴散分支。在這個分支中,我們結合了對比對齊損失和ID損失,以最小化ID信息對原始模型的污染,同時確保保真度。與當前主流方法提高ID編碼器或數據集相比,我們提供了新的視角和訓練范式。(3) 實驗表明,我們的方法在ID保真度和可編輯性方面實現了SOTA性能。此外,與現有方法相比,我們的方法對模型的ID信息侵擾較少,使得我們的方法在實際應用中更加靈活。

Related Work

基于微調的文本生成圖像ID定制。文本生成圖像模型的ID定制旨在使預訓練模型能夠生成特定身份的圖像,同時遵循文本描述。兩個開創性的基于微調的工作【5, 30】努力實現這一目標。Textual Inversion【5】為用戶提供的ID優化了一個新的詞嵌入,而Dreambooth【30】則通過微調整個生成器進一步增強了保真度。隨后,各種方法【12, 17, 8, 35】在生成器和嵌入空間探索了不同的微調范式,以實現更高的ID保真度和文本對齊。盡管這些進展顯著,但每個ID的耗時優化過程(至少需要幾分鐘)限制了其更廣泛的應用。

無需微調的文本生成圖像ID定制。為了減少在線微調所需的資源,一系列無需微調的方法【36, 38, 25, 42, 20, 41, 3】應運而生,這些方法直接將ID信息編碼到生成過程中。這些方法面臨的主要挑戰是,在保持高ID保真度的同時,盡量減少對T2I模型原始行為的干擾。為了最小化干擾,一個可行的方法是使用面部識別模型【4】提取更抽象和相關的面部領域特定表示,就像IP-Adapter-FaceID【1】和InstantID【38】所做的那樣。包含同一ID的多張圖像的數據集可以促進共同表示的學習【20】。盡管這些方法取得了一定的進展,但它們還沒有從根本上解決干擾問題。值得注意的是,ID保真度較高的模型往往會對原始模型的行為造成更大的干擾。在本研究中,我們提出了一種新的視角和訓練方法來解決這一問題。有趣的是,該方法不需要按ID分組的數據集,也不局限于特定的ID編碼器。

為了提高ID保真度,以前的工作【16, 2】使用了ID損失,這一做法受到了先前基于GAN的工作【29, 39】的啟發。然而,在這些方法中,通常在當前時間步使用單一步驟直接預測x0,這往往會導致嘈雜和有缺陷的圖像。這些圖像對于面部識別模型【4】來說并不理想,因為它們是在真實世界的圖像上訓練的。PortraitBooth【25】通過僅在噪聲較小的階段應用ID損失來緩解這一問題,但這忽略了早期步驟中的損失,從而限制了其整體有效性。Diffswap【45】通過使用兩步而不是一步來獲得更好的預測x0,盡管這種估計仍然包含嘈雜的偽影。在我們的工作中,通過引入Lightning T2I訓練分支,我們可以在更準確的設置中計算ID損失。

我們注意到一個同時進行的工作LCM-Lookahead【6】,它也使用了快速采樣技術(即LCM【23】)來實現更精確的x0預測。然而,該工作與我們的工作有幾個不同之處。首先,LCM-Lookahead在傳統的擴散去噪過程中對x0進行精確預測,而我們從純噪聲開始,迭代去噪到x0。我們的方法與實際測試設置更一致,使得ID損失的優化更加直接。其次,為了增強提示編輯能力,LCM-Lookahead利用了SDXL-Turbo【32】的模式崩潰現象來合成一致的ID數據集。然而,合成的數據集可能面臨多樣性和一致性挑戰,作者發現,使用該數據集訓練可能比其他方法更頻繁地產生風格化結果。相比之下,我們的方法不需要按ID分組的數據集。相反,我們通過一種更基礎和直觀的方法,即對比對齊,來增強提示跟隨能力。

擴散模型的快速采樣。在實踐中,擴散模型通常在1000步內進行訓練。在推理過程中,這種冗長的過程可以借助高級采樣方法【33, 22, 15】縮短到幾十步。最近基于蒸餾的工作【21, 23, 32】進一步將這一生成過程加速到10步以內。其核心動機是指導學生網絡對齊與基礎教師模型更遠的點。在本研究中,我們引入的Lightning T2I訓練分支利用了SDXL-Lightning【21】加速技術,從而使我們能夠在僅4步內從純噪聲生成高質量圖像。

Methods

在這里插入圖片描述
圖2:PuLID框架概述。框架的上半部分展示了傳統的擴散訓練過程。從同一圖像中提取的面部用作ID條件 ( C_{\text{id}} )。框架的下半部分展示了本研究中引入的Lightning T2I訓練分支。該分支利用了最新的快速采樣方法,通過幾步迭代去噪從純噪聲生成高質量圖像(本文中為4步)。在這個分支中,我們構建了有ID注入和無ID注入的對比路徑,并引入了對齊損失,以指導模型如何在不破壞原始模型行為的情況下插入ID條件。由于該分支可以生成照片級真實感圖像,這意味著我們可以實現更準確的ID損失優化。

在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23617.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信好友朋友圈的三天、半年可見怎么破?方法拿走不謝

『Code掘金』問大家,有沒有這種經歷,當你想去翻某人的朋友圈時,對方設置成了3天可見,之前的內容沒法看到了。 不過沒關系!今天『Code掘金』給大家分享一款導出朋友圈的工具,讓大家留住痕跡。 WechatMomen…

PostgreSQL中有沒有類似Oracle的dba_objects系統視圖

PostgreSQL中有沒有類似Oracle的dba_objects系統視圖 在PostgreSQL中,沒有一個完全集成了所有對象信息的視圖(類似于Oracle中的DBA_OBJECTS)。但是,PostgreSQL提供了一些系統目錄表和視圖,可以用來獲取數據庫對象的信…

初探沁恒CH32V307VCT6評估板 1-1外部中斷EXTI

旋轉編碼器計次 1,創建 .C .H 文件 Count_Sonser.c Count_Sonser.h 2,包含頭文件 #include "ch32v30x.h" //#include "debug.h" #include "Count_Sonser.h" 注意:如果不包含第一第二個頭文件uint、int這…

如何掌握 Java 正則表達式 的基本語法及在 Java 中的應用

正則表達式是一種用于匹配字符串的模式,在許多編程語言中廣泛使用。Java 正則表達式提供了強大的文本處理能力,能夠對字符串進行查找、替換、分割等操作。 一、正則表達式的基本語法 正則表達式由普通字符和特殊字符組成。普通字符包括字母、數字和標點…

通過 echo 命令向 /sys/class/gpio/export 寫入一個GPIO編號,但遇到 “Device or resource busy

通過 echo 命令向 /sys/class/gpio/export 寫入一個GPIO編號,但遇到 "Device or resource busy" 錯誤時,這通常意味著該GPIO引腳已經被其他驅動或用戶空間程序導出并使用了。 要解決這個問題,可以嘗試以下步驟: 檢查GP…

SpEL表達式使用方法

1 SpEL簡介 SpEL(Spring Expression Language)是一種用于在Spring框架中進行數據綁定和執行業務邏輯的表達式語言。Spring EL提供了一種簡潔、靈活和強大的方式來訪問對象的屬性、調用方法、執行運算和邏輯判斷等操作。 官方文檔:https://d…

C# 多線程:并發編程的利器

在現今日益復雜的軟件開發環境中,多線程編程已經成為提升應用程序性能和響應速度的關鍵技術。C# 作為一種現代、功能強大的編程語言,提供了豐富的多線程支持,使開發者能夠充分利用多核處理器和并行計算的優勢。本文將深入探討C#中的多線程編程…

網絡協議三

數據中心 一、DNS 現在網站的數目非常多,常用的網站就有二三十個,如果全部用 IP 地址進行訪問,恐怕很難記住 根 DNS 服務器 :返回頂級域 DNS 服務器的 IP 地址 頂級域 DNS 服務器:返回權威 DNS 服務器的 IP 地址 …

匯凱金業:貴金屬交易規則有哪些

貴金屬投資目前非常火熱,許多投資者從中獲得了可觀的收益。新手投資者在進入貴金屬市場及其交易之前,務必要了解清楚貴金屬的交易規則。了解規則和差異能幫助新手更好地進行貴金屬投資交易。下面我們以現貨類貴金屬為例,詳細說明貴金屬的交易…

一周學會Django5 Python Web開發 - Django5內置Auth認證系統-用戶修改密碼實現

鋒哥原創的Python Web開發 Django5視頻教程: 2024版 Django5 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili2024版 Django5 Python web開發 視頻教程(無廢話版) 玩命更新中~共計59條視頻,包括:2024版 Django5 Python we…

關于在 Ubuntu 下安裝配置和調優 FTP 服務器

今天我在阿貝云的免費服務器上部署測試FTP服務器,這個阿貝云真是個不錯的免費云服務器啊,配置雖然不高,但完全足夠搭建一個FTP服務器使用了。1核CPU、1G內存、10G硬盤、5M帶寬,對我這個喜歡折騰的家伙來說可太好用了。 首先,讓我簡單介紹下今天要用到的FTP服務器軟…

Mybatis雜記

group by查詢返回map類型 1,2 List<Map<String, Object>> getCount();xml: <select id"getCount" resultType"java.util.HashMap">SELECT company_id, ifnull(sum(count_a count_b),0) ctFROM test.com_countWHERE is_del 0 GROUP BY…

天氣數據集2-應用RNN做天氣預測

二、用循環神經網絡做天氣(溫度)預測 本項目是基于Pytorch的 RNN&GRU模型&#xff0c;用于預測未來溫度 數據集: https://mp.weixin.qq.com/s/08BmF4RnnwQ-jX5s_ukDUA 項目代碼: https://github.com/disanda/b_code/tree/master/Weather_Prediction RNN 模型本質是用于預…

MySQL(四)查詢

1、MySQL限性約束 —非空、唯一(自增)、主外鍵、檢查(MySQL存在但是不能用)。 約束主要完成對數據的校驗,保證數據庫數據的完整性;如果有相互依賴數據,保證該數據不被刪除。 1)常用五類約束 not null :非空約束,指定某列不為空。 unique:唯一約束,指定某列和幾列組…

基于springboot的-倉庫 管理系統【附:資料?文檔】

前言&#xff1a;我是源碼分享交流Coding&#xff0c;專注JavaVue領域&#xff0c;專業提供程序設計開發、源碼分享、 技術指導講解、各類項目免費分享&#xff0c;定制和畢業設計服務&#xff01; 免費獲取方式--->>文章末尾處&#xff01; 項目介紹&#xff1a; 管理員…

【VUE】el-table表格 實現滾動到底部加載更多數據

廢話不多說&#xff0c;直接上代碼 <template></template>部分代碼 <!-- 表格 --> <el-tableid"mytable"v-loading"listLoading"highlight-current-rowrow-key"project_id":data"tableData"border:reload"…

java中的三種拷貝方法

在Java編程中&#xff0c;理解深拷貝&#xff08;Deep Copy&#xff09;、淺拷貝&#xff08;Shallow Copy&#xff09;和引用拷貝&#xff08;Reference Copy&#xff09;是非常重要的。這三種拷貝方式涉及對象復制和內存管理。以下是對它們的詳細解釋&#xff1a; 1. 引用拷…

數字IC后端物理驗證PV | TSMC 12nm Calibre Base Layer DRC案例解析

基于TSMC 12nm ARM A55 upf flow后端設計實現訓練營將于6月中旬正式開班&#xff01;小班教學&#xff01;目前還有3個名額&#xff0c;招滿為止&#xff01;有需要可以私信小編 ic-backend2018報名。吾愛IC社區所有訓練營課程均為直播課&#xff01; 這個課程支持升級成雙核A…

服務器禁止密碼登陸

轉載請標明出處&#xff1a;https://blog.csdn.net/donkor_/article/details/139444224 文章目錄 一、前言二、編輯sshd_config文件三、重啟服務四、總結 一、前言 復雜的密碼&#xff0c;登陸服務器的時候&#xff0c;也是很不方便的。并且頻繁登陸&#xff0c;暴露給外界&am…

事件總線vueEvent

一個組件結束后要更新另一個組件數據&#xff0c;但是另一個組件和這個組件沒有上下級關系 在 Vue 中&#xff0c;非父子組件之間進行通信通常需要使用事件總線或者其他的全局事件管理器。在你的代碼片段中&#xff0c;vueEvent 似乎是一個事件總線對象&#xff0c;通過 emit 方…