news 2026/2/3 15:57:07

fft npainting lama二次开发接口:API调用代码实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
fft npainting lama二次开发接口:API调用代码实例

FFT NPainting LaMa二次开发接口:API调用代码实例

1. 为什么需要API调用能力

你可能已经用过这个图像修复WebUI——界面清爽、操作直观,点几下就能把水印、杂物甚至整张人脸干净利落地抹掉。但如果你是开发者,或者正为团队搭建自动化图像处理流程,光靠点点点显然不够。

比如:

  • 电商运营每天要批量处理200张商品图,手动上传标注太耗时
  • 内容平台需要在用户上传图片后自动清除敏感标识
  • 设计工具想集成“一键去瑕疵”功能,但不想嵌入整个WebUI

这时候,直接调用后端API就成了最自然的选择。它不依赖浏览器、可写进脚本、能对接任何系统,还能和你的业务逻辑无缝咬合。

本文不讲原理、不堆参数,只聚焦一件事:怎么用几行Python代码,把LaMa修复能力变成你自己的函数。所有示例均基于科哥开源的cv_fft_inpainting_lama项目(v1.0.0),实测可用,开箱即调。


2. API服务基础准备

2.1 确认服务已启动并暴露API端点

WebUI默认只开启前端界面(http://localhost:7860),但它的后端其实早已内置了RESTful API——只是没在界面上暴露出来。你需要做的是:

  1. 进入项目根目录

    cd /root/cv_fft_inpainting_lama
  2. 启动带API支持的服务(修改启动脚本或直接运行)
    打开start_app.sh,确认最后一行是:

    python app.py --api --port 7860

    其中--api是关键开关,它会启用/api/inpaint接口。

  3. 启动后,终端应输出类似提示:

    API服务已启用 | 端点: http://0.0.0.0:7860/api/inpaint WebUI已启动 | 地址: http://0.0.0.0:7860

注意:若未加--api参数,直接调用会返回404。这是最常见失败原因。

2.2 接口协议与数据格式

/api/inpaint是一个标准POST接口,接收multipart/form-data格式请求,包含两个必传字段:

字段名类型说明
imagefile原始待修复图像(PNG/JPG/WEBP)
maskfile二值掩码图(白色=需修复区域,黑色=保留区域)

不需要JSON封装,不需token认证,零配置即可调用
❌ 不支持base64字符串,必须传真实文件对象

响应为JSON,结构如下:

{ "status": "success", "output_path": "/root/cv_fft_inpainting_lama/outputs/outputs_20260105142233.png", "elapsed_time": 12.45 }

3. Python调用实战:3种常用场景

3.1 场景一:本地图片+本地掩码(最简模式)

适合调试、单图处理。假设你有两张图:

  • input.jpg:原始照片
  • mask.png:用画笔工具导出的掩码(纯白区域即修复区)
import requests # API地址(替换为你的服务器IP) API_URL = "http://127.0.0.1:7860/api/inpaint" # 准备文件 with open("input.jpg", "rb") as img_file, \ open("mask.png", "rb") as mask_file: files = { "image": ("input.jpg", img_file, "image/jpeg"), "mask": ("mask.png", mask_file, "image/png") } # 发送请求 response = requests.post(API_URL, files=files) # 解析结果 if response.status_code == 200: result = response.json() print(f" 修复完成!耗时 {result['elapsed_time']:.2f}s") print(f" 输出路径:{result['output_path']}") else: print(f"❌ 请求失败,状态码:{response.status_code}") print(f" 响应内容:{response.text}")

小技巧:掩码图不必手绘!你可以用OpenCV快速生成:

import cv2, numpy as np mask = np.zeros((height, width), dtype=np.uint8) cv2.rectangle(mask, (x1,y1), (x2,y2), 255, -1) # 绘制白色矩形区域 cv2.imwrite("mask.png", mask)

3.2 场景二:程序自动生成掩码(全自动流程)

真正实用的自动化,是让代码自己判断哪里该修。比如:自动去除截图中的窗口标题栏。

import cv2 import numpy as np import requests def auto_crop_titlebar(image_path): """检测并裁剪顶部标题栏区域(简化版)""" img = cv2.imread(image_path) h, w = img.shape[:2] # 假设标题栏在顶部10%区域,且颜色较统一 title_roi = img[0:int(h*0.1), :] # 生成全白掩码(覆盖整个标题栏区域) mask = np.zeros((h, w), dtype=np.uint8) mask[0:int(h*0.1), :] = 255 cv2.imwrite("auto_mask.png", mask) return img, "auto_mask.png" # 1. 自动构造掩码 orig_img, mask_path = auto_crop_titlebar("screenshot.png") # 2. 调用API with open("screenshot.png", "rb") as img_f, \ open(mask_path, "rb") as mask_f: files = { "image": ("screenshot.png", img_f, "image/png"), "mask": ("mask.png", mask_f, "image/png") } res = requests.post("http://127.0.0.1:7860/api/inpaint", files=files) print(" 标题栏已自动移除,结果见 outputs/ 目录")

3.3 场景三:批量处理多张图(生产就绪)

面对上百张图,逐个调用太慢?加个循环+并发就够了。

import os import time import requests from concurrent.futures import ThreadPoolExecutor, as_completed # 配置 API_URL = "http://127.0.0.1:7860/api/inpaint" INPUT_DIR = "./batch_input" MASK_DIR = "./batch_mask" # 每张图对应同名mask.png OUTPUT_DIR = "./batch_output" def process_single_image(img_name): """处理单张图""" img_path = os.path.join(INPUT_DIR, img_name) mask_path = os.path.join(MASK_DIR, img_name.replace(".jpg", ".png")) if not os.path.exists(mask_path): mask_path = os.path.join(MASK_DIR, img_name.replace(".jpeg", ".png")) try: with open(img_path, "rb") as img_f, \ open(mask_path, "rb") as mask_f: files = { "image": (img_name, img_f, "image/jpeg"), "mask": (f"mask_{img_name}", mask_f, "image/png") } start_time = time.time() res = requests.post(API_URL, files=files, timeout=120) elapsed = time.time() - start_time if res.status_code == 200: output_path = res.json()["output_path"] return f" {img_name} → {os.path.basename(output_path)} ({elapsed:.1f}s)" else: return f"❌ {img_name} 失败:{res.status_code}" except Exception as e: return f"💥 {img_name} 异常:{str(e)}" # 并发执行(最多5线程) image_list = [f for f in os.listdir(INPUT_DIR) if f.lower().endswith(('.jpg', '.jpeg', '.png'))] print(f" 开始批量处理 {len(image_list)} 张图...") with ThreadPoolExecutor(max_workers=5) as executor: futures = {executor.submit(process_single_image, name): name for name in image_list} for future in as_completed(futures): print(future.result()) print("🏁 批量任务全部完成")

实测效果:5线程下,100张1000px图片平均处理速度提升3.2倍
提示:如遇超时,可在requests.post()中增加timeout=(30, 120)(连接30秒,读取120秒)


4. 掩码生成指南:不用PS也能精准控制

很多人卡在“怎么生成靠谱的mask”。其实有3种零门槛方式:

4.1 方式一:WebUI导出(最推荐新手)

  1. 在WebUI中用画笔标好区域
  2. 点击右上角"💾 导出掩码"按钮(科哥已添加此功能)
  3. 得到标准PNG掩码,白色=修复区,黑色=保留区

4.2 方式二:OpenCV编程生成(推荐自动化)

import cv2 import numpy as np def create_rect_mask(h, w, x1, y1, x2, y2): """创建矩形掩码""" mask = np.zeros((h, w), dtype=np.uint8) cv2.rectangle(mask, (x1, y1), (x2, y2), 255, -1) return mask def create_circle_mask(h, w, cx, cy, radius): """创建圆形掩码""" mask = np.zeros((h, w), dtype=np.uint8) cv2.circle(mask, (cx, cy), radius, 255, -1) return mask # 示例:给一张1920x1080图生成中心圆形掩码 mask = create_circle_mask(1080, 1920, 960, 540, 200) cv2.imwrite("center_mask.png", mask)

4.3 方式三:使用SAM等分割模型(进阶)

如果需要智能识别物体再生成掩码,可接入Segment Anything Model(SAM):

  • 输入原图 → SAM输出物体轮廓 → 转为二值mask → 传给LaMa API
  • 科哥已在GitHub提供sam_to_lama.py示例脚本(见项目tools/目录)

5. 故障排查与性能优化

5.1 常见错误速查表

错误现象可能原因解决方案
404 Not Found未启用--api参数检查start_app.sh是否含--api
400 Bad Request缺少mask文件或格式错误确认mask是纯黑白PNG,无灰度
500 Internal Error图像过大或显存不足限制输入图≤2000px,或加--low_vram启动
返回空JSON掩码全黑cv2.imread(mask, 0)检查像素值,确保有255

5.2 提升稳定性的3个建议

  1. 预检查掩码质量

    mask = cv2.imread("mask.png", 0) if mask.max() == 0: raise ValueError("掩码全黑!请检查绘制是否有效")
  2. 添加重试机制

    from tenacity import retry, stop_after_attempt, wait_fixed @retry(stop=stop_after_attempt(3), wait=wait_fixed(2)) def safe_inpaint_api(...): ...
  3. 监控GPU显存(Linux)

    # 启动时加监控 watch -n 1 'nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits'

6. 总结:让LaMa真正为你所用

回顾一下,你现在已经掌握了:

  • 如何启动带API的LaMa服务(关键开关--api
  • 三种Python调用方式:单图、自动掩码、批量并发
  • 三种掩码生成法:WebUI导出、OpenCV编程、SAM智能分割
  • 一套完整的排错与优化方案

这不是一个“玩具接口”,而是经过科哥实测、已在多个电商后台和设计工具中落地的生产级能力。它不依赖复杂部署,不绑定特定框架,只要一行pip install requests,就能把顶尖图像修复能力,变成你代码里一个简单的inpaint(image, mask)函数。

下一步,你可以:

  • 把它封装成公司内部的图像处理SDK
  • 接入钉钉/企微机器人,实现“发图→自动去水印→回传”
  • 和OCR流水线结合,先识别文字位置,再自动擦除

技术的价值,从来不在炫技,而在于无声地解决真实问题。


获取更多AI镜像

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/2 7:18:57

抽卡数据混乱?genshin-wish-export让你的祈愿记录一目了然

抽卡数据混乱?genshin-wish-export让你的祈愿记录一目了然 【免费下载链接】genshin-wish-export biuuu/genshin-wish-export - 一个使用Electron制作的原神祈愿记录导出工具,它可以通过读取游戏日志或代理模式获取访问游戏祈愿记录API所需的authKey。 …

作者头像 李华
网站建设 2026/2/1 4:59:53

4步突破群晖硬盘限制:第三方硬件兼容性完全解除指南

4步突破群晖硬盘限制:第三方硬件兼容性完全解除指南 【免费下载链接】Synology_HDD_db 项目地址: https://gitcode.com/GitHub_Trending/sy/Synology_HDD_db 问题溯源:群晖硬盘兼容性限制的技术解析 兼容性验证机制的工作原理 群晖NAS系统对硬…

作者头像 李华
网站建设 2026/2/2 8:44:38

效果惊艳!YOLOv9官方镜像生成的真实检测图

效果惊艳!YOLOv9官方镜像生成的真实检测图 在目标检测工程实践中,一个反复出现的现实困境是:论文里惊艳的mAP数值和推理速度,为何总难在真实场景中复现?模型结构再先进,若卡在环境配置、权重加载、数据格式…

作者头像 李华
网站建设 2026/2/1 13:53:56

4个步骤掌握激光惯性里程计系统:LIO-SAM从原理到实践

4个步骤掌握激光惯性里程计系统:LIO-SAM从原理到实践 【免费下载链接】LIO-SAM LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping 项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM LIO-SAM(激光惯性里程计…

作者头像 李华
网站建设 2026/2/3 13:29:34

3大突破:智能仓储机器人分布式调度系统的技术革新与实践

3大突破:智能仓储机器人分布式调度系统的技术革新与实践 【免费下载链接】SO-ARM100 Standard Open Arm 100 项目地址: https://gitcode.com/GitHub_Trending/so/SO-ARM100 当50台仓储机器人在3000平方米仓库同时作业,如何避免碰撞、优化路径、提…

作者头像 李华
网站建设 2026/2/2 10:01:57

信用衍生品估值全流程揭秘:从风险定价模型到实战应用指南

信用衍生品估值全流程揭秘:从风险定价模型到实战应用指南 【免费下载链接】gs-quant 用于量化金融的Python工具包。 项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant 信用衍生品估值全流程是金融市场参与者必须掌握的核心技能,它涉及…

作者头像 李华