【Notebook系列第十三期】基于多模型推理任务的车辆特征识别

news2024/11/23 19:04:00

在之前的课程中,我们分享的推理任务大部分都只由一个模型构成,但在真实的业务场景下,往往需要我们将多个模型放在一起去运行,才能获取到这个任务的最终预期结果。

因此,本次分享将通过一个简单的示例演示如何使用 OpenVINO™ 完成多模型串行的推理任务部署,看如何通过一个 Notebook 完成从车辆检测到车辆特征识别的具体任务的落地。

01 前期操作

打开 Jupyter Notebook,来到编号为218的任务中,可以看到这边有一张流程图,这张流程图明确说明了本次任务的开发流程。

首先,我们会有一张输入图片被送到前处理模块中,前处理模块会将原始图片的格式转化成后续模型所要求的输入格式,经过 resize 等前处理操作以后,图片会被送到后面的目标检测模型中,从而提取出该图片中每一辆车辆的位置信息。我们会通过位置信息进一步对原始画面进行截取,截取出车辆的特写图,再将这些特写图送到后续的识别模型中,识别出每一辆车所对应的具体特征,比如说它的颜色、它的车辆种类等。

之所以没有通过整张图片被送入到识别模型的形式去检测车辆特征,是因为如果我们将整张图片送到识别模型进行识别的话,如果这张图片中包含了很多辆车,此时会产生大量的误识别。

除此以外,我们也可以通过截取的方式,截取到一张满屏都是车辆的单张车辆特写图,进一步为我们后期模型去放大它的车辆特征表示,以提高它后面识别的精确性。

本次任务会用到 Open Model Zoo 中的车辆识别模型和一个检测模型。

检测模型

我们来看一下车辆检测模型,车辆检测模型其实是在原始画面中去找车辆的具体位置。它是一张标准的 bgr 图片,输出是由4个维度所构成的,前2个维度可以忽略不计,后面第3个维度200是指该模型对于单张图片它所能处理的被检测目标的上限,也就是我们最多可以检出200个目标。第4个维度的7是由图片的id、label信息、置信度,以及车辆在图片中的具体位置信息等所构成的。

识别模型

再看一下识别模型,这个识别模型主要是通过分类算法来检测出车的具体类别。它的输入同样是一张 bgr 通道的图片,输出有两个部分构成,一个是对于颜色类别的判断,一个是对于类型类别的判断。

02 回归代码

在这个输出示例中,我们会对画面中的每一辆车进行画框,然后标定它的分类结果。

Step 1:载入依赖库,并下载预训练模型

需要载入相应的依赖库,再通过 OpenVINO™ 的 Open Model Zoo 自带的模型下载工具下载我们的预训练模型。

Step 2:定义模型的初始化模块

我们需要定义模型的初始化模块。由于本次用到的都是来自 Open Model Zoo 中标准IR格式的模型,所以我们可以通过一个统一的模块来对这两个模型进行初始化,并且返回模型编译好的对象,我们也会通过 input_keys 和 output_keys 的值去找到输入和输出的相关的信息。

Step 3:获取模型对于输入图像的尺寸要求

除了对模型进行初始化以外,还要进一步的获取这两个模型对于输入图像的尺寸上要求,比如检测模型的输入高度、输入宽度,以及识别模型输入的高度和识别模型输入的宽度。

Step 4:定义画图功能

此外,我们还需要定义一个画图的功能,用来对最终结果在原始图片上进行可视化呈现。

Step 5:读取、下载并处理图片

接下来,我们需要去读取这样一张图片,从链接中下载图片,然后送到前处理模块中,对其进行通道转化和 resize 等等一些前处理操作。

完成前处理操作以后,车辆的图片就被展示出来了。肉眼可以看到这个图里是有一辆灰色的轿车,稍后我们看一下模型最终识别的效果是否准确。

Step 6:进一步完成推理输出

接着通过推理任务进一步完成对推理的输出。这是一个检测模型,通过我们刚才定义的输入图像,导入进来以后,并通过 output_keys 来获取它所对应的输出。

Step 7:过滤无效对象

由于在 Open Model Zoo 的示例中,原始输出的前两个维度都是1,我们可以通过 squeeze 也就是降维的方法将前两个维度将其过滤。此外,由于我们的原始模型输出包含了200个对象,然而在真实画面中其实并没有200个对象,所以为了进一步缓解后期任务中去遍历这200个对象所带来的算力上的压力,我们需要采取措施对其进行二次过滤。

