乐东黎族自治县网站建设_网站建设公司_SQL Server_seo优化
2026/1/21 10:04:06 网站建设 项目流程

图像修复服务化:fft npainting lama REST API封装教程

1. 引言:从WebUI到API服务的跃迁

你是不是也遇到过这样的场景?好不容易调好了一个图像修复模型,结果只能通过网页界面点点点操作。每次想集成到自己的项目里,就得手动上传、点击修复、再下载——这效率简直让人抓狂。

今天这篇文章,就是为了解决这个问题而生的。我们将带你把一个现成的fft npainting lama图像修复 WebUI 工具,改造成一个可编程调用的REST API 服务。改造完成后,你只需要发个HTTP请求,就能自动完成“上传图片→标注区域→修复→返回结果”的全流程。

这个项目原本是由“科哥”开发的一套基于 FFT 和 LaMa 模型的图像修复系统,支持通过画笔标注来移除水印、物体、文字等不需要的内容。它本身已经具备强大的修复能力,但仅限于本地交互式使用。我们的目标是让它“服务化”,变成一个真正能嵌入生产环境的工具。

你能学到什么?

  • 如何分析现有WebUI项目的结构
  • 怎样提取核心推理逻辑并封装成独立函数
  • 使用 FastAPI 快速构建 REST 接口
  • 实现图像与掩码(mask)的 Base64 传输方案
  • 添加异步处理和错误捕获机制
  • 一键部署为后台服务

整个过程不需要你从头训练模型,也不需要深入理解 LaMa 的网络结构。我们只关注一件事:让这个强大的修复能力变得可调用、可集成、可扩展


2. 环境准备与项目结构解析

在开始改造之前,先确保你的运行环境满足基本要求。

2.1 基础环境要求

# 推荐使用 Python 3.9+ 环境 python --version # 安装依赖包管理工具 pip install -r requirements.txt

原始项目目录结构如下:

/root/cv_fft_inpainting_lama/ ├── app.py # Gradio WebUI 主程序 ├── core/ # 核心修复逻辑模块 │ ├── inference.py # 模型加载与推理入口 │ ├── model_zoo/ # 预训练模型文件 │ └── utils/ # 图像处理辅助函数 ├── start_app.sh # 启动脚本 ├── outputs/ # 输出结果保存路径 └── requirements.txt # 依赖列表

2.2 关键组件定位

我们要做的第一件事,就是找到图像修复的核心执行函数。

打开core/inference.py文件,你会发现类似这样的代码片段:

def inpaint_image(image: np.ndarray, mask: np.ndarray) -> np.ndarray: """ 输入原始图像和掩码,返回修复后的图像 image: RGB格式,HWC排列 mask: 0表示保留,255表示待修复 """ # 模型加载(建议全局初始化) model = get_lama_model() # 预处理 + 推理 + 后处理 result = model(torch.from_numpy(image).permute(2,0,1).float() / 255.0, torch.from_numpy(mask).unsqueeze(0).float() / 255.0) return (result[0].permute(1,2,0).cpu().numpy() * 255).astype(np.uint8)

这个inpaint_image函数就是我们整个服务的核心引擎。只要能把前端传来的图像和掩码转换成它需要的格式,就能直接调用。


3. 封装核心修复功能

为了让 API 能稳定调用,我们需要对原始逻辑进行轻量级重构。

3.1 提取可复用模块

新建一个api_service/core/inpaint.py文件:

import cv2 import numpy as np from .inference import inpaint_image as raw_inpaint class ImageInpainter: def __init__(self): self.model_ready = False try: # 初始化模型(全局单例) self._model = None self.model_ready = True except Exception as e: print(f"模型加载失败: {e}") def process(self, image_b64: str, mask_b64: str) -> dict: if not self.model_ready: return {"success": False, "error": "修复引擎未就绪"} try: # 解码Base64图像 img_data = base64.b64decode(image_b64) mask_data = base64.b64decode(mask_b64) image = cv2.imdecode(np.frombuffer(img_data, np.uint8), cv2.IMREAD_COLOR) mask = cv2.imdecode(np.frombuffer(mask_data, np.uint8), cv2.IMREAD_GRAYSCALE) # 转换为RGB image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 执行修复 result_rgb = raw_inpaint(image, mask) result_bgr = cv2.cvtColor(result_rgb, cv2.COLOR_RGB2BGR) # 编码回Base64 _, buffer = cv2.imencode('.png', result_bgr) result_b64 = base64.b64encode(buffer).decode('utf-8') return {"success": True, "result": result_b64} except Exception as e: return {"success": False, "error": str(e)}

