
如何快速實現REST API集成以優化業務流程
反向提示詞我們用這個就好了:cartoonpaintingllustration, (worst quality, low quality, normal quality:2)
,其他配置可以參照下圖,注意圖片的寬度和高度要和 ControlNet 插件中上傳的圖片一致。
在 ControlNet 插件中,我們需要用到 2 個 ControlNet Unit,在第一個 Unit 中我們先上傳一張文字圖片,這個文字就是要在圖片中隱藏的文字,可以用 Word 或者 WPS 寫一個字然后截圖保存下來,保存下來后記得看下圖片的尺寸,然后修改上面提到的圖片寬度和高度。其他屬性的修改可以參考下圖,模型要選擇control_v1p_sd15_qrcode_monster
:
因為文字圖片是黑底白字的,需要在預處理中選擇invert
,如果文字圖片是白底黑字的話就需要選擇無
。
ControlNet 第二個 Unit 的配置大致相同,上傳同樣的圖片,但模型要選擇control_v1p_sd15_brightness
,還有控制權重、啟動控制的步數和結束控制的步數也需做相應調整,詳細配置信息如下:
生成的效果如下:
除了隱藏文字外,我們還可以隱藏 LOGO,比如將文字圖片中的文字換成 APPLE 的 LOGO,也可以實現類似的效果。
生成隱藏二維碼圖片我們需要先制作一張二維碼圖片,這張圖片要放到 ContolNet 插件中作為圖片生成的引導。二維碼圖片的制作需要用到之前預安裝的sd-webui-qrcode-toolkit
插件,安裝完插件后,我們可以在 sd-webui 的頂部菜單欄中看到QR Toolkit
這個菜單,進入后可以看到如下界面:
在 QR Toolkit 中輸入一個網址后右邊會生成二維碼,下面的各種參數用來調整二維碼圖片的效果,截圖之外的參數不需要調整,只需要調整上圖中的參數即可。這里主要的目標是盡量讓二維碼圖片看起來不那么像二維碼,這樣生成出來的圖片二維碼的痕跡就不會那么重。但如果二維碼圖片調整太過的話,可能導致生成的圖片無法被正常掃描,因此要做好其中的權衡,在調整過程中如果二維碼不容易被掃描,QR Toolkit 會提示:This QR Code may or may not be scannable. Please verify before using
。調整完后下載二維碼圖片以備用。
回到文生圖界面中,這次我們選擇的模型是Realistic Vision V5.1
,準備生成一張森林女精靈的圖片,采樣器建議選擇Euler a
,注意寬度和高度要和二維碼圖片的高度和寬度一致,詳細配置信息如下所示:
在 ControlNet 插件中,同樣需要用到 2 個 ControlNet Unit,步驟與隱藏文字相同,只是將文字圖片替換成之前生成的二維碼圖片,詳細配置信息如下:
因為這次生成的圖片有人物,所以我們要用到 ADetailer 插件來進行面部修復,ADetailer 的配置信息如下:
生成的效果如下:
了解了手動實現的過程后,我們再來看 API 的實現方式。
首先我們要啟動 sd-webui 的 API 服務,正常啟動 sd-webui 是通過webui.sh
命令(Windows 是webui.bat
)進行啟動,默認方式啟動后只能是本地訪問,如果你的 sd-webui 是部署在服務器上的話,那么你無法通過{服務器IP}:7860
這個地址進行訪問,這時候你需要添加參數--listen
,添加過后就可以通過{服務器IP}:7860
地址進行訪問了。
bash webui.sh --listen
如果你想在瀏覽器上安裝插件的話,系統會報安全錯誤提示,這意味著不允許你在服務器上直接安裝 sd-webui 插件,這時候你需要添加參數--enable-insecure-extension-access
。
bash webui.sh --listen --enable-insecure-extension-access
這樣啟動 sd-webui 服務后只能訪問 web 頁面,并沒有 API 服務,如果想要啟動 API 服務的話,需要添加參數--api
,這樣啟動后就可以通過{服務器IP}:7860/docs
地址來訪問 sd-webui 的 API 文檔了。
bash webui.sh --listen --enable-insecure-extension-access --api
如果你想為 sd-webui 增加一些安全性,可以添加參數--gradio-auth
,啟動服務后用戶只要訪問{服務器IP}:7860
就會看到一個登陸頁面,需要輸入用戶名和密碼才能訪問。
bash webui.sh --listen --enable-insecure-extension-access --api --gradio-auth {username}:{password}
在手動生成圖片的過程中,我們主要使用的是 sd-webui 的文生圖功能,這個功能對應的 API 接口是sdapi/v1/txt2img
,它的請求方式是POST
,請求參數有模型、正向提示詞、負向提示詞等等,返回的結果在images
參數中,是一個列表,列表中的每個元素都是一個圖片的 base64 編碼,我們只需要將列表中的第一個元素保存成圖片即可,示例代碼如下:
def generate_img() -> str:
response = requests.post(
url=f"{SD_ENDPOINT}/sdapi/v1/txt2img",
headers={"Content-Type": "application/json", "accept": "application/json"},
data=json.dumps(
{
"prompt": "xxxx", # 正向提示詞
"negative_prompt": "yyy", # 反向提示詞
"sd_model_checkpoint": "realsticVisionV51_v51VAE.safetensors [15012c583f]", # 模型
"width": 512, # 寬度
"height": 512, # 高度
"batch_size": 1, # 生成次數
"n_iter": 1, # 每次數量
"steps": 25, # 采樣步數
"cfg_scale": 7, # 提示詞引導系數
"sampler_name": "DPM++ SDE Karras", # 采樣器
}
),
)
response.raise_for_status()
return response.json()["images"][0]
在示例代碼中我們列舉了手動生成圖片的幾個配置參數,其中模型參數sd_model_checkpoint
的值可以通過另外一個接口sdapi/v1/sd-models
來獲取,更多的參數信息可以參考接口文檔:
在請求參數中,我們除了要傳 sd-webui 的基本參數外,還需要傳入我們所用到的插件的參數,比如我們在之前示例中用到的 ControlNet 插件,那么我們就需要將 ControlNet 插件的配置加入到請求參數中,示例代碼如下:
data=json.dumps(
{
...
"alwayson_scripts": {
"controlnet": {
"args": [
{
"input_image": input_image, # 上傳的文件
"model": "control_sd15_qrcode_monster [ff0e6388]", # 模型
"weight": 1, # 控制權重
"guidance_start": 0, # 啟動控制的步數
"guidance_end": 1, # 結束控制的步數
"resize_mode": 2, # 縮放模式,2表示填充
"module": "invert", # 預處理
"pixel_perfect": True, # 完美匹配像素
},
{
"input_image": input_image, # 上傳的文件
"model": "control_v1p_sd15_brightness [1cf9248a]", # 模型
"weight": 0.3, # 控制權重
"guidance_start": 0.65, # 啟動控制的步數
"guidance_end": 0.9, # 結束控制的步數
"resize_mode": 2, # 縮放模式,2表示填充
"module": "invert", # 預處理
"pixel_perfect": True, # 完美匹配像素
},
]
},
},
}
),
sd-webui 插件的參數都放在alwayson_scripts
中,每個插件以自己名稱作為 key,ControlNet 插件的 key 是controlnet
,下面的 args
數組是我們用到的 2 個 ControlNet Unit,然后是每個 Unit 的配置,這里我們列舉了手動示例中的幾個參數。其中的model
參數的值可以通過另外一個接口controlnet/modelslist
來獲取,更多的參數可以參考ControlNet 插件的 API 文檔[11]。
其實每個插件都會將自己的接口信息會添加到 sd-webui API 的接口文檔中,比如 ControlNet 插件就增加了以controlnet
開頭的幾個接口,文檔做得好的插件還會有自己的接口文檔,通常放在插件倉庫的 Wiki 中,比如 ControlNet 插件的接口文檔就放在了這里[12]。
input_image
參數是我們上傳的文字圖片,我們需要將其轉換成 base64 編碼,圖片文件轉 base64 編碼的示例方法如下:
def image_to_base64(image_path: str) -> str:
# 打開圖像文件
with Image.open(image_path) as image:
# 創建一個BytesIO對象
buffered_image = BytesIO()
# 保存圖像到BytesIO對象
image.save(buffered_image, format="PNG")
# 獲取BytesIO對象的二進制數據
image_bytes = buffered_image.getvalue()
# 轉換二進制數據為base64編碼
base64_string = base64.b64encode(image_bytes).decode("utf-8")
return base64_string
調用文生圖接口生成圖片后,我們可以將生成的圖片保存到本地,示例代碼如下:
def saveImg(output_path="output.jpg", ):
img = generate_img()
image_data = base64.b64decode(img)
image_io = BytesIO(image_data)
image = Image.open(image_io)
image.save(output_path)
這樣我們就實現了通過 API 方式生成隱藏文字圖片的功能了,生成的圖片保存在output.png
文件中。
隱藏二維碼圖片的 API 實現方式與隱藏圖片的實現方式基本相同,不同的地方是我們還用到另外一個 ADetailer 插件,這個插件的配置我們也需要一起放在請求參數中,示例代碼如下:
data=json.dumps(
{
...
"alwayson_scripts": {
"controlnet": {...},
"ADetailer": {
"args": [
{
"ad_model": "face_yolov8n.pt",
}
]
},
}
}
),
這里我們只添加了 ADetailer 插件中的模型參數,其他參數都用默認的,插件更多參數信息可以參考ADetailer 插件的 API 文檔[13]。
以上就是通過 API 實現 Stable Diffusion 文字和二維碼隱藏圖片的全部過程,現在有一些 APP 已經實現了這些功能,比如字畫幻術圖等,如果覺得自己實現起來比較麻煩的話,也可以直接使用這些 APP 來生成圖片,它們的實現原理都是一樣的,都是通過 sd-webui API 的方式來實現。
關注我,一起學習各種人工智能和 AIGC 新技術,歡迎交流,如果你有什么想問想說的,歡迎在評論區留言。
?ADetailer 插件的 API 文檔:?https://github.com/Bing-su/adetailer/wiki/API[1]?
Stable Diffusion WebUI: https://github.com/AUTOMATIC1111/stable-diffusion-webui[2]
Realistic Vision V5.1: https://civitai.com/models/4201/realistic-vision-v51[3]
Photon: https://civitai.com/models/84728?modelVersionId=90072[4]
ControlNet: https://github.com/lllyasviel/ControlNet[5]
sd-webui-controlnet: https://github.com/Mikubill/sd-webui-controlnet[6]
monster-labs/control_v1p_sd15_qrcode_monster: https://huggingface.co/monster-labs/control_v1p_sd15_qrcode_monster[7]
ioclab/control_v1p_sd15_brightness: https://huggingface.co/ioclab/control_v1p_sd15_brightness[8]
sd-webui-qrcode-toolkit: https://github.com/antfu/sd-webui-qrcode-toolkit[9]
ADetailer: https://github.com/Bing-su/adetaile[10]
靈羽助手: www.ai-anywhere.com/#/?c=F43MLO6Q[11]
ControlNet 插件的 API 文檔: https://github.com/Mikubill/sd-webui-controlnet/wiki/API#controlnetunitrequest-json-object[12]
這里: https://github.com/Mikubill/sd-webui-controlnet/wiki/API[13]
文章轉自微信公眾號@極客與黑客之路