从本地玩具到生产级服务:用FastAPI将PhotoMaker打造成高可用图片生成API
【免费下载链接】PhotoMaker 项目地址: https://gitcode.com/mirrors/TencentARC/PhotoMaker
引言
你是否已经能在本地用PhotoMaker生成惊艳的图像,并渴望将其强大的视觉创造力分享给你的网站或App用户?本教程将带你走完从本地脚本到云端API的关键一步。通过将PhotoMaker封装为API,你可以轻松实现以下目标:
- 为你的产品添加个性化图片生成功能。
- 支持高并发请求,满足用户需求。
- 将AI能力转化为可运营的服务。
技术栈选型与环境准备
推荐框架:FastAPI
我们选择FastAPI作为Web框架,原因如下:
- 高性能:基于Starlette和Pydantic,性能接近Node.js和Go。
- 易用性:自动生成Swagger文档,便于调试和测试。
- 异步支持:原生支持异步请求,适合AI模型的高延迟场景。
环境准备
创建一个requirements.txt文件,包含以下依赖:
fastapi
uvicorn
torch
diffusers
transformers
pillow
安装依赖:
pip install -r requirements.txt
核心逻辑封装:适配PhotoMaker的推理函数
模型加载函数
from diffusers import StableDiffusionXLPipeline
import torch
def load_model():
"""
加载PhotoMaker模型。
返回:StableDiffusionXLPipeline实例。
"""
# 下载模型权重
model_path = "TencentARC/PhotoMaker"
pipe = StableDiffusionXLPipeline.from_pretrained(model_path, torch_dtype=torch.float16)
pipe.to("cuda" if torch.cuda.is_available() else "cpu")
return pipe
推理函数
def generate_image(pipe, prompt: str, face_image_path: str, output_path: str = "output.jpg"):
"""
根据文本提示和面部图像生成图片。
参数:
- pipe: 加载的模型管道。
- prompt: 文本提示。
- face_image_path: 面部图像路径。
- output_path: 输出图片路径。
返回:生成的图片路径。
"""
from PIL import Image
# 加载面部图像
face_image = Image.open(face_image_path)
# 生成图片
image = pipe(prompt=prompt, face_image=face_image).images[0]
image.save(output_path)
return output_path
API接口设计:优雅地处理输入与输出
服务端代码
from fastapi import FastAPI, UploadFile, File
from fastapi.responses import FileResponse
import os
app = FastAPI()
pipe = load_model()
@app.post("/generate/")
async def generate(prompt: str, face_image: UploadFile = File(...)):
"""
生成图片的API端点。
参数:
- prompt: 文本提示。
- face_image: 上传的面部图像文件。
返回:生成的图片文件。
"""
# 保存上传的面部图像
face_image_path = "temp_face.jpg"
with open(face_image_path, "wb") as f:
f.write(await face_image.read())
# 生成图片
output_path = generate_image(pipe, prompt, face_image_path)
# 返回生成的图片
return FileResponse(output_path, media_type="image/jpeg")
为什么返回文件而不是URL?
- 简单性:直接返回文件内容适合小型服务。
- 灵活性:用户可以根据需求将文件存储到云服务或本地。
实战测试:验证你的API服务
启动服务
uvicorn main:app --reload
测试代码
使用curl测试:
curl -X POST -F "prompt=A futuristic portrait" -F "face_image=@face.jpg" http://localhost:8000/generate/ -o output.jpg
使用Python requests测试:
import requests
url = "http://localhost:8000/generate/"
files = {"face_image": open("face.jpg", "rb")}
data = {"prompt": "A futuristic portrait"}
response = requests.post(url, files=files, data=data)
with open("output.jpg", "wb") as f:
f.write(response.content)
生产化部署与优化考量
部署方案
- Gunicorn + Uvicorn:支持多Worker,提高并发能力。
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app - Docker:便于环境隔离和扩展。
优化建议
- GPU显存管理:通过
VAE切片减少显存占用。 - 批量推理:支持多请求合并处理,提高吞吐量。
【免费下载链接】PhotoMaker 项目地址: https://gitcode.com/mirrors/TencentARC/PhotoMaker
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



