昌都市网站建设_网站建设公司_改版升级_seo优化
2026/1/21 14:15:29 网站建设 项目流程

如何实现自动融合?unet image API调用与脚本化处理指南

1. 引言:从WebUI到自动化,解锁人脸融合新姿势

你是不是已经用过那个蓝紫色界面的人脸融合工具?就是科哥基于阿里达摩院 ModelScope 模型开发的Face Fusion WebUI。点点鼠标、传两张图、滑动参数,几秒就能看到融合效果,确实方便。

但如果你经常要用这个功能——比如做批量换脸测试、集成到自己的项目里,或者想定时处理一批照片,每次都手动操作就太累了。

这篇文章就是要带你走出Web界面,走进自动化世界。我们会讲清楚:

  • 怎么绕过网页点击,直接调用底层的unet image融合能力
  • 如何通过 API 实现程序化控制
  • 写一个可重复运行的 Python 脚本,完成自动上传、融合、保存全流程

目标很明确:让你不再依赖浏览器,用代码掌控人脸融合的一切

前置说明:本文假设你已部署并能正常运行 Face Fusion WebUI(端口7860),且熟悉基本的 Python 和 requests 使用。


2. 理解WebUI背后的API机制

别被“WebUI”迷惑了,它本质上是一个 Gradio 应用,而 Gradio 在后台其实暴露了一套标准的 HTTP 接口。我们每次点击“开始融合”,浏览器都在悄悄发送 POST 请求。

要实现自动化,第一步就是搞清楚这些请求长什么样。

2.1 抓包分析:看看点击“融合”时发生了什么

打开浏览器开发者工具(F12),切换到 Network 标签页,点击一次“开始融合”。你会看到一个叫predict/的请求。

查看其内容,典型的请求体结构如下:

{ "data": [ "data:image/jpeg;base64,/9j/4AAQSkZJRgA...", "data:image/jpeg;base64,/9j/4AAQSkZJRgB...", 0.5, { "face_detection_threshold": 0.5, "fusion_mode": "normal", "output_resolution": "1024x1024", "skin_smooth": 0.3, "brightness": 0.0, "contrast": 0.0, "saturation": 0.0 } ] }

响应返回的是融合后的 base64 图片数据。

这说明:整个融合过程可以通过 JSON 数据驱动,完全不需要图形界面


3. 构建自动化脚本的核心步骤

现在我们要做的,就是用 Python 模拟这个请求流程。

3.1 准备工作:安装依赖

确保你的环境中安装了requests

pip install requests

3.2 工具函数:图像转base64

Gradio 接口要求图片以 base64 字符串形式传递:

import base64 import requests def image_to_base64(image_path): """将本地图片转换为 base64 编码字符串""" with open(image_path, "rb") as f: encoded = base64.b64encode(f.read()).decode('utf-8') return f"data:image/jpeg;base64,{encoded}"

支持 PNG 的话可以判断后缀动态设置 MIME 类型。


4. 调用API实现自动融合

4.1 定义请求参数和接口地址

# WebUI 后端地址(默认) API_URL = "http://localhost:7860/api/predict/" # 构造请求数据 payload = { "data": [ image_to_base64("target.jpg"), # 目标图像 image_to_base64("source.jpg"), # 源图像 0.6, # 融合比例 { # 高级参数 "face_detection_threshold": 0.5, "fusion_mode": "blend", "output_resolution": "1024x1024", "skin_smooth": 0.4, "brightness": 0.1, "contrast": 0.0, "saturation": 0.1 } ] }

注意:output_resolution必须是"原始""512x512"这样的字符串,不能写成元组或列表。


4.2 发送请求并处理结果

def call_face_fusion_api(payload): try: response = requests.post(API_URL, json=payload, timeout=30) response.raise_for_status() result = response.json() # 提取 base64 结果 if "data" in result and len(result["data"]) > 0: output_image_base64 = result["data"][0] # 去掉 data:image/...;base64, 前缀 header, encoded = output_image_base64.split(",", 1) return encoded else: print("未收到有效返回数据") return None except requests.exceptions.RequestException as e: print(f"请求失败: {e}") return None

4.3 保存结果图像