这样我们就把修复能力包装成了一个类,便于后续管理和扩展。


4. 构建REST API接口

接下来,使用 FastAPI 来暴露 HTTP 接口。

4.1 安装FastAPI相关依赖

pip install fastapi uvicorn python-multipart

4.2 创建API主程序

新建api_service/main.py

from fastapi import FastAPI, HTTPException from pydantic import BaseModel import base64 from .core.inpaint import ImageInpainter app = FastAPI(title="图像修复API", description="基于LaMa模型的图像修复服务") # 全局实例 inpainter = ImageInpainter() class InpaintRequest(BaseModel): image: str # Base64编码的原图 mask: str # Base64编码的掩码图 class InpaintResponse(BaseModel): success: bool result: str = None error: str = None @app.post("/inpaint", response_model=InpaintResponse) async def repair_image(data: InpaintRequest): if not data.image or not data.mask: raise HTTPException(status_code=400, detail="缺少image或mask字段") result = inpainter.process(data.image, data.mask) return InpaintResponse(**result) @app.get("/health") async def health_check(): return {"status": "ok", "model_ready": inpainter.model_ready}

4.3 启动方式

添加启动脚本start_api.sh

#!/bin/bash cd /root/cv_fft_inpainting_lama/api_service uvicorn main:app --host 0.0.0.0 --port 8000 --reload

现在你可以通过以下命令启动API服务:

bash start_api.sh

访问http://服务器IP:8000/docs即可查看自动生成的 Swagger 文档界面。


5. 客户端调用示例

5.1 Python调用代码

import requests import base64 def call_inpaint_api(image_path, mask_path): # 读取图像并编码 with open(image_path, "rb") as f: image_b64 = base64.b64encode(f.read()).decode('utf-8') with open(mask_path, "rb") as f: mask_b64 = base64.b64encode(f.read()).decode('utf-8') # 发送请求 resp = requests.post( "http://localhost:8000/inpaint", json={"image": image_b64, "mask": mask_b64} ) if resp.json()["success"]: result_data = base64.b64decode(resp.json()["result"]) with open("output_repaired.png", "wb") as f: f.write(result_data) print("修复完成!已保存为 output_repaired.png") else: print("修复失败:", resp.json()["error"]) # 调用示例 call_inpaint_api("input.jpg", "mask.png")

5.2 curl命令测试

curl -X POST "http://localhost:8000/inpaint" \ -H "Content-Type: application/json" \ -d '{ "image": "'$(base64 -w 0 input.jpg)'", "mask": "'$(base64 -w 0 mask.png)'" }' | jq

6. 进阶优化建议

6.1 支持多种输入方式

除了Base64,还可以扩展支持:

  • 直接上传文件(multipart/form-data)
  • 传入远程URL地址
  • 支持批量处理多个区域

6.2 添加任务队列机制

对于大图或高并发场景,建议引入 Celery + Redis 实现异步任务队列:

from celery import Celery celery_app = Celery('inpaint_tasks', broker='redis://localhost:6379') @celery_app.task def async_inpaint_job(image_b64, mask_b64): return inpainter.process(image_b64, mask_b64)

客户端提交后返回任务ID,轮询获取结果。

6.3 性能监控与日志记录

添加简单的请求计数和耗时统计:

import time from functools import wraps def timing_decorator(func): @wraps(func) async def wrapper(*args, **kwargs): start = time.time() result = await func(*args, **kwargs) duration = time.time() - start print(f"[INFO] 请求耗时: {duration:.2f}s") return result return wrapper

7. 总结:让AI能力真正可用

经过这一系列改造,我们成功地将一个只能“手动点按钮”的图像修复工具,变成了一个可以通过代码调用的服务接口。这意味着它可以轻松集成进各种应用场景中:

  • 电商平台自动去除商品图水印
  • 内容管理系统批量清理旧图中的敏感信息
  • 移动App实现一键去物功能
  • 自动化流水线处理大量历史照片修复

更重要的是,这种“WebUI → API”的改造思路具有很强的通用性。无论是图像生成、语音合成还是视频处理,只要你能找到其核心推理函数,都可以用类似的方法封装成服务。

记住一句话:真正的生产力,不在于模型多强,而在于能否被方便地使用


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询