首页 > 其他分享 >yolov8识别图片并获取识别信息 - 幽络源

yolov8识别图片并获取识别信息 - 幽络源

时间:2024-11-03 14:50:55浏览次数:3  
标签:wastedTime results yolov8 幽络源 cls 识别 os 图片

背景

有个项目要求:使用yolov8训练出的模型将图片进行识别后,需要返回识别后的信息,信息中包括 耗时(毫秒)、类别、类别对应的方框坐标,本篇教程便是完成此功能。

前提

有自己的yolov8环境且有训练好的模型

直接上源码

注意:这里提供了两个函数,一个是只返回信息不返回识别后的图片,一个是即返回信息又返回图片

import base64
import os
import shutil
import time
import uuid

'''
输入:图 picId , 图片路径 picPath , 识别模型 identifyYolo
输出:
{   
    "picId" : "图id",
    "wastedTime" : 耗时(毫秒),
    "results" : [
        {
            "cls" : "类别",
            "location" : "方框坐标"
        }
    ]
}
'''
def PicPathToInfo(picId,picPath,identifyYolo):
    #进行识别并记录耗时(毫秒)
    startTime = time.time()
    results = identifyYolo(source=picPath, save=False) #不需要保存识别后的图片,因此将save设置False
    endTime = time.time()
    wastedTime = int((endTime - startTime) * 1000)

    # 获取类别名称列表
    class_names = identifyYolo.names

    #因为只处理一张图,所以取第0个结果就行了
    result=results[0]
    #获取所有检测结果
    detections = result.boxes
    #构造返回结果
    resDict= {"picId":picId,"wastedTime": wastedTime, "results": []}
    #遍历检测结果
    for detection in detections:
        cls_id = int(detection.cls)  # 类别ID
        cls_name = class_names[cls_id]  # 类别名称
        location = detection.xyxy[0].tolist()  # 获取边界框坐标 [x_min, y_min, x_max, y_max]
        obj={
            "cls":cls_name,
            "location":location
        }
        resDict["results"].append(obj)
    return resDict

'''
输入:图片二进制文件流 picBytes , 识别模型 identifyYolo
输出:
{
    "wastedTime" : 耗时(毫秒),
    "identifiedPicBytesBase64" : 识别后的图片二进制文件流的Base54编码
    "results" : [
        {
            "cls" : "类别",
            "location" : "方框坐标"
        }
    ]
}
'''
def PicBytesToIdentifiedPicBytes(picBytes,identifyYolo):
    # 创建原图临时目录以保存图片(如果不存在),后续删掉里面的图片
    tempOriginDir="originTemp"
    if not os.path.exists(tempOriginDir):
        os.makedirs(tempOriginDir)

    uuidName = str(uuid.uuid4()) + '.jpg'  #将图片保存为jpg格式

    # 将二进制数据写入临时目录
    with open(os.path.join(tempOriginDir,uuidName), 'wb') as f:
        f.write(picBytes)

    # 进行识别并记录耗时(毫秒)
    startTime = time.time()
    results = identifyYolo(source=os.path.join(tempOriginDir,uuidName), save=True)
    endTime = time.time()
    wastedTime = int((endTime - startTime) * 1000)
    # 删掉原图,防止占用空间
    os.remove(os.path.join(tempOriginDir,uuidName))

    # 获取类别名称列表
    class_names = identifyYolo.names

    # 因为只处理一张图,所以取第0个结果就行了
    result = results[0]
    # 获取识别后的图片
    identifyPicPath=os.path.join(result.save_dir,uuidName)
    # 将其读取为二进制文件流
    with open(identifyPicPath, 'rb') as picFile:
        identifiedPicBytes = picFile.read()
    #将识别后的图片的所在目录删掉,防止占用空间
    shutil.rmtree(result.save_dir)
    # 将文件流转为Base64编码用于传入json
    identifiedPicBytesBase64=base64.b64encode(identifiedPicBytes).decode('utf-8')

    # 获取所有检测结果
    detections = result.boxes
    # 构造返回结果
    resDict = {"identifiedPicBytesBase64":identifiedPicBytesBase64,"wastedTime": wastedTime, "results": []}
    # 遍历检测结果
    for detection in detections:
        cls_id = int(detection.cls)  # 类别ID
        cls_name = class_names[cls_id]  # 类别名称
        location = detection.xyxy[0].tolist()  # 获取边界框坐标 [x_min, y_min, x_max, y_max]
        obj = {
            "cls": cls_name,
            "location": location
        }
        resDict["results"].append(obj)
    return resDict

使用方法

PicPathToInfo的使用

1.在yolv8源码根目录新建IdentifyUtil.py,将上面的源码粘贴进去,如图

图1

2.新建test.py,然后这里我训练好的模型名为Merged.pt,因此需先加载Merged.pt获取yolo对象,如图

from ultralytics import YOLO

#混合缺陷识别模型
mergedYolo=YOLO(model=r"D:\A01PythonProjects3123\ultralytics-main\Merged.pt",task="detect")

图2

3.调用函数进行识别并获取信息

PicPathToInfo参数解释:

  • picId:这个原本是用于后端项目上的,不需要的可以随便传,也可以自行删掉
  • picUrl:可以是本地路径,也可以是http链接的图片
  • identtifyYolo:加载了模型的yolo对象

如图,我这里因为是本地测试,随便传了个id和本地的图片,最终返回的结果为json数据,非常方便

图3

PicBytesToIdentifiedPicBytes的使用

1.同样的,需要先加载自己的模型获取yolo对象,和上面第2步一样

