使用FastAPI部署Ultralytics YOLOv5模型

YOLO是You Only Look Once(你只看一次)的缩写,它具有识别图像中的物体的非凡能力,在日常应用中会经常被使用。所以在本文中,我们将介绍如何使用FastAPI的集成YOLOv5,这样我们可以将YOLOv5做为API对外提供服务。

Python有几个web框架,其中最突出的两个是Flask和FastAPI。Flask是一个轻量级且灵活的框架,非常适合中小型web应用程序,而FastAPI是一个相对较新的框架,旨在快速轻松地构建api。

FastAPI

FastAPI是一个现代的web框架,可以用于基于OpenAPI标准使用Python 3.6+构建api。FastAPI提供的代码只需进行最小的调整即可用于生产环境。FastAPI与ASGI(异步服务器网关接口)的集成使其成为最快的Python框架之一。

设置环境

建立虚拟环境是软件开发和数据科学中至关重要的第一步。虽然并不总是强制性的,但强烈建议这样做。虚拟环境隔离了项目的依赖项,确保了稳定性和兼容性。这种做法简化了版本管理,使项目更有组织性和可维护性。简而言之,它是提高项目质量的最佳实践。

 python3 -m venv my_project

然后使用命令激活来启动虚拟环境

 my_project/bin/activate

训练定制YOLOv5模型

我们这里不介绍详细的训练流程,第一是因为官方有代码可以直接使用,第二是因为我们主要介绍部署的步骤。

这里使用6种食物数据集进行训练,这些数据集在Roboflow上进行了预先注释,可以对鸡翅,炸薯条,饺子,热狗,甜甜圈,华夫饼图像进行分类。如果你有自己的图像并想要创建一个数据集,你也可以在Roboflow上手动注释它们。

 python train.py - img 416 - batch 16 - epochs 100 - data {dataset.location}/data.yaml - cfg ./models/custom_yolov5s.yaml - weights '' - name yolov5s_results - cache

只需要上面一句就可以进行训练,结果如下

精度§: 0.763(所有类别的平均值)

召回率®: 0.662(所有类别的平均值)

mAP50 (IoU 0.5的平均精度):0.712(所有类别的平均值)

mAP50-95: 0.4(所有类别的平均值)

使用FastAPI进行模型推理

下面是一个最简单的项目目录结构模板:

 ├── README.md├── main.py # The main program├── model│   ├── __init__.py│   └── best.pt # Custom training model ├── requirements.in # Used to generate requirements.txt├── requirements.txt # Install dependencies: pip install -r requirements.txt├── segmentation.py # Importing the local YOLOv5 and resize images└── yolov5 # You can obtain this from https://github.com/ultralytics/yolov5

main.py

这是一个有3个函数:

