openvino系列教程之人脸检测 mobilenetv2

news2024/11/20 6:33:31

        OpenVINO(开放式视觉推理和神经网络优化)是英特尔推出的一款用于加速计算机视觉应用开发的软件。它基于英特尔的深度学习技术,提供了一套完整的工具链,包括模型优化器、运行时库等,帮助开发者快速实现高性能的计算机视觉算法。OpenVINO支持多种硬件平台,如CPU、GPU、FPGA等,可以广泛应用于智能安防、工业检测、无人驾驶等领域。通过使用OpenVINO,开发者可以轻松地将深度学习模型部署到各种设备上,实现高效、低功耗的计算机视觉应用。

一、python环境安装

conda create -n vino2021 python=3.8 -y
conda activate vino2021
pip install opencv-python==4.5.4.58
pip install openvino==2021.4.1  # 建议最好使用这个版本

为什么这里建议openvino使用版本和本文一致?因为openvino向上向下兼容性很一般。

二、openvino推理流程简介

一般地,模型推理包含三大步骤:

  • 图像预处理
  • 推理
  • 后处理

        openvino也遵从上面步骤流程。其中,图像预处理可能包含:图像resize、将BGR转成RGB次序、将CHW转成HWC等等。这些工作,使用opencv可以快速实现。例如:

import cv2
src = cv2.imread("d:/Data/15.jpg")
src_ = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) # 将BGR转成RGB次序 
image = cv2.resize(src, (256, 256)) # 图像resize
image = image.transpose(2, 0, 1) # 将CHW转成HWC

        至于模型推理,其实不管是openvino,还是tensorrt,或者是onnxruntime等,都有推理引擎组件,使用的时候是需要使用模型将推理引擎初始化就OK;然后往引擎里面塞入图像数据就行了。这里举个例子:

# 读取模型
model_xml = "data/face-detection-0200.xml"
model_bin = "data/face-detection-0200.bin"
net = ie.read_network(model=model_xml)
# 加载模型到CPU中
exec_net = ie.load_network(network=net, device_name="CPU")
# 推理(这里相当于将image塞进推理引擎了)
res = exec_net.infer(inputs={input_blob: [image]})

        最后,推理引擎会输出特征图,也就是推理结果,我们写一个后处理代码就行了。例如:对于目标检测,我需要手写NMS;对于分割,我们需要手写上采样。

res = res[output_blob]
dets = res.reshape(-1, 7)
sh, sw, _ = src.shape
for det in dets:
    conf = det[2]
    if conf > 0.5:
        # calss_id...
        xmin = int(det[3] * sw)
        ymin = int(det[4] * sh)
        xmax = int(det[5] * sw)
        ymax = int(det[6] * sh)

        本文openvino的使用套路其实很固定,上文说道模型推理一般是三大步骤,这里openvino推理给细化成8个步骤。openvino一般完整代码步骤如下:

  • Step1:初始化推理引擎
  • Step2:从xml文件读取模型网络,从bin文件读取模型参数;或者直接从onnx文件同时读取模               型和参数
  • Step3:配置网络的输出、输入(图像预处理)
  • Step4:加载模型到设备
  • Step5:创建推理请求
  • Step6:准备输入
  • Step7:推理
  • Step8:后处理

        上述8个步骤,看似有点啰嗦,其实一般其中几个步骤就够了,以下给一个例子,可以参考下(看看就行不必执行):

import cv2
from openvino.inference_engine import IECore
import numpy as np
from timeit import default_timer as timer

# ---------------------------Step 1. Initialize inference engine core--------------------------------------------------
ie = IECore()
device = "CPU"
# ---------------------------Step 2. Read a model in OpenVINO Intermediate Representation or ONNX format---------------
model_xml = "data/face-detection-0200.xml"
model_bin = "data/face-detection-0200.bin"
net = ie.read_network(model=model_xml)
# ---------------------------Step 3. Configure input & output----------------------------------------------------------
input_blob = next(iter(net.input_info))
output_blob = next(iter(net.outputs))
n, c, h, w = net.inputs[input_blob].shape
print("outputs's shape = ", net.outputs[output_blob].shape)

