0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

解析OpenVINO™ + SSD 实时对象检测

英特尔物联网 来源:英特尔物联网 作者:英特尔物联网 2021-05-18 09:35 次阅读

前面我们了解OpenVINO 如何部署图像分类网络ResNet,本文我们将会学习OpenVINO 中对象检测网络的部署与推理应用。说到对象检测网络,我们首先需要理解两个概念:对象检测与对象检测网络。

SSD对象检测模型

对象检测是计算机视觉核心任务之一,也是最常见与应用最广泛的视觉场景。OpenVINO 已经提供了以下通用场景下的对象检测包括人脸检测、行人检测、物体检测、车辆检测、车牌检测等,一个图像对象检测显示示意图如下:

图-1(来自SSD论文)

相比图像分类,对象检测多了每个对象位置信息,所以简单的认为对象检测=图像分类+Box位置信息。第一个深度学习相关的对象检测网络正是基于这样思想的RCNN模型,但是它的缺点是无法实时,所以2015年底有人提出了一个实时对象检测网络Single Shot MultiBox Detector缩写为SSD。它的模型结构如下:

23b73396-b4ff-11eb-bf61-12bb97331649.png

图2(来自SSD论文)

图2中SSD对象检测网络简单说可以分为三个部分:

- 基础网络(backbone) 这里为VGG16

- 特征提取Neck,构建多尺度特征

- 检测头 – 非最大抑制与输出

OpenVINO 中模型库自带预训练的人脸检测网络有很多,分别针对不同的应用场景与输入分辨率。这里我们以face-detection-0202人脸检测模型为例说明,它是一个MobileNetV2作为基础网络的SSD对象检测模型,模型支持的输入图像大小与格式如下:

NCHW=1x3x384x384其中

N表示图像数目,这里为1

C表示输入图像通道数目,这里彩色图像为3

H表示图像高度

W表示图像宽度

期望的图像通道顺序:BGR

23f26fa6-b4ff-11eb-bf61-12bb97331649.png

图-3

模型推理计算得输出格式为:

1x1xNx7其中

N表示检测到的对象数目

7表示[image_id, label, conf, x_min, y_min, x_max, y_max]这七个值,其中

Image_id 表示图像编号,这个输入的是一张图像,base为0

Label 表示标签,跟数据集的label_map文本文件相关,根据标签编号可以查找标签文本名

Conf 表示对象的置信度,取值范围在0~1之间,值越大表示置信程度越高

x_min, y_min, x_max, y_max 四个值对象位置信息,分别是左上角与有下角的坐标

该模型的相关性能参数如下:

图-4

从上面我们可以知道模型来自Pytorch训练生成。

OpenVINO基于SSD模型实时人脸检测

现在我们已经了解SSD模型的基本网络结构,OpenVINO 自带SSD人脸检测模型face-detection-0202的输入与输出相关格式与参数细节信息,这里我们就基于该模型使用OpenVINO 中的推理引擎模型实现一个实时人脸检测应用,根据之前的内容,我们首先需要加载模型,相关代码如下:

// 加载检测模型

auto network = ie.ReadNetwork(model_xml, model_bin);

其中

model_xml表示face-detection-0202模型文件

model_bin表示face-detection-0202权重文件

然后设置模型的输入与输出相关的格式,代码如下:

// 请求网络输入与输出信息

InferenceEngine::InputsDataMap input_info(network.getInputsInfo());

InferenceEngine::OutputsDataMap output_info(network.getOutputsInfo());

// 设置输入格式

for (auto &item : input_info) {

auto input_data = item.second;

input_data->setPrecision(Precision::U8);

input_data->setLayout(Layout::NCHW);

}

printf("get it ");

// 设置输出格式

for (auto &item : output_info) {

auto output_data = item.second;

output_data->setPrecision(Precision::FP32);

}

加载可执行网络,创建推理请求对象实例,代码如下:

// 创建可执行网络对象

auto executable_network = ie.LoadNetwork(network, "CPU");

// 请求推断图

auto infer_request = executable_network.CreateInferRequest();

设置推理输入图像数据,转换为NCHW格式的blob数据,代码如下:

/** Getting input blob **/

auto input = infer_request.GetBlob(input_name);

size_t num_channels = input->getTensorDesc().getDims()[1];

size_t h = input->getTensorDesc().getDims()[2];

size_t w = input->getTensorDesc().getDims()[3];

size_t image_size = h*w;

Mat blob_image;

resize(src, blob_image, Size(w, h));

// NCHW

unsigned char* data = static_cast(input->buffer());

