想要在iOS跑AI生圖?不要雲端運算,而是直接用本機GPU生圖?
Draw Things APP實現你的願望!
Draw Things為Liu Liu於2022年推出的免費APP,部份開放原始碼,僅支援Mac、iPhone、iPad系統。其他系統建議用 Automatic1111 Stable Diffusion WebUI。
Draw Things提供文生圖、圖生圖、局部重繪、訓練模型等功能,界面針對行動裝置重新設計過。它利用Apple Core ML加速技術,讓你可以在iOS裝置直接跑Stable Diffusion、FLUX這類AI生圖模型,不用依賴第三方生圖服務。生圖過程全都是在本機運算的。
這樣做的好處是你可以自由下載生圖模型,不會有任何色色關鍵字審查,也沒有額度限制,能夠自由生成想要的圖片。
現在Draw Things仍持續更新中,不斷加入許多AI生圖的新技術,例如LoRA、ControlNet、Fooocus,新的模型也會陸續支援。
1. Draw Things硬體需求#
Draw Things支援Mac、iPhone、iPad系統,界面大同小異。
雖然開發者沒有明講Draw Things硬體需求,但AI生圖非常吃系統資源,會大量佔用GPU和RAM,敬請注意散熱。
建議使用搭載M1晶片、RAM 8GB以上的裝置,否則生成1024x1024大圖APP可能資源不足閃退。
iOS在生圖時建議將背景執行的APP全部關閉,將資源留給Draw Things。
另外,AI生圖模型會佔用許多空間,因此要準備20GB以上儲存空間。
2. 下載Draw Things模型#
開啟後Draw Things 會提示你下載模型,我們就選SDXL吧,大約需要5GB左右空間。
Draw Things相容大部分Stable Diffusion模型,所以你也可以到 Civitai網站手動下載模型(建議用Safari背景下載),再點選Import手動匯入至Draw Things。
點選左下角系統設定,開啟CoreML全部功能,加快生圖速度。
3. 文生圖模式#
Text to image,根據輸入的文字生成圖片。
裡面的參數請參考 Stable Diffusion WebUI的說明。
界面概覽:
預設Draw Things會開一個新專案,左邊是生圖選項,中間是畫布圖層,上方為提示詞區域。
首先,點選左邊的Basic選單,選取使用Stable Diffusion XL模型,Sampler選擇Euler A或UniPC,然後設定生圖長寬為1024x1024
填入正向提示詞和負向提示詞,後者可以用embedding達成,點一下迴紋針按鈕,下載Negative XL模型。
按Generate開始生成!等待畫布上的藍色格子填滿…
圖片就會出來了。長按側邊欄位儲存圖片。
Draw Things的操作邏輯是這樣:每次「文生圖」生完圖都是一個圖層,如果你繼續點生圖,會變成「局部重繪」模式,新圖會參考方框內的圖生成,空白的地方會自動填滿。
若要生成獨立的新圖,請在生成圖片之後移動畫布的選取框到空白處,或者點一下右下角按鈕
Start a blank canvas
,這樣新圖才不會參考現有圖片。
4. 圖生圖模式#
Image to image,參考畫布上的圖片進行AI生成。
按畫布下方的相機按鈕,或是旁邊的歷史紀錄,匯入要參考的圖片,並讓白色方框對準圖片
填入提示詞。
左邊選取Image to Image,調整拉桿,設定參考原圖的程度(Strength),數值越小越像原圖。
如果你覺得圖生圖不夠精準,你還可以搭配 ControlNet依照輪廓或線稿,做更精準的生成,不過這要額外下載許多模型。
5. 局部重繪模式#
Inpainting,劃出局部區域,重新生成衣服或者換臉。
點選橡皮擦圖示,擦掉要修改的地方,再點選生成,它就會按照你的提示詞填滿空白處。
如果使用油漆刷工具的話,就是讓AI生成與筆刷顏色相近的圖片。
6. 啟用HTTP API伺服器遠端生圖#
你可以啟動Draw Things的HTTP伺服器,遠端請求Draw Things生圖。
點一下左側的Davanced → HTTP API Server,啟動服務,監聽IP設定
0.0.0.0
Apple裝置的區域IP可在系統設定 → Wifi查看
這樣另一部裝置就能向
http://裝置IP:7860
傳送生圖請求了,目前支援Draw Things生圖的客戶端似乎就只有 SillyTavern而已哪。若要自行實現Python生圖的話,請求格式長這樣,下面是我參考 Github的.mjs範例所改寫的Python指令稿:
import requests
import base64
import time
import os
DRAW_THINGS_URL = 'http://裝置IP:7860/sdapi/v1/txt2img'
MAX_FILE_NAME_LEN = 30
params = {
"prompt": "girls with bunch of carrots",
"negative_prompt": "worst quality, low quality, normal quality",
"model": "模型名稱.ckpt",
"sampler": "UniPC",
"seed": -1,
"steps": 20,
"guidance_scale": 7,
"batch_count": 1,
"width": 768,
"height": 768
}
headers = {
'Content-Type': 'application/json'
}
now = int(time.time())
def get_file_name(idx):
file_name = f"{prompt.replace(' ', '_')[:MAX_FILE_NAME_LEN].lower()}_{now}_{idx}.png"
return file_name
def save_img(data, idx):
file_name = get_file_name(idx)
with open(file_name, 'wb') as f:
f.write(base64.b64decode(data))
print(f"Saved: {file_name}")
response = requests.post(DRAW_THINGS_URL, json=params, headers=headers)
data = response.json()
images = data.get('images', [])
for idx, img_data in enumerate(images):
save_img(img_data, idx)
- 存檔為
drawthings.py
,在電腦終端機執行這個Python指令稿就能呼叫Draw Things生圖。
python3 drawthings.py
- 上述的指令稿會在Draw Things界面生圖,同時把圖片下載到電腦。