@app.get(’ /notify/v1/health '),这是检查应用程序运行状况的端点。它返回一个带有消息“OK”的JSON响应。这个端点用于检查Kubernetes的readinessProbe和liveessprobe。

@app.post(" /object-to-json "),这个端点处理图像中对象的检测,并以JSON格式返回结果。它需要一个图像文件作为输入。

@app.post(" /object-to-img "),这个端点执行对象检测并返回带有注释对象的图像。它还需要一个图像文件作为输入,并将带注释的图像作为响应发送。

 #import statementfromfastapiimportFastAPI, File#building the APIfromsegmentationimportget_yolov5, get_image_from_bytes#segmentation functionsfromstarlette.responsesimportResponse#handling API responsesimportiofromPILimportImageimportjsonfromfastapi.middleware.corsimportCORSMiddleware#initialize and obtain the modelmodel=get_yolov5() #FastAPI application setupapp=FastAPI(title="Custom YOLOV5 Machine Learning API",description="""Obtain object value out of imageand return image and json result""",version="0.0.1",)#CORS (Cross-Origin Resource Sharing) middleware, allows the API to be accessed from different domains or origins. origins= ["http://localhost","http://localhost:8000","*"]app.add_middleware(CORSMiddleware,allow_origins=origins,allow_credentials=True,allow_methods=["*"],allow_headers=["*"],)#Checking health of application, returns “OK” JSON response@app.get('/notify/v1/health')defget_health():"""Usage on K8SreadinessProbe:httpGet:   path: /notify/v1/healthport: 80livenessProbe:httpGet:path: /notify/v1/healthport: 80:return:dict(msg='OK')"""returndict(msg='OK')@app.post("/object-to-json")asyncdefdetect_food_return_json_result(file: bytes=File(...)):input_image=get_image_from_bytes(file)results=model(input_image)detect_res=results.pandas().xyxy[0].to_json(orient="records")  # JSON img1 predictionsdetect_res=json.loads(detect_res)return {"result": detect_res}@app.post("/object-to-img")asyncdefdetect_food_return_base64_img(file: bytes=File(...)):input_image=get_image_from_bytes(file)results=model(input_image)results.render()  # updates results.imgs with boxes and labelsforimginresults.imgs:bytes_io=io.BytesIO()img_base64=Image.fromarray(img)img_base64.save(bytes_io, format="jpeg")returnResponse(content=bytes_io.getvalue(), media_type="image/jpeg")

segmentation.py定义了2个方法:

1、Get_yolov5():这是yolov5可以使用定制模型的地方。

Model = torch.hub.load('。/yolov5 ', ’ custom ', path= ’ ./model/best.pt ', source= ’ local ‘):它从本地目录加载自定义yolov5模型。’ custom ‘参数指定模型架构,’ ./model/best.pt ‘是定制训练模型文件的路径,’ source '表示模型位于本地。conf = 0.5:设置对象检测的置信度阈值。只有置信水平大于0.5的对象才会被包含在检测结果中。

2、Get_image_from_bytes():调整图像大小以确保与模型期望的兼容性。

input_image = image .open(io.BytesIO(binary_image)).convert(" RGB "):它读取二进制图像数据并将其转换为RGB格式的PIL (Python Imaging Library)图像。它计算图像的宽度和高度,并确定调整因子以适应指定的max_size。Resized_image是通过根据计算的尺寸调整输入图像的大小来创建的,确保它不超过最大大小。

启动项目

在终端上输入以下命令

 uvicorn main:app — reload — host 0.0.0.0 — port 8000

成功运行程序时,它将看起来像这样

测试结果

在浏览器中打开http://127.0.0.1:8000/docs#/。你应该看到有3个端点的Open API文档:

/notify/v1/health 返回一个JSON响应,其中包含消息’ OK '。你可以通过点击try it out并执行来检查,输出如下:

/object-to-json 处理图像中对象的检测,并以JSON格式返回结果。它需要一个图像文件作为输入。

/object-to-img 执行对象检测并返回带有注释对象的图像。它还需要一个图像文件作为输入,并将带注释的图像作为响应发送。

这样我们的程序就完成了

总结

这里我们看到了yolov5模型的部署的完整过程,并且这个过程是可以应用到生产环境的。但是这里我们发现了一个新的命令 ‘uvicorn’.

Uvicorn 是基于 uvloop 和 httptools 构建的非常快速的 ASGI 服务器。因为 Uvicorn 是一个非常快速、可靠且易于使用的 ASGI 服务器,可以在处理大量并发连接时保持稳定和高效。Uvicorn 还支持 WebSocket 和 HTTP/2 等新特性,它符合 FastAPI 提倡的现代 Web 开发理念。所以使用 Uvicorn 作为 FastAPI 的 Web 服务器是一个很好的选择。

https://avoid.overfit.cn/post/c23627999f1a44689000105eb315180e

作者:auliyafirdaus

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

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

相关文章

如何将 ruby 打包类似于jdk在另一台相同架构的机器上面开箱即用

需求 目前工作中使用到了ruby作为java 项目的中转语言,但是部署ruby的时候由于环境的不同会出现安装依赖包失败的问题,如何找到一种开箱即用的方式类似于java 中的jdk内置jvm这种方式 解决 TruffleRuby 完美解决问题,TruffleRuby 是使用 T…

基于STC系列单片机实现外部中断0控制按键调节定时器0产生PWM(脉宽调制)的功能

#define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint sbit PwmOut P1^0;//位定义脉宽调制输出为单片机P1.0脚 uchar PwmTimeCount;//声明脉宽调制时间计数变量 uchar PwmDutyCycle;//声明脉宽调制占空比变量 void Ti…

Apache服务的搭建与配置(超详细版)

前言 Apache是一种常见的Web服务器软件,广泛用于Linux和其他UNIX操作系统上。它是自由软件,可以通过开放源代码的方式进行自由分发和修改。Apache提供了处理静态和动态内容的能力,而且还支持多种编程语言和脚本,如PHP、Python和P…

python数据可视化

内容主要介绍了python模块matplotlib即seaborn数据可视化 matplotlib模块通过import matplotlib.pyplot as plt生成图形,如生成图形没展示,可调用plt.show()方法展示图形; 对于颜色属性设置,既可以使用十六进制颜色表达(#7777aa…

cdrx8和2020哪个版本更好用?有什么区别

经过多年的发展,cdr推出了很多优秀的版本,并顺应时代的发展更新了多项功能。随着cdr推出的软件版本增多,小伙伴们可选择的产品也在增多,那么该怎么选择呢?本文会给大家介绍cdrx8和2020的区别,CDRX8和2020哪…

Pytorch 猫狗识别案例

猫狗识别数据集https://download.csdn.net/download/Victor_Li_/88483483?spm1001.2014.3001.5501 训练集图片路径 测试集图片路径 训练代码如下 import torch import torchvision import matplotlib.pyplot as plt import torchvision.models as models import torch.nn as…

基于静电放电算法的无人机航迹规划-附代码

基于静电放电算法的无人机航迹规划 文章目录 基于静电放电算法的无人机航迹规划1.静电放电搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用静电放电算法来优化无人机航迹规划。 …

0基础学习PyFlink——用户自定义函数之UDF

大纲 标量函数入参并非表中一行(Row)入参是表中一行(Row)alias PyFlink中关于用户定义方法有: UDF:用户自定义函数。UDTF:用户自定义表值函数。UDAF:用户自定义聚合函数。UDTAF&…

1400*C. Team(模拟构造)

Problem - 401C - Codeforces 解析&#xff1a; 因为0不能相邻&#xff0c;所以0之间最少 n-1 个位置&#xff0c;最多 n1 个位置&#xff0c;如果 m<n-1显然不符题意。 并且1最多连续两个&#xff0c;所以 m>2*n2 同样不符题意。 其余情况构造即可 #include<bits/st…

【嵌入式】【GIT】如何迁移老的GIF到新的仓库时使用LFS功能并保持LOG不变

一、正常迁移流程 假设有仓库 ssh://old/buildroot-201902 需要迁移到新的仓库 ssh://old/buildroot-201902时,我们可以使用以下命令来完成: # 下载老的仓库 git clone ssh://old/buildroot-201902 # 向新的仓库上传所有的tags git push ssh://new/buildroot-201902 --tag…

【网络安全】Seeker内网穿透追踪定位

Seeker追踪定位对方精确位置 前言一、kali安装二、seeker定位1、ngrok平台注册2、获取一次性邮箱地址3、ngrok平台登录4、ngrok下载5、ngrok令牌授权6、seeker下载7、运行seeker定位8、运行隧道开启监听9、伪装链接10、用户点击&#xff08;获取定位成功&#xff09;11、利用经…

Rust-虽然9天过去了,结果是没有结果(Docker容器的端口映射问题)

​ 这篇文章收录于Rust 实战专栏。这个专栏中的相关代码来自于我开发的笔记系统。它启动于是2023年的9月14日。相关技术栈目前包括&#xff1a;Rust&#xff0c;Javascript。关注我&#xff0c;我会通过这个项目的开发给大家带来相关实战技术的分享。 前言 上上周了吧&#xf…

机器学习(六)构建机器学习模型

1.9构建机器学习模型 我们使用机器学习预测模型的工作流程讲解机器学习系统整套处理过程。 整个过程包括了数据预处理、模型学习、模型验证及模型预测。其中数据预处理包含了对数据的基本处理&#xff0c;包括特征抽取及缩放、特征选择、特征降维和特征抽样&#xff1b;我们将…

Linux的简介和环境搭建

简介 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想&#xff0c;是一个…

Python构造代理IP池提高访问量

目录 前言 一、代理IP是什么 二、代理IP池是什么 三、如何构建代理 IP 池 1. 从网上获取代理 IP 地址 2. 对 IP 地址进行筛选 3. 使用筛选出来的 IP 地址进行数据的爬取 四、总结 前言 爬虫程序是批量获取互联网上的信息的重要工具&#xff0c;在访问目标网站时需要频…

#stm32整理(一)flash读写

以这篇未开始我将进行stm32学习整理为期一个月左右完成stm32知识学习整理内容顺序没有一定之规写到哪想到哪想到哪写到哪&#xff0c;主要是扫除自己知识上的盲区完成一些基本外设操作。 以stm32f07为例子进行flash读写操作 stm32flash简介 参考资料正点原子和野火开发手册 …

如何选择传感器输出模式——电流输出还是电压输出?

一 背景及挑战 传感器在汽车测试系统中发挥着采集和传输信息的作用&#xff0c;可称之为汽车的“神经元”。 按照功能可将传感器分为压力传感器、流量传感器、温湿度传感器和电流传感器等。传感器的主要指标是精度、测量范围和响应时间等。在满足指标的情况下&#xff0c;通常…

笔记软件Notability mac中文版软件功能

Notability mac是一款帮助用户备注文件的得力工具&#xff0c;Notability Mac版可用于注释文稿、草拟想法、录制演讲、记录备注等。它将键入、手写、录音和照片结合在一起&#xff0c;便于您根据需要创建相应的备注。 Mac Notability mac中文版软件功能 将手写&#xff0c;照片…

springboot和flask整合nacos,使用openfeign实现服务调用,使用gateway实现网关的搭建(附带jwt续约的实现)

环境准备&#xff1a; 插件版本jdk21springboot 3.0.11 springcloud 2022.0.4 springcloudalibaba 2022.0.0.0 nacos2.2.3&#xff08;稳定版&#xff09;python3.8 nacos部署&#xff08;docker&#xff09; 先创建目录&#xff0c;分别创建config&#xff0c;logs&#xf…

APISpace 全国快递物流地图轨迹查询API接口案例代码

1.全国快递物流地图轨迹查询接口详解 1.1 接口请求 请求方式&#xff1a;POST请求地址&#xff1a;https://eolink.o.apispace.com/wldtgj1/paidtobuy_api/trace_map请求头&#xff1a; 标签必填说明X-APISpace-Token是鉴权私钥&#xff0c;登陆 APISpace 后在管理后台的[访…