

這是后悔一款通過 Docker 和八十行左右的 Python 代碼,實現一款類似 Midjourney 官方圖片解析功能 Describe 的图片图片 Pr
.jpg)
聲明:本文轉載自蘇洋大佬博客內文章 ,可有效轉載注明原文鏈接原文鏈接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