題目簡介
筆者個人的畢業(yè)設(shè)計課題如下:
簡介:使用預(yù)訓(xùn)練的Diffusion Model圖像生成模型生成圖像,將這些生成的圖像作為擴充訓(xùn)練集加入到2D目標(biāo)檢測器、2D圖像分類器的訓(xùn)練過程。深度學(xué)習(xí)是數(shù)據(jù)驅(qū)動的,隨著數(shù)據(jù)量的擴充,能夠提高檢測器、分類器的魯棒性、準確性。
建議的baseline:
分類:ResNet
檢測:YOLO
可以看到,給的題目難度還是比較輕松的;本次畢設(shè)的全過程會以周為單位采用博客的形式記錄下來。
前言
由于個人原因,這周還是沒法使用實驗室的卡;但是不要緊,手邊有一臺剛組的機子,配的12G的4070ti,用來跑一個擴散模型還是沒什么問題的。
另一方面需要考慮的是,基于Diffusion Model這個原理的模型有很多,具體要使用哪一個來完成本次畢業(yè)設(shè)計呢?筆者第一時間想到的是發(fā)表在去年CVPR上的Stable Diffusion,很多人熟悉的AI繪畫去年的大火,和這個模型是脫不開關(guān)系的。
上圖所示為Stable Diffusion的官網(wǎng)
一方面,在擴散模型的理論應(yīng)用上,最出名又最新的就是Stable Model;另一方面,免費開源,且模型設(shè)計親民,甚至可以在消費級顯卡上運行(雖然該模型一般需求顯存10G以上),這些都讓它一下帶火了AI繪畫,反而很多人可能并不了解這個模型背后的擴散模型的理論。不過從各方面考慮,在本次畢業(yè)設(shè)計選擇該模型都是個不錯的選擇。
Stable Diffusion
Stable Diffusion是一個文本到圖像的潛在擴散模型,由CompVis、Stability AI和LAION的研究人員和工程師創(chuàng)建。它使用來自LAION-5B數(shù)據(jù)庫子集的512x512圖像進行訓(xùn)練。
官方網(wǎng)站:https://stability.ai/blog/stable-diffusion-public-release
不回答為什么進不去,或者打不開的問題
Stable Diffusion是一種機器學(xué)習(xí)模型,它經(jīng)過訓(xùn)練可以逐步對隨機高斯噪聲進行去噪以獲得感興趣的樣本,例如生成圖像。
擴散模型有一個主要的缺點就是去噪過程的時間和內(nèi)存消耗都非常昂貴。這會使進程變慢,并消耗大量內(nèi)存。主要原因是它們在像素空間中運行,特別是在生成高分辨率圖像時。
Latent diffusion通過在較低維度的潛空間上應(yīng)用擴散過程而不是使用實際的像素空間來減少內(nèi)存和計算成本。所以Stable Diffusion引入了Latent diffusion的方式來解決這一問題計算代價昂貴的問題。
Latent diffusion
自動編碼器(VAE)
自動編碼器(VAE)由兩個主要部分組成:編碼器和解碼器。編碼器將把圖像轉(zhuǎn)換成低維的潛在表示形式,該表示形式將作為下一個組件U_Net的輸入。解碼器將做相反的事情,它將把潛在的表示轉(zhuǎn)換回圖像。
在Latent diffusion訓(xùn)練過程中,利用編碼器獲得正向擴散過程中輸入圖像的潛表示(latent)。而在推理過程中,VAE解碼器將把潛信號轉(zhuǎn)換回圖像。
U-Net
U-Net也包括編碼器和解碼器兩部分,兩者都由ResNet塊組成。編碼器將圖像表示壓縮為低分辨率圖像,解碼器將低分辨率解碼回高分辨率圖像。
為了防止U-Net在下采樣時丟失重要信息,通常在編碼器的下采樣的ResNet和解碼器的上采樣ResNet之間添加了捷徑的連接。
在Stable Diffusion的U-Net中添加了交叉注意層對文本嵌入的輸出進行調(diào)節(jié)。交叉注意層被添加到U-Net的編碼器和解碼器ResNet塊之間。
Text-Encoder
文本編碼器將把輸入文字提示轉(zhuǎn)換為U-Net可以理解的嵌入空間,這是一個簡單的基于transformer的編碼器,它將標(biāo)記序列映射到潛在文本嵌入序列。
Stable Diffusion的推理過程
首先,模型將潛在空間的隨機種子和文本提示同時作為輸入。然后使用潛在空間的種子生成大小為64×64的隨機潛在圖像表示,通過CLIP的文本編碼器將輸入的文本提示轉(zhuǎn)換為大小為77×768的文本嵌入。
然后,使用U-Net 在以文本嵌入為條件的同時迭代地對隨機潛在圖像表示進行去噪。 U-Net 的輸出是噪聲的殘差,用于通過scheduler 程序算法計算去噪的潛在圖像表示。 scheduler 算法根據(jù)先前的噪聲表示和預(yù)測的噪聲殘差計算預(yù)測的去噪圖像表示。
許多不同的scheduler 算法可以用于這個計算,每一個都有它的優(yōu)點和缺點。對于Stable Diffusion,建議使用以下其中之一:
PNDM scheduler (默認)
DDIM scheduler
K-LMS scheduler
去噪過程重復(fù)約50次,這樣可以逐步檢索更好的潛在圖像表示。一旦完成,潛在圖像表示就會由變分自編碼器的解碼器部分進行解碼。
從零開始配置實驗環(huán)境
因為這次用的是新組的機子,所以正好可以演示一下怎么從頭開始配置各項環(huán)境到運行;為了方便大多數(shù)人的使用習(xí)慣,這里使用WIN而非Linux。
IDE
這部分可以自行安裝,pycharm或者VScode都是不錯的選擇
Anaconda
什么是Anconda?Anaconda是開源的Python發(fā)行版本,其包含了conda、Python等180多個科學(xué)包及其依賴項。conda是一個開源的包、環(huán)境管理器,可以用于在同一個機器上安裝不同版本的軟件包及其依賴,并能夠在不同的環(huán)境之間切換。
官網(wǎng):https://www.anaconda.com/
安裝過程可以自行查找 這里不做贅述
需要注意的是,在安裝過程中可以選擇Add Anaconda3 to the system PATH選項,自動添加環(huán)境變量
如果選不了的話,也可以自己手動添加,過程很簡單,具體可以自行百度
CUDA和CuDNN
CUDA 是 NVIDIA 發(fā)明的一種并行計算平臺和編程模型。它通過利用GPU的處理能力,可大幅提升計算性能
CuDNN (NVIDIA CUDA 深度神經(jīng)網(wǎng)絡(luò)庫) 是一個 GPU 加速的深度神經(jīng)網(wǎng)絡(luò)基元庫,能夠以高度優(yōu)化的方式實現(xiàn)標(biāo)準例程(如前向和反向卷積、池化層、歸一化和激活層)。
全球的深度學(xué)習(xí)研究人員和框架開發(fā)者都依賴CuDNN 來實現(xiàn)高性能 GPU 加速。借助 CuDNN,研究人員和開發(fā)者可以專注于訓(xùn)練神經(jīng)網(wǎng)絡(luò)及開發(fā)軟件應(yīng)用,而不必花時間進行低層級的 GPU 性能調(diào)整。
CuDNN 可加速廣泛應(yīng)用的深度學(xué)習(xí)框架,包括 Caffe2、Chainer、Keras、MATLAB、MxNet、PaddlePaddle、PyTorch 和 TensorFlow。我們接下來就需要用到Pytorch深度學(xué)習(xí)框架。
為了進行這一步,我們首先要確認你的電腦可以支持的最高CUDA版本和顯存(雖然后者一般都知道)
在控制臺輸入代碼 nvidia–smi
如上圖所示,筆者的4070ti最高支持12.1的CUDA,并且有12G顯存
英偉達CUDA官網(wǎng):https://developer.nvidia.com/cuda-toolkit-archive
接下來要涉及CUDA版本的選擇,自行去官網(wǎng)查看版本和驅(qū)動對應(yīng)關(guān)系;
簡單來說,驅(qū)動版本應(yīng)該高于cuda需求版本
筆者這里以11.7為例
注意上面的選擇
安裝完成
CuDNN
英偉達CuDNN網(wǎng)站:https://developer.nvidia.com/rdp/cudnn-archive#a-collapse860-118
這里要提一句,CuDNN在官方的網(wǎng)站下載的話,是需要注冊用戶的。
如果嫌麻煩或者是網(wǎng)絡(luò)原因的話,可以去第三方網(wǎng)站和論壇下載鏡像資源,注意和CUDA的版本對應(yīng)
注意不要下載成linux的
注意CuDNN是CUDA的補充庫,所以不是安裝包的形式,而是直接拖到CUDA路徑覆蓋的補丁安裝形式
下面進行驗證是否安裝完成
打開如上圖所示路徑
打開CMD后,拖入 deviceQuery.exe 和 bandwidthTest.exe
如果出現(xiàn)下圖中的Result = PASS 則證明安裝完成
Stable Diffusion的本地部署
github地址:https://github.com/CompVis/stable-diffusion
克隆到本地
接下來要安裝對應(yīng)環(huán)境,這里建議使用虛擬環(huán)境
環(huán)境名可以自定義,python版本建議用官方環(huán)境的3.8.5
驗證虛擬環(huán)境安裝完成
打開克隆的代碼倉,找到其中的環(huán)境需求單
這里一般存在兩種安裝方式
直接在控制臺對該文件一鍵安裝,和按照版本號分開單獨安裝。
這里的可以按照自己需求來操作,筆者選擇后者。
numpy安裝完畢
關(guān)于pytorch部分,可以直接命令行安裝(高概率因為網(wǎng)絡(luò)原因各種報錯)
或者直接離線下載
https://download.pytorch.org/whl/torch_stable.html
但是需要自己去下面的官方網(wǎng)站查好版本號對應(yīng)關(guān)系
https://github.com/pytorch/vision/blob/main/README.rst
在存放目錄處點擊紅線旁空白區(qū)域,輸入cmd(在指定目錄打開控制臺)
本地安裝
安裝完成
驗證安裝(忽視中間的拼寫錯誤)
剩下的安裝和numpy一樣
也可以用如下語句一次性安裝(大多不會出現(xiàn)網(wǎng)絡(luò)或者版本錯誤)
pip install albumentations diffusers opencv-python pudb invisible-watermark imageio imageio-ffmpeg pytorch-lightning omegaconf test-tube streamlit einops torch-fidelity transformers torchmetrics kornia
接下來切換到代碼目錄
并把另外兩個項目克隆到本地項目新建的src工作目錄中
記得在在目錄下打開控制臺(上面有寫)或者手動切換目錄
同時還需要下載權(quán)重
https://link.csdn.net/?target=https%3A%2F%2Fhuggingface.co%2FCompVis
在項目目錄models/ldm下手動創(chuàng)建stable-diffusion-v1文件夾,用來存放下載好的權(quán)重文件,即需要把下載文件夾里的sd-v1-4.ckpt文件改名為model.ckpt,然后粘貼到手動創(chuàng)建的stable-diffusion-v1文件夾下即可。
理論上到這里為止,所有的環(huán)境準備工作完畢
注:這里可能會遇到各種環(huán)境依賴的報錯,是正常的;建議可以把報錯的函數(shù)和接口名去Github倉查討論區(qū),600+的討論基本上都有涉及到了。
https://github.com/CompVis/stable-diffusion/issues/162
這里貼一個我遇到問題找到的討論
運行測試
生成samurai in the war的文字到圖片模塊
開始跑的時候隨意截了一張圖,可以看到效果還是可以的。
GPU也是直接吃滿,意料之中就是了
注意:這里的demo是跑的text2img;本次畢業(yè)設(shè)計實際上還是會采用圖片生成圖片這種性能更好的模式!?。?/strong>
總結(jié)
本周完成了擴散模型部分的內(nèi)容實驗,從搭建環(huán)境到隨意跑個DEMO;現(xiàn)在整個畢業(yè)設(shè)計的各個零件已經(jīng)完全準備好了,接下來需要做的事情就在于組合起來對比效果了文章來源:http://www.zghlxwxcb.cn/news/detail-460634.html
這里還是要吐槽一句,其實模型搭建部分遇到挺多問題的,官方給的依賴文檔實際上不太行,得自己在Github的討論區(qū)看洋兄弟是怎么解決這個問題的,還好模型熱度大,什么稀奇古怪的報錯都能找到同病相憐的兄弟。文章來源地址http://www.zghlxwxcb.cn/news/detail-460634.html
到了這里,關(guān)于基于Diffusion Model的數(shù)據(jù)增強方法應(yīng)用——畢業(yè)設(shè)計 其三的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!