YOLOv8 测试 5-2:Linux 中 Dockerfile 部署 YOLOv8 项目一键运行,Python 封装 API 接口测试

一、前言

记录时间 [2024-4-15]

系列文章简摘:
Docker 学习笔记(二):在 Linux 中部署 Docker(Centos7 下安装 docker、环境配置,以及镜像简单使用)
API 接口简单使用(二):Python 中使用 Flask(接口封装整理版,含文件上传接口的详细实现)
YOLOv8 测试 5:Linux 中 Docker 部署 YOLOv8,Python 封装 API 接口,base64 图片处理

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

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

本文在测试 5 基础上进行升级,采用 Dockerfile 的方式来构建 Conda 镜像,部署 YOLOv8 项目一键运行。


二、材料准备

材料准备:是在测试 5 基础上哦,这些材料的制作测试 5 都有详细说明。

在这里整理了一下步骤,方便快速操作。更详细的解释请参考,这篇文章

  1. 【测试 5 步骤 4-3】导出备份的 conda 虚拟环境 envs(envs / yolov8 里面安装了 python 和 pytorch);
  2. 【测试 5 步骤 3, 4-2】本地编写完成的 ultralytics-main 项目文件(base64_test.py 编写完成了);
  3. 把这两个材料放在同一个目录下,比如笔者放在了 /home/yuanyuan/build/yolo 目录下;
  4. /home/yuanyuan/build/yolo 是制作 Dockerfile 的工作目录。

1. 导出 conda 虚拟环境

制作虚拟环境

Docker 安装配置什么的这里就不赘述啦

用从 DockerHub 下载的基础镜像 conda/miniconda3 运行容器,制作 conda 虚拟环境 yolov8,并下载 python 和 pytorch。

# 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

导出到 Linux 宿主机

备份 conda 虚拟环境 yolov8 到 Linux 宿主机

# docker cp 容器名:源路径 目标路径
docker cp yolopy03:/usr/local/envs /home/yuanyuan/conda

2. 编写 YOLOv8 项目并上传

自己电脑上,使用 PyCharm 打开从仓库下载的 YOLOv8 项目 ultralytics-main,找到 tests 目录,在该目录下新建 base64_test.py 文件。并在 ultralytics-main/tests/tmp/ 目录下,新建 upload 文件夹,用来存放接口上传的文件;新建 save 文件夹,用来存放项目保存的文件。

导入项目依赖

在 base64_test.py 文件中导入项目运行的所有依赖:

# YOLOv8 所需依赖
import 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)# Flask 框架使用所需依赖
from flask import Flask, request, send_file# base64 处理依赖,文件依赖
import base64
from PIL import Image
from io import BytesIO

编写测试程序

在 base64_test.py 文件中,编写 API 接口,完成 YOLOv8 测试程序编写:

app = Flask(__name__)@app.post('/baseFile')
def return_image():
# 1. 获取上传的文件# 文件作为参数传递,其 id为 file# 如果没有接收到这个请求,返回 No file partif '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)# 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')# 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)if __name__ == '__main__':app.run(host='0.0.0.0', port=5001)

上传本地项目

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

通过 FinalShell,把 ultralytics-main 一整个上传到 Linux 服务器 /home/yuanyuan/build/yolo 目录中


3. 上传材料到工作目录

本地项目 ultralytics-main 应该是上一步就上传好了的,接下来把备份的虚拟环境也放进工作目录。

Linux 中拷贝文件夹的命令为:

# cp -r 源路径 目标路径
cp -r /home/yuanyuan/conda/envs /home/yuanyuan/build/yolo

如图所示,把这两个材料放在工作目录。

在这里插入图片描述


三、思路整理

Dockerfile 用于程序开发,就好比,本来我们是在 Linux 中运行官方仓库的基础镜像,然后自己在容器里面一步一步地完成 YOLOv8 模型的部署,自己创建 conda 环境,在命令行里一步一步地配置依赖,最后再通过 python 把我们的项目运行起来。

Dockerfile 要做的事情就是,上面的这些步骤都可以在构建镜像之前完成,然后只要运行这个镜像,项目就可以一键运行。

那么在 Dockerfile 中具体完成了哪些步骤呢?

  • 配置基础镜像 conda/miniconda3
  • 添加 ultralytics-main 项目到工作路径
  • 添加适合 yolov8 运行的 conda 虚拟环境
  • 设置合适的 Bash 脚本 /bin/bash -c
  • 安装项目所需的依赖
  • 配置工作路径 /usr/local/ultralytics-main
  • 暴露项目运行的 5001 端口
  • 设置容器默认的启动运行命令 CMD

四、部署 YOLOv8 项目

1. 编写 Dockerfile

根据上面的思路整理,完成 Dockerfile 的编写。

确定工作目录 /home/yuanyuan/build/yolo,确保工作目录下面两份材料导入成功。

