news 2026/6/15 18:42:31

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/6/15 12:11:26

穿越时空的数字考古:86Box ROM仓库的文化解码与技术传承

穿越时空的数字考古:86Box ROM仓库的文化解码与技术传承 【免费下载链接】roms ROMs for the 86Box emulator. For development versions of 86Box, the recommended way to use this repository is to clone it instead of downloading the tagged releases. 项目…

作者头像 李华
网站建设 2026/6/15 12:23:25

AutoGLM-Phone如何防误操作?敏感动作确认机制实战分析

AutoGLM-Phone如何防误操作?敏感动作确认机制实战分析 1. 什么是AutoGLM-Phone:手机端AI智能助理的底层逻辑 AutoGLM-Phone不是一款普通App,而是一个运行在本地控制端、调用云端大模型能力的手机端AI Agent框架。它背后依托的是智谱开源的O…

作者头像 李华
网站建设 2026/6/15 12:17:01

5个维度解析开源安全自动化平台:从部署到实战的完整指南

5个维度解析开源安全自动化平台:从部署到实战的完整指南 【免费下载链接】tracecat 😼 The open source alternative to Tines / Splunk SOAR. Build AI-assisted workflows, orchestrate alerts, and close cases fast. 项目地址: https://gitcode.co…

作者头像 李华
网站建设 2026/6/15 12:17:08

cv_resnet18_ocr-detection Batch Size调优:内存与速度平衡策略

cv_resnet18_ocr-detection Batch Size调优:内存与速度平衡策略 1. 为什么Batch Size对OCR文字检测如此关键 你可能已经发现,cv_resnet18_ocr-detection这个模型在WebUI里跑得挺快,但一旦点开“训练微调”页面,那个默认设为8的B…

作者头像 李华
网站建设 2026/6/15 12:24:19

5步精通API错误处理:从状态码解析到故障恢复

5步精通API错误处理:从状态码解析到故障恢复 【免费下载链接】ollama Get up and running with Llama 2 and other large language models locally 项目地址: https://gitcode.com/gh_mirrors/ol/ollama 在API开发与集成过程中,错误处理是保障系统…

作者头像 李华