2026/4/18 17:48:04
网站建设
项目流程
网站建设四川,珠海网站品牌设计公司哪家好,整站优化多少钱,关键词seo排名优化fft npainting lama API文档生成#xff1a;Swagger集成实战
1. 背景与目标
你可能已经用过 fft npainting lama 这个图像修复工具——它能轻松实现图片重绘、物品移除、水印清除等操作#xff0c;界面友好#xff0c;效果惊艳。但如果你正在做二次开发#xff0c;比如想…fft npainting lama API文档生成Swagger集成实战1. 背景与目标你可能已经用过fft npainting lama这个图像修复工具——它能轻松实现图片重绘、物品移除、水印清除等操作界面友好效果惊艳。但如果你正在做二次开发比如想把它集成到自己的系统中或者提供给团队调用光靠WebUI点击可不够。我们需要的是API。更进一步我们还需要一份清晰、可交互的API文档让前端、测试甚至客户都能快速理解怎么调用接口。这时候Swagger 就派上用场了。本文将带你从零开始在fft npainting lama的基础上集成 Swagger 自动生成 API 文档完成一次实用的工程化升级。整个过程不依赖复杂框架改造适合已有 WebUI 项目的快速接入。2. 系统架构与技术选型2.1 原有系统分析fft npainting lama的 WebUI 是基于 Gradio 构建的核心启动文件是app.py其本质是一个 Python 函数封装 Gradio 接口暴露的模式。关键点图像上传 → 画笔标注mask→ 模型推理 → 返回修复图所有逻辑集中在predict或类似函数中当前只支持 UI 交互无标准 HTTP 接口我们要做的是在不影响原有功能的前提下新增一个 FastAPI 服务层把核心修复能力包装成 RESTful 接口并通过 Swagger 展示。2.2 技术组合FastAPI Swagger为什么选 FastAPI自带 Swagger UI默认路径/docs类型提示友好自动校验参数性能高适合图像处理类服务与 Python 生态无缝集成最终架构如下[客户端] ↓ (HTTP POST /api/inpaint) [FastAPI Server] → 调用 [lama 修复核心函数] ↓ 返回 base64 或 图片 URLSwagger 自动生成文档开发者打开/docs即可测试。3. 核心改造步骤3.1 提取图像修复核心函数首先我们要把app.py中的图像修复逻辑独立出来变成一个可复用的函数。假设原始代码中有类似这样的函数def process_image(image, mask): # image: numpy array, HWC, BGR # mask: 2D binary array # 返回修复后的图像numpy array ... return result_image我们将这个函数保存为inpaint_core.py# inpaint_core.py import cv2 import numpy as np def load_model(): # 模型加载逻辑只加载一次 pass def process_image(image_bgr: np.ndarray, mask: np.ndarray) - np.ndarray: 图像修复主函数 :param image_bgr: 输入图像 (H, W, 3), BGR格式 :param mask: 修复区域掩码 (H, W), 0表示保留255表示修复 :return: 修复后图像 (H, W, 3), BGR格式 # 这里调用 lama 的实际推理逻辑 # 示例伪代码 # pred_img model.infer(image_bgr, mask) pred_img image_bgr.copy() # 替换为真实逻辑 return pred_img注意确保模型只加载一次避免每次调用都初始化。3.2 创建 FastAPI 服务入口新建api_server.py引入 FastAPI 并注册路由# api_server.py from fastapi import FastAPI, UploadFile, File from fastapi.responses import JSONResponse import uvicorn import numpy as np import cv2 import base64 from io import BytesIO from PIL import Image from inpaint_core import process_image app FastAPI( titleFFT Lama 图像修复 API, description基于 fft npainting lama 的图像修复接口支持物品移除、水印清除等, version1.0.0 ) app.post(/api/inpaint, tags[图像修复]) async def inpaint_image( image: UploadFile File(..., description原始图像), mask: UploadFile File(..., description修复区域掩码白色为修复区) ): 执行图像修复 - **image**: 原始图像PNG/JPG - **mask**: 标注掩码图单通道或三通道白色区域将被修复 - 返回修复后的图像 base64 编码 # 读取图像 img_data await image.read() mask_data await mask.read() img cv2.imdecode(np.frombuffer(img_data, np.uint8), cv2.IMREAD_COLOR) mask_img cv2.imdecode(np.frombuffer(mask_data, np.uint8), cv2.IMREAD_GRAYSCALE) if img is None or mask_img is None: return JSONResponse({error: 图像解码失败}, status_code400) # 调整mask大小以匹配图像 mask_img cv2.resize(mask_img, (img.shape[1], img.shape[0])) _, mask_binary cv2.threshold(mask_img, 127, 255, cv2.THRESH_BINARY) # 执行修复 result process_image(img, mask_binary) # 编码为 base64 返回 _, buffer cv2.imencode(.png, result) img_base64 base64.b64encode(buffer).decode(utf-8) return JSONResponse({ success: True, result: fdata:image/png;base64,{img_base64} }) if __name__ __main__: uvicorn.run(api_server:app, host0.0.0.0, port8000, reloadFalse)3.3 集成 Swagger 文档上面的 FastAPI 代码已经自带 Swagger启动服务后访问http://你的服务器IP:8000/docs你会看到自动生成的交互式文档页面包含接口路径/api/inpaint参数说明image、mask 文件上传测试按钮可直接上传图片试用返回示例结构支持 cURL 命令导出Swagger 界面长这样文字描述左侧是接口列表点击展开中间是请求参数表单支持文件上传底部是“Try it out”按钮点击后发送请求实时显示响应结果包括 base64 图像预览这就是我们想要的效果无需写文档代码即文档。4. 与原有 WebUI 共存方案你可能担心加了 FastAPI会不会影响原来的 Gradio WebUI不会。我们可以这样做4.1 双服务并行启动修改start_app.sh同时启动两个服务#!/bin/bash # 启动 FastAPI后台 nohup python api_server.py fastapi.log 21 # 启动 Gradio WebUI cd /root/cv_fft_inpainting_lama python app.py --server_port 7860 --share False这样WebUI 继续运行在:7860API 服务运行在:8000互不干扰4.2 统一入口建议可选如果希望统一端口可以用 Nginx 反向代理location / { proxy_pass http://127.0.0.1:7860; } location /api/ { proxy_pass http://127.0.0.1:8000/; } location /docs { proxy_pass http://127.0.0.1:8000/docs; }这样所有流量走 80 端口外部更整洁。5. 接口使用示例5.1 使用 curl 调用curl -X POST http://your-server:8000/api/inpaint \ -F imageinput.jpg \ -F maskmask.png \ | jq -r .result | sed s/^data:image\/png;base64,// | base64 -d output.png5.2 使用 Python requestsimport requests files { image: open(input.jpg, rb), mask: open(mask.png, rb) } response requests.post(http://your-server:8000/api/inpaint, filesfiles) data response.json() # 提取 base64 并保存 import re match re.match(rdata:image\/png;base64,(.*), data[result]) if match: with open(output.png, wb) as f: f.write(base64.b64decode(match.group(1)))前端也可以直接用input typefile fetch 调用。6. 安全性与生产建议虽然 Swagger 方便调试但在生产环境要注意6.1 关闭调试接口可选FastAPI 默认开启/docs和/redoc如需关闭app FastAPI(docs_urlNone, redoc_urlNone) # 完全关闭 # 或 app FastAPI(docs_url/apidocs if DEBUG else None) # 仅开发环境开放6.2 添加身份验证推荐简单 token 验证from fastapi import Depends, HTTPException, Header def verify_token(x_token: str Header(...)): if x_token ! your-secret-token: raise HTTPException(status_code401, detailUnauthorized) app.post(/api/inpaint, dependencies[Depends(verify_token)]) async def inpaint_image(...): ...调用时需加头curl -H x-token: your-secret-token -F image... http://.../api/inpaint6.3 限制文件大小防止大文件拖垮服务MAX_FILE_SIZE 10 * 1024 * 1024 # 10MB async def read_upload_file(file: UploadFile): content await file.read() if len(content) MAX_FILE_SIZE: raise HTTPException(status_code413, detail文件过大) return content7. 效果验证与截图说明虽然本文重点是 API 集成但我们仍可通过 Swagger 界面直观验证效果。访问http://your-server:8000/docs后点击/api/inpaint→ “Try it out”上传一张原图和对应的 mask 图白色标记要移除的物体点击 “Execute”查看返回的 base64 图像是否正确预期结果返回 JSON 包含result字段base64 解码后图像完整修复区域自然融合无明显边缘痕迹或颜色偏差这表明 API 已成功集成原有修复能力。8. 总结8.1 我们完成了什么从fft npainting lama中抽离核心修复逻辑使用 FastAPI 封装为标准 HTTP 接口自动生成 Swagger 交互式文档实现双服务共存不影响原有 WebUI提供调用示例和生产优化建议现在无论是前端工程师、测试人员还是合作方都可以通过http://your-server:8000/docs快速了解并调用图像修复能力大大提升协作效率。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。