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

news2025/9/19 2:28:34

前言

技术栈是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 

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

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

相关文章

GC4938 三相无刷直流电机预驱动芯片可替代A4938/allegro,外置MOS,具有低速降噪,宽电压工作的功能

GC4938 是一款三相无刷直流电机预驱 动芯片。芯片可以驱动 N 型功率 MOSFET, 最高电源到 36V。芯片状态切换逻辑受三个 相位差为 120的霍尔输入确定。 芯片集成固定衰减时间的脉冲调制来控 制电流并且抑制励磁涌流;堵转保护时间可 调;过温保护…

AIOps探索 | 基于大模型构建高效的运维知识及智能问答平台(2)案例分享

原作者:擎创科技产品专家 布博士 案例分享 所需要的软件列表 本次案例的实现,全部采用开源或SAAS的产品来提供,并不涉及到私有化部署的软件产品。软件列表如下所示,如何申请apikey请自行研究,在这里不再详细说明&…

Linux第3步_安装Ubuntu操作系统

创建好虚拟机后,就可以安装Ubuntu操作系统了。 1、双击“VMware Workstation Pro”,得到下面的界面。 2、点击“编辑虚拟机设置”,见下图: 3、等几秒钟,得到下面的界面: 4、点击“CD/DVD”,得到…

opencv入门到精通——Canny边缘检测

目录 理论 OpenCV中的Canny Edge检测 附加资源 在本章中,我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法。它由John F. Canny发明 1.这是一个多阶段算法,我们将经历每个阶段。 2.降…

redis重启后数据丢失问题解决(亲测好用)

redis修改密码重启后发现redis中的数据丢失了 解决办法: 首先在redis的安装目录下查找重启之前的dump.rdb文件,发现只有当天的一个dump.rdb文件,确认不是重启备份的文件 然后我就全盘找一下dump.rdb的备份文件,找到前一天的备份…

鸿蒙应用中图片的显示(Image组件)

目录 1、加载图片资源 1.1、存档图类型数据源 a.本地资源 b.网络资源 c.Resource资源 d.媒体库file://data/storage e.base64 1.2、多媒体像素图片 2、显示矢量图 3、添加属性 3.1、设置图片缩放类型 3.2、设置图片重复样式 3.3、设置图片渲染模式 3.4、设置图…

工具篇--Spring-Cloud--feign 通过feign 接口完成文件的下载

文章目录 前言一、feign接口获取文件流程:二、文件获取实现2.1 引入jar:2.2 实现: 总结 前言 通常在spring-boot 项目中,对于文件的下载都是直接调用到对应的服务中,而不是通过feign 接口获取文件;有时我们…

珠海盈致浅析MES生产管理系统的优点

MES系统是用于管理和控制制造过程的信息化系统.它具有许多优点: 1. 生产过程可视化:MES系统提供实时的生产过程监控和数据收集,使管理人员能够清晰地了解生产线上的各个环节,包括设备状态、生产进度、质量指标等.这使得管理人员能够作出准确的决策并快速响应变化. 2…

APPnium 自动化实践 :第一步adb 连接手机

1. 下载安装 adb ,添加到环境变量。 ADB Download - Get the latest version of ADB and fastboot 2. 手机开启开发者模式 https://developer.huawei.com/consumer/cn/doc/quickApp-Guides/quickapp-open-developer-option-0000001137005543 3. adb 连接设备 【And…

【C语言】字符串 和 ctype.h 中的函数 练习

前面总结了有关字符串和ctype.h的文章,接下来就以几个例子来练习一下,以巩固之前的基础概念。注意:以下示例都有更简单更高效的解决方法,但本次仅以巩固基础为目的,所以方法可能稍作繁琐 Leetcode 344.反转字符串 编…

HUAWEI WATCH 系列 eSIM 全新开通指南来了

HUAWEI WATCH 系列手表提供了eSIM硬件能力,致力为用户提供更便捷、高效的通信体验。但eSIM 业务是由运营商管理并提供服务的,当前运营商eSIM业务集中全面恢复,电信已经全面恢复,移动大部分省份已经全面放开和多号App开通方式&…

自由DIY预约小程序源码系统:适用于任何行业+自由DIY你的界面布局+全新升级的UI+多用户系统 带安装部署教程

随着移动互联网的普及,预约服务逐渐成为人们日常生活的一部分。从家政服务、医疗挂号到汽车保养,预约已经渗透到各个行业。然而,市面上的预约小程序大多功能单一,界面老旧,无法满足商家和用户的个性化需求。今天来给大…

PPT如何画半圆和半圆弧

一、画半圆 这里总结为两种方法,具体如下: 1.形状剪除法 1.打开PPT,选择“插入”->“形状”,接着画一个正圆 2.在刚才画好的圆形一半的位置,画出一个矩形 3.按住Ctrl键,同时选中圆形和矩形两个图形…

Pytest fixture 及 conftest详解!

前言 fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似u…

[排序算法] 如何解决快速排序特殊情况效率低的问题------三路划分

前言 在[C/C]排序算法 快速排序 (递归与非递归)一文中,对于快速排序的单趟排序一共讲了三种方法: hoare、挖坑法、双指针法 ,这三种方法实现的快速排序虽然在一般情况下效率很高,但是如果待排序数据存在大量重复数据,那这几种方法的效率就很低,而为了解决快速排序在这样特殊情况…

面试题:你如何理解 System.out.println()?

文章目录 前言首先分析System源码:out源码分析println分析 前言 如果你能自己读懂System.out.println(),就真正了解了Java面向对象编程的含义。 面向对象编程即创建了对象,所有的事情让对象帮亲力亲为(即对象调用方法&#xff09…

CDD文件的制作

CDD文件 1、核查诊断调查表2、制作CDD3、Diva测试 1、核查诊断调查表 ECU级别:包括文档相关、控制器的诊断ID和时间参数,支持的服务,DTC、DID、刷写流程。 2、制作CDD 2.1、cddt编辑思路(每一步都要根据调查表进行操作&#xf…

AI:112-基于卷积神经网络的美食图片识别与菜谱推荐

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

基于Java SSM框架实现四六级在线考试系统项目【项目源码+论文说明】

基于java的SSM框架实现四六级在线考试系统演示 摘要 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多学院的之中,随之就产生了“四六级在线考试系统”,这样就让四六级在线考试系统更加方便…

修改选择框el-select样式,显示及下拉样式

修改选择框el-select样式,显示及下拉样式 .el-input__inner {background: rgba(25, 126, 195, 0.2);border: none;color: #fff; }.el-select-dropdown {background: rgba(19, 73, 104, 0.79);border: 2px solid #48e3ff;border-radius: 0; }.el-popper .popper__arrow {display…