Stable Diffusion Webui源碼剖析

1、關鍵python依賴

(1)xformers:優化加速方案。它可以對模型進行適當的優化來加速圖片生成并降低顯存占用。缺點是輸出圖像不穩定,有可能比不開Xformers略差。

(2)GFPGAN:它是騰訊開源的人臉修復算法,利用預先訓練號的面部GAN(如styleGAN2)中封裝的豐富多樣的先驗因素進行盲臉(blind face)修復,旨在開發用于現實世界人臉修復的實用算法。

(3)CLIP:Contrastive Language-Image Pre-Training,多模態方向的算法。可以訓練出一個可以處理圖像和文本的模型,從而使得模型可以同時理解圖像和對圖像的描述。

(4)OPEN-CLIP:一個開源的clip實現。

(5)Pyngrok:Ngrok工具的python實現,可以實現內網穿透

2、核心目錄文件

(1)sd根目錄下的repositories

存放算法源碼

1)stable-diffusion-stability-ai:sd算法

2)taming-transformers:高分辨率圖像合成算法

3)k-diffusion:擴散算法

4)CodeFormer:圖片高清修復算法

5)BLIP:多模態算法

(2)sd根目錄/models

存放模型文件

3、Gradio使用說明

【stable diffusion webui源碼解析】-界面篇ui.py - 知乎

sd是基于gradio構建的,它是python庫,僅需幾行代碼就可以構造一個html界面。

測試例子:

gr.Interface是只有左右分列的布局,它有3個輸入參數:

參數1:處理函數,根據inputs中傳入的組件按照順序對應到函數的入參

參數2:組件信息

參數3:輸出的數據類型

4、webui之模型處理流程

(1)cleanup_models函數move模型文件

將models目錄下的文件移到相關子目錄下,比如ckpt文件和safetensors文件放到Stable-diffusion子目錄下。

(2)啟動SD模型setup_model流程

該模型位于:/data/work/xiehao/stable-diffusion-webui/models/Stable-diffusion

主要是通過list_models函數遍歷所有的模型的信息并存到checkpoint_alisases中。

第1步,查看sd/models/Stable-diffusion下是否有cpkt和safetensors結尾的文件,有則放入model_list列表中,沒有則從hugginface下載模型。

第2步,通過CheckpointInfo函數檢查model_list中每個模型的checkpoint信息。如果是safetensors文件,通過read_metadata_from_safetensors讀取文件信息。Safetensors模型的參數都存放在json中,把鍵值對讀出來存放到metadata字段中。

第3步,最后把每個模型根據{id : 模型對象}的鍵值對存放到checkpoint_alisases全局變量中。

(3)啟動codeformer模型的setup_model流程

該模型位于:/data/work/xiehao/stable-diffusion-webui/models/Codeformer

主要將Codeformer初始化之后的實例放到shared.face_restorers列表中。在此過程中并沒有將模型參數裝載到Codeformer網絡中。

(4)啟動GFPGAN模型的setup_model流程

(5)遍歷并加載內置的upscaler算法

這些算法位于:/data/work/xiehao/stable-diffusion-webui/modules

遍歷該目錄下_model.py結尾的文件,通過importlib.import_module()進行加載,這一步未看到實際作用。

初始化以下放大算法[<class 'modules.upscaler.UpscalerNone'>, <class 'modules.upscaler.UpscalerLanczos'>, <class 'modules.upscaler.UpscalerNearest'>, <class 'modules.esrgan_model.UpscalerESRGAN'>, <class 'modules.realesrgan_model.UpscalerRealESRGAN'>],其中第1個沒任何算法,第2-4是img.resize()方法實現的,第5、6個需要單獨加載模型,數據都以UpscalerData格式存放,其中該對象的local_data_path存放了模型的本地地址信息。

比如:shared.sd_upscalers[5].local_data_path為:

'/data/work/xiehao/stable-diffusion-webui/models/RealESRGAN/RealESRGAN_x4plus_anime_6B.pth'

(6)加載py執行腳本load_scripts

遍歷sd根目錄/scripts下的py腳本 以及 extensions下各擴展組件的py腳本,放到scripts_list變量中,格式如下:ScriptFile(basedir='/data/work/xiehao/stable-diffusion-webui/extensions/sd-webui-controlnet', filename='processor.py', path='/data/work/xiehao/stable-diffusion-webui/extensions/sd-webui-controlnet/scripts/processor.py')

