YOLOv8测试3:在Python中将YOLOv8模型封装成API接口使用(上传测试图片并返回识别结果,附测试代码)

这篇具有很好参考价值的文章主要介绍了YOLOv8测试3:在Python中将YOLOv8模型封装成API接口使用(上传测试图片并返回识别结果,附测试代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

记录时间 [2024-4-4]


本文讲述的是在Windows系统(Python+PyTorch+Conda+cpu)中YOLOv8模型的简单应用。这里附带上YOLOv8官方文档,里面记载了详细的使用方法,如果觉得看文档比较麻烦的话,可以直接看文章,需要用到的部分已经在文章中进行了摘录。


经过了前几次的尝试,我们不仅能使用CLI的方式运行yolov8n.pt模型,对图像和视频进行目标识别,并得到结果。
参考文章:YOLOv8模型的简单测试,Windows环境下安装部署(Python+PyTorch+Conda+cpu+CLI)


也可以在PyCharm集成开发环境中编写简单的python文件,以python的方式对YOLOv8模型进行简单的测试。
参考文章:YOLOv8模型的简单测试2,PyCharm集成开发环境安装使用(Windows+Python+PyTorch+Conda+cpu)


同时也了解了在Python中使用Flask封装网络接口的方法,能实现文件的上传。
参考文章:API接口简单使用(二):Python中使用Flask(接口封装整理版,含文件上传接口的详细实现)


接下来,本文将介绍在Python中将YOLOv8模型封装成API接口使用的方法,然后通过调用封装好的API接口,我们可以上传自定义的测试图片,并返回识别结果。识别结果有两种:一种是完成识别后的图片;另一种是识别目标的类型,以及它们在图片中的坐标、大小,以文本形式返回。


二、思路整理


想要实现在Python中将YOLOv8模型封装成API接口使用,首先整理下思路:

  • (服务端)使用Flask框架编写一个简单的测试实例,可以实现文件上传
  • (客户端)通过API接口,以文件形式上传自定义的测试图片
  • (服务端)获取图片名称和类型,然后保存到指定路径
  • (服务端)下载并使用YOLOv8模型进行图片预测/识别
  • (服务端)保存图片目标识别的结果
  • (服务端)返回目标识别的结果
  • (客户端)得到服务端返回的识别结果

三、过程实现

此处主要讲述这个案例的实现过程,想要直接上手的朋友可以在文章下半部分获取详细完整版的测试代码哦。


1. 编写测试实例

(服务端)使用Flask框架编写一个简单的测试实例,可以实现文件上传


简单了解


简单的测试实例如下:

from flask import Flask, request

app = Flask(__name__)

@app.route('/...')
def hanshu():
    # 这里是写接口函数的地方

if __name__ == '__main__':
    app.run()

文件上传功能的网络接口参考这个:(简单看一下即可)

@app.post('/upload')
def upload():

    # 文件作为参数传递,其 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"

    # file_format 获取文件类型,并返回
    if file:
        filename = file.filename
        file_format = filename.rsplit('.', 1)[1]
        return "File format is: " + file_format.upper()

创建测试文件


然后,开始动手操作。

使用PyCharm打开我们之前从仓库下载的YOLOv8项目ultralytics-main,找到tests目录,在该目录下新建image_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)

导入Flask框架使用所需依赖:(如果Flask依赖报错,说明没有导入成功,重新导入一下即可。)

from flask import Flask, request, send_file

编写文件上传接口


app = Flask(__name__)

@app.post('/image')
def return_image():
    return "Succeed"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5001)

大家可以自行测试下这个接口可不可用,后面我们在return_image()函数中编写内容。


创建上传目录


ultralytics-main/tests/tmp/目录下新建upload文件夹,用来存放我们上传的文件。


2. 上传测试图片

(客户端)通过API接口,以文件形式上传自定义的测试图片


这里简单写一个HTML文件用于测试即可:

<html>

<head>
	<title>文件上传</title>

</head>

<body>
    
    <!--action中写入请求的URL-->
    <!--method中写入请求的方法,如 get/post...-->
    
	<form action="http://127.0.0.1:5001/image" method="post" enctype="multipart/form-data">
	
		<input type="file" name="file">
		<input type="submit" value="上传">
	
	</form>

</body>

</html>

3. 获取图片信息并保存

(服务端)获取图片名称和类型,然后保存到指定路径


return_image()函数中编写内容:

# 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. 保存到指定位置
file.save(TMP / 'upload' / filename)

4. 进行图片预测

(服务端)下载并使用YOLOv8模型进行图片预测/识别


return_image()函数中编写内容:

