YOLOv8 测试 5:Linux 中 Docker 部署 YOLOv8,Python 封装 API 接口,base64 图片处理

一、前言

记录时间 [2024-4-14]

系列文章简摘:
Docker 学习笔记(二):在 Linux 中部署 Docker(Centos7 下安装 docker、环境配置,以及镜像简单使用)
API 接口简单使用(二):Python 中使用 Flask(接口封装整理版,含文件上传接口的详细实现)
YOLOv8 测试 3:在 Python 中将 YOLOv8 模型封装成 API 接口使用(上传测试图片并返回识别结果,附测试代码)
YOLOv8 测试 4:在 Linux 中使用 Docker 部署 YOLOv8 模型,并使用简单的命令行脚本测试模型

更多 YOLOv8 测试相关文章请参考上面专栏哦。

本文在 YOLOv8 测试 3 和 4 的基础上开展,在测试 3 中,介绍 Windows 中使用 Python 将 YOLOv8 模型封装成 API 接口来调用;在测试 4 中,介绍 Linux 中使用 Docker 部署 YOLOv8 模型。

综合测试 3 和 4,本文主要实现在 Linux 中 使用 Docker 部署 YOLOv8 模型,并借助 Python 封装 API 接口来调用。在此基础上,再介绍 base64 格式图片的处理方法,最后通过接口上传图片的 base64 格式编码,得到接口返回识别结果


二、思路整理

  • 在本地 PyCharm 中完成项目开发
    • 使用 Flask 框架编写 API 接口
    • base64 格式图片处理
    • YOLOv8 模型的 predict 使用
  • 在 Linux 中部署 Docker,操作系统为 CentOS 7
    • 准备 Linux 云服务器 / 虚拟机
    • 安装并配置 Docker
    • 熟悉 Docker 的镜像容器操作
  • 在 Conda 容器中部署 YOLOv8 项目
    • 通过 FinalShell 把本地项目上传到 Linux 服务器中
    • 部署一个 conda 镜像
    • 配置端口暴露,数据卷挂载
    • 通过数据卷挂载 YOLOv8 项目到容器中
  • 使用 Postman 测试 API 接口
    • 上传图片的 base64 格式编码文件
    • 得到接口返回的图片识别结果

三、YOLOv8 项目开发

在本地 PyCharm 中完成项目开发,更详细的步骤请参考这篇文章

1. 依赖配置

使用 PyCharm 打开我们之前使用过的,从仓库下载的 YOLOv8 项目 ultralytics-main,找到 tests 目录,在该目录下新建 base64_test.py 文件

并在 ultralytics-main/tests/tmp/ 目录下,新建 upload 文件夹,用来存放接口上传的文件;新建 save 文件夹,用来存放项目保存的文件;

在 base64_test.py 文件中导入 YOLOv8 项目运行所需的依赖和配置:

# Ultralytics YOLO 🚀, AGPL-3.0 licenseimport contextlib
from copy import copy
from pathlib import Pathimport cv2
import numpy as np
import pytest
import torch
import yaml
from PIL import Image
from torchvision.transforms import ToTensorfrom ultralytics import RTDETR, YOLO
from ultralytics.cfg import TASK2DATA
from ultralytics.data.build import load_inference_source
from ultralytics.utils import (ASSETS,DEFAULT_CFG,DEFAULT_CFG_PATH,LINUX,MACOS,ONLINE,ROOT,WEIGHTS_DIR,WINDOWS,Retry,checks,is_dir_writeable,
)
from ultralytics.utils.downloads import download
from ultralytics.utils.torch_utils import TORCH_1_9, TORCH_1_13MODEL = WEIGHTS_DIR / "path with spaces" / "yolov8n.pt"  # test spaces in path
CFG = "yolov8n.yaml"
SOURCE = ASSETS / "bus.jpg"
TMP = (ROOT / "../tests/tmp").resolve()  # temp directory for test files
IS_TMP_WRITEABLE = is_dir_writeable(TMP)