src = cv2.imread("d:/Data/6.jpg")
#src_ = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
image = cv2.resize(src, (w, h))
image = image.transpose(2, 0, 1)
# ---------------------------Step 4. Loading model to the device-------------------------------------------------------
exec_net = ie.load_network(network=net, device_name=device)
# ---------------------------Step 5. Create infer request--------------------------------------------------------------
# ---------------------------Step 6. Prepare input---------------------------------------------------------------------
# ---------------------------Step 7. Do inference----------------------------------------------------------------------
tic = timer()
res = exec_net.infer(inputs={input_blob: [image]})
toc = timer()
print("the cost time is(ms): ", 1000*(toc - tic))
print("the latance is:", exec_net.requests[0].latency)
# ---------------------------Step 8. Process output--------------------------------------------------------------------

以上步骤范式比较固定,部署别的模型,你会发现很多代码都一样,复制粘贴而已,需要改的无非就是模型的输入和后处理。

三、人脸检测网络

        这个人脸检测模型backbone是mobilev2,人脸检测头是SSD目标检测的head,在此模型的训练期间,训练图像的大小调整为 256x256。上一节我们知道,模型部署只需要三步:图像预处理、推理、后处理;由于推理openvino帮咱们干了,咱们只需要写好模型输入和输出就行了。

输入信息

        在模型文件中,输入的名称为: `input`, 输入图像的shape为: `1, 3, 256, 256` 输入图像次序为 `B, C, H, W`, 其中:

  • `B` - batch size
  • `C` - 图像通道数,一般为3
  • `H` - image height
  • `W` - image width

输入图像的次序为: `BGR`.

输出信息

        网络输出特征图的shape为: `1, 1, 200, 7`,其中200表示候选目标数量.每一个候选目标是一个7维的向量,存储顺序为: [`image_id`, `label`, `conf`, `x_min`, `y_min`, `x_max`, `y_max`], 其中:

  • `image_id` - 图像在这个batch中的ID,不用管,因为本文是单batch推理
  •  `label` - 预测的类别ID(0 - face)
  •  `conf` - 置信度
  •  (`x_min`, `y_min`) - 矩形bbox左上角的点坐标
  •  (`x_max`, `y_max`) - 矩形bbox右下角的点坐标

四、源码测试

下面代码中,需要三个文件:输入图像,模型xml、bin文件,下载方法在文末。

import cv2
from openvino.inference_engine import IECore
import numpy as np
from timeit import default_timer as timer

# ---------------------------Step 1. Initialize inference engine core--------------------------------------------------
ie = IECore()
device = "CPU"
# ---------------------------Step 2. Read a model in OpenVINO Intermediate Representation or ONNX format---------------
model_xml = "data/face-detection-0200.xml"
model_bin = "data/face-detection-0200.bin"
net = ie.read_network(model=model_xml)
# ---------------------------Step 3. Configure input & output----------------------------------------------------------
input_blob = next(iter(net.input_info))
output_blob = next(iter(net.outputs))
n, c, h, w = net.inputs[input_blob].shape
print("outputs's shape = ", net.outputs[output_blob].shape)

src = cv2.imread("d:/Data/15.jpg")
#src_ = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
image = cv2.resize(src, (w, h))
image = image.transpose(2, 0, 1)
# ---------------------------Step 4. Loading model to the device-------------------------------------------------------
exec_net = ie.load_network(network=net, device_name=device)
# ---------------------------Step 5. Create infer request--------------------------------------------------------------
# ---------------------------Step 6. Prepare input---------------------------------------------------------------------
# ---------------------------Step 7. Do inference----------------------------------------------------------------------
tic = timer()
res = exec_net.infer(inputs={input_blob: [image]})
toc = timer()
print("the cost time is(ms): ", 1000*(toc - tic))
print("the latance is:", exec_net.requests[0].latency)
# ---------------------------Step 8. Process output--------------------------------------------------------------------
res = res[output_blob]
dets = res.reshape(-1, 7)
sh, sw, _ = src.shape
for det in dets:
    conf = det[2]
    if conf > 0.5:
        # calss_id...
        xmin = int(det[3] * sw)
        ymin = int(det[4] * sh)
        xmax = int(det[5] * sw)
        ymax = int(det[6] * sh)
        cv2.putText(src, str(round(conf, 3)), (xmin, ymin), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 1, 7)
        cv2.rectangle(src, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)
