【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 argparse

import uvicorn
from fastapi import FastAPI

from 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 = args
    app.include_router(api_router)

    app.add_event_handler('startup', start_app_handler(app))
    app.add_event_handler('shutdown', stop_app_handler(app))
    return app


def 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 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第34期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

ElecardStreamEye使用教程(视频质量分析工具、视频分析)

文章目录 Elecard StreamEye 使用教程安装与设置下载安装 界面导航主菜单视频窗口分析窗口 文件操作打开视频文件 视频流分析帧类型识别码率分析分析报告 高级功能视觉表示比较模式自动化脚本 下载地址1:https://www.onlinedown.net/soft/58792.htm 下载地址2&…

又又又崩了?盘点 23 年十大线上事故!

以下文章来源于前端充电宝 ,作者CUGGZ 2023 年,互联网世界日新月异,线上应用已成为我们生活中不可或缺的一部分。然而,在这一年里,一系列令人咋舌的线上事故频频发生。“XXX 崩了” 成为热搜常客。这些事故不仅给用户带…

从第一步开始

从新建文件到开始写代码 新建文件 创建项目步骤 选择C++ 选择存放路径,给项目起个名字 最后选择编译器 进入写代码环节 写代码 #include <iostream>using

SSM共享汽车租赁平台----计算机毕业设计

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,修改管理员信息,用户信息管理,管理新闻公告,汽车品牌信息管理,城市信息管理,租赁点信息管理,共享汽车信息管理,汽车订单信…

SQL Server从0到1——报错注入

报错注入分为三类&#xff1a;隐式转换&#xff0c;和显示转换&#xff0c;declare函数 隐式转换&#xff1a; 原理&#xff1a;将不同数据类型的数据进行转换或对比 select * from test.dbo.users where (select user)>0 #对比 select * from test.dbo.users where ((sel…

电锯切割狂

欢迎来到程序小院 电锯切割狂 玩法&#xff1a;把木块切成等分的碎片&#xff0c;每关都会有切割次数&#xff0c;木块数&#xff0c;切割越均匀分数越搞&#xff0c; 有简单、正常、困难、专家版&#xff0c;快去解锁不同版本进行切割吧^^。开始游戏https://www.ormcc.com/pl…

c++的三大特性之关于继承

目录 继承的概念及定义 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元&#xff0c;静态成员 继承的概念及定义 概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类…

【计算机毕业设计】SSM二手交易网站

项目介绍 该项目分为前后台&#xff0c;前台普通用户角色&#xff0c;后台管理员角色。 管理员主要功能如下&#xff1a; 登陆,商品分类管理,商品管理,商品订单管理,用户管理等功能。 用户角色主要功能如下&#xff1a; 包含以下功能&#xff1a;查看所有商品,用户登陆注册…

ctfshow——PHP特性

文章目录 web 89web 90web 91web 92web 93web 94web 95web 96web 97web 98web 99 web 89 使用人工分配 ID 键的数值型数组绕过preg_match. 两个函数&#xff1a; preg_match()&#xff1a;执行正则表达式&#xff0c;进行字符串过滤。preg_match函数用法&#xff0c;正则表达式…

springboot漫画网站源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

2024美赛数学建模常用数学建模模型之——层次分析法

一、层次分析法的基本原理与步骤 人们在进行社会的、经济的以及科学管理领域问题的系统分析中&#xff0c;面临的常常是 一个由相互关联、相互制约的众多因素构成的复杂而往往缺少定量数据的系统。层次 分析法为这类问题的决策和排序提供了一种新的、简洁而实用的建模方法。 …

【C语言】程序练习(四)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。非常感谢各位的支持&#xff0c;也期待着您的关注。 目前博主有着C语言、C、linux以及数据结构的专栏&#xff0c;内容正在逐步的更新。 希望对各位朋友有所帮助同时也期望可以得到各位的支持&#xff0c;有任何问题欢迎私信与…

安卓Android Studio读写FM1208CPU卡源码

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21818769070.11.6c46789elLwMzv&id615391857885 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout x…

STL-string

目录 &#x1f4a1;介绍 &#x1f4a1;string的基本操作 &#x1f4a1;string的构造函数 &#x1f4a1;string赋值操作 &#x1f4a1;string字符串拼接 &#x1f4a1;string的查找和替换 &#x1f4a1;string字符串比较 &#x1f4a1;string字符存取 &#x1f4a1;str…

全志R128硬件设计指南②

PCB设计 叠层设计 R128采用两层板或四层板设计。 2层板设计参考 4层板设计参考 SoC Fanout R128封装采用 8x8mm QFN设计&#xff0c;0.35mm ball pitch&#xff0c;0.17mm ball size&#xff0c;可支持 2 层板方案与 4 层板方案。 两层板 Fanout 建议 尽量保证 SOC 背面 …

C#高级:Lambda表达式分组处理2(WITH ROLLUP关键字)

目录 一、问题引入 二、with rollup查询 三、去掉多余数据 四、拓展 一、问题引入 查询SQL后结果如下&#xff0c;字段分别是用户、项目、批次、工作时间&#xff1a; SELECT UserID,ProjectID,ProBatchesID,WorkHour FROM MAINTABLE GROUP BY HourFiller ,ProjectID ,…

LeetCode 热题 100——42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

总结MySQL 的一些知识点:MySQL 排序

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

YOLOv5独家原创改进:一种新颖的自适应空间相关性金字塔注意力 ,实现小目标暴力涨点

💡💡💡本文改进:自适应空间相关性金字塔注意力 ----提取特征图的多尺度空间信息,并且进行空间相关特征重标定,最后选择性地增强有效的特征,最终在YOLOv5进行实现,在小目标检测领域上实现暴力涨点。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/…