[root@localhost yolo]# pwd
/home/yuanyuan/build/yolo
[root@localhost yolo]# ls
envs  ultralytics-main

在工作目录,创建 Dockerfile 文件:注意默认命名 Dockerfile 不要写错。

vim Dockerfile

编写 Dockerfile,注意顺序,构建的时候是从上到下执行的。

FROM conda/miniconda3
MAINTAINER yuanyuan<1234567@qq.com>ADD ultralytics-main /usr/local/ultralytics-main
ADD envs /usr/local/envsSHELL ["/bin/bash", "-c"]RUN source activate && \conda activate yolov8 && \pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \cd /usr/local/ultralytics-main && \pip install -e . && \pip uninstall opencv-python -y && \pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple && \pip install pytest && \pip install flaskENV MYPATH /usr/local/ultralytics-main
WORKDIR $MYPATHEXPOSE 5001CMD source activate && conda activate yolov8 && python tests/base64_test.py

2. 构建 + 运行 + 测试

构建镜像

在工作目录,使用 Dockerfile 构建 diy-yolov8 镜像

docker build -t diy-yolov8 .

一键运行

diy-yolov8 镜像构建完成后,把容器端口映射给宿主机,一键运行。

docker run -p 3354:5001 diy-yolov8

接口测试

测试方式,使用 Postman 测试。

在 Postman 中,输入宿主机 ip / 宿主机端口,POST 请求,添加 base64 格式编码 txt 文件,Send 测试!

http://ip:3354/baseFile

五、常见问题整理

1. sh 无法运行 source 命令

Docker 使用 conda 时,如果遇到以下错误:

ERROR: failed to solve: process "/bin/sh -c source ..." did not complete successfully: exit code: 127

错误原因:Docker 构建镜像时,默认使用 sh 方式,而 sh 下没有 source 命令。

解决方式:把 sh 修改为 bash 方式。

# 此命令写在 source 命令之前
SHELL ["/bin/bash", "-c"]

2. ADD 添加文件注意点

对比 cp 和 ADD 中的文件路径:

# 在 yolo 目录下放入 整个 envs
# 最终文件位置 yolo/envs
cp -r /home/yuanyuan/conda/envs /home/yuanyuan/build/yolo# 把 envs 目录下的内容放入 local/envs 目录下
# 最终文件位置 local/envs
ADD envs /usr/local/envs

六、总结

本文在测试 5 基础上进行升级,采用 Dockerfile 的方式来构建 Conda 镜像,部署 YOLOv8 项目一键运行。整理了 Dockerfile 制作 YOLOv8 镜像过程中的常见问题。


一些参考资料

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/310982.html

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

相关文章

第十五届蓝桥杯复盘 pythonA组——试题A 拼正方形

思路 先把22的正方形放进去&#xff0c;剩余的地方用11的正方形填充 情况一&#xff1a; 假设所有的22 和11恰好拼成一个大正方形 但是上图的代码是不符合现实情况的 比如两个22和1个11 面积为9&#xff0c;是平方数&#xff0c;但是拼不成正方形&#xff0c; 因此要换思路&…

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…

SOLIDWORKS 2024教育版全套多少钱?

SOLIDWORKS 2024教育版全套是一款专为教育机构和学生设计的3D CAD设计软件套装。它集合了SOLIDWORKS的核心功能和工具&#xff0c;旨在帮助学生在学习和实践过程中掌握先进的工程设计和制造技术。对于教育机构和学生而言&#xff0c;了解SOLIDWORKS 2024教育版全套的价格成为了…

深度探索:Secure Hash Algorithm(SHA)全景解析

title: 深度探索&#xff1a;Secure Hash Algorithm&#xff08;SHA&#xff09;全景解析 date: 2024/4/15 18:33:17 updated: 2024/4/15 18:33:17 tags: SHA安全抗碰撞性算法版本实现细节性能优化发展历史应用案例 密码学中的哈希函数 一、哈希函数的定义 哈希函数是一种数…

快来看!这样的统计地图真的很好绘制的~~

之前有小伙伴再讨论群里提问关于分级统计地图(choropleth maps) 的绘制方法&#xff0c;刚开始看到这个问题的时候觉得比较简单&#xff0c;就给出了几个处理方法&#xff0c;有R的也有基于Python 的&#xff0c;但后来和提问小伙伴一聊&#xff0c;才知道是要绘制一个有 ”三元…

2024五一杯数学建模C题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

四.音视频编辑-音频混合-概述

引言 当我们在前两篇博客中成功地构建了一个媒体组合&#xff0c;并且略过了音频部分时&#xff0c;我们意识到了我们需要对这个项目进行更详细的探讨。在本篇博客中&#xff0c;我们将会展示如何创建一个包含视频轨道、配音音频轨道以及背景音频轨道的完整媒体组合。更进一步…

lua 环境安装

