从本地玩具到生产级API:手把手教你将sd-controlnet-canny打造成高可用图像生成服务
【免费下载链接】sd-controlnet-canny 项目地址: https://gitcode.com/mirrors/lllyasviel/sd-controlnet-canny
引言
你是否已经能在本地用sd-controlnet-canny生成惊艳的图像,并渴望将其强大的视觉创造力分享给你的网站或App用户?本教程将带你走完从本地脚本到云端API的关键一步。通过封装成API,你的模型将不再局限于本地运行,而是可以支撑高并发请求,为你的产品注入AI灵魂!
技术栈选型与环境准备
推荐框架:FastAPI
我们选择FastAPI作为Web框架,原因如下:
- 高性能:基于Starlette和Pydantic,性能接近Node.js和Go。
- 异步支持:天然支持异步请求处理,适合高并发场景。
- 自动文档生成:内置Swagger UI和ReDoc,方便调试和测试。
环境依赖
创建一个requirements.txt文件,包含以下依赖:
fastapi
uvicorn
torch
diffusers
transformers
opencv-contrib-python
pillow
安装依赖:
pip install -r requirements.txt
核心逻辑封装:适配sd-controlnet-canny的推理函数
模型加载函数
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torch
def load_model():
"""加载sd-controlnet-canny模型及其依赖的Stable Diffusion模型"""
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
return pipe
说明:
ControlNetModel.from_pretrained:加载预训练的ControlNet模型。StableDiffusionControlNetPipeline:将ControlNet与Stable Diffusion结合,支持条件控制生成。
推理函数
from PIL import Image
import numpy as np
import cv2
def run_inference(pipe, prompt: str, canny_image: Image.Image, num_inference_steps: int = 20):
"""运行推理生成图像"""
# 将输入图像转换为Canny边缘图
image = np.array(canny_image)
image = cv2.Canny(image, 100, 200)
image = Image.fromarray(image)
# 生成图像
output = pipe(
prompt,
image,
num_inference_steps=num_inference_steps,
).images[0]
return output
说明:
cv2.Canny:将输入图像转换为Canny边缘图,作为ControlNet的条件输入。pipe:调用模型生成图像,返回PIL图像对象。
API接口设计:优雅地处理输入与输出
服务端代码
from fastapi import FastAPI, UploadFile, File
from fastapi.responses import FileResponse
import tempfile
import os
app = FastAPI()
pipe = load_model()
@app.post("/generate")
async def generate_image(
prompt: str,
canny_image: UploadFile = File(...),
num_inference_steps: int = 20,
):
"""生成图像的API端点"""
# 保存上传的临时文件
with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmp:
tmp.write(await canny_image.read())
tmp_path = tmp.name
# 运行推理
input_image = Image.open(tmp_path)
output_image = run_inference(pipe, prompt, input_image, num_inference_steps)
# 保存输出图像
output_path = "output.png"
output_image.save(output_path)
# 清理临时文件
os.unlink(tmp_path)
return FileResponse(output_path)
说明:
- 使用
UploadFile接收上传的图像文件。 - 返回
FileResponse,直接提供生成图像的下载链接。
实战测试:验证你的API服务
使用curl测试
curl -X POST -F "prompt=Girl with Pearl Earring" -F "canny_image=@input.png" http://localhost:8000/generate --output output.png
使用Python requests测试
import requests
url = "http://localhost:8000/generate"
files = {"canny_image": open("input.png", "rb")}
data = {"prompt": "Girl with Pearl Earring"}
response = requests.post(url, files=files, data=data)
with open("output.png", "wb") as f:
f.write(response.content)
生产化部署与优化考量
部署方案
- Gunicorn + Uvicorn Worker:适合生产环境的高并发部署。
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app - Docker:封装为容器,便于跨平台部署。
优化建议
- GPU显存管理:对于高并发场景,建议动态加载模型,避免显存溢出。
- VAE切片:如果生成高分辨率图像,启用VAE切片以节省显存。
【免费下载链接】sd-controlnet-canny 项目地址: https://gitcode.com/mirrors/lllyasviel/sd-controlnet-canny
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