2. 编写 API 接口

如果对 Flask 构建 API 接口有疑问的,参考这篇文章

在这个接口中,实现以下要求:

  • 接收接口请求的图片的 base64 格式编码文件
  • 将 base64 格式编码文件还原成图片并保存
  • YOLOv8 模型对该图片进行目标识别
  • 返回目标图片的识别结果

编写文件上传接口

在 base64_test.py 文件中,导入 Flask 框架使用所需依赖:

from flask import Flask, request, send_file

编写一个简单的 API 接口,后面我们在return_image()函数中编写内容。

app = Flask(__name__)@app.post('/baseFile')
def return_image():return "Succeed"if __name__ == '__main__':app.run(host='0.0.0.0', port=5001)

编写好后运行(右键 run ‘base64_test.py’),使用 Postman 测试下这个接口可不可用。

POST 请求不能直接在浏览器测试,浏览器默认 GET 请求。

在这里插入图片描述


处理上传的文件

return_image()函数中编写内容:获取接口上传的文件,并保存到 upload 目录。

# 1. 获取上传的文件# 文件作为参数传递,其 id为 file
# 如果没有接收到这个请求,返回 No file part
if 'file' not in request.files:return "No file part"# 获取文件
file = request.files['file']# 获取文件名
if file.filename == '':return "No selected file"filename = file.filename# 2. 保存到指定位置 upload 文件夹
file.save(TMP / 'upload' / filename)

处理 base64 格式编码文件

base64 格式编码是指:把二进制数据转换成 64 个可以打印的字符。

如何获取图片的 base64 格式编码呢?使用在线图片转换工具,上传图片获得 base64 格式编码,将编码保存为 txt 文件。

在 base64_test.py 文件中,导入依赖:

import base64
from PIL import Image
from io import BytesIO

接着在return_image()函数中编写内容:读取编码文件内容,将 base64 格式编码文件还原成图片并保存。

# 3. 获取编码文件并解码
base_file = TMP / 'upload' / filename# 打开编码文件,读取文件中的内容
with open(base_file, 'r') as file:content = file.read()# 将 base64_str 以 “,” 分割为两部分,context 部分是需要解码的部分
base64_str = str(content)
head, context = base64_str.split(",")# 解码时只要内容部分
img_data = base64.b64decode(context)# 4. 通过解码内容得到图片,保存图片
image = Image.open(BytesIO(img_data))
image.save(TMP / 'save' / 'test_image.jpg')# 看图片
# image.show()

3. YOLOv8 识别图片

接下来,下载并使用 YOLOv8 模型,对获得的图片进行目标识别。

接着在return_image()函数中编写内容:对图片进行目标识别,并返回识别结果。

# 5. 使用 YOLOv8 模型对该图片进行目标识别
model = YOLO(MODEL)# 得到的图片路径
source = TMP / 'save' / 'test_image.jpg'# 保存 目标识别的结果
results = model.predict(source, save=True, imgsz=320, conf=0.5)# 6. 获取 识别结果 的保存路径
save_path = Path(results[0].save_dir)
image_path = save_path / 'test_image.jpg'# 7. 以图片形式 返回结果
return send_file(image_path)

编写好后运行(右键 run ‘base64_test.py’),使用 Postman 测试下,选 form-data 类型,上传 base64 格式编码文件,测试下识别结果是否返回成功。

在这里插入图片描述


四、在 Linux 中的准备工作

1. Linux 中部署 Docker

宿主机 Linux,操作系统为 CentOS 7,Linux 虚拟机安装,参考这篇文章

在 Linux 中部署 Docker,参考这篇文章

2. 上传本地项目

本地项目 ultralytics-main 已经完成编写,关闭 PyCharm,找到 ultralytics-main 文件夹

通过 FinalShell,把 ultralytics-main 一整个上传到 Linux 服务器 /home/YOLO 目录中(目录随便)