下载地址&#xff1a; https://luabinaries.sourceforge.net/download.html 安装环境变量 检查一下是否安装成功&#xff0c;有版本号&#xff0c;打印一句话&#xff0c;如下表示成功 idea 安装插件&#xff0c;方便编写lua脚本 配置一下idea 运行测试 local function m…

经典文献阅读之--Light-LOAM( 基于图匹配的轻量级激光雷达里程计和地图构建)

0. 简介 将SLAM应用于机器人应用中&#xff0c;可靠性和效率是两个最受重视的特性。本文《Light-LOAM: A Lightweight LiDAR Odometry and Mapping based on Graph-Matching》考虑在计算能力有限的平台上实现可靠的基于激光雷达的SLAM功能。首先与大多数选择点云配准的显著特征…

国税发票查验接口、电子增值税发票查验接口、数电票查验接口

翔云发票查验接口支持增值税发票管理系统开具发票的真伪&#xff0c;通过发票代码、号码、日期、金额、校验码四要素信息进行真伪的查验&#xff0c;支持返回全票面信息&#xff0c;API接口便于集成&#xff0c;可适用于多种应用场景。 发票查验接口python调用示例&#xff1a;…

正则表达式(Regular Expression)

正则表达式很重要&#xff0c;是一个合格攻城狮的必备利器&#xff0c;必须要学会&#xff01;&#xff01;&#xff01; &#xff08;参考视频&#xff09;10分钟快速掌握正则表达式&#xff08;奇乐编程学院&#xff09;https://www.bilibili.com/video/BV1da4y1p7iZ在线测试…

分布式监控平台---Zabbix

一、Zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态。 利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; 通过一个友好的界面进行浏览整个…

CSRF漏洞详解

目录 什么是同源策略 什么是csrf CSRF 攻击会产生什么影响&#xff1f; CSRF漏洞low等级复现 什么是同源策略 协议相同 域名相同 端口相同 什么是csrf 跨站请求伪造&#xff08;也称为 CSRF&#xff09;是一种 Web 安全漏洞&#xff0c;允许攻击者诱导用户执行他们不打…

华为各级OD薪资曝光。。

华为 OD 薪资 之前写过几篇华为 OD 的算法题&#xff0c;后来有不少同学问起&#xff0c;华为 OD 薪资到底怎么样。 华为 OD 的薪资待遇&#xff0c;网上信息不多&#xff0c;只找到一篇相对靠谱的爆料&#xff1a; 上述是月 base 的爆料&#xff0c;然后通常 OD 是 15-16 薪。…

如何连通私有子网中的 MSK / Kafka 集群?

MSK 集群通常都是建在私有子网中的&#xff0c;这给本地访问带来了很多麻烦&#xff0c;特别是需要在本地使用 Kafka GUI 客户端管理和读写 MSK 数据的时候。本文会给出一套解决方案。 我们这里讨论的问题有一点特殊性&#xff0c;那就是&#xff1a;由于 MSK 是托管服务&…

标准版uni-app移动端页面添加/开发操作流程

页面简介 uni-app项目中&#xff0c;一个页面就是一个符合Vue SFC规范的.vue文件或.nvue文件。 .vue页面和.nvue页面&#xff0c;均全平台支持&#xff0c;差异在于当uni-app发行到App平台时&#xff0c;.vue文件会使用webview进行渲染&#xff0c;.nvue会使用原生进行渲染。…

单元测试四大过程

单元测试四大过程&#xff08;蓝桥课学习笔记&#xff09; 单元测试过程 单元测试是软件测试过程中的一个关键环节&#xff0c;它与集成测试、系统测试一样&#xff0c;分为测试策划、测试设计、测试执行和测试总结几个阶段。 单元测试过程中每个阶段需要完成的主要工作如下&…

Ubuntu配置VScode的C++环境

在Ubuntu系统下配置C环境&#xff0c;并运行helloworld 1. 下载VScode 我这里使用的是星火应用商店&#xff0c;在商店里面可以直接下载安装 http://spark-app.store/ 2.创建文件夹 3.启动VScode并打开该文件夹 4.安装以下几个扩展 PS&#xff1a;Clang这个插件别安装&…

使用TomCat写Film前后端项目0414

使用TomCat写Film前后端项目源文件0414-CSDN博客 实现功能&#xff1a; 得到数据库所有电影数据在首页显示出来 添加 删除 修改 点击修改&#xff0c;获取编号id&#xff0c;传入到根据id编号查询数据的控制器转发数据到 修改的jsp页面。 获取修改数据传入到根据id修改数据的控…

【word2pdf】Springboot word转pdf(自学使用)

文章目录 概要整体介绍具体实现官网pom文件增加依赖 遇到的问题本地运行OK&#xff0c;发布到Linux报错还是本地OK&#xff0c;但是Linux能运行的&#xff0c;但是中文乱码 小结 概要 Springboot word 转 pdf 整体介绍 搜了一下&#xff0c;发现了能实现功能的方法有四种 U…