OpenCV学堂 | 影楼精修-交互式修图Agent

本文来源公众号“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服务调用(方便不同服务接口扩展),也可以通过本地接口调用;

最终将修图效果图返回给用户;

二,算法流程图(伪代码结构)

pythondef 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 grimport openaiimport osfrom 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. skinColorUnifyRatio2. bigEyeRatio3. faceLiftRatio4. eyebagRemoveRatio5. nasolabialFoldsRemoveRatio6. eyewinklesRemoveRatio7. skinSoftRatio8. spotRemoveRatio9. skinWhiteRatio10. skinBeautyRatio11. faceSteroRatio12. eyelid13. facesmile14. hairColorUnifyRatio15. hairSmoothRatio16. whiteTeethRatio17. lipsTextureRemoveRatio18. 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 !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值