换而言之我们会将一些无效的 box 过滤掉,只是我们通过这种方式来判断 box的值是不是为0,如果是0的话,我们会把它进行一个筛选,最终我们会提取出其中两个有效的对象。其实这两个对象并不能代表这张图像中只有两个车辆目标,所以我们还要对它进行进一步的后处理操作。

Step 8:进行后处理操作

我们这边会定义一个 crop_images 的方法,用来将我们刚才所判断到的检测到的车辆位置信息在原始的画面中进行截取,此时我们需要通过置信度的方法,将一些置信度过低的车辆的目标对它进行过滤,最终将我们所检测到的车辆的具体的4个点的位置信息统统绑定在1个列表中。

Step 9:运行并提前相关信息

运行一下,然后我们可以找到这个列表中的第一个值,提取它所对应的4个点的位置信息,并在原始的画面中进行截取。

03 运行效果

我们可以看一下运行的效果。

将图片的具体特征进行识别

很明显这张图中只有一辆车,所以我们截取的第一个位置信息就是这辆车所对应的这张特写图,然后我们将这个特写图送到后面的识别网络中,对它的具体特征进行识别。因为识别网络是支持色彩和类别识别的,所以需要去定义色彩的分类范围,首先是不同的颜色,还有不同的车辆类别,然后我们进一步去匹配识别模型它的前处理操作。

因为识别模型会有两个输出结果,所以我们会通过这种方式分别去获取这两个分类结果所对应的输出,编号1就是色彩空间上的输出。

大家也不难发现,输出里后面两个维度的1其实也是无效值,所以我们也需要对其进行降维的操作,同样是通过 squeeze 方式对它任意降维,那么同样的方法我们也可以获取车辆类别的一个输出的结果。

此时,原始输出其实是由一串置信度所构成的,每一个值分别对应了不同类别所对应的置信度的大小。我们通过 argmax 方法可以将置信度最大的值所对应的编号给它求出来,这个时候才是我们最终想获取的结果信息。

运行效果:可视化呈现

可以看到,此时我们已经检测出这个车的颜色是 gray,它的类别是 car。为了进一步在我们的原始图像做一个可视化的展示,我们还需要将刚才输出的这个标签放到我们画面中。方法比较简单,大家可以简单的了解一下这个代码。

可以看到,我们首先在画面中画了一个框,然后将 gray 和 car 的标签信息放在框上。

本次课程分享到这里就结束啦,有疑惑的同学欢迎随时私信Nono哦!

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

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

相关文章

12月13日(第11天)

腾讯云上通过面板开放端口,不起作用,解决办法:手动在服务器上开放,参考文章地址:在腾讯云控制台下配置防火墙端口无效 直接关闭防火墙是最简单的,systemctl stop firewalld,然后再再腾讯云上打开…

解决端口被占用的方法(查看端口和关闭端口)

目录 前言必读 一.简介 二、解决办法 1.查看该端口是否被占用 2.关闭占用该端口的进程 前言必读 读者手册(必读)_云边的快乐猫的博客-CSDN博客 一.简介 在使用各种端口时候经常会出现端口被占用导致代码程序无法执行或者执行错误。一般都是由于该端…

DataGear 4.3.0 发布,数据可视化分析平台

DataGear 4.3.0 发布,增强图表和看板功能,具体更新内容如下: 新增:看板模板新增dg-dashboard-auto-render属性,用于控制看板是否自动渲染;新增:看板模版新增dg-dashboard-code属性,…

Spring Batch 批处理-作业参数设置与获取

引言 书接上篇Spring Batch批处理-作业Job简介,上篇带小伙伴们了解色作业Job对象,那这篇就看一下作业参数是啥一回事,同时要怎么设置参数并获取参数的。 JobParameters 前面提到,作业的启动条件是作业名称 识别参数&#xff0…

MQ消息中间件

MQ消息中间件1、应用场景1、流量削峰2、应用解耦3、异步处理2、MQ分类1、ActiveMQ2、kafka3、RocketMQ4、RabbitMQ3、RabbitMQ详解3.1、核心概念3.2 RabbitMQ基本知识点3.3消息发布确认3.4 交换机1、应用场景 1、流量削峰 将访问的大流量通过消息队列做缓冲,我们可…

二叉树-二叉树的基础遍历(3)

二叉树的遍历的三种方式 1.前序遍历; 先访问根结点,然后再访问左子树,最后访问右子树 2.中序遍历; 先访问左子树,中间访问根节点,最后访问右子树 3.后序遍历; 先访问左子树,再访问右…

PicoRV32 笔记 05

接口信号 PicoRV32 提供一个本地存储器接口,Native Memory Interface。 本地存储器接口采用 valid-ready握手信号。这种机制在axi总线中使用相同,能够实现流控, 和axi总线不同点,PicoRV32本地接口使用一组valid-ready信号&…