遍歷并導入scripts_list中的類型為Script或ScriptPostprocessing的py文件:

Load_module(path)加載第三方組件時可能會輸出日志信息:

?

(7)遍歷VAE模型

目前沒有裝任何vae模型

(8)加載模型load_model

Select_checkpoint()函數,獲取sd模型信息,majicmixRealistic_v4.safetensors/majicmixRealistic_v4.safetensors [d819c8be6b]

do_inpainting_hijack函數。設置PLMSSampler的p_sample_plms。關于該方法,重建圖片的反向去噪過程的每一步的圖片都應用了該方法。

get_checkpoint_state_dict函數。如果是safetensors則使用safetensors.torch.load_file加載模型參數,否則使用torch.load加載模型參數。加載到pl_sd的dict類型變量中。

?? pl_sd字典做進一步處理:如果最外層是state_dict的key,則取該key下的value。此時pl_sd下就是模型各個節點名及對應的weights值。然后替換下面的key值:

?????? find_checkpoint_config函數。先從模型目錄下找下yaml配置文件,如果沒有則執行guess_model_config_from_state_dict函數,即從模型參數中獲取模型配置,最后返回/data/work/xiehao/stable-diffusion-webui/configs/v1-inference.yaml作為配置文件,信息如下:

?????? 接著用OmegaConf.load加載yaml文件,然后通過/data/work/xiehao/stable-diffusion-webui/repositories/stable-diffusion-stability-ai/ldm/util.py(82)instantiate_from_config()加載yaml信息獲得model。具體步驟為:

步驟1,通過yaml的target信息,可以知道model為ldm.models.diffusion.ddpm的LatentDiffusion類。模型的源碼位于:sd根目錄/modules/models/diffusion/ddpm_edit.py。

?????? 步驟2,通過getattr(module的obj,class_name)獲取model的類。

load_model_weights函數,將模型參數加載到模型中。通過model.load_state_dict(state_dict, strict=False)加載。因為程序參數no_half為false,所以模型量化需要從float32變為半精度tensor,half()的時候不對vae模塊做處理。Vae模塊為model.first_stage_model部分,所以先存到一個臨時變量,half()量化完成后再賦值回去。Vae最后再單獨變為float16。然后把模型放到cuda上。

Hijack函數,處理用戶輸入的embedding信息。假如給一個初始值,通過SD會生成未知的東西,我們通過添加額外的信息(比如prompts)讓sd朝著我們想要的方向生成東西,這個就是劫持的功能,劫持是在embeddings層的。模型的embedding類為:transformers.models.clip.modeling_clip.CLIPTextEmbeddings,它的token_embeddings類為:torch.nn.modules.sparse.Embedding。

針對prompts的embedding處理類為:FrozenCLIPEmbedderWithCustomWords。約有4.9W個token。然后針對token的權重進行處理,普通單詞為1.0, 中括號則除以1.1,小括號則乘以1.1.

指定優化方法apply_optimizations,通過xformers工具優化sd模型中的CrossAttention。(跨注意力機制是一種擴展自注意力機制的技術。自注意力機制是一種通過計算查詢query、鍵key和值value之間的關聯度來為輸入序列中的每個元素分配權重的方法,而跨注意力機制則通過引入額外的輸入序列來融合兩個不同來源的信息以實現更準確的建模)。

load_textual_inversion_embeddings函數,加載根目錄/embeddings下的embedding文件。加載[('/data/work/xiehao/stable-diffusion-webui/embeddings', <modules.textual_inversion.textual_inversion.DirWithTextualInversionEmbeddings object at 0x7ff2900b39d0>)]兩個下的embeddings信息。比如:badhandv4、easynegative、EasyNegativeV2、ng_deepnegative_v1_75t等。

model_loaded_callback函數,遍歷callback_map['callbacks_model_loaded']所有的回調函數,然后把sd_model模型傳進去依次執行這些回調函數。比如/data/work/xiehao/stable-diffusion-webui/extensions/a1111-sd-webui-tagcomplete/scripts/tag_autocomplete_helper.py的get_embeddings方法,/data/work/xiehao/stable-diffusion-webui/extensions-builtin/Lora/scripts/lora_script.py的assign_lora_names_to_compvis_modules方法。

5、頁面布局

基于gradio編寫,界面入口函數為modules/ui.py的create_ui()。

未完待續

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

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

相關文章

