基于 OpenVINO 的目标识别

news2025/3/11 1:31:17

基于 OpenVINO 的目标识别

YOLOV5原理

YOLOv5是一种快速高效的目标检测算法,具有优秀的实时性能和较高的准确度。该算法利用深度学习技术实现了端到端的目标检测,在计算资源有限的情况下也能够获得出色的表现

YOLOv5采用了一种基于Anchor的检测方式,在输入图像中通过预先定义的Anchor尺寸进行目标检测。相比于传统的滑动窗口方法,该方法能够在不同尺度的特征图上同时进行目标检测,大大提升了检测效率和准确度

在算法实现方面,YOLOv5采用了轻量级网络结构和多尺度训练策略。具体来说,该算法使用了CSPDarknet53作为主干网络,采用了Bottleneck残差块和SPP模块等技术,进一步加强了网络的表示能力和感受野。此外,该算法还引入了多尺度训练策略,通过在不同尺度的图像上训练模型,使模型能够更好地适应不同场景下的目标检测任务

除了算法本身的优化,YOLOv5还采用了一系列技术手段来提高算法的性能和鲁棒性。例如,使用Mish激活函数代替传统的ReLU激活函数,可以有效避免梯度消失问题;使用DropBlock正则化方法可以提高模型的泛化能力和抗过拟合能力;使用AutoAugment数据增强技术可以增加数据的多样性,进一步提高模型的准确度和鲁棒性

总之,YOLOv5是一种快速高效、准确度较高的目标检测算法,通过采用端到端的检测方式、基于Anchor的检测方式、轻量级网络结构和多尺度训练策略等优化措施,成功地实现了在计算资源有限的情况下高效地完成目标检测任务

环境安装

pip install labelimg
pip install openvino-dev[onnx,tensorflow]==2022.2.0
pip install paddle2onnx==1.0.5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install tensorflow-gpu==2.7.0
pip install paddlepaddle

数据处理

这里我们选择的分类数据是《喜羊羊与灰太狼》其中的七个角色,标签名称设置如下:

meiyangyang
xiyangyang
feiyangyang
lanyangyang
huitailang
manyangyang
hongtailang

这里我们采用了1432张图片进行训练,使用 LabelImg 开始打标签:

image

当我们把所有的标签全部处理完成之后,我们就可以进行数据格式处理:

首先我们进入到 yolo 文件夹下:

image

mask 中存储刚我们处理过的图片和信息:

image

当我们完成这一步之后就可以开始数据处理了,首先我们在当前目录下打开 CMD,直接运行 gen.py

然后进入如下路径运行以下命令:

image

python yolov5_2_coco.py --dir_path dataset/YOLOV5

环境搭建

我们在 paddle 新建一个环境,将生成的数据打包上传到 paddle 云端即可,并同时在 github 中下载 PaddleYOLO 一同进行上传

我们需要将数据放到 dataset 路径下:

image

然后我们需要修改我们的配置文件:

image

image

数据训练

这里我们修改了训练的轮数和数据分类数,然后在最开始的路径下新建一个 notebook 文件运行如下代码:

image

当我们全部运行结束后,会生成这两个文件夹:

image

这里我们子需要下载以下文件夹即可:

image

这里我们下载好解压出来即可

模型处理

这里我们需要将我们下载的文件放到如下目录中:

image

由于我们训练出来的模型并不能直接使用,所以我们按照顺序执行如下代码即可:

python prune_paddle_model.py --model_dir ppyoloe_crn_s_80 --model_filename model.pdmodel --params_filename model.pdiparams --output_names tmp_16 concat_14.tmp_0 --save_dir export_model

paddle2onnx --model_dir export_model --model_filename model.pdmodel --params_filename model.pdiparams --input_shape_dict "{'image':[1,3,640,640]}" --opset_version 11 --save_file ppyoloe_crn_s_80.onnx

mo --input_model ppyoloe_crn_s_80.onnx

这样我们就得到了我们需要的模型:

image

我们将这两个模型文件与我们的代码文件放到我们的 jupyter notebook 路径下引入即可:

image

然后我们直接运行代码即可,代码如下:

from openvino.runtime import Core
import openvino.runtime as ov
import cv2 as cv
import numpy as np
import tensorflow as tf
import paddle.fluid as fluid
# OpenVINO 模型推理器
class Predictor:
    """
    OpenVINO 模型推理器
    """
    def __init__(self, model_path):
        ie_core = Core()
        model = ie_core.read_model(model=model_path)
        self.compiled_model = ie_core.compile_model(model=model, device_name="CPU")
    def get_inputs_name(self, num):
        return self.compiled_model.input(num)
    
    def get_outputs_name(self, num):
        return self.compiled_model.output(num)
    
    def predict(self, input_data):
        return self.compiled_model([input_data])
    
    def get_request(self):
        return self.compiled_model.create_infer_request()