什么是SWDM4和100G QSFP28 SWDM4光模块?

随着OM5多模光纤(MMF)的推广和40G或100G数据中心传输网络的大规模部署,SWDM技术逐渐进入人们的视野并开始得到应用。那么,什么是SWDM4呢?什么是100G SWDM4光模块?它们的优势是什么?跟着易天光通信ETU-LINK看下面的文字…

十、原型、原型链、闭包和立即执行函数、插件开发初始

十、原型、原型链、闭包和立即执行函数、插件开发初始 原型 什么是原型(prototype)? 无论何时,只要创建一个函数,就会按照特定的规则为这个函数创建一个prototype属性,指向原型对象。 function Car(){}…

Vue入门与指令

Vue入门 1.1、MVVM编程思想 MVVM:页面输入改变数据,数据改变影响页面数据展示与渲染。 M(model):普通的javascript数据对象。 V(view):前端展示页面。 VM(ViewModel&…

Jmeter初了解-接口并发测试

Jmeter初了解-接口并发测试 介绍 我们在开发的时候,经常会需要进行接口压力测试,确定接口运行的稳定情况 这里我们就使用java开发的测试工具Jmeter来进行测试。 Jmeter 官网地址 Apache JMeter™应用程序是开源软件,是一个 100% 纯 Jav…

Pytorch安装详细过程及遇到的问题解决

一、Aanconda的安装 可以参考笔者的这篇博客:Anaconda安装详细教程 二、准备工作 1、查看本机的python的版本(本机python解释器版本为3.8.5) 2、单击启动Anaconda Prompt创建新虚拟环境 3、在Anaconda Prompt依次执行以下命令,创建名字为pytorch的虚拟…

nn.Embedding使用

nn.Embedding是一种词嵌入的方式,跟one-hot相似但又不同,会生成低维稠密向量,但是初始是随机化的,需要根据模型训练时进行调节,若使用预训练词向量模型会比较好。 1. one-hot one-hot是给定每个单词一个索引&#xf…

概论_第4章__方差D(X)的定义和性质

一 定义 通常以此公式来计算: 就是说: 方差 X的平方再求期望 —— X的期望的平方 即 括号里面的平方的期望减去期望的平方, 怎样求期望点击:概论_第4章__期望的定义和性质 注意: 方差不可能为负数。 2. …

如何快速拥有自己的虚拟形象?

元宇宙(Metaverse),是人类运用数字技术构建的,由现实世界映射或超越现实世界,可与现实世界交互的虚拟世界,具备新型社会体系的数字生活空间。 可见元宇宙第一步是创建专属虚拟形象,但创建3D虚拟…

Android入门第45天-手工发送一个BroadCast

简介 上一篇我们讲了简单的动态BroadCast,今天我们通过手工来发送一条BroadCast进一步来了解BroadCast。 在上一篇里我们使用BroadCast监听网络状态,今天我们要完成的是自己发一条自自己的消息来触发BroadCast Receiver。 设计 为了让Receiver收听到…

蓝牙耳机无延迟哪款好?适合打游戏的无线蓝牙耳机

手机可以说是人手必备,随声得还有蓝牙耳机,随着3.5耳机孔得消失,蓝牙耳机可以说是现在得主流,无论哪个年龄段都可以佩戴蓝牙耳机,日常听歌、追剧,和朋友玩游戏佩戴蓝牙耳机,已经成为一种生活方式…

mybatis06:MyBatis的多表操作

目录 1.一对一关系 2.一对多查询 3.多对多查询 4例题演示 ​5.知识小结 1.一对一关系 2.一对多查询 3.多对多查询 4例题演示 前置准备 对应的依赖 <dependencies><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId&…

外汇交易:流行图表指标盘点

您所学到的关于交易的一切都像一种工具&#xff0c;已被添加到外汇交易者的工具箱中。当您在正确的时间使用正确的工具时&#xff0c;您的图表指标工具将为您提供更好的机会做出正确的交易决策。 布林带 布林带用来衡量市场的波动性。它们的作用类似于迷你支撑位和阻力位。 布…

MES系统为何与工厂数字化转型联系紧密

随着数字化技术的发展&#xff0c;MES系统的定义也是在不断的变化。但是&#xff0c;计划调度、质量管理、生产执行以及数据采集&#xff0c;一直都是MES的核心功能。 工厂数字化改造&#xff0c;对于制造业来说并不是一场革命。很多工厂在十年前就实现了车间设备的联网&#…