# 3. 使用 YOLOv8模型对该图片进行预测
model = YOLO(MODEL)

# Define path to the image file
source = TMP / 'upload' / filename

# 具体要在 predict中添加一些参数
model.predict(source)

5. 保存图片目标识别的结果

(服务端)保存图片目标识别的结果


图片结果


我们要保存识别后的图片结果,主要使用的参数是save,我们设置save=True即可。

# 4. 保存结果
results = model.predict(source, save=True, imgsz=320, conf=0.5)

文本结果


如果要保存识别目标的类型,以及它们在图片中的坐标、大小,以文本形式返回

则使用参数save_txt,设置为True

results = model.predict(source, save_txt=True)

结果会以txt文件的形式保存在tests\tmp\runs\detect\predict[i]\labels目录下。


6. 返回目标识别的结果

(服务端)返回目标识别的结果


图片结果


send_file(image_path)是直接将返回的结果在浏览器中进行预览,

如果想要下载图片,就添加as_attachment=True参数。

# 获取文件保存的路径
save_path = Path(results[0].save_dir)
image_path = save_path / filename

# 5. 返回结果
return send_file(image_path)
# 下载版
return send_file(image_path, as_attachment=True)

文本结果


想要获取识别目标的类型,以及它们在图片中的坐标、大小的信息,

我们需要读取tests\tmp\runs\detect\predict[i]\labels目录中的txt文件

# 获取文件保存的路径
save_path = Path(results[0].save_dir)

# 获取label标签文件
for r in results:
    im_name = Path(r.path).stem
    labels = save_path / f"labels/{im_name}.txt"

# 读取标签文件中的内容
txt_file = labels
with open(txt_file, 'r') as file:
    content = file.read()

# 返回结果
return content

7. 得到返回结果

(客户端)得到服务端返回的识别结果


图片结果


我们可以用上面写的HTML文件来进行测试,双击运行,选择文件,然后上传即可。

这里为了呈现结果更加直观,所以使用了Postman来测试,如图所示。


注意:测试图片素材来源于网络,仅用于测试演示。

html调用yolov8,YOLOv8,YOLO,python,目标检测,计算机视觉


文本结果


如图所示,返回识别目标的类型,以及它们在图片中的坐标、大小等信息。

html调用yolov8,YOLOv8,YOLO,python,目标检测,计算机视觉


下面对YOLOv8标签文件label中的内容进行解释:

  • 如图,在项目中打开一个模型训练文件进行查看
  • 以第一行标签为例,首个数字5代表的是names中的第五类,即bus
  • 后面的四个参数分别是bus在图片中的纵横坐标,以及它的长宽
  • 通过这些参数,我们就可以确定识别目标的类型,以及它在图片中的位置啦

html调用yolov8,YOLOv8,YOLO,python,目标检测,计算机视觉


四、详细完整版测试代码


1. 得到图片目标版本


image_test.py

# 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

from flask import Flask, request, send_file

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)

app = Flask(__name__)

@app.post('/image')
def return_image():
    # 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. 保存到指定位置
    file.save(TMP / 'upload' / filename)

    # 3. 使用 YOLOv8模型对该图片进行预测
    model = YOLO(MODEL)

    # Define path to the image file
    source = TMP / 'upload' / filename

    # 4. 保存结果
    results = model.predict(source, save=True, imgsz=320, conf=0.5)

    # 获取文件保存的路径
    save_path = Path(results[0].save_dir)
    image_path = save_path / filename

    # 5. 返回结果
    return send_file(image_path)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5001)

2. 得到文本参数版本


text_test.py

# 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

from flask import Flask, request, send_file

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)

app = Flask(__name__)

@app.post('/text')
def return_text():
    # 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. 保存到指定位置
    file.save(TMP / 'upload' / filename)

    # 3. 使用 YOLOv8模型对该图片进行预测
    model = YOLO(MODEL)

    # Define path to the image file
    source = TMP / 'upload' / filename

    # 4. 保存结果
    results = model.predict(source, save_txt=True)

    # 获取文件保存的路径
    save_path = Path(results[0].save_dir)

    # 获取label标签文件
    for r in results:
        im_name = Path(r.path).stem
        labels = save_path / f"labels/{im_name}.txt"

    # 读取标签文件中的内容
    txt_file = labels
    with open(txt_file, 'r') as file:
        content = file.read()

    # 5. 返回结果
    return content

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5001)

五、总结


本文在Python中将YOLOv8模型封装成API接口进行使用,通过调用封装好的API接口来实现自定义测试图片的上传,并返回识别结果。识别结果有两种:一种是完成识别后的图片;另一种是识别目标的类型,以及它们在图片中的坐标、大小,以文本形式返回。