大數據掃盲(1): 數據倉庫與ETL的關系及ETL工具推薦

在數字化時代&#xff0c;數據成為了企業決策的關鍵支持。然而&#xff0c;隨著數據不斷增長&#xff0c;有效地管理和利用這些數據變得至關重要。數據倉庫和ETL工具作為數據管理和分析的核心&#xff0c;將幫助企業從龐雜的數據中提取有價值信息。 一、ETL是什么&#xff1f; …

【不限于聯想Y9000P電腦關蓋再打開時黑屏的解決辦法】

不限于聯想Y9000P電腦關蓋再打開時黑屏的解決辦法 問題的前言問題的出現問題擬解決 問題的前言 事情發生在昨天&#xff0c;更新了Win11系統后&#xff1a; 最惹人注目的三處地方就是&#xff1a; 1.可以查看時間的秒數了&#xff1b; 2.右鍵展示的內容變窄了&#xff1b; 3.按…

Pycharm 雙擊啟動失敗?

事故 雙擊 Pycharm 后&#xff0c;出現加載工程&#xff0c;我不想加載這個工程&#xff0c;就點擊了彈出的 cancle 取消按鈕。然后再到桌面雙擊 Pycharm 卻發現無法啟動了。哪怕以管理員權限運行也沒用&#xff0c;就是不出界面。 原因未知 CtrlshiftESC 打開后臺&#xff…

【騰訊云 Cloud Studio 實戰訓練營】Hexo 框架 Butterfly 主題搭建個人博客

什么是Cloud Studio Cloud Studio 是基于瀏覽器的集成式開發環境&#xff08;IDE&#xff09;&#xff0c;為開發者提供了一個永不間斷的云端工作站。用戶在使用 Cloud Studio 時無需安裝&#xff0c;隨時隨地打開瀏覽器就能在線編程。 ? Hexo 博客成品展示 本人博客如下&…

leetcode268. 丟失的數字

這題簡單的有點過分了吧。。。 一開始還納悶會不會有重復的元素&#xff0c;后來看到[0,n]范圍&#xff0c;那么肯定有n1個數字&#xff0c;然后要在n 個數字里面找誰沒有&#xff0c;那肯定沒有重復的元素&#xff0c;如果有重復&#xff0c;就不止缺少一個元素了。 思路&am…

【Spring】-Spring項目的創建

作者&#xff1a;學Java的冬瓜 博客主頁&#xff1a;?冬瓜的主頁&#x1f319; 專欄&#xff1a;【Framework】 主要內容&#xff1a;創建spring項目的步驟&#xff1a;先創建一個maven項目&#xff0c;再在pom.xml中添加spring框架支持&#xff0c;最后寫一個啟動類。 文章目…

Field injection is not recommended

文章目錄 1. 引言2. 不推薦使用Autowired的原因3. Spring提供了三種主要的依賴注入方式3.1. 構造函數注入&#xff08;Constructor Injection&#xff09;3.2. Setter方法注入&#xff08;Setter Injection&#xff09;3.3. 字段注入&#xff08;Field Injection&#xff09; 4…

03 QT基本控件和功能類

一 進度條 、水平滑動條 垂直滑動條 當在QT中,在已知類名的情況下,要了解類的構造函數 常用屬性 及 信號和槽 常用api 特征:可以獲取當前控件的值和設置它的當值 ---- int ui->progressBar->setValue(value); //給進度條設置一個整型值 ui->progressBar->value…

計算機視覺五大核心研究任務全解:分類識別、檢測分割、人體分析、三維視覺、視頻分析

目錄 一、引言1.1 計算機視覺的定義1.1.1 核心技術1.1.2 應用場景 1.2 歷史背景及發展1.2.1 1960s-1980s: 初期階段1.2.2 1990s-2000s: 機器學習時代1.2.3 2010s-現在: 深度學習的革命 1.3 應用領域概覽1.3.1 工業自動化1.3.2 醫療圖像分析1.3.3 自動駕駛1.3.4 虛擬現實與增強現…

【Linux】進程調度

進程調度 硬件向OS發送時間中斷 --> 系統時鐘硬件會進行時間計數&#xff0c;每隔一段很短的時間會向OS發送時鐘中斷&#xff0c;處理中斷&#xff0c;檢測進程時間片 --> 收到中斷&#xff0c;OS就會不斷定期地執行對應的時鐘中斷處理方法&#xff0c;檢查當前進程的時…

