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.mzph.cn/news/823680.shtml

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

相关文章

Zabbix监控内容

目录 一、自定义监控内容 1、在客户端创建自定义key 1.1明确需要执行的linux命令 1.2创建zabbix监控项配置文件,用于自定义Key 1.3服务端验证测试 2、在Web界面创建自定义监控模板 2.1创建模板 2.2创建应用集(用于管理监控项) 2.3创建…

python-获取config.ini中的属性值

获取配置文件中的数据 import configparser class ReadConfig(object):def __init__(self,config_file_path):self.config configparser.ConfigParser()self.config.read(config_file_path,encodingutf-8)def get_config(self,section,option):config_valueself.config.get(s…

牛客NC197 跳跃游戏(一)【中等 动态规划 Java、Go、PHP】

题目 题目链接: https://www.nowcoder.com/practice/23407eccb76447038d7c0f568370c1bd 思路 答案说的merge区间就是每个A[i]的地方能跳到的最远坐标是A[i] [i], 有一个maxReach,遍历一遍A[i], 不断刷新MaxReach, 如果某个i 位置比maxReac…

进位制之间相互转换:二进制<=>八进制

示例&#xff1a; /*** brief how about carry-bin-otc? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h> #inc…

Python可视化-matplotlib用法详解(三)

一、子图绘制 # 上节课复习 import pandas as pd import matplotlib.pyplot as plt s../../data/unrate.csvunrate pd.read_csv(s) unrate[DATE] pd.to_datetime(unrate[DATE]) first_twelve unrate[0:12] first_twelveDATEVALUE01948-01-013.411948-02-013.821948-03-014.…

【测试开发学习历程】python常用的模块(下)

目录 8、MySQL数据库的操作-pymysql 8.1 连接并操作数据库 9、ini文件的操作-configparser 9.1 模块-configparser 9.2 读取ini文件中的内容 9.3 获取指定建的值 10 json文件操作-json 10.1 json文件的格式或者json数据的格式 10.2 json.load/json.loads 10.3 json.du…

【八股】Redisson分布式锁

Redisson分布式锁 主要了解了Redisson分布式锁实现的三个功能&#xff1a; 1.可重入 -> 防止死锁 2.可重试&#xff08;i.e. 非阻塞获取锁&#xff09; 3.自动续约 1. 可重入 原理&#xff1a; 利用Redis的Hash结构&#xff0c;记录了使用当前锁的线程id和重用次数&#…

Linux系统——Elasticsearch企业级日志分析系统

目录 前言 一、ELK概述 1.ELK简介 2.ELK特点 3.为什么要使用ELK 4.完整日志系统基本特征 5.ELK工作原理 6.Elasticsearch介绍 6.1Elasticsearch概述 6.2Elasticsearch核心概念 7.Logstash介绍 7.1Logstash简介 7.2Logstash主要组件 8.Kibana介绍 8.1Kibana简介 …

考研数学|「基础」和「强化」阶段分别怎么做?

从目前考研数学的趋势来看&#xff0c;更加注重数学基础的理解和计算量。也就是基础知识和计算&#xff0c;如何锻炼这两种能力就显得尤为重要。希望我的复习经验可以给到读者一些启发。 数学规划 从备考过程来看&#xff0c;数学的复习可以分为三个阶段&#xff1a;1、基础阶…

监控系统Prometheus--与第三方框架集成

文章目录 Prometheus和Flink集成拷贝jar包修改Flink配置为了运行测试程序&#xff0c;启动netcat启动hdfs、yarn&#xff0c;提交flink任务到yarn上可以通过8088跳到flinkUI的job页面&#xff0c;查看指标统计刷新Prometheus页面&#xff0c;如果有flink指标&#xff0c;集成成…

linux线程的同步

目录 1.死锁概念 2.接口 3.代码展示 1.死锁概念 死锁的四个必要条件&#xff08;必须同时满足&#xff09;&#xff1a; 1.互斥条件&#xff1a;一个资源每次只能被一个执行流使用&#xff08;前提&#xff09;。 2.请求与保持条件&#xff1a;一个执行流因请求资源而堵塞…

如何查看Postman的版本信息?

如何查看Postman的版本信息 一、为何需要查看版本信息&#xff1f;二、查看Postman的版本信息的步骤 一、为何需要查看版本信息&#xff1f; 不同的版本之间可能存在功能和界面的差异。 二、查看Postman的版本信息的步骤 1、打开 Postman 2、打开设置项 点击页面右上角的 “…

Spring-tx事务管理

第五章 Spring声明式事务 一 声明式事务概念 1.1 编程式事务 手动编写程序来管理事务&#xff0c;即通过编写代码的方式来实现事务的提交&#xff0c;和回滚。 1.2 声明式事务 声明式事务是指使用注解或配置文件来控制事务的提交和回滚。 开发者只需要添加注解或者配置文…

陇剑杯 流量分析 webshell CTF writeup

陇剑杯 流量分析 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek目录结构 LearnCTF ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │ …

[SWPUCTF 2021 新生赛]error

如果 flag 只出现一半&#xff0c;用substr(A,B,C) 查询flag 1 and (select extractvalue(1,concat(~,(select substr((select flag from test_tb), 1 , 31))))) # 0-30位 左边30位 1and (select extractvalue(1,concat(~,(select substr((select flag from test_tb), 31 , 6…

vivado 设置 VIO 核以执行测量、查看 VIO 核状态

设置 VIO 核以执行测量 您添加到自己的设计中的 VIO 核会显示在“硬件 (Hardware) ”窗口中的目标器件下。如果未显示这些 VIO 核 &#xff0c; 请右键 单击器件并选择“ Refresh Hardware ”。这样将重新扫描 FPGA 或 ACAP 并刷新“ Hardware ”窗口。 注释 &#xff…

阿里云4核8G云服务器价格多少钱?700元1年

阿里云4核8G云服务器价格多少钱&#xff1f;700元1年。阿里云4核8G服务器租用优惠价格700元1年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R…

久吾高科技股份有限将莅临2024第13届生物发酵展

参展企业介绍 江苏久吾高科技股份有限公司成立于1997年&#xff0c;是一家专注从事新材料研发与整体解决方案的高科技企业。2017年3月在深交所A股创业板上市。公司是首批认定的guojiaji高新技术企业、国家专精特新“小巨人”企业、国家制造业单项、中国膜行业陶瓷膜领域龙头企…

使用vite从头搭建一个vue3项目(三)vite.config.js配置

目录 一、声明环境变量配置文件二、vite.config.js基础配置1、defineConfig()、loadEnv()2、plugins配置项3、server配置项4、resolve配置项5、css配置项6、build配置项 三、vite.config.js配置完整代码 VITE版本&#xff1a;v5.2.8 一、声明环境变量配置文件 在根目录下新建…

Qt 系统相关

这里写目录标题 Qt 事件事件介绍事件的处理按键事件单个按键组合按键 ⿏标事件⿏标单击事件⿏标释放事件⿏标双击事件⿏标移动事件滚轮事件 定时器QTimerEvent 类QTimer 类获取系统⽇期及时间 事件分发器概述事件分发器⼯作原理 事件过滤器 Qt ⽂件Qt ⽂件概述输⼊输出设备类⽂…