一些参考资料

YOLOv8官方文档:https://docs.ultralytics.com/zh/

YOLOv8模型仓库地址:https://github.com/ultralytics/ultralytics

PyCharm官网:https://www.jetbrains.com/pycharm/download/?section=windows文章来源地址https://www.toymoban.com/news/detail-858757.html

到了这里,关于YOLOv8测试3:在Python中将YOLOv8模型封装成API接口使用(上传测试图片并返回识别结果,附测试代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Vue项目笔记心得】postman接口测试、axios二次封装、api接口统一管理

    1、postman接口测试 下载地址:Download Postman | Get Started for Free   2、axios二次封装 (1)为什么进行二次封装axios? 请求拦截器、响应拦截器: 请求拦截器 :可以在发请求之前可以处理一些业务 响应拦截器 :当服务器数据返回以后,可以处理一些事情 安装axios: npm install ax

    2023年04月08日
    浏览(40)
  • yolov8n 瑞芯微RKNN和地平线Horizon芯片仿真测试部署,部署工程难度小、模型推理速度快

      特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。   模型和完整仿真测试代码,放在github上参考链接 模型和代码。   因为之前写了几篇yolov8模型部署的博文,存在两个问题:部署难度大、模型推理速度慢。该篇解

    2024年02月01日
    浏览(49)
  • LAZADA平台的商品评论Python封装API接口接入文档和参数说明

         LAZADA是一个位于东南亚的电商平台,成立于2012年。该平台覆盖的国家包括新加坡、马来西亚、印尼、菲律宾、泰国和越南等地。它提供了一个多样化的产品选择,包括时尚、美容、数码、母婴等商品,并且拥有许多知名品牌的官方旗舰店。同时,LAZADA平台也为卖家提供

    2024年02月08日
    浏览(38)
  • python+pytest接口自动化之测试函数、测试类/测试方法的封装

    今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行。 例如单个接口的请求代码如下: 假设我们需要将上面这段代码编写成测试框架能执行的测试用例,仅仅只是这样写代码显然是不够的,还需要进行如下

    2024年03月09日
    浏览(62)
  • Windows10+Python+Yolov8+ONNX图片缺陷识别,并在原图中标记缺陷,有onnx模型则无需配置,无需训练。

    目录 一、训练自己数据集的YOLOv8模型  1.博主电脑配置 2.深度学习GPU环境配置  3.yolov8深度学习环境准备 4.准备数据集 二、Python+Onnx模型进行图像缺陷检测,并在原图中标注 1、模型转换 2、查看模型结构 3、修改输入图片的尺寸 4、 图像数据归一化 5、模型推理 6、推理结果筛

    2024年02月12日
    浏览(39)
  • 基于YOLOV8模型的海上船只目标检测系统(PyTorch+Pyside6+YOLOv8模型)

    摘要:基于YOLOV8模型的海上船只目标检测系统用于日常生活中检测与定位海上船只目标(散装货船(bulk cargo carrier)、集装箱船(container ship)、渔船(fishing boat)、普通货船(general cargo ship)、矿石船(ore carrier)和客轮(passenger ship)),利用深度学习算法可实现图片、视

    2024年02月09日
    浏览(55)
  • 基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

    摘要:基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库来搭

    2024年02月11日
    浏览(45)
  • 基于YOLOv8模型的深海鱼目标检测系统(PyTorch+Pyside6+YOLOv8模型)

    摘要:基于YOLOv8模型和BDD数据集的自动驾驶目标检测系统可用于日常生活与海洋中检测与定位深海鱼目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据

    2024年02月07日
    浏览(41)
  • YOLOv8模型部署

    (1)yolov8之导出onnx(二)_model.export(format=“onnx”)-CSDN博客 (1)本次针对多样化场景,不同场景取1000+张图片(1920*1080)。 (2)训练YOLOv8模型(包含n和s的模型) 模型是通过Rect=True, imgsz = 960训练的。 上述,若不改变其它源码,则转化过程是input shape (1, 3, 960, 544) BCHW and ou

    2024年02月22日
    浏览(41)
  • 【目标检测算法实现之yolov8】yolov8训练并测试VisDrone数据集

    在这之前,需要先准备主机的环境,环境如下: Ubuntu18.04 cuda11.3 pytorch:1.11.0 torchvision:0.12.0 在服务器上执行以下命令, pytorch v1.11.0(torch1.11.0+cu1113 ,torchvision0.12.0+cu113) 先创建yolov8文件夹,存放等会要下载的yolov8代码 mkdir yolov8 进入yolov8文件夹, cd yolov8 下载yolov8代码 git cl

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包