def save_base64_image(base64_str, output_path): """将 base64 数据保存为图片文件""" with open(output_path, "wb") as f: f.write(base64.b64decode(base64_str)) # 执行融合 encoded_result = call_face_fusion_api(payload) if encoded_result: save_base64_image(encoded_result, "fused_result.jpg") print("✅ 融合成功,结果已保存为 fused_result.jpg") else: print("❌ 融合失败,请检查输入或服务状态")

5. 封装成可复用的自动化脚本

把上面逻辑整合成一个完整的.py文件:

# auto_face_fusion.py import base64 import requests import sys import os def image_to_base64(image_path): if not os.path.exists(image_path): raise FileNotFoundError(f"找不到图片: {image_path}") with open(image_path, "rb") as f: encoded = base64.b64encode(f.read()).decode('utf-8') ext = image_path.split('.')[-1].lower() mime = "jpeg" if ext in ["jpg", "jpeg"] else ext return f"data:image/{mime};base64,{encoded}" def fuse_faces(target_img, source_img, ratio=0.6, output_file="result.jpg", params=None): API_URL = "http://localhost:7860/api/predict/" advanced_params = { "face_detection_threshold": 0.5, "fusion_mode": "normal", "output_resolution": "1024x1024", "skin_smooth": 0.3, "brightness": 0.0, "contrast": 0.0, "saturation": 0.0 } if params: advanced_params.update(params) payload = { "data": [ image_to_base64(target_img), image_to_base64(source_img), ratio, advanced_params ] } try: print("🔄 正在发送融合请求...") response = requests.post(API_URL, json=payload, timeout=30) response.raise_for_status() result = response.json() if "data" in result and result["data"]: _, b64_data = result["data"][0].split(",", 1) with open(output_file, "wb") as f: f.write(base64.b64decode(b64_data)) print(f"✅ 融合成功!结果已保存至 {output_file}") return True else: print("❌ 返回数据异常") return False except Exception as e: print(f"❌ 融合失败: {str(e)}") return False # 示例调用 if __name__ == "__main__": success = fuse_faces( target_img="photos/target.jpg", source_img="photos/source.jpg", ratio=0.7, output_file="outputs/fused_07.jpg", params={ "fusion_mode": "blend", "skin_smooth": 0.5, "brightness": 0.1 } )

6. 扩展应用场景:让自动化更有价值

有了这个脚本,你可以做很多事:

6.1 批量融合多组人脸

pairs = [ ("target1.jpg", "celebrity_a.jpg"), ("target2.jpg", "celebrity_b.jpg"), # ... ] for i, (t, s) in enumerate(pairs): fuse_faces(t, s, ratio=0.65, output_file=f"batch/output_{i}.jpg")

6.2 集成到Flask/Django服务中

fuse_faces包装成一个 API 接口,供前端或其他系统调用。

6.3 定时任务生成创意内容

配合cronAPScheduler,每天自动生成一张“今日变身”海报。

6.4 结合人脸识别筛选最佳源图

先用 face_recognition 库检测哪张源图表情最自然,再自动触发融合。


7. 常见问题与解决方案

7.1 请求超时或连接拒绝

  • 确保 WebUI 正在运行:执行/bin/bash /root/run.sh
  • 检查端口是否被占用:netstat -tuln | grep 7860
  • 若服务器资源不足,增大 timeout 时间

7.2 返回空结果或错误码

  • 查看 WebUI 控制台日志,通常会打印具体错误
  • 检查图片路径是否正确、格式是否支持
  • 确保 base64 编码完整无截断

7.3 分辨率选项不生效

必须严格按照 WebUI 中显示的字符串填写,例如:

  • "1024"
  • "1024x1024"

建议先在界面上试一次,抓包确认 exact value。


8. 总结:从手动操作到工程化落地

通过这篇文章,你应该已经掌握了如何:

  • 理解 WebUI 背后的 API 通信机制
  • 将图形化操作转化为代码调用
  • 编写可复用、可扩展的自动化脚本

更重要的是,这种“逆向解析 + 脚本封装”的思路不仅适用于人脸融合,也适用于几乎所有基于 Gradio 或类似框架构建的 AI 工具。

自动化的意义,从来不是替代人工,而是把重复劳动交给机器,让人专注于更有创造力的事。

你现在完全可以把这个脚本集成进自己的项目,或是搭建一个私有的“AI换脸服务”。


获取更多AI镜像

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

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

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

立即咨询