在这里插入图片描述


3. 运行 conda 容器

在之前的文章中,参考这篇文章,我们已经在 Docker 中部署了 Conda 环境,可以直接把这个部署好的 conda 虚拟环境拿来用。

如果之前的容器丢失了,那我们快速地部署一下吧。

# 1. 创建 conda 容器并运行
docker run -it --name yolopy03 conda/miniconda3 /bin/bash# 2. 配置 yolov8 运行环境
conda create -n yolov8 python=3.9
# Proceed ([y]/n)? y# 3. 检查虚拟环境配置
conda env list# 4. 进入 base 环境
source activate# 5. 激活 Conda 环境,创建 yolov8 运行
conda activate yolov8# 6. 配置清华源镜像
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple# 7. 安装 pytorch
pip install torch==1.13.1+cpu torchvision==0.14.1+cpu torchaudio==0.13.1 \
--extra-index-url https://download.pytorch.org/whl/cpu# 8. 检查 python 环境
python --version# 9. 退出容器 exit,退出虚拟环境用 conda deactivate,退不出就 kill,没事的
exit

五、部署 YOLOv8 项目

接下来,在 Docker 中部署 YOLOv8 项目,配置数据卷挂载,更详细的步骤请参考这篇文章

1. 导出 yolov8 虚拟环境

把上面那个配置好的 yolopy03 容器 conda 环境拿过来,导出 envs 下面的 yolov8 虚拟环境。

虚拟环境位于容器的 /usr/local/envs ,把它导出到宿主机的 /home/YOLO目录下:

# 导出 yolov8 虚拟环境
docker cp yolopy03:/usr/local/envs /home/YOLO

2. 运行新的容器

在运行前,配置下端口暴露,以及数据卷挂载。

端口暴露是为 API 接口访问做准备,数据卷挂载是为了将宿主机上的 ultralytics-main 项目和 yolov8 虚拟环境同步到新容器中。

这样可以省去新容器重复配置的步骤,一些创建的、安装好的东西不用重复安装了。

但是参数 / 变量的配置是不会生效的,比如清华源镜像。

  • -it:交互式运行;
  • --name:容器命名;
  • -p 3352:5001:把容器的 5001 端口映射到宿主机的 3352 端口;
  • -v 宿主机路径:容器内路径:把容器内路径挂载到宿主机路径,可以挂载很多个路径。
docker run -it --name yolopy06 -p 3352:5001 \-v /home/YOLO/ultralytics-main:/usr/local/ultralytics-main \-v /home/YOLO/envs:/usr/local/envs conda/miniconda3

进入容器后,检查下虚拟环境配置,然后激活 yolov8 运行环境。

# 检查虚拟环境配置
conda env list# 进入 base 环境
source activate# 激活 yolov8 运行环境
conda activate yolov8

配置清华源镜像,否则下载东西非常慢

# 检查 python 环境
python --version# 配置清华源镜像
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

3. 安装 YOLOv8 项目依赖

进入 ultralytics-main 目录,为什么容器内会有 ultralytics-main 文件呢?答对了,因为数据卷挂载。

cd /usr/local/ultralytics-main

在该目录下,安装 / 更新 YOLOv8 项目运行所需的依赖:

# 安装 YOLOv8 项目依赖
pip install -e .# 更新 opencv-python
pip uninstall opencv-python -y
pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simplepip install pytest
pip install flask

六、项目测试运行

1. 运行项目

先确定容器工作目录:/usr/local/ultralytics-main

python 方式运行 base64_test.py(熟悉吗?我们刚刚写的)

python tests/base64_test.py

2. 接口测试

测试方式,使用 Postman 测试。

http://ip:3352/baseFile

如图所示,项目启动成功后,输入宿主机 ip / 宿主机端口,POST 请求,添加 base64 格式编码文件,Send 测试!

返回了识别结果,测试成功!

在这里插入图片描述