# 图像预处理
def process_image(input_image, size):
    """输入图片与处理方法,按照PP-Yoloe模型要求预处理图片数据

    Args:
        input_image (uint8): 输入图片矩阵
        size (int): 模型输入大小

    Returns:
        float32: 返回处理后的图片矩阵数据
    """
    max_len = max(input_image.shape)
    img = np.zeros([max_len,max_len,3],np.uint8)
    img[0:input_image.shape[0],0:input_image.shape[1]] = input_image # 将图片放到正方形背景中
    img = cv.cvtColor(img,cv.COLOR_BGR2RGB)  # BGR转RGB
    img = cv.resize(img, (size, size), cv.INTER_NEAREST) # 缩放图片
    img = np.transpose(img,[2, 0, 1]) # 转换格式
    img = img / 255.0 # 归一化
    img = np.expand_dims(img,0) # 增加维度
    return img.astype(np.float32)
# 图像后处理
def process_result(box_results, conf_results):
    """按照PP-Yolove模型输出要求,处理数据,非极大值抑制,提取预测结果

    Args:
        box_results (float32): 预测框预测结果
        conf_results (float32): 置信度预测结果
    Returns:
        float: 预测框
        float: 分数
        int: 类别
    """
    conf_results = np.transpose(conf_results,[0, 2, 1]) # 转置
    # 设置输出形状
    box_results =box_results.reshape(8400,4) 
    conf_results = conf_results.reshape(8400,2)
    scores = []
    classes = []
    boxes = []
    for i in range(8400):
        conf = conf_results[i,:] # 预测分数
        score = np.max(conf) # 获取类别
        # 筛选较小的预测类别
        if score > 0.5:
            classes.append(np.argmax(conf)) 
            scores.append(score) 
            boxes.append(box_results[i,:])
    scores = np.array(scores)
    boxes = np.array(boxes)
    
    result_box = []
    result_score = []
    result_class = []
    # 非极大值抑制筛选重复的预测结果
    if len(boxes) != 0:
        # 非极大值抑制结果
        indexs = tf.image.non_max_suppression(boxes,scores,len(scores),0.25,0.35)
        for i, index in enumerate(indexs):
            result_score.append(scores[index])
            result_box.append(boxes[index,:])
            result_class.append(classes[index])
    # 返回结果
    return np.array(result_box),np.array(result_score),np.array(result_class)
# 画出预测框
def draw_box(image, boxes, scores, classes, labels):
    """将预测结果绘制到图像上

    Args:
        image (uint8): 原图片
        boxes (float32): 预测框
        scores (float32): 分数
        classes (int): 类别
        lables (str): 标签

    Returns:
        uint8: 标注好的图片
    """
    colors = [(0, 0, 255), (0, 255, 0)]
    scale = max(image.shape) / 640.0 # 缩放比例
    if len(classes) != 0:
        for i in range(len(classes)):
            box = boxes[i,:]
            x1 = int(box[0] * scale)
            y1 = int(box[1] * scale)
            x2 = int(box[2] * scale)
            y2 = int(box[3] * scale)
            label = labels[classes[i]]
            score = scores[i]
            cv.rectangle(image, (x1, y1), (x2, y2), colors[classes[i]], 2, cv.LINE_8)
            cv.putText(image,label+":"+str(score),(x1,y1-10),cv.FONT_HERSHEY_SIMPLEX, 0.55, colors[classes[i]], 2)
        
    return image
# 读取标签
def read_label(label_path):
    with open(label_path, 'r') as f:
        labels = f.read().split()
    return labels
# 同步推理
label_path = "labels.txt"
yoloe_model_path = "ppyoloe_crn_s_80.xml"
predictor = Predictor(model_path = yoloe_model_path)
boxes_name = predictor.get_outputs_name(0)
conf_name = predictor.get_outputs_name(1)
labels = read_label(label_path=label_path)
cap = cv.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    frame = cv.flip(frame, 180)
    cv.namedWindow("MaskDetection", 0)  # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直
    cv.resizeWindow("MaskDetection", 640, 480)    # 设置长和宽
    input_frame = process_image(frame, 640)
    results = predictor.predict(input_data=input_frame)
    boxes, scores, classes = process_result(box_results=results[boxes_name], conf_results=results[conf_name])
    result_frame = draw_box(image=frame, boxes=boxes, scores=scores, classes=classes, labels=labels)
    cv.imshow('MaskDetection', result_frame)
    key = cv.waitKey(1)
    if key == 27: #esc退出
        break