cv2.imshow("src", src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如图:

模型数据+图片:链接:https://pan.baidu.com/s/1srtz0WUr9liwyTb55hZv_w?pwd=1234 
提取码:1234

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

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

相关文章

火爆,接口测试+接口自动化测试整理总结,你不知道的都在这了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、接口自动化测试…

软件外包开发文档

编写软件开发文档是项目开发过程中的关键步骤,它有助于组织、记录和分享项目的信息和进展。以下是编写软件开发文档的一般步骤和建议,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.文档…

vue2 集成 Onlyoffice

缘起于进行了一次在线 Office 解决方案的调研,对比了 Office365、可道云、WPS Office、PageOffice 等厂商,最终敲定了使用 Onlyoffice,故整理了一份 Onlyoffice 从零开始系列教程,这是第一篇。 一、Onlyoffice 是什么&#xff1f…

虹科 | 解决方案 | 机械免拆压力测试方案

对于发动机的气门卡滞或气门开闭时刻错误、活塞环磨损、喷油嘴泄漏/堵塞等故障,往往需要解体发动机或拆卸部件才能发现;而对于某些轻微的故障,即使解体了发动机后也经常难于肉眼判别 虹科Pico提供的WPS500压力测试方案,可以动态测…

架构师日记-聊聊开发必掌握的那些实践技能 | 京东云技术团队

一 引言 尽管软件开发一直致力于追求高效、可读性强、易于维护的特性,但这些特性却像是一个不可能三角,相互交织,此消彼长。就像底层语言(如汇编和C语言)能够保持高效的运行性能,但在可读性和维护性方面却…

会议OA小程序【首页布局】

目录 一. Flex布局介绍 1.1 什么是Flex布局 1.2 基本概念 1.3 Flex属性 二. 会议OA首页轮播图的实现 配置 Mock工具 swiper 效果展示 三. 会议OA首页会议信息布局 index.js index.wxml index.wxss 首页整体效果展示 一. Flex布局介绍 布局的传统解决方案&#x…

LeetCode之买卖股票的最佳时机系列共6道题

文章目录 0 引言1 121. 买卖股票的最佳时机1. 1 暴力法1.2 一次遍历1.3 动态规划 2 122. 买卖股票的最佳时机 II2.1 一次遍历2.2 动态规划 3 123. 买卖股票的最佳时机 III3.1 动态规划 4 188. 买卖股票的最佳时机 IV4.1 动态规划 5 309. 买卖股票的最佳时机含冷冻期5.1 动态规划…

每日温度00

题目链接 每日温度 题目描述 注意点 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替1 < temperatures.length < 100000 解答思路 使用单调栈解决本题&#xff0c;思路为&#xff1a…

IEEE754 FP16

一. 实数的表达方法 1.定点数表示法 <整数部分>.<小数部分> 例. 666.66 2.浮点数表示法 科学计数法&#xff1a;有效数字基数&#xff08;base&#xff09;指数&#xff08;exponent&#xff09;正负符号位 规范化表示&#xff1a;d.ddd*β^e&#xff08;0&…

智能井盖的用处有哪些?好用在什么地方?

智能井盖是一种基于物联网技术的井盖系统&#xff0c;通过集成传感器、通信设备和数据处理功能&#xff0c;实现对井盖的实时监测、远程管理和智能化控制。WITBEE万宾的智能井盖传感器EN100-C2&#xff0c;只要在城市需要的井盖上面安装即可使用&#xff0c;一体式结构&#xf…

Python pip 替换国内镜像源

pip它还有一个非常好的特点&#xff0c;当你安装一个库的时候&#xff0c;它会自动帮你安装所有这个库的依赖库。完全一键式操作。非常方便。但是由于pipy网站是国外网站&#xff0c;很容易会被墙&#xff0c;导致经常下载速度非常慢&#xff0c;经常超时。 解决办法&#xff…

BSA研究方案——如何从容不迫的进行性状定位

&#xff08;一&#xff09;BSA基本概念 BSA即集群分离分析法&#xff0c;是Bulked-Segregant Analysis的首字母缩写。具体是利用差异目标性状的两个亲本构建家系&#xff0c;在子代分离群体中选取目标性状个体构建DNA混合池&#xff0c;采用高通量测序技术对混池DNA进行建库测…

在VScode中启动的前端项目关于 Local 和 Network 两个地址的区别

首先这两个地址在你的电脑上都是可以访问的 具体区别&#xff1a; localhost 是供当前电脑访问的地址&#xff0c;仅供你自己访问&#xff0c;其他人通过localhost 是访问不到你跑的项目的。你把 localhost 换成IP地址 127.0.0.1 也是相同的效果&#xff0c;因为 127.0.0.1 也…

uniapp vue3.0+TS 上传单张或多张图片,并且能删除和预览。

一、uniapp vue3.0TS 上传单张或多张图片&#xff0c;并且能删除和预览。 效果&#xff1a;人菜话不多 先上效果&#xff1a; 二、代码 1.HTML 上传图片相关代码 代码如下&#xff1a; <template><view class"images_box"><view class"img…

初始web项目tomcat部署报错404

问题 简单地创建了一个web项目&#xff0c;结果一运行就404咧&#xff0c;真滴烦。。。接下来的项目也没法继续了 问题原因&#xff1a;缺少文件 其实造成这样问题的原因有不少&#xff0c;但在这里我是踩了一个坑。在出问题之前&#xff0c;我运行的其他项目都是可以跑的&…

antdv 锚点踩坑

目录 1.锚点无滚动效果 2. 进入页面跳转到指定锚点 1.锚点无滚动效果 背景&#xff1a;使用antd的锚点时&#xff0c;按照官方文档的用法配置之后发现锚点组件的锚点Title位置没办法随着我的页面滚动而变化&#xff0c;但是点击Title跳转具体锚定位置的功能却是没有问题的 解…

使用 Elasticsearch 作为向量数据库:深入研究 dense_vector 和 script_score

Elasticsearch 是一个非常强大且灵活的搜索和分析引擎。 虽然其主要用例围绕全文搜索&#xff0c;但它的用途广泛&#xff0c;足以用于各种其他功能。 其中一项引起许多开发人员和数据科学家关注的功能是使用 Elasticsearch 作为向量数据库。 随着 dense_vector 数据类型的出现…

排名评估指标综合指南

一、介绍 右排序是机器学习中的一个问题&#xff0c;其目标是以最合适的方式对最终用户的文档列表进行排序&#xff0c;因此最相关的文档出现在顶部。排名出现在数据科学的多个领域中&#xff0c;从推荐系统开始&#xff0c;算法建议一组要购买的商品&#xff0c;最后到 NLP 搜…

STM32F4X TFTLCD ST7735S使用

STM32F4X TFTLCD ST7735S使用 TFTLCD简介TFTLCD使用TFTLCD特点TFTLCD的概念TFTLCD色彩空间三原色RGB颜色RGB565RGB666RGB888 ST7735S驱动芯片ST7735S引脚定义ST7735S 4线SPI模式ST7735S显示原理ST7735S分辨率ST7735S显存结构ST7735S像素点扫描模式MCU操作ST7735S显存方法 TFTLC…

解决appium或selenium使用时driver.find_element_by_xpath中间有删除线问题

一、问题描述 Darren洋在公司电脑搭建完成appium后准备运行appium2.0版本执行脚本时发现执行脚本中的driver.find_element_by_xpath中间有删除线&#xff0c;说明较高版本的appium及selenium中该方法已被弃用。 二、解决办法 该问题解决办法为将driver.find_element_by_xpath()…