再来看一下服务端的情况吧:

  • 处理了 base64 编码文件,保存了图片;
  • 下载了 yolov8n.pt 模型,对图片进行目标识别;
  • 将结果保存,并通过接口返回给客户端。

在这里插入图片描述


七、总结

本文主要实现在 Linux 中 使用 Docker 部署 YOLOv8 模型,并借助 Python 封装 API 接口来调用。还介绍了 base64 格式图片的处理方法,最后通过接口上传图片的 base64 格式编码,得到接口返回识别结果。复习了数据卷的命令挂载方法。


一些参考资料

Docker 官方文档:https://docs.docker.com/engine/install/centos/
Docker 远程仓库:https://hub.docker.com/
FinalShell 下载:http://www.hostbuf.com/t/988.html
YOLOv8 官方文档:https://docs.ultralytics.com/zh/
YOLOv8 模型仓库地址:https://github.com/ultralytics/ultralytics
PyCharm官网:https://www.jetbrains.com/pycharm/download/?section=windows
Postman 官网:https://www.postman.com/
阿里云官网:https://www.aliyun.com/

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

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

相关文章

【HormonyOS4+NEXT】TypeScript基础语法详解

🙋‍ 一日之际在于晨 ⭐本期内容:TypeScript基础语法详解 🏆系列专栏:鸿蒙HarmonyOS4NEXT:探索未来智能生态新纪元 文章目录 前言变量与类型函数类与接口类(Class)接口(Interface&am…

Golang使用PGO优化程序性能

文章目录 参考文章PGO是什么使用PGO的好处PGO做了什么热函数内联什么是内联内联的好处Go默认的内联策略查看内联预算PGO的热函数内联 去虚拟化调用指令高速缓存 PGO有什么缺点可执行程序变大构建时间变长 PGO怎么使用典型的工作流程收集CPU配置文件生产环境启动PGO代码改动重新…

Go 自定义14位时间类型 yyyyMMddHHmmss

目录 功能 代码 功能 数据库或者接口时间类型,经常会使用14位的时间格式。每次都转换有点麻烦。可以自定义一个时间类型。 自定义类型需要实现json接口中的MarshalJSON与UnmarshalJSON两个函数,这样在做json编码解码时就会自动转为14位的时间格式了。…

Vue项目学习(一)-SQL闯关

Hello , 我是小恒不会java。今天来阅读一个Vue纯前端项目--SQL在线闯关 进步的方法除了文档书籍视频,学会阅读源代码,从代码中学会解决需求的方法也是必要的 已部署完成,在线体验:http://sql.yunduanjianzhan.cn 背景 简介 闯…

如何提升亚马逊店铺质量?住宅IP代理有何用处?

亚马逊作为全球最大的电子商务平台之一,吸引了无数卖家和买家参与其中。在这个竞争激烈的环境中,要想提升亚马逊店铺的质量和业绩,需要采取一系列有效的策略和工具。而住宅IP代理作为一个强大的网络工具,也在其中发挥着重要的作用…

最新的网易星球GEC挖矿系统修复版 章鱼星球挖矿系统源码 区块链虚拟币交易源码 基于ThinkPHP5开发

区块链系统介绍 2018.12.10更新增加聚合数据短信接口 2018.11.19更新增加短信宝接口 2018.08.17修复Linux系统搭建验证码不显示问题 2018.08.09修复后台某处溢出数据库账号密码BUG 2018.08.06修复票卷BUG 源码介绍: 区块链系统中用户共九个等级,依…

苹果系统如何使用CorelDRAW?coreldraw苹果版使用指南

有不少粉丝使用的是苹果的电脑或者笔记本,想要利用最新的M系列芯片带来的长续航便利,实现外出时进行创意设计的工作。 那如何才能在苹果系统使用CorelDRAW?2个方法分享给大家: 一、购买Mac版CorelDRAW 从2020版开始&#xff0c…

【热门话题】常见分类算法解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 常见分类算法解析1. 逻辑回归(Logistic Regression)2. 朴…

CSS文本属性与字体属性

目录 文本属性 文本颜色 文本对齐 修饰文本 文本缩进 行高 字体属性 字体系列 字体大小 字体粗细 字体样式 字体/文本综合属性写法 Chrome调试工具的使用 文本属性 文本颜色 在CSS中使用color 属性用于定义文本的颜色,使用background-color设置一个盒…

【教学类-50-06】20240410“数一数”4类星号图片制作PDF学具

作品展示: 背景需求: 前文遍历四个文件夹,分别将每个文件夹内的10个图片的左上角加入星号,显示难度系数 【教学类-50-05】20240410“数一数”4类图片添加“难度星号”-CSDN博客文章浏览阅读55次,点赞2次,…

ESXi 无法启动NTP守护进程

在VMware ESXi环境中如果遇到无法启动NTP(Network Time Protocol)守护进程的问题,可以通过以下步骤进行排查和解决: 步骤1:检查与修复配置文件 登录到ESXi Shell(SSH)。编辑 /etc/ntp.conf 配…

MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书)

MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书) 前言 现在https大行其道, ssl又是必不可少的环节. 今天就教大家用开源工具openssl自己生成ssl证书的文件和私钥 环境 MAC电脑 openssl工具自行搜索安装 正文 1、终端执行命令 //生成rsa私钥&…

【保姆级】2024年OnlyFans订阅指南

OnlyFans是一个独特的社交媒体平台,它为创作者和粉丝提供了一个互动交流的空间。通过这个平台,创作者可以分享他们的独家内容,而粉丝则可以通过订阅来支持和享受这些内容。如果你对OnlyFans感兴趣,并希望成为其中的一员&#xff0…

嵌入式工程师如何摸鱼?

有老铁问我,做嵌入式开发要加班吗? 也不知道搞什么鬼,现在的年轻人对加班这么抵触。 我刚做开发那会,啥也不懂,每天基本都要加班到晚上7-9点不等,我并不抵触加班,因为早早回家,也没什…

Latex学习(从入门到入土)2

第一章 :插图 在LaTeX中插入插图可以通过graphicx宏包来实现,这个宏包提供了强大的图像处理功能。以下是如何使用graphicx宏包插入图像的基本步骤: ### 1. 加载宏包 在文档的序言部分(\begin{document}之前)&#x…

POST 为什么会发送两次请求?

本文目录 同源策略 什么是同源策略 CORS 简单请求 预检请求 附带身份凭证的请求与通配符 完整的请求流程图 总结 前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,因为在前端开发的日常开发中我们总是会与post请求…

引导和服务(2)

服务 1.systemd服务的简要介绍 (1)对比5 6 可以解决依赖关系并行启动 (2)按需启动 (3)自动解决依赖关系 负责在系统启动或运行时,激活系统资源,服务器进程和其它进程 2.System…

03-JAVA设计模式-迭代器模式

迭代器模式 什么是迭代器模式 迭代器模式(demo1.Iterator Pattern)是Java中一种常用的设计模式,它提供了一种顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示的方法。迭代器模式将遍历逻辑从聚合对象中分离出来…

Delphi Xe 10.3 钉钉SDK开发——审批流接口(获取表单ProcessCode)

开发钉钉审批流时,需要用到钉钉表单的Processcode,有两种方法 : 一、手动获取: 管理员后台——审批——找到对应的表单:如图: ProcessCode后面就是了! 二、接口获取:今天的重点&a…

funasr 麦克风实时流语音识别;模拟vad检测单独输出完整每句话

参考: https://github.com/alibaba-damo-academy/FunASR chunk_size 是用于流式传输延迟的配置。[0,10,5] 表示实时显示的粒度为 1060=600 毫秒,并且预测的向前信息为 560=300 毫秒。每个推理输入为 600 毫秒(采样点为 16000*0.6=960),输出为相应的文本。对于最后一个语音…