山東布谷科技直播軟件開發WebRTC技術:建立實時通信優質平臺

在數字化的時代&#xff0c;實時通信成為了人們遠程交流的主要方式&#xff0c;目前市場上也出現了很多帶有實時通信交流的軟件&#xff0c;實時通信符合人們現在的需求&#xff0c;所以在直播軟件開發過程中&#xff0c;開發者也運用了實時通信技術為直播軟件加入了實時通信的…

【計算機視覺|生成對抗】生成對抗網絡(GAN)

本系列博文為深度學習/計算機視覺論文筆記&#xff0c;轉載請注明出處 標題&#xff1a;Generative Adversarial Nets 鏈接&#xff1a;Generative Adversarial Nets (nips.cc) 摘要 我們提出了一個通過**對抗&#xff08;adversarial&#xff09;**過程估計生成模型的新框架…

mybatisplus學習筆記

1.踩過的坑 1.MybatisPlus 要與其代碼生成器的版本一致&#xff1b; 2.要使用新版代碼&#xff08;3.5.1及以上&#xff09;生成器則要使用springboot3&#xff0c;如果用springboot2使用新版代碼生成器會導致builder.parent(“com.sdfsf”) // 設置父包名》重復&#xff01;&…

2.阿里云對象存儲OSS

1.對象存儲概述 文件上傳&#xff0c;是指將本地圖片、視頻、音頻等文件上傳到服務器上&#xff0c;可以供其他用戶瀏覽或下載的過程。文件上傳在項目中應用非常廣泛&#xff0c;我們經常發抖音、發朋友圈都用到了文件上傳功能。 實現文件上傳服務&#xff0c;需要有存儲的支持…

【概念理解】STM32中的sprintf()函數

sprintf()函數 這個函數在 stdio.h中&#xff1b;可以將格式化的數據寫入到一個字符串緩沖區中。 int sprintf(char *str, const char *format, ...);str&#xff1a;指向字符數組的指針&#xff0c;即用于存儲格式化后字符串的緩沖區。format&#xff1a;格式化字符串&#…

(十六)大數據實戰——安裝使用mysql版的hive服務

前言 hive默認使用的是內嵌據庫derby&#xff0c;Derby 是一個嵌入式數據庫&#xff0c;可以輕松地以庫的形式集成到應用程序中。它不需要獨立的服務器進程&#xff0c;所有的數據存儲在應用程序所在的文件系統中。為了支持hive服務更方便的使用&#xff0c;我們使用mysql數據…

Centos 8和Centos 7中配置阿里云的 yum 源

YUM源簡介 yum是一種在Linux環境下安裝、更新和刪除軟件包的軟件管理器。通過yum&#xff0c;用戶可以輕松地從軟件倉庫中搜索和安裝包含所需軟件的軟件包&#xff0c;并自動處理所需的依賴關系。此外&#xff0c;yum還可以與其他軟件管理工具配合使用&#xff0c;例如rpm。它…

【實戰】十一、看板頁面及任務組頁面開發(一) —— React17+React Hook+TS4 最佳實踐,仿 Jira 企業級項目(二十三)

文章目錄 一、項目起航&#xff1a;項目初始化與配置二、React 與 Hook 應用&#xff1a;實現項目列表三、TS 應用&#xff1a;JS神助攻 - 強類型四、JWT、用戶認證與異步請求五、CSS 其實很簡單 - 用 CSS-in-JS 添加樣式六、用戶體驗優化 - 加載中和錯誤狀態處理七、Hook&…

c語言每日一練(8)

前言&#xff1a;每日一練系列&#xff0c;每一期都包含5道選擇題&#xff0c;2道編程題&#xff0c;博主會盡可能詳細地進行講解&#xff0c;令初學者也能聽的清晰。每日一練系列會持續更新&#xff0c;暑假時三天之內必有一更&#xff0c;到了開學之后&#xff0c;將看學業情…

【javaweb】學習日記Day1 - HTML CSS入門

目錄 一、圖片標簽 ① 絕對路徑 1.絕對磁盤路徑 2.絕對網絡路徑 ② 相對路徑 &#xff08;推薦&#xff09; 二、標題標簽 三、水平線標簽 四、標題樣式 1、CSS引入樣式 ① 行內樣式 ② 內嵌樣式 ③ 外嵌樣式 2、CSS選擇器 ① 元素選擇器 ② id選擇器 ③…