地 址:聯係地址聯係地址聯係地址
电 话:020-123456789
网址:www.6ql2.cn
邮 箱:[email protected]
這是后悔一款通過 Docker 和八十行左右的 Python 代碼 ,實現一款類似 Midjourney 官方圖片解析功能 Describe 的图片图片 Pr
聲明:本文轉載自蘇洋大佬博客內文章,可有效轉載注明原文鏈接原文鏈接https://soulteary.com/2023/04/05/eighty-lines-of-code-to-implement-the-open-source-midjourney-and-stable-diffusion-spell-drawing-tool.html
這是程序程序一款通過 Docker 和八十行左右的 Python 代碼,實現一款類似 Midjourney 官方圖片解析功能 Describe 的代码 Prompt 工具讓你在玩 Midjourney、Stable Diffusion 這類模型時 ,后悔不再為生成 Prompt 描述撓頭。图片图片
▍"咒語"做圖工具簡介該工具提供兩個版本,程序程序分別支持 CPU 和 GPU 推理使用,代码如果你有一張大於 8GB 顯存的后悔顯卡,可以愉快的图片图片使用全部的功能 ,如果你隻有 CPU ,程序程序那麽也可以使用 CPU 版本的代码應用來進行偷懶 。
Github :https://github.com/soulteary/docker-prompt-generator
“咒語”做圖工具項目該工具是由作者蘇洋開發而後開源的,作者本人開發這個工具最初的图片图片想法也是為了一個宗旨:“方便且快”,俗稱“懶” ,程序程序作者原話是這樣說的 :“昨晚在玩 Midjourney 的時候 ,在想 Prompt 的時候 ,想到撓頭。
作為一個懶人 ,計上心頭 :能不能讓模型幫我生成 Prompt 呢 ,輸入一些關鍵詞或者句子 ,然後讓程序幫助我完成完整的 Prompt 內容(俗話:文生文)”而恰在此時Midjourney 官方又發布了新功能,“describe”,支持解析圖片為幾段不同的 Prompt 文本 ,並支持繼續進行圖片生成。
(俗話:圖生文,然後文生圖)
Midjourney 官方的“圖生文”功能:describe這個功能給了大多人人,甚至行業外的人,更多的體驗對於懶人體驗也非常好但是官方肯定不會開源此功能 ,所以蘇洋大佬靈機一動 ,就有了開發這款工具的初衷。
▍“作圖咒語生成器” 的使用為了更快的上手和使用到這個工具 ,我們需要先完成環境的配置應用和 Docker 環境準備基於 Docker 和 Nvidia 官方基礎容器的深度學習環境《基於 Docker 的深度學習環境(入門篇)》-作者:蘇洋。
https://soulteary.com/2023/03/22/docker-based-deep-learning-environment-getting-started.html純 CPU 也是可以上手的:《在搭載 M1 及 M2 芯片 MacBook設備上玩 Stable Diffusion 模型》-作者 :蘇洋
https://soulteary.com/2022/12/10/play-the-stable-diffusion-model-on-macbook-devices-with-m1-and-m2-chips.html
在準備好 Docker 環境的配置之後 ,我們就可以繼續玩啦我們隨便找一個合適的目錄,使用 git clone 或者下載 Zip 壓縮包的方式 ,先把“Docker Prompt Generator(Docker 作圖咒語生成器)”項目的代碼下載到本地 。
git clone https://github.com/soulteary/docker-prompt-generator.git# or curl -sL -o docker-prompt-generator.zip https:
//github.com/soulteary/docker-prompt-generator/archive/refs/heads/main.zip接著 ,進入項目目錄 ,使用 Nvidia 原廠的 PyTorch Docker 基礎鏡像來完成基礎環境的構建,相比於我們直接從 DockerHub 拉製作好的鏡像,自行構建將能節約大量時間 。
我們在項目目錄中執行下麵的命令 ,就能夠完成應用模型應用的構建啦 :# 構建基礎鏡像dockerbuild -t soulteary/prompt-generator:base . -f docker/Dockerfile.base
# 構建 CPU 應用dockerbuild -t soulteary/prompt-generator:cpu . -f docker/Dockerfile.cpu # 構建 GPU 應用docker
build -t soulteary/prompt-generator:gpu . -f docker/Dockerfile.gpu然後 ,根據你的硬件環境,選擇性執行下麵的命令 ,就能夠啟動一個帶有 Web UI 界麵的模型應用啦 。
# 運行 CPU 鏡像 docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -p 7860:7860 soulteary/prompt-generator:cpu
# 運行 GPU 鏡像 docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -p 7860:7860 soulteary/prompt-generator:gpu
我們在瀏覽器中輸入運行容器的宿主機的 IP 地址,就能夠開始使用工具啦使用工具工具的使用,非常簡單 ,分別有使用“圖片生成描述”和使用“文本生成描述”兩種我找了一張之前模型生成的圖片,然後將這張圖片喂給這個程序,點擊按鈕 ,就能獲得圖片的描述文本啦 。
將圖片解析為描述文本我們可以在 Midjourney 或者 Stable Diffusion 中,直接使用這段文本來繼續生成圖片 ,或者使用“從文本中生成”,來擴展內容,讓內容更適合 Midjourney 這類應用。
為了體現工具的中文翻譯和續寫能力 ,我們單獨寫一段簡單的中文描述 :“一隻小鳥立梢頭,一輪明月當空照,一片黃葉鋪枝頭”。
使用中文生成圖片生成“咒語”(描述)可以看到,基於我們的輸入內容 ,生成了非常多不同的文本 。想要驗證文本內容是否符合原意,我們可以將內容粘貼到 Midjourney 中進行測試。
使用上麵兩段文本來生成圖片因為模型存在隨機性,如果想要得到更好的結果,還需要對描述進行更多的調整優化 ,不過 ,看起來工具解析圖片,生成的描述,其實是能夠做到開箱即用的,而根據我們的三言兩語生成的文本 ,也生成出了符合要求的圖片。
這次試驗中相對好的結果▍模型應用功能實現下麵是工具的實現流程和思考,如果你想學習或快速使用開源模型項目來構建你的 AI 容器應用,可以繼續瀏覽應用功能設計在“動手”前,我們需要先明確功能設計 ,以及考慮使用什麽樣的技術來做具體功能的技術支撐。
在我日常使用 Stable Diffusion、Midjourney 的過程中,時常有三個場景撓頭:我隻有一些關鍵詞,需要發揮想象力把關鍵詞串起來,然後喂給模型應用如果描述內容不夠好,或者關鍵詞之間的關聯比較遠,那麽圖片的生成效果就不會特別好 。
我有一張圖片 ,想讓模型圍繞圖片中的內容 ,比如 :構圖 、某些元素 、情感等進行二次創作,而不是簡單的做圖片中的元素替換我更習慣使用中文做描述,而不是英文,但是目前模型生成圖片 ,想要好的效果 ,需要使用英文 ,總是借助翻譯工具,切換程序界麵或者網頁 ,還是挺麻煩的。
解決第一個問題 ,我們可以使用最近火爆出圈的 GPT-4 的前輩的前輩:GPT-2 其實就能夠滿足需求,將內容(一句話 、幾個關鍵詞)進行快速續寫相比較使用 GPT-3 / GPT-4,無需聯網,也無需付費 ,模型文件更是“便宜大碗” ,用 CPU 就能跑起來 。
解決第二個問題,我們可以使用 OpenAI 在一年前推出的 CLIP 神經網絡模型 ,以及 Salesforce 推出的 BLIP ,能夠從圖片中抽取出最合適的描述文本 ,讓我們用在新的 AIGC 圖片生成任務中。
稍作優化調整,我們隻需要大概使用 6~8GB 顯存就能將這部分功能的模型跑起來解決第三個問題 ,我們可以使用赫爾辛基大學開源的 OPUS MT 模型,實現將中文翻譯為英文 ,進一步偷懶 ,以及解決上麵兩類原始模型不支持中文輸入的問題。
因為前兩個場景問題中的模型不支持中文 ,而我又是一個懶人 ,不想輸入英文來玩圖 ,所以我們先來解決第三個問題,讓整個應用實現流程更絲滑中文 Prompt 翻譯為英文 Prompt 功能想要實現第一個懶人功能,從用戶輸入的中文內容中 ,自動生成英文 ,我們需要使用中英雙語的翻譯模型。
赫爾辛基大學的開源組織將預訓練模型開放在了 HuggingFace 社區 ,Helsinki-NLP/opus-mt-zh-en我們可以通過寫十五行簡單的 Python 代碼,來完成模型文件的下載,以及實現將中文自動轉換為合適的英文內容的功能。
比如下麵的例子中,程序運行完畢 ,將輸出《火影忍者》中的金句“青春不能回頭,所以青春沒有終點”的譯文from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import torch model = AutoModelForSeq2SeqLM.from_pretrained("Helsinki-NLP/opus-mt-zh-en").eval() tokenizer = AutoTokenizer.from_pretrained(
"Helsinki-NLP/opus-mt-zh-en") deftranslate(text):with torch.no_grad(): encoded = tokenizer([text], return_tensors=
"pt") sequences = model.generate(**encoded) return tokenizer.batch_decode(sequences, skip_special_tokens=
True)[0] input = "青春不能回頭 ,所以青春沒有終點 ——《火影忍者》" print(input, translate(input))將上麵的代碼保存為 translate.py,然後執行 python translate.py,等待模型下載完畢 ,我們將得到類似下麵的結果: 。
青春不能回頭,所以青春沒有終點 Youth cant turn back, so theres no end to youth.是不是看起來還不錯 ?這部分代碼保存在了項目中的 soulteary/docker-prompt-generator/app/translate.py 。
接下來,我們來實現 Prompt “免費續杯”(有邏輯續寫)功能實現 MidJourney Prompt 續寫功能基於一些內容 ,進行繼續的內容生成,是生成類模型的看家本領,比如大家已經熟悉的不能再熟悉的 ChatGPT 背後的 GPT 模型係列。
作者也找到了一個 Google 離職創業的“國外大姐” 基於 GPT-2 使用 25 萬條 MidJourney 數據 fine-tune 好的 GPT2 模型:succinctly/text2image-prompt-generator
,試了試效果不錯,那麽我們就用它來實現這部分功能吧和上麵一樣 ,我們實現一個不到 30 行的簡單的程序 ,就能夠實現模型自動下載 ,以及調用模型根據我們的輸入內容(上文中熱血台詞的翻譯)生成一些符合 Midjourney 或 Stable Diffusion 的新的 Prompt 內容 : 。
from transformers import pipeline, set_seed import random import re text_pipe = pipeline(text-generation
, model=succinctly/text2image-prompt-generator) def text_generate(input): seed = random.randint(
100, 1000000) set_seed(seed) for count in range(6): sequences = text_pipe(input, max_length=
random.randint(60, 90), num_return_sequences=8) list = [] for sequence in sequences: line = sequence[
generated_text].strip() if line != inputandlen(line) > (len(input) + 4) and line.endswith((
":", "-", "—")) is False: list.append(line) result = "\n".join(list) result = re.
sub([^ ]+\.[^ ]+,, result) result = result.replace("", "") if result !=
"": return result if count == 5: return result input = "Youth cant turn back, so theres no end to youth."
print(input, text_generate(input))我們將上麵的代碼保存為 text-generation.py ,然後執行 python text-generation.py,稍等片刻我們將得到類似下麵的內容:
# Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation. Youth cant turn back, so theres no
endto youth. Youth cant turn back, so theres noendto youth. Young, handsome, confident, lonely boy sitting
on his cant turn back, so theres noendto youth. Whereold yang waits, young man on the streets of Bangkok::
10 film poster::10 photorealism, postprocessing, low angle::10 Trending on artstation::8 —ar 47:82 Youth can
t turn back, so theres noendto youth. By Karel Thole and Mike Mignola --ar 2:3 Youth cant turn back, so there
s noendto youth. And there is a bright hope about a future where there will be time.內容看起來好像還不錯,我們直接在 Midjourney 中輸入測試,將得到類似下麵的結果 。
將我們生成的 Prompt 內容,使用 Midjourney 進行圖片生成看起來算是及格了,這部分代碼在項目的 soulteary/docker-prompt-generator/app/text-generation.py
完成了兩個功能之後,我們來實現根據圖片內容生成 Prompt 描述的應用功能實現根據圖片生成 Prompt 描述功能相比較上麵兩個功能,使用 CPU 就能搞定,內容生成效率也非常高但是想要快速的根據圖片生成 Prompt 則需要顯卡的支持。
不過根據我的試驗 ,運行起來隻需要 6~8GB 左右的顯存,還是比較省錢的(沒有顯卡可以使用雲服務器代替,買個按量的 ,玩罷銷毀即可)這裏,我們依舊是實現一段簡單的 ,不到 30 行的 Python 代碼,完成模型下載 、應用加載 、圖片下載 ,以及將圖片轉換為 Prompt 的功能 :
from clip_interrogator import Config, Interrogator import torch config = Config() config.device = cuda
if torch.cuda.is_available() elsecpu config.blip_offload = Falseif torch.cuda.is_available() elseTrue
config.chunk_size = 2048 config.flavor_intermediate_count = 512 config.blip_num_beams = 64 config.clip_model_name =
"ViT-H-14/laion2b_s32b_b79k" ci = Interrogator(config) defget_prompt_from_image(image):return ci.interrogate(image.convert(
RGB)) import requests import shutil r = requests.get("https://pic1.zhimg.com/v2-6e056c49362bff9af1eb39ce530ac0c6_1440w.jpg?source=d16d100b"
, stream=True) if r.status_code == 200: with open(./image.jpg, wb) as f: r.raw.decode_content =
True shutil.copyfileobj(r.raw, f) from PIL import Image print(get_prompt_from_image(Image.open(
./image.jpg)))代碼中的圖片,使用了我專欄中上一篇文章的題圖(同樣使用 Midjourney 生成)將上麵的內容保存為 clip.py ,然後執行 python clip.py,稍等片刻,我們將得到類似下麵的結果:。
# WARNING:root:Pytorch pre-release version 1.14.0a0+410ce96 - assuming intent to test itLoadingBLIPmodel...
loadcheckpointfromhttps://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_large_caption.pth
LoadingCLIPmodel...LoadedCLIPmodelanddatain8.29seconds.100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
55/55[00:00<00:00,316.23it/s]Flavor chain:38%|███████████████████████████████████████████████████████▏
|12/32[00:04<00:07,2.74it/s]100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
55/55[00:00<00:00,441.49it/s]100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
6/6[00:00<00:00,346.74it/s]100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
50/50[00:00<00:00,457.84it/s]arobotwithaspeechbubbleonabluebackground,highlydetailedhyperrealretro,artificial
intelligence!!,toyphotography,byEmmaAndijewska,markingsonrobot,computergenerated,blueish,delete,small
gadget,animated,bluebody,inretrocolors從結果中看 ,描述還是比較準確的這部分代碼在了項目的 soulteary/docker-midjourney-prompt-generator/app/clip.py。
好啦,到目前為止,三個主要功能 ,就都實現完畢了接下來 ,我們借助 Docker 和 Gradio 來完成 Web UI 和一鍵運行的模型容器應用使用 Docker 構建 AI 應用容器接下來 ,我們來完成 AI 應用的容器構建和相關代碼編寫。
前文中提到 ,我們將實現兩個版本的應用 ,分別支持 CPU 和 GPU 來完成快速的 AI 模型推理功能因為後者可以向下兼容前者,所以我們先來實現一個包含前兩個應用功能 ,CPU 就能跑的模型基礎鏡像完成隻需要 CPU 運行的應用容器鏡像。
結合上文中的代碼,Dockerfile 文件不難編寫:FROM nvcr.io/nvidia/pytorch:22.12-py3 LABEL org.opencontainers.image.authors="[email protected]" RUN pip config
set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \ pip install transformers sentencepiece sacremoses && \ pip
install gradio WORKDIR /app RUN cat > /get-models.py <
Helsinki-NLP/opus-mt-zh-en) AutoTokenizer.from_pretrained(Helsinki-NLP/opus-mt-zh-en) pipeline(text-generation
, model=succinctly/text2image-prompt-generator) EOF RUN python /get-models.py && \ rm -rf /get-models.py
將上麵的內容保存為 Dockerfile.base,然後使用 docker build -t soulteary/prompt-generator:base . -f Dockerfile.base ,稍等片刻 ,包含了模型文件的基礎應用模型就搞定啦 。
[+] Building 189.5s (7/8) => [internal] load .dockerignore
0.0s => => transferring context: 2B
0.0s => [internal] load build definition from Dockerfile.base
0.0s => => transferring dockerfile: 692B
0.0s => [internal] load metadata for nvcr.io/nvidia/pytorch:22.12-py3
0.0s => [1/5] FROM nvcr.io/nvidia/pytorch:22.12-py3
0.0s => CACHED [2/5] RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && pip install transformers sentencepiece sacremoses && pip install gradio 0.0s
=> CACHED [3/5] WORKDIR /app
0.0s => CACHED [4/5] RUN cat > /get-models.py <
0.0s => [5/5] RUN python /get-models.py && rm -rf /get-models.py
189.4s => => # Downloading (…)olve/main/source.spm: 100%|██████████| 805k/805k [00:06<00:00, 130kB/s]
=> => # Downloading (…)olve/main/target.spm: 100%|██████████| 807k/807k [00:01<00:00, 440kB/s]
=> => # Downloading (…)olve/main/vocab.json: 100%|██████████| 1.62M/1.62M [00:01<00:00, 1.21MB/s]
=> => # Downloading (…)lve/main/config.json: 100%|██████████| 907/907 [00:00<00:00, 499kB/s]
=> => # Downloading pytorch_model.bin: 100%|██████████| 665M/665M [00:11<00:00, 57.2MB/s]
=> => # Downloading (…)okenizer_config.json: 100%|██████████| 255/255 [00:00<00:00, 81.9kB/s]實現過程中,我這邊的構建時間大概要 5 分鍾左右,可以從椅子上起來,動一動,聽首歌放鬆一會。
鏡像構建完畢,可以使用下麵的命令 ,進入包含模型和 PyTorch 環境的 Docker 鏡像在這個鏡像中,我們可以自由的使用前兩個功能相關的模型:docker run --gpus all --ipc=host --。
ulimit memlock=-1 --ulimit stack=67108864 --rm -it -p 7680:7680 soulteary/prompt-generator:base bash有了環境之後 ,我們來繼續實現一個簡單的 Web UI,實現上文中的懶人功能 :讓模型根據我們輸入的中文內容 ,生成可以繪製高質量圖片的 Prompt:
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM import torch model = AutoModelForSeq2SeqLM.from_pretrained(Helsinki-NLP/opus-mt-zh-en).eval() tokenizer = AutoTokenizer.from_pretrained(Helsinki-NLP/opus-mt-zh-en) def translate(text):
with torch.no_grad(): encoded = tokenizer([text], return_tensors=pt) sequences = model.generate(**encoded)
return tokenizer.batch_decode(sequences, skip_special_tokens=True)[0] from transformers import pipeline, set_seed
import random import re text_pipe = pipeline(text-generation, model=succinctly/text2image-prompt-generator
) def text_generate(input): seed = random.randint(100, 1000000) set_seed(seed) text_in_english =
translate(input) forcountinrange(6): sequences = text_pipe(text_in_english, max_length=random.randint(
60, 90), num_return_sequences=8) list = [] forsequencein sequences: line =
sequence[generated_text].strip() if line != text_in_english andlen(line) > (len(text_in_english) +
4) and line.endswith((:, -, —)) isFalse: list.append(line) result = "\n".join(
list) result = re.sub([^ ]+\.[^ ]+,, result) result = result.replace(, )
ifresult != : returnresultifcount == 5: returnresultimport gradio as gr with
gr.Blocks() asblock: with gr.Column(): with gr.Tab(文本生成): input = gr.Textbox(
lines=6, label=你的想法, placeholder=在此輸入內容...) output = gr.Textbox(lines=6, label=生成的 Prompt
) submit_btn = gr.Button(快給我編) submit_btn.click( fn=text_generate, inputs=
input, outputs=output ) block.queue(max_size=64).launch(show_api=False, enable_queue=True
, debug=True, share=False, server_name=0.0.0.0)在容器環境中創建一個名為 webui.cpu.py 的文件,然後使用 python webui.cpu.py,將看到類似下麵的日誌輸出:
Running on local URL: http://0.0.0.0:7860 To create a publiclink, set`share=True`in`launch()`.然後我們在瀏覽器中打開容器所在設備的 IP (如果在本機運行 ,可以訪問 http://127.0.0.1:7860 ,就能訪問 Web 服務啦。
隨便輸入點什麽,它都能給你繼續往下編我們在上麵的輸入框裏輸入一些內容,然後點擊“快給我編”按鈕,就能夠得到一堆模型編出來的 Prompt 內容啦實現完“文生文”功能之後 ,我們來實現“圖生文”相關功能完成需要 GPU 運行的應用容器鏡像
結合上文,完成 GPU 相關功能需要的容器環境也不難:FROM soulteary/prompt-generator:base LABEL org.opencontainers.image.authors="[email protected]" RUN pip config
set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \ pip install clip_interrogator git+https://github.com/pharmapsychotic/BLIP.git@lib
#egg=blip RUN cat > /get-models.py <
cudaif torch.cuda.is_available() elsecpu config.blip_offload = Falseif torch.cuda.is_available() else
True config.chunk_size = 2048 config.flavor_intermediate_count = 512 config.blip_num_beams = 64 config.clip_model_name =
"ViT-H-14/laion2b_s32b_b79k" ci = Interrogator(config) EOF RUN python /get-models.py && \ rm -rf /
get-models.py將上麵的內容保存為 Dockerfile.gpu 文件 ,然後使用 docker build -t soulteary/prompt-generator:gpu . -f Dockerfile.gpu 完成鏡像的構建。
耐心等待鏡像構建完畢,使用下麵的命令 ,能夠進入包含三種模型和 PyTorch 環境的 Docker 鏡像:docker run --gpus all --ipc=host --ulimit memlock=-1 --
ulimit stack=67108864 --rm -it -p 7680:7680 soulteary/prompt-generator:gpu bash接著 ,來編寫能夠調用三種模型能力的 Python 程序:
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM import torch model = AutoModelForSeq2SeqLM.from_pretrained(Helsinki-NLP/opus-mt-zh-en).eval() tokenizer = AutoTokenizer.from_pretrained(Helsinki-NLP/opus-mt-zh-en) def translate(text):
with torch.no_grad(): encoded = tokenizer([text], return_tensors=pt) sequences = model.generate(**encoded)
return tokenizer.batch_decode(sequences, skip_special_tokens=True)[0] from transformers import pipeline, set_seed
import random import re text_pipe = pipeline(text-generation, model=succinctly/text2image-prompt-generator
) def text_generate(input): seed = random.randint(100, 1000000) set_seed(seed) text_in_english =
translate(input) forcountinrange(6): sequences = text_pipe(text_in_english, max_length=random.randint(
60, 90), num_return_sequences=8) list = [] forsequencein sequences: line =
sequence[generated_text].strip() if line != text_in_english andlen(line) > (len(text_in_english) +
4) and line.endswith((:, -, —)) isFalse: list.append(line) result = "\n".join(
list) result = re.sub([^ ]+\.[^ ]+,, result) result = result.replace(, )
ifresult != : returnresultifcount == 5: returnresultfrom clip_interrogator import
Config, Interrogator import torch import gradio as gr config = Config() config.device = cudaif torch.cuda.is_available()
elsecpu config.blip_offload = Falseif torch.cuda.is_available() elseTrue config.chunk_size = 2048 config.flavor_intermediate_count =
512 config.blip_num_beams = 64 config.clip_model_name = "ViT-H-14/laion2b_s32b_b79k" ci = Interrogator(config)
def get_prompt_from_image(image, mode): image = image.convert(RGB) ifmode == best: prompt
= ci.interrogate(image) elif mode == classic: prompt = ci.interrogate_classic(image) elif
mode == fast: prompt = ci.interrogate_fast(image) elif mode == negative: prompt = ci.interrogate_negative(image)
returnpromptwith gr.Blocks() asblock: with gr.Column(): gr.HTML(
) with gr.Tab(從圖片中生成): with gr.Row(): input_image = gr.Image(type
=pil) with gr.Column(): input_mode = gr.Radio([best, fast, classic
, negative], value=best, label=Mode) img_btn = gr.Button(這圖裏有啥) output_image = gr.Textbox(
lines=6, label=生成的 Prompt) with gr.Tab(從文本中生成): input_text = gr.Textbox(lines=6, label=
你的想法, placeholder=在此輸入內容...) output_text = gr.Textbox(lines=6, label=生成的 Prompt) text_btn = gr.Button(
快給我編) img_btn.click(fn=get_prompt_from_image, inputs=[input_image, input_mode], outputs=output_image) text_btn.click(fn=text_generate, inputs=input_text, outputs=output_text) block.queue(max_size=
64).launch(show_api=False, enable_queue=True, debug=True, share=False, server_name=0.0.0.0)我們將上麵的程序保存為 webui.gpu.py ,然後使用 python webui.gpu.py 運行程序,將得到類似下麵的日誌 :
██████████████████████████████████████████████████████████████████████████████████████████████████████████████|
44.0/44.0[00:00<00:00,31.5kB/s]Downloading:100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
786k/786k[00:01<00:00,772kB/s]Downloading:100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
788k/788k[00:00<00:00,863kB/s]Downloading:100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
1.54M/1.54M[00:01<00:00,1.29MB/s]Downloading:100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
907/907[00:00<00:00,618kB/s]Downloading:100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
634M/634M[00:27<00:00,23.8MB/s]Downloading:100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
255/255[00:00<00:00,172kB/s]Downloading:100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
779k/779k[00:01<00:00,757kB/s]Downloading:100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
446k/446k[00:00<00:00,556kB/s]Downloading:100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
2.01M/2.01M[00:01<00:00,1.60MB/s]Downloading:100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████|
99.0/99.0[00:00<00:00,69.2kB/s]I040512:50:42.798199140240289830720instantiator.py:21]Createdatemporary
directoryat/tmp/tmpuvpi8s9qI040512:50:42.798363140240289830720instantiator.py:76]Writing/tmp/tmpuvpi8s9q/_remote_module_non_scriptable.py
W040512:50:42.878760140240289830720version.py:27]Pytorchpre-releaseversion1.14.0a0+410ce96-assumingintent
totestitI040512:50:43.373221140240289830720font_manager.py:1633]generatednewfontManagerLoadingBLIPmodel...
loadcheckpointfromhttps://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_large_caption.pth
LoadingCLIPmodel...I040512:51:00.455630140240289830720factory.py:158]LoadedViT-H-14modelconfig.I040512
:51:06.642275140240289830720factory.py:206]LoadingpretrainedViT-H-14weights(laion2b_s32b_b79k).Loaded
CLIPmodelanddatain8.22seconds.Running on local URL:http://0.0.0.0:7860Tocreateapubliclink,set`share=True`
in`launch()`.當看到 Running on local URL: http://0.0.0.0:7860 的日誌的時候,我們就可以在瀏覽器中訪問程序啦。
將上文中的圖喂給它將上文中的圖片投喂給它,然後點下“這圖裏有啥”按鈕 ,稍等片刻 ,我們將得到一些比較合理的 Prompts 內容,你可以用這些內容去生成圖片 。
喂它文本,擴寫內容喂它文本 ,擴寫內容當然 ,你也可以將生成的文本內容再投喂給它,來獲得更多的 Prompt 內容,讓圖片的變化更豐富一些其他 :顯存資源消耗在模型識別圖片的過程中,我簡單記錄了應用的顯存消耗,峰值大概在 8GB 左右。
Wed Apr 521:00:09 2023 +-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.89.02 Driver Version: 525.89.02 CUDA Version: 12.0 ||-------------------------------+----------------------+----------------------+ |
GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:
Usage/Cap| Memory-Usage | GPU-Util Compute M. | || | MIG M.
| |===============================+======================+======================| |0 NVIDIA GeForce ... Off
| 00000000:01:00.0 Off | Off | |31% 35C P8 23W / 450W | 8111MiB / 24564MiB |
0% Default | || | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ |
Processes:| | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage
| |=============================================================================| |0 N/A N/A
1286 G /usr/lib/xorg/Xorg 9MiB | |0 N/A N/A 1504 G /usr/bin/gnome-shell
10MiB | |0 N/A N/A 115252 C python 8086MiB | +-----------------------------------------------------------------------------+
參考鏈接:CLIP 神經網絡模型:https://openai.com/research/clipSalesforce 推出的 BLIP:https://blog.salesforceairesearch.com/blip-bootstrapping-language-image-pretraining/
赫爾辛基大學開源的 OPUS MT 模型 :https://github.com/Helsinki-NLP/OPUS-MT-trainHelsinki-NLP/opus-mt-zh-en :https://huggingface.co/Helsinki-NLP/opus-mt-zh-en
succinctly/text2image-prompt-generator:https://huggingface.co/succinctly/text2image-prompt-generator
免責聲明:本站所有信息均搜集自互聯網,並不代表本站觀點,本站不對其真實合法性負責 。如有信息侵犯了您的權益 ,請告知,本站將立刻處理。聯係QQ:1640731186