for (size_t row = 0; row < h; row++) {

for (size_t col = 0; col < w; col++) {

for (size_t ch = 0; ch < num_channels; ch++) {

data[image_size*ch + row*w + col] = blob_image.at(row, col)[ch];

}

}

}

预测与解析输出结果,代码如下:

// 执行预测

infer_request.Infer();

// 处理输出结果

for (auto &item : output_info) {

auto output_name = item.first;

// 获取输出数据

auto output = infer_request.GetBlob(output_name);

const float* detection = static_cast::value_type*>(output->buffer());

const SizeVector outputDims = output->getTensorDesc().getDims();

const int maxProposalCount = outputDims[2];

const int objectSize = outputDims[3];

// 解析输出结果

for (int curProposal = 0; curProposal < maxProposalCount; curProposal++) {

float label = detection[curProposal * objectSize + 1];

float confidence = detection[curProposal * objectSize + 2];

float xmin = detection[curProposal * objectSize + 3] * image_width;

float ymin = detection[curProposal * objectSize + 4] * image_height;

float xmax = detection[curProposal * objectSize + 5] * image_width;

float ymax = detection[curProposal * objectSize + 6] * image_height;

if (confidence > 0.5) {

printf("label id : %d ", static_cast(label));

Rect rect;

rect.x = static_cast(xmin);

rect.y = static_cast(ymin);

rect.width = static_cast(xmax - xmin);

rect.height = static_cast(ymax - ymin);

putText(src, "OpenVINO-2021R02", Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2, 8);

rectangle(src, rect, Scalar(0, 255, 255), 2, 8, 0);

}

std::cout << std::endl;

}

}

imshow("OpenVINO+SSD人脸检测", src);

最终显示结果如下:

图-5

总结

本文我们完成了OpenVINO 人脸检测模型的推理调用演示,关键知识点在于模型的输入与输出格式,以及推理以后的模型输出数据的解析方式。到这里大家希望借助OpenVINO 实现一个视频版本的人脸检测,没关系,下一次我们将来完成这样的事情……

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SSD
    SSD
    +关注

    关注

    20

    文章

    2828

    浏览量

    117063
  • 代码
    +关注

    关注

    30

    文章

    4708

    浏览量

    68176
  • 人脸检测
    +关注

    关注

    0

    文章

    79

    浏览量

    16435
  • 深度学习
    +关注

    关注

    73

    文章

    5456

    浏览量

    120853
  • resnet
    +关注

    关注

    0

    文章

    12

    浏览量

    3154