cap.release()
cv.destroyAllWindows()
# 异步推理
label_path = "labels.txt"
yoloe_model_path = "ppyoloe_crn_s_80.xml"
predictor = Predictor(model_path = yoloe_model_path)
input_layer = predictor.get_inputs_name(0)
labels = read_label(label_path=label_path)
cap = cv.VideoCapture(0)
curr_request = predictor.get_request()
next_request = predictor.get_request()
ret, frame = cap.read()
curr_frame = process_image(frame, 640)
curr_request.set_tensor(input_layer, ov.Tensor(curr_frame))
curr_request.start_async()
while cap.isOpened():
    ret, next_frame = cap.read()
    next_frame = cv.flip(next_frame, 180)
    cv.namedWindow("MaskDetection", 0)  # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直
    cv.resizeWindow("MaskDetection", 640, 480)    # 设置长和宽
    in_frame = process_image(next_frame, 640)
    next_request.set_tensor(input_layer, ov.Tensor(in_frame))
    next_request.start_async()
    if curr_request.wait_for(-1) == 1:
        boxes_name = curr_request.get_output_tensor(0).data
        conf_name = curr_request.get_output_tensor(1).data
        boxes, scores, classes = process_result(box_results=boxes_name, conf_results=conf_name)
        frame = draw_box(image=frame, boxes=boxes, scores=scores, classes=classes, labels=labels)
        cv.imshow('MaskDetection', frame)
    frame = next_frame
    curr_request, next_request = next_request, curr_request
    key = cv.waitKey(1)
    if key == 27: #esc退出
        break
cap.release()
cv.destroyAllWindows()

这里同步推理和异步推理我们只需要使用一个即可
最后我们的运行效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762065.html

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

相关文章

广西电网:筑牢数字化安全根基,推动新型能源体系建设

广西电网是南方电网的全资子公司,是广西地区内资产规模数一数二的特大型企业。一直以来,广西电网都积极探索深化数字化绿色化协同,深入推进数字电网建设,构建新型电力系统和新型能源体系。 国家政策提出要求 以安全保障数字纽带 …

postman常用操作说明

环境变量 环境变量就是我们存放一组公共数据的地方,比如我有100个接口,三套环境(开发环境、测试环境、生产环境),我们没有必要把这100个接口根据三个环境分别写一套用例。只需要维护一套用例脚本,然后设置对应三个环境的变量就行…

抗性宏基因组揭秘人和动物共享ARG以及ARG的转移能力

抗生素耐药性(Antibiotic Resistance)是全球日益严重的公共卫生问题,随着“同一健康”概念的提出,人们更追求人、动物和环境的最佳健康。动物服用抗生素后会在其内脏中产生抗药细菌,并留在动物体内,最终可能…

MIT 6.829 -- Lecture 1: Packet Switching

MIT 6.829 -- Lecture 1: Packet Switching 引言InterconnectionsCircuit SwitchingPacket SwitchingDatagram routingSource routingVirtual circuits An example:LAN SwitchingLearning bridgesThe Solution:Spanning TreesVirtual LANs Summary 本课程…

PS图层混合模式超详细解答-图层混合模式的原理(Part1)

PS图层混合模式超详细解答-图层混合模式的原理 ☕ 前言 本教程非常详细,请用心看完 本教程如果有如何问题,欢迎评论区留言讨论 本教程为了避免冗余,一些不必要的截图就省略了 本教程只讨论8bit的情形下的混合 未经许可,不可转…

3.7 Bootstrap 导航栏

文章目录 Bootstrap 导航栏响应式的导航栏导航栏中的表单导航栏中的按钮导航栏中的文本结合图标的导航链接组件对齐方式固定到顶部固定到底部静态的顶部反色的导航栏 Bootstrap 导航栏 导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点。导航栏在您的应用或…

详解GPT技术发展脉络

文章目录 前言关于本篇的分享内容大语言模型大模型语言模型 百花齐放TransformerAuto-RegressiveResnetLayer-NormMaskScaled Dot-Product AttentionMulti-Head AttenionSelf-AttentionPositional Encoding关于并行计算关于长程依赖Transformer演化 GPT SeriesGPT-1GPT-2GPT-3 …

