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 license

import contextlib
from copy import copy
from pathlib import Path

import cv2
import numpy as np
import pytest
import torch
import yaml
from PIL import Image
from torchvision.transforms import ToTensor

from 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_13

MODEL = 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/simple

pip 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/

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

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

相关文章

树莓集团构建特色化3+3+1数字产业园运营体系

树莓集团构建的331数字产业园运营体系,是以三大服务体系、三大服务平台以及智慧园区服务为核心,为企业提供全生命周期服务,实现第五代数字化产业园区(基地、中心)的并网化运营。 这一运营体系的构建,标志着…

【MATLAB源码-第50期】基于simulink的BPSK调制解调仿真,输出误码率。

操作环境: MATLAB 2022a 1、算法描述 1. Bernoulli Binary: 这个模块生成伯努利二进制随机数,即0或1。这些数字表示要传输的原始数字信息。 2. Unipolar to Bipolar Converter: 此模块将伯努利二进制数据从0和1转换为-1和1,这是BPSK调制的…

硬件开发相关的流程文件介绍

学习目的:前面文章有简要介绍硬件开发的基本过程,本文会细分硬件开发的流程,然后分作5个步骤,详细介绍开发全过程,包括立项-实施项目-软件开发-测试-验收 这几个过程,然后,再分解对每一个步骤进…

poi-tl的使用(通俗易懂,全面,内含动态表格实现 包会!!)

最近在做项目时候有一个关于解析Html文件,然后将解析的数据转化成word的需求,经过调研,使用poi-tl来实现这个需求,自己学习花费了一些时间,现在将这期间的经验总结起来,让大家可以快速入门 poi-tl的介绍 …

Linux应用 select编程

1、概念 1.1 多路复用 在Linux中,多路复用是一种机制,用于同时监视多个文件描述符的状态,以便在其中任何一个文件描述符准备好进行读写操作时立即通知进程。常见的多路复用机制包括 select、poll 和 epoll。 1.2 select select 是一种用于…

【aws】在DBeaver上用终端节点连接Redshift

碎碎念 最近想要尝试redshift的一个叫做重新定位的功能,重新定位触发之后会停止当前的集群,转而在同一个区域的另一个可用区中启动一个一样的集群,这个过程视情况会花上10到60分钟不等。 但是目前项目中连接到redshift用的是私有ip&#xf…

C# Window form 自定义控件的结构和设计(三)

C# Window form 自定义控件的结构和设计(三) 一、前面介绍了如何来创建第一个自定义的控件,以及一个测试程序。下面我们来看下如何在自定义控件中添加属性。 C#和其他.NET语言支持属性作为语言的第一类成员。把属性作为语言的基础属性有两点主要的有点&#xff1a…

foreach无法修改数组值解决方案

效果展示: 解决办法: this.sportList.forEach((item,index) >{let that this;if(item.idinfo.id) {that.sportList[index].sportTime e.detail.value} }) 这里小编解释下,将this赋值给that通常是为了在回调函数或者异步代码中保持对Vu…

Android安卓开发 - 开发基础(二)

App的工程结构 本节介绍App工程的基本结构及其常用配置,首先描述项目和模块的区别,以及工程内部各目录与配置 文件的用途说明;其次阐述两种级别的编译配置文件build.gradle…

吴恩达2022机器学习专项课程(一) 第二周课程实验:特征工程和多项式回归(Lab_04)

目标 探索特征工程和多项式回归,使用线性回归来拟合非常复杂甚至非线性的函数。 1.为什么线性回归能拟合非线性函数? fxw*xb,属于线性回归的扩展,这个公式在数学中不属于线性,因为有x,而在机器学习中属于…

接口的三个常见使用案例

下面的三个案例,都是需要实现接口,才能进行的操作。 目录 1.比较对象大小 2.给对象排序 3.深浅拷贝 1.比较对象大小 1.1引入 (1)普通类型比较 (2)引入类型比较 发现报错,因为在Java中&…

如何理解Vue 3组件的component关键字

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

新质生产力与智能制造:推动制造业转型升级的双引擎

引言 随着科技的不断进步和全球制造业的快速发展,新质生产力与智能制造成为推动制造业转型升级的关键驱动力。新质生产力强调的是以科技创新和制度创新为核心,通过提高生产效率和经济效益来推动经济发展。而智能制造则是利用现代信息技术,实现…

window2012等显示桌面上面的【我的电脑】图标

服务器版本,登录进去,就留个垃圾桶在桌面上,一点也没有用处。 如何显示经典的“我的电脑”呢。 网络介绍了几种方法都木用。这种还点用: win图标点右键》运行: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,…

【系统分析师】计算机网络

文章目录 1、TCP/IP协议族1.1 DHCP协议1.2 DNS协议1.3网络故障诊断 2、网路规划与设计2.1逻辑网络设计2.2物理网络设计2.3 分层设计 3、网络接入3.1 接入方式3.2 IPv6地址 4、综合布线技术5、物联网5.1物联网概念与分层5.2 物联网关键技术 6、云计算7、网络存储技术&#xff08…

使用odbc链接dm8数据库

一、环境说明 windows11 VMware Workstation 17 Pro ubuntu22.04 docker $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy因docker版本的dm8中,没有…

【每日刷题】代码随想录-动规32

1. 代码随想录-动规32.LC121买卖股票的最佳时机 题目链接 不用动规。双指针法。快指针遍历,慢指针指向最小的。 max维护最大差值。 min第一天价格,如果碰到有比min低的,则更新min。 代码 public int maxProfit(int[] prices) {int min pr…

国内开通gpt会员方法

ChatGPT镜像 今天在知乎看到一个问题:“平民不参与内测的话没有账号还有机会使用ChatGPT吗?” 从去年GPT大火到现在,关于GPT的消息铺天盖地,真要有心想要去用,途径很多,别的不说,国内GPT的镜像…

【WinForm】如何在自己的程序窗口中显示并调用外部桌面程序

当你爱上一个程序的功能,并且希望扩展它以满足自己的需求时,你可能会觉得困惑。毕竟,你已经为此付出了很多努力,并希望能够有效地整合这些功能。那么,是否可以将这些功能嵌套到自己的程序中呢? 首先&#…

三年了,期待下一个三年

第一个三年 时间好快,距离我发布我第一篇文章都已经三个年头了。 转眼也从大一新生变成了大四打工人。 在平台上发布博客,分享自己的项目、学习思路、解决的bug都带给我很多收获。 平台上的粉丝,阅读量等,也让我的简历更加出彩。…