【ModelScope】部署一个属于自己的AI服务

前言

技术栈是Fastapi。

FastAPI 是一个现代、快速(基于 Starlette 和 Pydantic)、易于使用的 Python web 框架,主要用于构建 RESTful API。以下是 FastAPI 的一些优势:

  1. 性能卓越: FastAPI 基于 Starlette 框架,并使用 Pydantic 进行数据验证,因此具有出色的性能。它通过异步编程利用 Python 3.7+ 中的 async/await 特性,使其能够处理大量并发请求。

  2. 自动文档生成: FastAPI 自动生成交互式 API 文档(Swagger UI 和 ReDoc),让开发者能够轻松地查看和测试 API 端点,同时提供即时的反馈和文档。

  3. 强类型注解: FastAPI 使用 Python 的类型提示来定义 API,同时利用 Pydantic 模型进行请求和响应的验证,这提供了强大的静态类型检查和自动文档的支持。

  4. 自动验证: 使用 Pydantic 模型,FastAPI 自动验证请求的数据,并在数据不符合预期时返回错误。这有助于提高代码的稳健性和可维护性。

  5. 异步支持: 支持异步处理请求,可以使用异步函数来处理请求,使得 FastAPI 在处理高并发时表现出色。

  6. 便捷的依赖注入系统: FastAPI 提供了一个灵活的依赖注入系统,让你能够方便地注入和管理依赖项,使代码更加清晰和可测试。

  7. WebSocket 支持: FastAPI 提供了对 WebSocket 的原生支持,能够轻松地实现实时通信。

  8. 易于学习: FastAPI 的语法和设计理念使其易于学习和使用,特别是对于熟悉 Python 的开发者。

 

安装modelscope

conda create -n modelscope python=3.8
conda activate modelscope
pip install modelscope

激活虚拟环境

conda activate modelscope

 

server.py代码

import argparseimport uvicorn
from fastapi import FastAPIfrom modelscope.server.api.routers.router import api_router
from modelscope.server.core.event_handlers import (start_app_handler,stop_app_handler)def get_app(args) -> FastAPI:app = FastAPI(title='modelscope_server',version='0.1',debug=True,swagger_ui_parameters={'tryItOutEnabled': True})app.state.args = argsapp.include_router(api_router)app.add_event_handler('startup', start_app_handler(app))app.add_event_handler('shutdown', stop_app_handler(app))return appdef add_server_args(parser):parser.add_argument('--model_id', required=True, type=str, help='The target model id')parser.add_argument('--revision', required=True, type=str, help='Model revision')parser.add_argument('--host', default='0.0.0.0', help='Host to listen')parser.add_argument('--port', type=int, default=8000, help='Server port')parser.add_argument('--debug', default='debug', help='Set debug level.')parser.add_argument('--llm_first',type=bool,default=True,help='Use LLMPipeline first for llm models.')if __name__ == '__main__':parser = argparse.ArgumentParser('modelscope_server')add_server_args(parser)args = parser.parse_args()app = get_app(args)uvicorn.run(app, host=args.host, port=args.port)

 任务一:人脸检测

命令行中虚拟环境中运行脚本

python server.py --model_id damo/cv_resnet50_face-detection_retinaface --revision v2.0.2

 

访问http://127.0.0.1:8000/docs打开文档

 

  • describe方法描述请求参数和输出形式 
{"schema": {"task_name": "face-detection","schema": {"input": {"type": "object","properties": {"image": {"type": "string","description": "Base64 encoded image file or url string."}}},"parameters": {},"output": {"type": "object","properties": {"scores": {"type": "array","items": {"type": "number"}},"boxes": {"type": "array","items": {"type": "number"}},"keypoints": {"type": "array","items": {"type": "number"}}}}}},"sample": null
}
  • call方法(是模型推理的入口)

    • 两种请求方式(post)

    • curl方式(encode_base64表示图片转换为base64后的形式)

  • 图片转换base64的链接可以使用在线转https://tool.jisuapi.com/pic2base64.html

    curl -X 'POST' \ 'http://127.0.0.1:8000/call' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "input":{"image":"encode_base64"}'
  • face-detection_retinaface请求参数体(界面请求)直接使用fastapi界面请求或者使用apifox等

  • {"input":{"image":"encode_base64"}}

    请求结果

 返回结果解释

{"scores": [0.9998026490211487],"boxes": [[164.9207000732422,82.86209106445312,353.395263671875,340.145263671875]],"keypoints": [[214.5664520263672,188.255859375,303.5237121582031,190.91671752929688,256.9284362792969,242.95065307617188,223.42758178710938,283.54241943359375,287.28448486328125,286.402587890625]]
}