原文标题:OpenVINO™ + SSD 实时对象检测

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用OpenVINO C# API部署YOLO-World实现实时开放词汇对象检测

    的快速准确识别,并通过AR技术将虚拟元素与真实场景相结合,为用户带来沉浸式的交互体验。在本文中,我们将结合OpenVINO C# API使用最新发布的OpenVINO 2024.0部署 YOLO-World实现实时开放词汇
    的头像 发表于 08-30 16:27 506次阅读
    使用<b class='flag-5'>OpenVINO</b> C# API部署YOLO-World实现<b class='flag-5'>实时</b>开放词汇<b class='flag-5'>对象</b><b class='flag-5'>检测</b>

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都觉得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的优化与整理,已经是非常贴近开发的使用习惯与推理方式。与OpenCV的Mat对象对接方式
    的头像 发表于 07-26 09:20 690次阅读

    OpenVINO C# API在intel平台部署YOLOv10目标检测模型

    的模型设计策略,从效率和精度两个角度对YOLOs的各个组成部分进行了全面优化,大大降低了计算开销,增强了性能。在本文中,我们将结合OpenVINO C# API使用最新发布的OpenVINO 2024.1部署YOLOv10目标检测
    的头像 发表于 06-21 09:23 891次阅读
    用<b class='flag-5'>OpenVINO</b> C# API在intel平台部署YOLOv10目标<b class='flag-5'>检测</b>模型

    OpenVINO™ Java API应用RT-DETR做目标检测器实战

    本文将从零开始详细介绍环境搭建的完整步骤,我们基于英特尔开发套件AIxBoard为硬件基础实现了Java在Ubuntu 22.04系统上成功使用OpenVINO™ Java API,并且成功运行了RT-DETR实现实时端到端目标检测
    的头像 发表于 03-18 15:04 719次阅读
    <b class='flag-5'>OpenVINO</b>™ Java API应用RT-DETR做目标<b class='flag-5'>检测</b>器实战

    OpenCV4.8 C++实现YOLOv8 OBB旋转对象检测

    YOLOv8框架在在支持分类、对象检测、实例分割、姿态评估的基础上更近一步,现已经支持旋转对象检测(OBB),基于DOTA数据集,支持航拍图像的15个类别
    的头像 发表于 02-22 10:15 1355次阅读
    OpenCV4.8 C++实现YOLOv8 OBB旋转<b class='flag-5'>对象</b><b class='flag-5'>检测</b>

    OpenVINO添加对Paddle 2.5的支持

    我是飞桨黑客马拉松第五期 OpenVINO 赛题获奖者——为 OpenVINO 添加了对 Paddle 2.5 的支持。在此记录下来贡献的过程,希望有更多的同学可以参与到 OpenVINO 的社区
    的头像 发表于 01-19 09:20 592次阅读

    基于OpenVINO™和AIxBoard的智能安检盒子设计

    公共安全问题日益凸显,传统安检手段面临挑战。为提高安检效率和保障公共安全,基于 OpenVINO™ 和 AIxBoard 的智能安检盒子应运而生。
    的头像 发表于 01-18 17:31 768次阅读
    基于<b class='flag-5'>OpenVINO</b>™和AIxBoard的智能安检盒子设计

    YOLOv8实现旋转对象检测

    YOLOv8框架在在支持分类、对象检测、实例分割、姿态评估的基础上更近一步,现已经支持旋转对象检测(OBB),基于DOTA数据集,支持航拍图像的15个类别
    的头像 发表于 01-11 10:43 1587次阅读
    YOLOv8实现旋转<b class='flag-5'>对象</b><b class='flag-5'>检测</b>

    基于OpenVINO和AIxBoard的智能安检盒子设计

    公共安全问题日益凸显,传统安检手段面临挑战。为提高安检效率和保障公共安全,基于 OpenVINO 和 AIxBoard 的智能安检盒子应运而生。利用深度学习模型和 X 光图像处理技术,该设备能够实时识别危险物品并发出警报,为公共场所、机场等场景提供高效、准确的安检解决方案
    的头像 发表于 12-25 11:14 473次阅读
    基于<b class='flag-5'>OpenVINO</b>和AIxBoard的智能安检盒子设计

    如何快速下载OpenVINO Notebooks中的AI大模型

    OpenVINO Notebooks是Jupyter Notebook形式的OpenVINO范例程序大集合,方便开发者快速学习并掌握OpenVINO推理程序,并通过Copy&Paste方式将范例中的关键程序应用到自己的AI软件中
    的头像 发表于 12-12 14:40 1041次阅读
    如何快速下载<b class='flag-5'>OpenVINO</b> Notebooks中的AI大模型

    NNCF压缩与量化YOLOv8模型与OpenVINO部署测试

    OpenVINO2023版本衍生出了一个新支持工具包NNCF(Neural Network Compression Framework – 神经网络压缩框架),通过对OpenVINO IR格式模型的压缩与量化更好的提升模型在OpenVI
    的头像 发表于 11-20 10:46 1411次阅读
    NNCF压缩与量化YOLOv8模型与<b class='flag-5'>OpenVINO</b>部署测试

    如何使用OpenVINO C++ API部署FastSAM模型

    当今,深度学习技术在计算机视觉领域取得了巨大的突破,使得各种图像处理任务变得更加智能化。其中,Semantic Segmentation(语义分割)是一项重要的任务,它有助于计算机理解图像中不同对象
    的头像 发表于 11-17 09:53 818次阅读
    如何使用<b class='flag-5'>OpenVINO</b> C++ API部署FastSAM模型

    基于OpenVINO C# API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基础上进行改进的,一种基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,在前文我们发表了《基于 OpenVINO
    的头像 发表于 11-10 16:59 685次阅读
    基于<b class='flag-5'>OpenVINO</b> C# API部署RT-DETR模型

    基于OpenVINO+OpenCV的OCR处理流程化实现

    预处理主要是基于OpenCV、场景文字检测与识别基于OpenVINO框架 + PaddleOCR模型完成。直接按图索骥即可得到最终结果。 OpenCV预处理主要是完成偏斜矫正、背景矫正等操作,然后使用场景文字检测模型+OCR识别
    的头像 发表于 11-07 11:21 687次阅读
    基于<b class='flag-5'>OpenVINO</b>+OpenCV的OCR处理流程化实现

    基于OpenVINO C++ API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基础上进行改进的,一种基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,在前文我们发表了《基于 OpenVINO
    的头像 发表于 11-03 14:30 737次阅读
    基于<b class='flag-5'>OpenVINO</b> C++ API部署RT-DETR模型