STM32存储左右互搏 I2C总线读写EEPROM AD24C02

STM32存储左右互搏 I2C总线读写EEPROM AD24C02 在较低容量存储领域,EEPROM是常用的存储介质,不同容量的EEPROM的地址对应位数不同,在发送字节的格式上有所区别。EEPROM是非快速访问存储,因为EEPROM按页进行组织,在连续…

数据库查询速度上不去的查询和分析

主要原因 数据库查询速度上不去、阻塞是指在并发访问 MySQL 数据库时,某个事务占用了资源并且长时间不释放,导致其他事务无法执行或执行缓慢的情况。MySQL 阻塞可能会导致数据库性能下降,甚至出现死锁等问题,需要马上进行处理。在 MySQL中,线程阻塞可能是由于以下原因导致…

vite 启动项目 报错 spawnargs: [ ‘--service=0.12.15‘, ‘--ping‘ ]

当前项目使用的是 vue3-antd-admin 框架 vue3-antd-admin 框架 详细地址 我们运行项目的时候发现报以下错误,npm i 了也不行, node:events:504throw er; // Unhandled error event^Error: spawn C:\Users\DELL\Desktop\vue3-antd-admin-master\node_modules\esbu…

阿里国际、敦煌、速卖通、沃尔玛、TEMU做测评补单核心关键点,看完你就会了

现在不管是做国内电商还是跨境电商,测评补单一直都有人在做,也确确实实的给卖家们带来了突破,不管是订单,留评,权重等等都有很大的提升,可以说有电商的地方就有测评补单,这是刚需。但是就像前人…

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析

目录 一、结构体概述及定义 1、概念 2、定义方式 方式1:先定义结构体类型,再定义结构体变量 方式2:定义结构体类型的同时定义结构体变量 方式3:定义一次性结构体 二、结构体变量的初始化 1、一般初始化 2、清空结构体变量…

【正点原子STM32连载】 第五十六章 DSP测试实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第五…

欧姆龙cp11以太网设置

捷米特JM-ETH-CP转以太网模块控,用于欧姆龙 CP1L/ CP1E/ CP1H 系列 PLC 的以太网数据采集,非常方便构建生产管理系统。 支持 FINS/UDP、FINS/TCP 以太网协议通信,支持上位机软件(组态王、MCGS、力控、KepWare OPC 服务器等&#…

leetcode2373. 矩阵中的局部最大值

https://leetcode.cn/problems/largest-local-values-in-a-matrix/ 给你一个大小为 n x n 的整数矩阵 grid 。 生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal ,并满足: maxLocal[i][j] 等于 grid 中以 i 1 行和 j 1 列为中心的 3 x 3 矩阵中…

【Android】报错java.lang.reflect.InvocationTargetException解决办法

报错信息:java.lang.reflect.InvocationTargetException反射层调用方法失败 结果图 原因 InvocationTargetException异常由Method.invoke(obj, args…)方法抛出。(反射异常) 当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收!&…

Stable Diffusion如何生成高质量的图-prompt写法介绍

文章目录 Stable Diffusion使用尝试下效果prompt的编写技巧prompt 和 negative promptPrompt格式Prompt规则细节优化Guidance Scale 总结 Stable Diffusion Stable Diffusion是一个开源的图像生成AI系统,由Anthropic公司开发。它基于 Transformer模型架构,可以通过文字描述生成…

查询每年最新的数据

1.最近在工作中遇到了一个需求,要求查询出每个党组织每年最新的数据 2.使用的sql语句为: SELECTCREATED_TIME,party_org_id,id FROMbranch_book WHERECREATED_TIME IN ( SELECT MAX( CREATED_TIME ) AS CREATED_TIME FROM branch_book GROUP BY DATE_FORMAT( year, %Y ), pa…

移动云发布医疗行业白皮书,构建全民健康数字化枢纽

医疗卫生改革正在深入推进,全民健康信息化建设也在加速进行。医疗云作为医疗卫生数字化转型的基础性平台,正引起越来越多的关注和探讨。近日,由中国移动集团政企事业部牵头发起,移动云联合IDC中国重磅发布《建设医疗云平台&#x…

Threejs——十四、关于深度冲突、重叠、以及加载模型进度条效果实现(附完整代码)

深度冲突 两个模型重叠的模型,通过浏览器旋转预览,会发现模型旋转的时候会发生闪烁。 这种情况,主要是两个模型重合,电脑分不清谁在前谁在后,这种情况,可以理解为深度冲突Z-fighting。 function addBox()…