返回图像中人脸的分数,越大表示有人脸的可能性越大,boxes表示人脸的矩形框,左上角x,y坐标和右下角x,y坐标,keypoints返回左眼、右眼、鼻尖、左嘴角、右嘴角的坐标值x,y。 

输入图片

 根据boxes和keypoints画图

 

import cv2# 读取图像
image = cv2.imread('0.png')# 定义矩形框的坐标和大小x, y, x1, y1 = 164,82,353,340
w = 353-164
h = 340-82# 画矩形框
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示结果
# cv2.imshow('Rectangle', image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
cv2.imwrite('0_rectangle.png', image)

 

import cv2# 读取图像
image = cv2.imread('0.png')radius = 5  # 点的半径
color = (0, 0, 255)  # 点的颜色,通常使用BGR格式
thickness = -1  # 为了画一个实心圆,线条宽度设置为-1
keypoints = [214.5664520263672,
188.255859375,
303.5237121582031,
190.91671752929688,
256.9284362792969,
242.95065307617188,
223.42758178710938,
283.54241943359375,
287.28448486328125,
286.402587890625]
print(len(keypoints))
for i in range(0,len(keypoints),2):cv2.circle(image, (int(keypoints[i]),int(keypoints[i+1])), radius, color, thickness)# 显示结果
# cv2.imshow('Point', image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
cv2.imwrite('0_keypoints.png', image)

 

 需要注意的是不同的任务请求体的内容不一样,需要明确每个任务的请求参数具体有哪些。

 任务二:人脸融合

 第二种任务,人脸融合,需要重启服务,将model_id和revision替换。

 

python server.py --model_id damo/cv_unet-image-face-fusion_damo --revision v1.3

此时访问http://127.0.0.1/docs 

执行一下describe方法 

 

{"schema": {"task_name": "image-face-fusion","schema": {"input": {"type": "object","properties": {"template": {"type": "string","description": "Base64 encoded image file or url string."},"user": {"type": "string","description": "Base64 encoded image file or url string."}}},"parameters": {"type": "object","properties": {"user": {"type": "object","default": null}}},"output": {"type": "object","properties": {"output_img": {"type": "string","description": "The base64 encoded image."}}}}},"sample": null
}

input有两个参数,第一个是template,表示模版;第二个参数是user,表示用户的图片,最终的目的就是将用户的图片的脸替换到模版上

parameters参数一般使用默认的就行,不填,如果有特殊需求可自行尝试

output会返回一个换好脸图像的base64编码

请求体

{"input": {"template": "base64_template","user":"bas64_user"}
}

 template

 User

 

 Ourput

参考链接:

https://github.com/modelscope/modelscope/blob/master/modelscope/server/api_server.py 

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

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

相关文章

Java程序设计——GUI设计

一、目的 通过用户图形界面设计,掌握JavaSwing开发的基本方法。 二、实验内容与设计思想 实验内容: 课本验证实验: Example10_6 图 1 Example10_7 图 2 图 3 Example10_15 图 4 设计思想: ①学生信息管理系统&#xff1a…

万界星空科技低代码平台:制造业数字化转型的捷径

低代码MES系统:制造业数字化转型的捷径 随着制造业的数字化转型,企业对生产管理系统的需求逐渐提高。传统的MES系统实施过程复杂、成本高昂,已经无法满足现代企业的快速发展需求。而低代码搭建MES系统的出现,为企业提供了一种高…

船舶数据采集与分析在线能源监测解决方案

一、船舶在线能源监测应用前景 船舶在线能源监测在能源效率优化、故障诊断和预测维护、节能减排和环保监管、数据分析和决策支持以及自动化智能化等方面具有广阔的应用前景。随着船舶行业对能源管理和环保要求的不断提高,船舶在线能源监测技术将成为船舶运营和管理中…

Linux系统:进程和计划任务管理

目录 一、程序 二、进程 1、什么是进程 1.1 进程的概念 1.2 进程的特征 1.3 进程、线程和协程 2、进程状态 3、进程的类型 4、进程使用内存出现的问题 三、进程管理相关命令 1、ps(process state) 1.1 用法 1.2 分析ps命令输出的内容 2、t…

LLM 中的长文本问题

近期,随着大模型技术的发展,长文本问题逐渐成为热门且关键的问题,不妨简单梳理一下近期出现的典型的长文本模型: 10 月上旬,Moonshot AI 的 Kimi Chat 问世,这是首个支持 20 万汉字输入的智能助手产品; 10 月下旬,百川智能发布 Baichuan2-192K 长窗口大模型,相当于一次…

