一、前言
記錄時間 [2024-4-14]
系列文章簡摘:
Docker 學(xué)習(xí)筆記(二):在 Linux 中部署 Docker(Centos7 下安裝 docker、環(huán)境配置,以及鏡像簡單使用)
API 接口簡單使用(二):Python 中使用 Flask(接口封裝整理版,含文件上傳接口的詳細(xì)實(shí)現(xiàn))
YOLOv8 測試 3:在 Python 中將 YOLOv8 模型封裝成 API 接口使用(上傳測試圖片并返回識別結(jié)果,附測試代碼)
YOLOv8 測試 4:在 Linux 中使用 Docker 部署 YOLOv8 模型,并使用簡單的命令行腳本測試模型
更多 YOLOv8 測試相關(guān)文章請參考上面專欄哦。
本文在 YOLOv8 測試 3 和 4 的基礎(chǔ)上開展,在測試 3 中,介紹 Windows 中使用 Python 將 YOLOv8 模型封裝成 API 接口來調(diào)用;在測試 4 中,介紹 Linux 中使用 Docker 部署 YOLOv8 模型。
綜合測試 3 和 4,本文主要實(shí)現(xiàn)在 Linux 中 使用 Docker 部署 YOLOv8 模型,并借助 Python 封裝 API 接口來調(diào)用。在此基礎(chǔ)上,再介紹 base64 格式圖片的處理方法,最后通過接口上傳圖片的 base64 格式編碼,得到接口返回識別結(jié)果。
二、思路整理
-
在本地 PyCharm 中完成項(xiàng)目開發(fā)
- 使用 Flask 框架編寫 API 接口
- base64 格式圖片處理
- YOLOv8 模型的 predict 使用
-
在 Linux 中部署 Docker,操作系統(tǒng)為 CentOS 7
- 準(zhǔn)備 Linux 云服務(wù)器 / 虛擬機(jī)
- 安裝并配置 Docker
- 熟悉 Docker 的鏡像容器操作
-
在 Conda 容器中部署 YOLOv8 項(xiàng)目
- 通過 FinalShell 把本地項(xiàng)目上傳到 Linux 服務(wù)器中
- 部署一個 conda 鏡像
- 配置端口暴露,數(shù)據(jù)卷掛載
- 通過數(shù)據(jù)卷掛載 YOLOv8 項(xiàng)目到容器中
-
使用 Postman 測試 API 接口
- 上傳圖片的 base64 格式編碼文件
- 得到接口返回的圖片識別結(jié)果
三、YOLOv8 項(xiàng)目開發(fā)
在本地 PyCharm 中完成項(xiàng)目開發(fā),更詳細(xì)的步驟請參考這篇文章
1. 依賴配置
使用 PyCharm 打開我們之前使用過的,從倉庫下載的 YOLOv8 項(xiàng)目 ultralytics-main,找到 tests 目錄,在該目錄下新建 base64_test.py 文件。
并在 ultralytics-main/tests/tmp/
目錄下,新建 upload
文件夾,用來存放接口上傳的文件;新建 save
文件夾,用來存放項(xiàng)目保存的文件;
在 base64_test.py 文件中導(dǎo)入 YOLOv8 項(xiàng)目運(yùn)行所需的依賴和配置:
# 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 構(gòu)建 API 接口有疑問的,參考這篇文章
在這個接口中,實(shí)現(xiàn)以下要求:
- 接收接口請求的圖片的 base64 格式編碼文件
- 將 base64 格式編碼文件還原成圖片并保存
- YOLOv8 模型對該圖片進(jìn)行目標(biāo)識別
- 返回目標(biāo)圖片的識別結(jié)果
編寫文件上傳接口
在 base64_test.py 文件中,導(dǎo)入 Flask 框架使用所需依賴:
from flask import Flask, request, send_file
編寫一個簡單的 API 接口,后面我們在return_image()
函數(shù)中編寫內(nèi)容。
app = Flask(__name__)
@app.post('/baseFile')
def return_image():
return "Succeed"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001)
編寫好后運(yùn)行(右鍵 run ‘base64_test.py’),使用 Postman 測試下這個接口可不可用。
POST 請求不能直接在瀏覽器測試,瀏覽器默認(rèn) GET 請求。
處理上傳的文件
在return_image()
函數(shù)中編寫內(nèi)容:獲取接口上傳的文件,并保存到 upload 目錄。
# 1. 獲取上傳的文件
# 文件作為參數(shù)傳遞,其 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 格式編碼是指:把二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成 64 個可以打印的字符。
如何獲取圖片的 base64 格式編碼呢?使用在線圖片轉(zhuǎn)換工具,上傳圖片獲得 base64 格式編碼,將編碼保存為 txt 文件。
在 base64_test.py 文件中,導(dǎo)入依賴:
import base64
from PIL import Image
from io import BytesIO
接著在return_image()
函數(shù)中編寫內(nèi)容:讀取編碼文件內(nèi)容,將 base64 格式編碼文件還原成圖片并保存。
# 3. 獲取編碼文件并解碼
base_file = TMP / 'upload' / filename
# 打開編碼文件,讀取文件中的內(nèi)容
with open(base_file, 'r') as file:
content = file.read()
# 將 base64_str 以 “,” 分割為兩部分,context 部分是需要解碼的部分
base64_str = str(content)
head, context = base64_str.split(",")
# 解碼時只要內(nèi)容部分
img_data = base64.b64decode(context)
# 4. 通過解碼內(nèi)容得到圖片,保存圖片
image = Image.open(BytesIO(img_data))
image.save(TMP / 'save' / 'test_image.jpg')
# 看圖片
# image.show()
3. YOLOv8 識別圖片
接下來,下載并使用 YOLOv8 模型,對獲得的圖片進(jìn)行目標(biāo)識別。
接著在return_image()
函數(shù)中編寫內(nèi)容:對圖片進(jìn)行目標(biāo)識別,并返回識別結(jié)果。
# 5. 使用 YOLOv8 模型對該圖片進(jìn)行目標(biāo)識別
model = YOLO(MODEL)
# 得到的圖片路徑
source = TMP / 'save' / 'test_image.jpg'
# 保存 目標(biāo)識別的結(jié)果
results = model.predict(source, save=True, imgsz=320, conf=0.5)
# 6. 獲取 識別結(jié)果 的保存路徑
save_path = Path(results[0].save_dir)
image_path = save_path / 'test_image.jpg'
# 7. 以圖片形式 返回結(jié)果
return send_file(image_path)
編寫好后運(yùn)行(右鍵 run ‘base64_test.py’),使用 Postman 測試下,選 form-data
類型,上傳 base64 格式編碼文件,測試下識別結(jié)果是否返回成功。
四、在 Linux 中的準(zhǔn)備工作
1. Linux 中部署 Docker
宿主機(jī) Linux,操作系統(tǒng)為 CentOS 7,Linux 虛擬機(jī)安裝,參考這篇文章
在 Linux 中部署 Docker,參考這篇文章
2. 上傳本地項(xiàng)目
本地項(xiàng)目 ultralytics-main 已經(jīng)完成編寫,關(guān)閉 PyCharm,找到 ultralytics-main 文件夾
通過 FinalShell,把 ultralytics-main 一整個上傳到 Linux 服務(wù)器 /home/YOLO 目錄中(目錄隨便)
3. 運(yùn)行 conda 容器
在之前的文章中,參考這篇文章,我們已經(jīng)在 Docker 中部署了 Conda 環(huán)境,可以直接把這個部署好的 conda 虛擬環(huán)境拿來用。
如果之前的容器丟失了,那我們快速地部署一下吧。
# 1. 創(chuàng)建 conda 容器并運(yùn)行
docker run -it --name yolopy03 conda/miniconda3 /bin/bash
# 2. 配置 yolov8 運(yùn)行環(huán)境
conda create -n yolov8 python=3.9
# Proceed ([y]/n)? y
# 3. 檢查虛擬環(huán)境配置
conda env list
# 4. 進(jìn)入 base 環(huán)境
source activate
# 5. 激活 Conda 環(huán)境,創(chuàng)建 yolov8 運(yùn)行
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 環(huán)境
python --version
# 9. 退出容器 exit,退出虛擬環(huán)境用 conda deactivate,退不出就 kill,沒事的
exit
五、部署 YOLOv8 項(xiàng)目
接下來,在 Docker 中部署 YOLOv8 項(xiàng)目,配置數(shù)據(jù)卷掛載,更詳細(xì)的步驟請參考這篇文章
1. 導(dǎo)出 yolov8 虛擬環(huán)境
把上面那個配置好的 yolopy03 容器 conda 環(huán)境拿過來,導(dǎo)出 envs 下面的 yolov8 虛擬環(huán)境。
虛擬環(huán)境位于容器的 /usr/local/envs
,把它導(dǎo)出到宿主機(jī)的 /home/YOLO
目錄下:
# 導(dǎo)出 yolov8 虛擬環(huán)境
docker cp yolopy03:/usr/local/envs /home/YOLO
2. 運(yùn)行新的容器
在運(yùn)行前,配置下端口暴露,以及數(shù)據(jù)卷掛載。
端口暴露是為 API 接口訪問做準(zhǔn)備,數(shù)據(jù)卷掛載是為了將宿主機(jī)上的 ultralytics-main 項(xiàng)目和 yolov8 虛擬環(huán)境同步到新容器中。
這樣可以省去新容器重復(fù)配置的步驟,一些創(chuàng)建的、安裝好的東西不用重復(fù)安裝了。
但是參數(shù) / 變量的配置是不會生效的,比如清華源鏡像。
-
-it
:交互式運(yùn)行; -
--name
:容器命名; -
-p 3352:5001
:把容器的 5001 端口映射到宿主機(jī)的 3352 端口; -
-v 宿主機(jī)路徑:容器內(nèi)路徑
:把容器內(nèi)路徑掛載到宿主機(jī)路徑,可以掛載很多個路徑。
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
進(jìn)入容器后,檢查下虛擬環(huán)境配置,然后激活 yolov8 運(yùn)行環(huán)境。
# 檢查虛擬環(huán)境配置
conda env list
# 進(jìn)入 base 環(huán)境
source activate
# 激活 yolov8 運(yùn)行環(huán)境
conda activate yolov8
配置清華源鏡像,否則下載東西非常慢
# 檢查 python 環(huán)境
python --version
# 配置清華源鏡像
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
3. 安裝 YOLOv8 項(xiàng)目依賴
進(jìn)入 ultralytics-main 目錄,為什么容器內(nèi)會有 ultralytics-main 文件呢?答對了,因?yàn)閿?shù)據(jù)卷掛載。
cd /usr/local/ultralytics-main
在該目錄下,安裝 / 更新 YOLOv8 項(xiàng)目運(yùn)行所需的依賴:
# 安裝 YOLOv8 項(xiàng)目依賴
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
六、項(xiàng)目測試運(yùn)行
1. 運(yùn)行項(xiàng)目
先確定容器工作目錄:/usr/local/ultralytics-main
python 方式運(yùn)行 base64_test.py(熟悉嗎?我們剛剛寫的)
python tests/base64_test.py
2. 接口測試
測試方式,使用 Postman 測試。
http://ip:3352/baseFile
如圖所示,項(xiàng)目啟動成功后,輸入宿主機(jī) ip / 宿主機(jī)端口,POST 請求,添加 base64 格式編碼文件,Send 測試!
返回了識別結(jié)果,測試成功!
再來看一下服務(wù)端的情況吧:
- 處理了 base64 編碼文件,保存了圖片;
- 下載了 yolov8n.pt 模型,對圖片進(jìn)行目標(biāo)識別;
- 將結(jié)果保存,并通過接口返回給客戶端。
七、總結(jié)
本文主要實(shí)現(xiàn)在 Linux 中 使用 Docker 部署 YOLOv8 模型,并借助 Python 封裝 API 接口來調(diào)用。還介紹了 base64 格式圖片的處理方法,最后通過接口上傳圖片的 base64 格式編碼,得到接口返回識別結(jié)果。復(fù)習(xí)了數(shù)據(jù)卷的命令掛載方法。
一些參考資料文章來源:http://www.zghlxwxcb.cn/news/detail-861862.html
Docker 官方文檔:https://docs.docker.com/engine/install/centos/
Docker 遠(yuǎn)程倉庫: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官網(wǎng):https://www.jetbrains.com/pycharm/download/?section=windows
Postman 官網(wǎng):https://www.postman.com/
阿里云官網(wǎng):https://www.aliyun.com/文章來源地址http://www.zghlxwxcb.cn/news/detail-861862.html
到了這里,關(guān)于YOLOv8 測試 5:Linux 中 Docker 部署 YOLOv8,Python 封裝 API 接口,base64 圖片處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!