API接口怎么写?M2FP Flask服务返回JSON+Base64双格式

API接口怎么写?M2FP Flask服务返回JSON+Base64双格式

🧩 M2FP 多人人体解析服务 (WebUI + API)

项目背景与技术价值

在计算机视觉领域,人体解析(Human Parsing)是一项比通用语义分割更精细的任务,目标是对图像中的人体进行像素级部位划分,如头发、面部、上衣、裤子、鞋子等。相比传统“人像分割”仅区分前景人物与背景,人体解析能为虚拟试衣、动作识别、智能安防等场景提供更丰富的结构化信息。

M2FP(Mask2Former-Parsing)是基于 ModelScope 平台发布的先进多人人体解析模型,采用 Mask2Former 架构并针对人体部位优化训练,在复杂遮挡、多尺度、密集人群等场景下表现优异。本项目将其封装为一个稳定可部署的 CPU 友好型 Flask 服务,不仅支持 WebUI 交互式操作,还提供了标准化 API 接口,满足前后端分离系统的集成需求。

📌 核心定位
为无 GPU 环境下的中小型应用提供开箱即用的多人人体解析能力,兼顾可视化展示与程序化调用。


📖 技术架构概览

整个系统由三大模块构成:

  1. 模型推理层:加载预训练 M2FP 模型,执行图像输入 → 掩码输出
  2. 后处理引擎:将原始二值掩码(mask list)拼接成彩色语义图,并生成结构化标签数据
  3. Flask 服务层:对外暴露/api/predict接口,支持 JSON 结构响应和 Base64 编码图像返回
[客户端] ↓ HTTP POST (image file) [Flask Server] ↓ 调用 modelscope.pipeline [M2FP Inference] ↓ 输出 mask 列表 + label id [Post-Processor] → 合成彩色分割图(Base64) → 提取部位类别统计(JSON) ↓ {return {'result_image': base64_str, 'labels': [...], 'masks': [...]}}

该设计实现了“一次推理,双格式输出”——既可用于前端直接渲染结果图,也可供后端进一步分析使用。


🛠️ Flask API 设计与实现逻辑

为什么需要双格式返回?

  • Base64 图像:便于前端<img src="data:image/png;base64,...">直接展示,无需额外图片服务器
  • JSON 数据:包含精确的标签 ID、置信度、区域面积等元信息,适合做业务判断(如检测是否穿工服)

因此,我们设计的 API 返回如下结构:

{ "success": true, "result_image": "iVBORw0KGgoAAAANSUhEUgAA...", // Base64 PNG "labels": [ {"id": 14, "name": "hair", "area": 2345}, {"id": 5, "name": "upper_clothes", "area": 8765} ], "message": "Prediction completed." }

✅ 核心代码实现(Flask + ModelScope)

以下是完整可运行的核心服务代码片段,已做异常捕获与性能优化:

import io import base64 from flask import Flask, request, jsonify from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks from modelscope.outputs import OutputKeys import cv2 import numpy as np app = Flask(__name__) # 初始化 M2FP 人体解析 pipeline(CPU 模式) parsing_pipeline = pipeline( task=Tasks.image_parsing, model='damo/cv_resnet101_image-parsing_m2fp', device='cpu' # 显式指定 CPU ) # 颜色映射表:每个 label ID 对应一种 RGB 颜色 COLOR_MAP = { 0: [0, 0, 0], # background - black 1: [255, 0, 0], # skin 2: [0, 255, 0], # left_eyebrow 3: [0, 0, 255], # right_eyebrow # ... 其他颜色省略,实际需补全 20 类 14: [255, 255, 0], # hair - yellow 19: [0, 255, 255], # pants - cyan } def create_color_mask(masks, labels): """将多个二值 mask 合成为带颜色的语义分割图""" h, w = masks[0].shape color_image = np.zeros((h, w, 3), dtype=np.uint8) for mask, label_id in zip(masks, labels): color = COLOR_MAP.get(label_id, [128, 128, 128]) # 默认灰色 for c in range(3): color_image[:, :, c] += mask * color[c] return np.clip(color_image, 0, 255).astype(np.uint8) @app.route('/api/predict', methods=['POST']) def predict(): if 'image' not in request.files: return jsonify({'success': False, 'message': 'No image uploaded.'}), 400 file = request.files['image'] img_bytes = file.read() try: # 执行 M2FP 推理 result = parsing_pipeline(img_bytes) masks = result[OutputKeys.MASKS] # List of binary masks labels = result[OutputKeys.LABELS] # List of label ids # 统计各部位面积 label_stats = [] for mask, label_id in zip(masks, labels): area = int(np.sum(mask)) label_name = get_label_name(label_id) # 假设有映射函数 label_stats.append({ 'id': label_id, 'name': label_name, 'area': area }) # 合成彩色分割图 color_seg = create_color_mask(masks, labels) # 编码为 Base64 PNG _, buffer = cv2.imencode('.png', color_seg) b64_image = base64.b64encode(buffer).decode('utf-8') return jsonify({ 'success': True, 'result_image': b64_image, 'labels': label_stats, 'message': 'Prediction completed.' }) except Exception as e: return jsonify({ 'success': False, 'message': f'Inference error: {str(e)}' }), 500 def get_label_name(label_id): """简单示例映射函数""" name_map = { 14: 'hair', 5: 'upper_clothes', 6: 'lower_clothes', 19: 'pants', 20: 'face', 1: 'skin' # 实际应补全所有 20 类 } return name_map.get(label_id, f'unknown_{label_id}') if __name__ == '__main__': app.run(host='0.0.0.0', port=8080, debug=False)

💡 关键点说明: - 使用modelscope.pipelines封装简化模型调用 -device='cpu'显式启用 CPU 推理,避免自动检测失败 -create_color_mask()实现了“拼图算法”,按顺序叠加 mask 并着色 - OpenCV 的cv2.imencode()将 NumPy 数组转为 PNG 字节流,再 Base64 编码


⚙️ 环境稳定性保障策略

由于 PyTorch 2.x 与 MMCV-Full 存在严重兼容问题(典型报错:tuple index out of range,mmcv._ext not found),我们采取以下锁定方案确保环境稳定:

| 组件 | 版本 | 安装命令 | |------|------|----------| | Python | 3.10 |conda create -n m2fp python=3.10| | PyTorch | 1.13.1+cpu |pip install torch==1.13.1 torchvision==0.14.1 --index-url https://download.pytorch.org/whl/cpu| | MMCV-Full | 1.7.1 |pip install mmcv-full==1.7.1 -f https://download.openmmlab.com/mmcv/dist/index.html| | ModelScope | 1.9.5 |pip install modelscope==1.9.5| | OpenCV | 4.8+ |pip install opencv-python-headless|

⚠️ 注意事项: - 必须使用opencv-python-headless避免 GUI 依赖冲突 - 不建议升级到 PyTorch 2.x,否则会触发 MMCV 内部 ABI 不兼容错误 - 若出现_ext缺失,请确认mmcv-full是否完整安装(非mmcv


🧪 实际调用示例(Python 客户端)

你可以通过以下脚本测试 API 功能:

import requests import json url = "http://localhost:8080/api/predict" files = {'image': open('test.jpg', 'rb')} response = requests.post(url, files=files) data = response.json() if data['success']: # 保存 Base64 图像 with open("result.png", "wb") as f: f.write(base64.b64decode(data['result_image'])) print("Detected body parts:") for item in data['labels']: print(f" - {item['name']} (ID: {item['id']}, Area: {item['area']} pixels)") else: print("Error:", data['message'])

前端也可以直接使用:

<img id="seg-result"> <script> fetch('/api/predict', { method: 'POST', body: formData }) .then(r => r.json()) .then(data => { document.getElementById('seg-result').src = 'data:image/png;base64,' + data.result_image; }); </script>

🔍 性能优化技巧(CPU 场景)

尽管 ResNet-101 计算量较大,但我们通过以下方式提升 CPU 推理速度:

  1. 图像预缩放:将输入图像短边限制在 512px 以内,大幅减少计算量
  2. OpenMP 加速:设置环境变量开启多线程:bash export OMP_NUM_THREADS=4 export MKL_NUM_THREADS=4
  3. 禁用梯度与追踪python with torch.no_grad(): result = pipeline(img_bytes)
  4. 模型缓存复用:全局初始化 pipeline,避免重复加载

实测在 Intel i7-11800H 上,单张 640x480 图像推理时间约1.8 秒,可接受于离线或低频调用场景。


📊 JSON vs Base64:如何选择返回格式?

| 维度 | JSON 数据 | Base64 图像 | |------|-----------|------------| | 传输体积 | 小(仅元数据) | 大(含完整像素) | | 可读性 | 高(结构清晰) | 低(需解码查看) | | 前端使用 | 需二次绘图 | 可直接<img>展示 | | 后端分析 | 适合做逻辑判断 | 难以提取信息 | | 存储用途 | 可入库统计 | 占用空间大 |

推荐实践: - 若用于数据分析平台→ 优先返回 JSON,图像另存对象存储 - 若用于实时预览系统→ 返回 Base64 更便捷 -最佳方案:同时返回两者,由客户端按需使用


🎯 总结与扩展建议

本文详细介绍了如何基于 M2FP 模型构建一个功能完整的 Flask 人体解析服务,重点解决了:

  • API 接口设计:统一返回 JSON + Base64 双格式
  • CPU 兼容性问题:锁定 PyTorch 1.13.1 + MMCV-Full 1.7.1
  • 可视化拼图算法:实现 mask 到彩色图的自动合成
  • 工程化部署考量:异常处理、性能调优、跨语言调用

下一步可拓展方向:

  1. 增加 Swagger UI:使用flask-restx自动生成 API 文档
  2. 支持批量预测:添加/api/batch_predict接口
  3. 引入缓存机制:对相同图像 MD5 缓存结果,避免重复计算
  4. 添加权限控制:对接 JWT 或 API Key 认证

🚀 开源提示
该项目已打包为 Docker 镜像发布至 ModelScope 社区,搜索 “M2FP 多人人体解析” 即可一键部署。

通过合理的设计与封装,即使是复杂的深度学习模型也能轻松转化为生产级 API 服务,真正实现“AI 能力即服务”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1129422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026:当人工智能从屏幕走向街头,我们正在见证一场认知的重塑

如果你在2024年惊叹于视频生成的逼真&#xff0c;在2025年感慨于大模型的无处不在&#xff0c;那么刚刚拉开帷幕的2026年&#xff0c;正在用一种更为深沉且彻底的方式&#xff0c;推翻我们对科技的过往认知。在拉斯维加斯刚刚结束的CES 2026上&#xff0c;科技巨头们不再执着于…

M2FP模型在多模态任务中的扩展可能性

M2FP模型在多模态任务中的扩展可能性 &#x1f4cc; 引言&#xff1a;从人体解析到多模态智能的跃迁 随着计算机视觉技术的不断演进&#xff0c;语义分割已从基础场景理解逐步深入到细粒度的人体结构解析。M2FP&#xff08;Mask2Former-Parsing&#xff09;作为ModelScope平台推…

MGeo在社区疫情防控住户信息整合中的实战

MGeo在社区疫情防控住户信息整合中的实战 引言&#xff1a;疫情下的数据整合挑战与MGeo的破局之道 在突发公共卫生事件如新冠疫情中&#xff0c;基层社区承担着关键的防控职责。其中&#xff0c;住户信息的精准整合是开展流调追踪、密接排查、物资配送等工作的基础。然而&#…

【dz-1118】基于单片机的智能宠物喂食器

基于单片机的智能宠物喂食器 摘要 在现代生活中&#xff0c;宠物已成为家庭重要成员&#xff0c;但主人因工作繁忙等原因常无法按时喂食&#xff0c;可能导致宠物饮食不规律影响健康。传统宠物喂食器多为手动操作或固定时间喂食&#xff0c;缺乏灵活性与精准控制&#xff0c;难…

虚拟服装设计:M2FP在时尚行业的创新应用

虚拟服装设计&#xff1a;M2FP在时尚行业的创新应用 &#x1f9e9; M2FP 多人人体解析服务&#xff1a;开启虚拟试衣新范式 随着数字时尚与个性化消费的崛起&#xff0c;虚拟服装设计正从概念走向主流。设计师不再局限于实体布料与模特试穿&#xff0c;而是借助AI技术在数字空间…

面向非平稳数据流的持续预训练理论与高效算法研究

摘要​现实世界中&#xff0c;数据常以非平稳数据流形式持续产生&#xff08;如智慧城市传感器网络、医疗监测系统、自动驾驶数据&#xff09;&#xff0c;其分布随时间动态演化&#xff08;概念漂移&#xff09;&#xff0c;与传统静态预训练的独立同分布假设存在根本冲突。持…

深度测评!9款AI论文软件助你搞定毕业论文

深度测评&#xff01;9款AI论文软件助你搞定毕业论文 2026年AI论文写作工具测评&#xff1a;为何值得一看 在学术研究日益数字化的今天&#xff0c;AI论文软件已成为研究生和科研人员不可或缺的助手。然而&#xff0c;面对市场上琳琅满目的工具&#xff0c;如何选择真正适合自…

【dz-1119】基于单片机的二氧化碳生物培养箱控制系统设计

摘 要 随着生物科技的不断发展&#xff0c;二氧化碳生物培养箱在科研、医疗及工业生产等领域的应用日益广泛。为确保培养箱内的环境条件满足生物培养需求&#xff0c;设计一套基于单片机的智能控制系统显得尤为重要。 本设计采用STM32F103C8T6单片机为核心&#xff0c;通过SGP…

无需微调即可使用:M2FP预训练模型覆盖常见人体姿态

无需微调即可使用&#xff1a;M2FP预训练模型覆盖常见人体姿态 &#x1f4d6; 项目简介&#xff1a;M2FP 多人人体解析服务 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;目标是将图像中的人体分解…

【dz-1120】机房基站环境监控系统

机房基站环境监控系统 摘要 随着信息化时代的快速发展&#xff0c;机房基站作为通信与数据存储的核心枢纽&#xff0c;其运行环境的稳定性与安全性直接影响通信网络的可靠运行。机房内温湿度异常、烟雾火灾、电力故障及非法入侵等问题&#xff0c;若不能及时监测和处理&#xf…

基于单片机的信号灯控制系统的设计

基于单片机的信号灯控制系统的设计 第一章 绪论 交通信号灯是维持路口秩序的核心设施&#xff0c;传统信号灯多采用固定时序电路&#xff0c;存在适应性差的问题——无法根据车流量动态调整通行时间&#xff0c;易导致高峰时段拥堵或平峰时段资源浪费。此外&#xff0c;部分老旧…

图解网络安全:一张图看懂通信中的失效、丢失、篡改危机(基础知识图解)

网络安全小课堂——网络安全基础知识 信息安全&#xff1a;为数据处理系统建立和采用的技术和管理的安全保护&#xff0c;保护计算机硬件、软件和数据不因偶然和恶意的原因遭到破坏、更改和泄露。 网络安全&#xff1a;防止未授权的用户访问信息&#xff0c;防止未授权而试图…

图解网络安全:一张图看懂通信中的失效、丢失、篡改危机(基础知识图解)

网络安全小课堂——网络安全基础知识 信息安全&#xff1a;为数据处理系统建立和采用的技术和管理的安全保护&#xff0c;保护计算机硬件、软件和数据不因偶然和恶意的原因遭到破坏、更改和泄露。 网络安全&#xff1a;防止未授权的用户访问信息&#xff0c;防止未授权而试图…

Z-Image-Turbo按需购买GPU实例的经济性分析

Z-Image-Turbo按需购买GPU实例的经济性分析 引言&#xff1a;AI图像生成的成本挑战与Z-Image-Turbo的定位 随着AIGC&#xff08;人工智能生成内容&#xff09;技术的普及&#xff0c;AI图像生成已从实验室走向商业应用。然而&#xff0c;高性能推理对计算资源的依赖带来了显著…

节省80%部署时间:M2FP镜像预装所有依赖,避免环境冲突

节省80%部署时间&#xff1a;M2FP镜像预装所有依赖&#xff0c;避免环境冲突 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与核心价值 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff…

Z-Image-Turbo输出文件命名规则解析与管理建议

Z-Image-Turbo输出文件命名规则解析与管理建议 引言&#xff1a;从自动化生成到高效文件管理的挑战 在使用阿里通义Z-Image-Turbo WebUI图像快速生成模型进行AI创作的过程中&#xff0c;用户往往关注提示词设计、参数调优和生成质量&#xff0c;却容易忽视一个关键环节——输出…

Z-Image-Turbo梦幻发光特效生成技巧

Z-Image-Turbo梦幻发光特效生成技巧 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥引言&#xff1a;从基础生成到艺术化表达的跃迁 在AI图像生成领域&#xff0c;高质量视觉表现力正逐渐成为创作者的核心诉求。阿里通义推出的 Z-Image-Turbo 模型凭借其高效…

增值税发票管理系统开具发票查验技巧-发票查验API

在“以数治税”深入推进的今天&#xff0c;电子发票-尤其是全面数字化的电子发票&#xff08;全电票&#xff09;在全国范围内推广&#xff0c;这对于企业而言&#xff0c;既是降本增效的机遇&#xff0c;也带来了新的挑战&#xff1a;如何高效、准确地核验海量发票的真伪&…

网络安全保姆级教程:手把手从零构建系统认知,直达精通之路

随着互联网的普及和数字化进程的加速&#xff0c;网络安全已经成为我们生活中不可或缺的一部分。然而&#xff0c;很多人对于网络安全的概念仍然模糊不清。 那么&#xff0c;什么是网络安全&#xff1f;它究竟有多重要呢&#xff1f; 一、网络安全的定义 网络安全是指通过采取…

Markdown文档说明清晰:M2FP提供详细API接口参数列表

Markdown文档说明清晰&#xff1a;M2FP提供详细API接口参数列表 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与技术定位 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项比通用语义分割更精细的任务&#xff0c;目标是对图…