江苏事业单位计算机岗复习备考经验(2023年)

一、考情分析:根据历年考试分析统计,我们江苏事业单位计算机岗考试题型为前百分之四十的行测和时政加上后百分之六十的计算机专业知识;其中前百分之四十为单项选择题,后面的计算机专业知识为单选题、多选题、简答题和实务题。由于…

ssrf之gopher协议的使用和配置,以及需要注意的细节

gopher协议 目录 gopher协议 (1)安装一个cn (2)使用Gopher协议发送一个请求,环境为:nc起一个监听,curl发送gopher请求 (3)使用curl发送http请求,命令为 …

黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目——第二部分

黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot mybatis plus开发核心技术的真java实战项目——第二部分 1.员工管理模块1.1 完善登陆功能1.2 新增员工1.2.1 全局异常捕获 1.3 员工信息分页查询1.4 启用/禁用员工账号1.4.1 使用自定义消息转换器 1.5 编辑…

springboot整合gateway网关

一、网关基本概念 1、API网关介绍 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题…

React Admin 前端脚手架之ant-design-pro

文章目录 一、React Admin 前端脚手架选型二、React Admin 前端脚手架之ant-design-pro三、ant-design-pro使用步骤四、常用总结(持续更新)EditableProTable组件 常用组件EditableProTable组件 编辑某行后,保存时候触发发送请求EditableProTa…

linux 系统 kill 指令笔记

kill 名称 kill - send a signal to a process 向指定的线程或进程发送信号 描述 The default signal for kill is TERM. Use -l or -L to list availablesignals. Particularly useful signals include HUP, INT, KILL, STOP,CONT, and 0. Alternate signals …

k8s笔记1- 初步认识k8s

k8s简介: kubernetes,俗称k8是,用于自动部署,扩缩和管理容器化应用程序的开源系统,它将组成应用程序的容器,组合成逻辑单元,便于管理和服务发现。 k8s的作用 自动化上线和回滚、存储编排…

Spring中的工厂类、bean的作用范围和生命周期

1.Spring中的工厂类 1.1ApplicationContext ClassPathXmlApplicationContext:加载类路径下 Spring 的配置文件 FileSystemXmlApplicationContext:加载本地磁盘下 Spring 的配置文件 1.1.1service ApplicationContext:只要一读取配置文件…

PyTorch|PyTorch张量解释

神经网络中的输入、输出和转换都使用张量表示,因此,神经网络编程大量使用张量,张量是我们在 PyTorch 中编程神经网络时将使用的数据结构。 关于张量及其维数的简要说明,以及术语: 你有时会看到一个称为向量的一维张量…

[论文分享]TimesURL:通用时间序列表示学习的自监督对比学习

论文题目:TimesURL: Self-supervised Contrastive Learning for Universal Time Series Representation Learning 论文地址:https://arxiv.org/abs/2312.15709 代码地址:暂无 摘要 学习适用于各种下游任务的通用时间序列表示具有挑战性&…

Springboot整合RocketMQ 基本消息处理

目录 1. 同步消息 2. 异步消息 3. 单向消息 4. 延迟消息 5. 批量消息 6. 顺序消息 7. Tag过滤 导入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId></dependency> …

14:00面试,14:08就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到10月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

机器学习原理到Python代码实现之LinearRegression

Linear Regression 线性回归模型 该文章作为机器学习的第一篇文章&#xff0c;主要介绍线性回归模型的原理和实现方法。 更多相关工作请参考&#xff1a;Github 算法介绍 线性回归模型是一种常见的机器学习模型&#xff0c;用于预测一个连续的目标变量&#xff08;也称为响应变…

Spring的bean的生命周期!!!

一.单例模式 单例&#xff1a;[启动容器]--->通过构造方法&#xff08;创建对象&#xff09;---->调用set方法&#xff08;注入&#xff09;--->调用init方法&#xff08;初始化&#xff09;----[容器关闭]----->调用destroy方法&#xff08;销毁&#xff09; app…

死锁的处理策略“检测和解除”-第三十九天

目录 前言 死锁的检测 数据结构资源分配图 基于“图”检测死锁 可以消除所有边 不能消除所有边 结论 死锁定理 死锁的解除 本节思维导图 前言 如果系统中既不采取预防死锁的措施&#xff0c;也不采取避免死锁的措施&#xff0c;系统就很可能发生死锁&#xff0c;在这种…