2.需注意的是,这个方法要求我们传入图片的二进制文件流,那就找一张本地的图片,先获取它的二进制文件流,代码与图如下:

from ultralytics import YOLO
from IdentifyUtil import *

#混合缺陷识别模型
mergedYolo=YOLO(model=r"D:\A01PythonProjects3123\ultralytics-main\Merged.pt",task="detect")

#读取图片为二进制文件流
picPath=r"D:\测试图.jpg"
with open(picPath, 'rb') as f:
    picBytes=f.read()

#调用函数识别图片获取识别信息
mergedResult=PicBytesToIdentifiedPicBytes(picBytes,mergedYolo)
print(mergedResult)

图4

3.执行后可以看到返回的json结果中包括了如下三个

  • wastedTime:耗时(毫秒)
  • results:包括了识别出的类别和类别对应的方框坐标
  • identifiedPicBytesBase64:这个是图片的二进制文件流的Base64编码,我们可以通过这个数据来获取到识别后的图片

4.将返回的Base64码写为图片,代码与图如下:

#将Base64码写为图片
image_data = base64.b64decode(mergedResult["identifiedPicBytesBase64"])
image_bytes = io.BytesIO(image_data)
image = Image.open(image_bytes)
# 保存图片到目录
savePath = "savePath"
if not os.path.exists(savePath):
    os.mkdir(savePath)
output_path = savePath + "/识别后的图.jpg"
image.save(output_path)

图5

你可能的疑问

你或许会问:对于PicBytesToIdentifiedPicBytes函数为什么要传入流再返回识别后的图片的Base64编码?yolov8本身就可以在本地生成识别后的图片啊?

我想说的是这两个方法主要是用于远程调用的,比如我在一台服务器部署了识别服务,我需要在本地用http去调用这个服务,那么此时就需要通过传文件流和图片Base64编码来进行图片的传输了

原文链接:yolov8识别图片并获取识别信息 – 幽络源

标签:wastedTime,results,yolov8,幽络源,cls,识别,os,图片
From: https://blog.csdn.net/m0_73873732/article/details/143431174

相关文章

  • 固态移动硬盘不识别数据恢复
    当固态移动硬盘不被识别时,数据恢复成为一个关键问题。以下是一些有效的数据恢复方法:一、检查连接与驱动程序检查连接:首先确认固态移动硬盘的连接是否正确,包括SATA接口、电源连接(如果适用)以及USB线或其他转接线是否损坏或松动。对于外置硬盘,确保连接线和转接器没有损坏。更新驱......
  • 基于YOLOv8模型的高精度红外行人车辆目标检测(PyTorch+Pyside6+YOLOv8模型)
    摘要:基于YOLOv8模型的高精度红外行人车辆目标检测系统可用于日常生活中检测与定位红外行人车辆目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库......
  • 使用 Elixir 实现简单的文字识别程序
    在这篇文章中,我们将手动实现一个简单的文字识别程序,使用Elixir编程语言。Elixir是一种函数式编程语言,特别适合处理并发和分布式任务。我们将通过分析图像数据,识别其中的字符。环境准备首先,请确保你已安装了Elixir。可以通过以下命令安装必要的依赖库,例如ex_image和ex_doc......
  • 变电站隔离刀闸状态自动识别系统
    变电站隔离刀闸状态自动识别系统采用超高速动态图像并行处理算法,变电站隔离刀闸状态自动识别系统通过现场监控摄像头对隔离刀闸进行实时图像采集,并利用图像识别技术对刀闸状态进行自动判断。该系统可实现一站多组刀闸、多站多组刀闸位置、运行状态等同时检测,速度快,识别速度达到秒......
  • 安全通道堵塞识别系统
    安全通道堵塞识别系统基于AI机器视觉分析识别技术的监控系统,安全通道堵塞识别系统利用现场已有的监控摄像头,对消防安全通道进行实时检测。当监测到消防安全通道被占用、堵塞时,该系统会立即告警,提醒相关工作人员及时处理。安全通道堵塞识别系统会将告警截图保存并推送给相关管理人......
  • 利用 D 编程语言实现文字识别程序
    在本篇文章中,我们将手动实现一个简单的文字识别程序,使用D编程语言。我们将通过分析图像中的像素数据,识别出其中的字符。尽管D是一种较少使用的编程语言,但它的高性能和简洁性使得我们能够高效地进行图像处理。环境准备首先,确保你已经安装了D编程语言的编译器和库。我们需要......
  • 基于OCaml的简单文字识别程序
    在本文中,我们将创建一个使用OCaml进行基本文字识别的程序。该程序将利用图像处理库来读取并识别图像中的文本。我们将实现一个简单的功能,首先加载图像,然后将其转换为灰度图像,最后提取文字。环境准备首先,确保你已经安装了OCaml和相关的图像处理库。我们将使用ocaml-gd和ocaml-tes......
  • 海南话语音识别模型——模型训练(一)
          上篇文章已经介绍了语料数据的预处理,对数据集中的音频数据分别做了重采样、静音切除、降噪以及在Fbank和MFCC中特征提取方式中选择了Fbank对音频数据进行特征提取的方法;在经过上面的处理后已经可以将提取出的音频数据Fbank丢到Transformer中进行训练,但还漏了一个比较......
  • 基于YOLO11/v10/v8/v5深度学习的危险驾驶行为检测识别系统设计与实现【python源码+Pyq
    《博主简介》小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~......
  • 【语音识别】男女声在线识别【含Matlab源码 8997期】
    ......