本文来源公众号“OpenCV学堂”,仅用于学术分享,侵权删,干货满满。
原文链接:影楼精修-交互式修图Agent
美图最近上线了自己的AI Agent,名字为RoboNeo;体验上对比传统的app,个人感觉让人有新的兴趣想尝试一下,结果如下:
这个修图的Agent,从本质上,还是基于一个图像分析的多模态大模型,通过对输入用户图的分析,来调用对应的图像处理算法对图像进行修图,与上一篇文章介绍的方法类似。
今天,我们继续这个话题,介绍一个基于聊天交互的修图Agent。
需求定义
基于聊天交互的修图Agent
我们定义需求如下:
-
用户输入自然语言需求(如“我想美白、瘦脸”)
-
聊天机器人自动判断应使用哪些美颜参数和对应数值,输出:
-
模拟的美颜意图说明(自然语言)
-
对应的 API 参数 JSON(字典)
-
-
根据API参数调用修图算法执行修图处理,给出最终修图结果
一,算法结构分解
第一步:意图抽取与解释
ChatGPT 接收到用户一句话,例如:
“这张照片里痘痘很多,皮肤很差,法令纹太明显了。”
它自然可以理解出用户有以下意图:
-
去痘
-
皮肤美化
-
法令纹去除
并形成自然的语言理解解释:
用户希望清除面部痘痘、改善皮肤粗糙感、并减少法令纹,使脸部更加干净年轻。
第二步:语义→API 参数 映射
假设我们有20个修图API接口,此时,我们在 ChatGPT 中内置20个API参数与其含义,模型通过理解用户意图,将其转换为一个参数json和一个自然语言解释:
json
{
"spotRemoveRatio": 100,
"skinSoftRatio": 85,
"nasolabialFoldsRemoveRatio": 80
}
自然语言解释:
好的,我会帮你去除痘痘并美化皮肤,同时减淡法令纹,让脸部看起来更加干净年轻。
第三步:API调用→返回修图结果
这一步可以统一为MCP服务调用(方便不同服务接口扩展),也可以通过本地接口调用;
最终将修图效果图返回给用户;
二,算法流程图(伪代码结构)
python
def beautify_api_from_prompt(user_input: str) -> dict:
# Step 1: 语言理解 —— 利用 ChatGPT 对自然语言的理解
explanation = chatgpt_understand(user_input)
# Step 2: 分析哪些API功能应该使用(语义理解 + 语义归因)
selected_api = extract_apis_from_explanation(explanation)
# Step 3: 生成合理参数(结合默认值 + 用户语气程度)
api_with_ratios = generate_ratios_from_description(selected_api, user_input)
return api_with_ratios
各模块接口:
1.chatgpt_understand(user_input)
基于 ChatGPT 语言理解能力,将用户语句转为自然语言解释意图:
输入: “脸太胖了,眼睛也太小,皮肤也看起来有些暗沉”
输出:
用户希望瘦脸,让眼睛变大,同时希望皮肤更加白皙明亮。
这个解释作为模型的中间 reasoning 层,有助于下一步映射。
2.extract_apis_from_explanation(explanation)
模型根据意图说明,生成对应的 API 参数键名:
输入:
用户希望瘦脸,让眼睛变大,同时希望皮肤更加白皙明亮。
输出:
json
{
"faceLiftRatio": None,
"bigEyeRatio": None,
"skinWhiteRatio": None
}
在这一层不设定数值,只判断应该调用哪些功能。使用 ChatGPT 自然理解即可,不用词典。
3.generate_ratios_from_description(api_keys, user_input)
这一步模型通过用户语气、词汇(如“太胖了”、“很明显”、“有点”)等进行语义强度推断,赋予数值。
示例:
输入:
json
{
"faceLiftRatio": None,
"bigEyeRatio": None,
"skinWhiteRatio": None
}
用户原话:“脸太胖了,眼睛也太小,皮肤也看起来有些暗沉”
输出:
json
{
"faceLiftRatio": 60, # 关键词“太胖”→高强度
"bigEyeRatio": 50, # “太小”→中强度
"skinWhiteRatio": 30 # “有些暗沉”→轻度
}
这个过程利用 ChatGPT 理解语言的语气强弱来自动判断程度。
完整示例:用户输入 → 输出
用户输入:
“这张照片里脸太胖了,而且皮肤发黄发暗,看起来比较老。”
ChatGPT 输出(解释):
好的,我会帮你做瘦脸处理,同时调整肤色,让皮肤更白更红润一些,显得更年轻。
API 参数生成:
json
{
"faceLiftRatio": 60,
"skinWhiteRatio": 40,
"skinBeautyRatio": 25,
"faceSteroRatio": 40
}
效果输出:
将json解析为参数params,然后调用修图接口:
process_image_with_beauty_api(image,params)
三,完整实现与测试
我们以OpenAI的chatgpt为例(仅聊天版本,非多模态版本),使用Gradio进行简单的界面设计,提供用户图像上传与效果图展示,并添加聊天窗口,这里给出完整代码:
import gradio as gr
import openai
import os
from PIL import Image
# ========== 请设置你的 OpenAI Key ==========
openai.api_key = os.getenv("OPENAI_API_KEY") # 或直接写:openai.api_key = "sk-..."
# ========== 模拟图像处理API ==========
def process_image_with_beauty_api(image: Image.Image, params: dict) -> Image.Image:
"""
模拟美颜图像处理API,根据参数返回新图像
你可以将此函数替换为真实的美颜图像处理流程
"""
# 这里只是将图像转灰模拟处理,你应替换为真实美颜实现
return image.convert("L").convert("RGB")
# ========== 系统提示词 ==========
system_prompt = """你是一个图像美颜参数识别助手。
用户会上传照片,并用自然语言描述需求。你的任务是:
1. 识别他们的意图(用自然语言总结)
2. 输出一个JSON参数字典,调用美颜API。
可用API参数有:
1. skinColorUnifyRatio
2. bigEyeRatio
3. faceLiftRatio
4. eyebagRemoveRatio
5. nasolabialFoldsRemoveRatio
6. eyewinklesRemoveRatio
7. skinSoftRatio
8. spotRemoveRatio
9. skinWhiteRatio
10. skinBeautyRatio
11. faceSteroRatio
12. eyelid
13. facesmile
14. hairColorUnifyRatio
15. hairSmoothRatio
16. whiteTeethRatio
17. lipsTextureRemoveRatio
18. bodyreshapeRatio
数值为0~100(或0/1)。请根据语气判断强度,给出合理值。
输出格式为:
第一行是意图说明;
第二部分是参数字典。
eg:
用户输入:"我的脸太圆了,还长了好多痘痘,皮肤有点暗沉"
机器人回应:好的,我会帮你进行瘦脸处理、去除痘痘并改善肤色暗沉问题,让皮肤更干净、脸型更好看。
{
"faceLiftRatio": 30,
"spotRemoveRatio": 100,
"skinWhiteRatio": 35,
"skinSoftRatio": 70
}
"""
# ========== 核心聊天 + 图像处理逻辑 ==========
def chat_with_bot(image, history, user_msg):
history = history or []
messages = [{"role": "system", "content": system_prompt}]
for human, assistant in history:
messages.append({"role": "user", "content": human})
messages.append({"role": "assistant", "content": assistant})
messages.append({"role": "user", "content": user_msg})
# 调用 GPT 模型
response = openai.ChatCompletion.create(
model="gpt-4", # 或 "gpt-4o"
messages=messages,
temperature=0.5,
)
reply = response['choices'][0]['message']['content']
history.append((user_msg, reply))
# 提取 JSON 部分(从回复中分割出参数字典)
import re
import json
# 尝试从回复中提取 JSON 字典
json_match = re.search(r"\{[\s\S]*\}", reply)
beautified_image = None
if json_match and image is not None:
try:
params = json.loads(json_match.group(0))
beautified_image = process_image_with_beauty_api(image, params)
except Exception as e:
print("参数解析失败:", e)
return history, history, beautified_image
# ========== 构建 Gradio 界面 ==========
with gr.Blocks() as demo:
gr.Markdown("## 💄 图像美颜助手(图 + 聊天智能识别参数)")
with gr.Row():
input_img = gr.Image(label="原始图像", type="pil")
output_img = gr.Image(label="美化后图像", type="pil")
chatbot = gr.Chatbot(label="美颜助手")
msg = gr.Textbox(label="输入你的美颜需求", placeholder="例如:帮我美白、瘦脸、去痘痘")
state = gr.State([])
send_btn = gr.Button("发送")
send_btn.click(
fn=chat_with_bot,
inputs=[input_img, state, msg],
outputs=[chatbot, state, output_img]
)
msg.submit(
fn=chat_with_bot,
inputs=[input_img, state, msg],
outputs=[chatbot, state, output_img]
)
demo.launch()
上述代码中介绍了完整的基于chatgpt的修图Agent流程,并给出了对应的UI DEMO,对于修图算法模块,大家可以结合自己的需求自行扩展;
最终效果展示:
上面介绍了一个完整的基于聊天交互的修图Agent,用户可以通过聊天的方式,让机器人按照自己的要求进行修图,大大降低了修图的门槛,具有较大的普适性;同时,对于专业用户,由于每次聊天返回了对应的修图API参数,我们也可以很方便的与操作界面中对应修图参数进行绑定,比如直接映射到功能滑杆上,这样,用户既可以通过聊天来修图,也可以在聊天结果的基础上,继续通过功能滑杆来修图,对于专业修图人员也更加友好。
如果将chatgpt替换为多模态版本,那么,我们可以增加一个多模态图像分析模块,通过智能分析,给用户推荐更加合理的美颜流程和参数,这样就是一个更加完整智能的修图Agent!
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。