0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解析OpenVINO? + SSD 實時對象檢測

英特爾物聯(lián)網(wǎng) ? 來源:英特爾物聯(lián)網(wǎng) ? 作者:英特爾物聯(lián)網(wǎng) ? 2021-05-18 09:35 ? 次閱讀

前面我們了解OpenVINO 如何部署圖像分類網(wǎng)絡(luò)ResNet,本文我們將會學(xué)習(xí)OpenVINO 中對象檢測網(wǎng)絡(luò)的部署與推理應(yīng)用。說到對象檢測網(wǎng)絡(luò),我們首先需要理解兩個概念:對象檢測與對象檢測網(wǎng)絡(luò)。

SSD對象檢測模型

對象檢測是計算機視覺核心任務(wù)之一,也是最常見與應(yīng)用最廣泛的視覺場景。OpenVINO 已經(jīng)提供了以下通用場景下的對象檢測包括人臉檢測、行人檢測、物體檢測、車輛檢測、車牌檢測等,一個圖像對象檢測顯示示意圖如下:

圖-1(來自SSD論文)

相比圖像分類,對象檢測多了每個對象位置信息,所以簡單的認為對象檢測=圖像分類+Box位置信息。第一個深度學(xué)習(xí)相關(guān)的對象檢測網(wǎng)絡(luò)正是基于這樣思想的RCNN模型,但是它的缺點是無法實時,所以2015年底有人提出了一個實時對象檢測網(wǎng)絡(luò)Single Shot MultiBox Detector縮寫為SSD。它的模型結(jié)構(gòu)如下:

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

圖2(來自SSD論文)

圖2中SSD對象檢測網(wǎng)絡(luò)簡單說可以分為三個部分:

- 基礎(chǔ)網(wǎng)絡(luò)(backbone) 這里為VGG16

- 特征提取Neck,構(gòu)建多尺度特征

- 檢測頭 – 非最大抑制與輸出

OpenVINO 中模型庫自帶預(yù)訓(xùn)練的人臉檢測網(wǎng)絡(luò)有很多,分別針對不同的應(yīng)用場景與輸入分辨率。這里我們以face-detection-0202人臉檢測模型為例說明,它是一個MobileNetV2作為基礎(chǔ)網(wǎng)絡(luò)的SSD對象檢測模型,模型支持的輸入圖像大小與格式如下:

NCHW=1x3x384x384其中

N表示圖像數(shù)目,這里為1

C表示輸入圖像通道數(shù)目,這里彩色圖像為3

H表示圖像高度

W表示圖像寬度

期望的圖像通道順序:BGR

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

圖-3

模型推理計算得輸出格式為:

1x1xNx7其中

N表示檢測到的對象數(shù)目

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

Image_id 表示圖像編號,這個輸入的是一張圖像,base為0

Label 表示標簽,跟數(shù)據(jù)集的label_map文本文件相關(guān),根據(jù)標簽編號可以查找標簽文本名

Conf 表示對象的置信度,取值范圍在0~1之間,值越大表示置信程度越高

x_min, y_min, x_max, y_max 四個值對象位置信息,分別是左上角與有下角的坐標

該模型的相關(guān)性能參數(shù)如下:

圖-4

從上面我們可以知道模型來自Pytorch訓(xùn)練生成。

OpenVINO基于SSD模型實時人臉檢測

現(xiàn)在我們已經(jīng)了解SSD模型的基本網(wǎng)絡(luò)結(jié)構(gòu),OpenVINO 自帶SSD人臉檢測模型face-detection-0202的輸入與輸出相關(guān)格式與參數(shù)細節(jié)信息,這里我們就基于該模型使用OpenVINO 中的推理引擎模型實現(xiàn)一個實時人臉檢測應(yīng)用,根據(jù)之前的內(nèi)容,我們首先需要加載模型,相關(guān)代碼如下:

// 加載檢測模型

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

其中

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

model_bin表示face-detection-0202權(quán)重文件

然后設(shè)置模型的輸入與輸出相關(guān)的格式,代碼如下:

// 請求網(wǎng)絡(luò)輸入與輸出信息

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

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

// 設(shè)置輸入格式

for (auto &item : input_info) {

auto input_data = item.second;

input_data->setPrecision(Precision::U8);

input_data->setLayout(Layout::NCHW);

}

printf("get it ");

// 設(shè)置輸出格式

for (auto &item : output_info) {

auto output_data = item.second;

output_data->setPrecision(Precision::FP32);

}

加載可執(zhí)行網(wǎng)絡(luò),創(chuàng)建推理請求對象實例,代碼如下:

// 創(chuàng)建可執(zhí)行網(wǎng)絡(luò)對象

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

// 請求推斷圖

auto infer_request = executable_network.CreateInferRequest();

設(shè)置推理輸入圖像數(shù)據(jù),轉(zhuǎn)換為NCHW格式的blob數(shù)據(jù),代碼如下:

/** 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];

}

}

}

預(yù)測與解析輸出結(jié)果,代碼如下:

// 執(zhí)行預(yù)測

infer_request.Infer();

// 處理輸出結(jié)果

for (auto &item : output_info) {

auto output_name = item.first;

// 獲取輸出數(shù)據(jù)

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];

// 解析輸出結(jié)果

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);

最終顯示結(jié)果如下:

圖-5

總結(jié)

本文我們完成了OpenVINO 人臉檢測模型的推理調(diào)用演示,關(guān)鍵知識點在于模型的輸入與輸出格式,以及推理以后的模型輸出數(shù)據(jù)的解析方式。到這里大家希望借助OpenVINO 實現(xiàn)一個視頻版本的人臉檢測,沒關(guān)系,下一次我們將來完成這樣的事情……

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SSD
    SSD
    +關(guān)注

    關(guān)注

    20

    文章

    2790

    瀏覽量

    116643
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67760
  • 人臉檢測
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    16391
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5422

    瀏覽量

    120587
  • resnet
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    3143

原文標題:OpenVINO? + SSD 實時對象檢測

文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    使用OpenVINO C# API部署YOLO-World實現(xiàn)實時開放詞匯對象檢測

    的快速準確識別,并通過AR技術(shù)將虛擬元素與真實場景相結(jié)合,為用戶帶來沉浸式的交互體驗。在本文中,我們將結(jié)合OpenVINO C# API使用最新發(fā)布的OpenVINO 2024.0部署 YOLO-World實現(xiàn)實時開放詞匯
    的頭像 發(fā)表于 08-30 16:27 ?366次閱讀
    使用<b class='flag-5'>OpenVINO</b> C# API部署YOLO-World實現(xiàn)<b class='flag-5'>實時</b>開放詞匯<b class='flag-5'>對象</b><b class='flag-5'>檢測</b>

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習(xí)慣與推理方式。與OpenCV的Mat對象對接方式
    的頭像 發(fā)表于 07-26 09:20 ?429次閱讀

    OpenVINO C# API在intel平臺部署YOLOv10目標檢測模型

    的模型設(shè)計策略,從效率和精度兩個角度對YOLOs的各個組成部分進行了全面優(yōu)化,大大降低了計算開銷,增強了性能。在本文中,我們將結(jié)合OpenVINO C# API使用最新發(fā)布的OpenVINO 2024.1部署YOLOv10目標檢測
    的頭像 發(fā)表于 06-21 09:23 ?766次閱讀
    用<b class='flag-5'>OpenVINO</b> C# API在intel平臺部署YOLOv10目標<b class='flag-5'>檢測</b>模型

    OpenVINO? Java API應(yīng)用RT-DETR做目標檢測器實戰(zhàn)

    本文將從零開始詳細介紹環(huán)境搭建的完整步驟,我們基于英特爾開發(fā)套件AIxBoard為硬件基礎(chǔ)實現(xiàn)了Java在Ubuntu 22.04系統(tǒng)上成功使用OpenVINO? Java API,并且成功運行了RT-DETR實現(xiàn)實時端到端目標檢測
    的頭像 發(fā)表于 03-18 15:04 ?628次閱讀
    <b class='flag-5'>OpenVINO</b>? Java API應(yīng)用RT-DETR做目標<b class='flag-5'>檢測</b>器實戰(zhàn)

    OpenVINO添加對Paddle 2.5的支持

    我是飛槳黑客馬拉松第五期 OpenVINO 賽題獲獎?wù)摺獮?OpenVINO 添加了對 Paddle 2.5 的支持。在此記錄下來貢獻的過程,希望有更多的同學(xué)可以參與到 OpenVINO 的社區(qū)
    的頭像 發(fā)表于 01-19 09:20 ?523次閱讀

    基于OpenVINO?和AIxBoard的智能安檢盒子設(shè)計

    公共安全問題日益凸顯,傳統(tǒng)安檢手段面臨挑戰(zhàn)。為提高安檢效率和保障公共安全,基于 OpenVINO? 和 AIxBoard 的智能安檢盒子應(yīng)運而生。
    的頭像 發(fā)表于 01-18 17:31 ?715次閱讀
    基于<b class='flag-5'>OpenVINO</b>?和AIxBoard的智能安檢盒子設(shè)計

    YOLOv8實現(xiàn)旋轉(zhuǎn)對象檢測

    YOLOv8框架在在支持分類、對象檢測、實例分割、姿態(tài)評估的基礎(chǔ)上更近一步,現(xiàn)已經(jīng)支持旋轉(zhuǎn)對象檢測(OBB),基于DOTA數(shù)據(jù)集,支持航拍圖像的15個類別
    的頭像 發(fā)表于 01-11 10:43 ?1366次閱讀
    YOLOv8實現(xiàn)旋轉(zhuǎn)<b class='flag-5'>對象</b><b class='flag-5'>檢測</b>

    基于OpenVINO和AIxBoard的智能安檢盒子設(shè)計

    公共安全問題日益凸顯,傳統(tǒng)安檢手段面臨挑戰(zhàn)。為提高安檢效率和保障公共安全,基于 OpenVINO 和 AIxBoard 的智能安檢盒子應(yīng)運而生。利用深度學(xué)習(xí)模型和 X 光圖像處理技術(shù),該設(shè)備能夠實時識別危險物品并發(fā)出警報,為公共場所、機場等場景提供高效、準確的安檢解決方案
    的頭像 發(fā)表于 12-25 11:14 ?421次閱讀
    基于<b class='flag-5'>OpenVINO</b>和AIxBoard的智能安檢盒子設(shè)計

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

    OpenVINO Notebooks是Jupyter Notebook形式的OpenVINO范例程序大集合,方便開發(fā)者快速學(xué)習(xí)并掌握OpenVINO推理程序,并通過Copy&Paste方式將范例中的關(guān)鍵程序應(yīng)用到自己的AI軟件中
    的頭像 發(fā)表于 12-12 14:40 ?968次閱讀
    如何快速下載<b class='flag-5'>OpenVINO</b> Notebooks中的AI大模型

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

    當(dāng)今,深度學(xué)習(xí)技術(shù)在計算機視覺領(lǐng)域取得了巨大的突破,使得各種圖像處理任務(wù)變得更加智能化。其中,Semantic Segmentation(語義分割)是一項重要的任務(wù),它有助于計算機理解圖像中不同對象
    的頭像 發(fā)表于 11-17 09:53 ?730次閱讀
    如何使用<b class='flag-5'>OpenVINO</b> C++ API部署FastSAM模型

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

    RT-DETR 是在 DETR 模型基礎(chǔ)上進行改進的,一種基于 DETR 架構(gòu)的實時端到端檢測器,它通過使用一系列新的技術(shù)和算法,實現(xiàn)了更高效的訓(xùn)練和推理,在前文我們發(fā)表了《基于 OpenVINO
    的頭像 發(fā)表于 11-10 16:59 ?606次閱讀
    基于<b class='flag-5'>OpenVINO</b> C# API部署RT-DETR模型

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

    RT-DETR 是在 DETR 模型基礎(chǔ)上進行改進的,一種基于 DETR 架構(gòu)的實時端到端檢測器,它通過使用一系列新的技術(shù)和算法,實現(xiàn)了更高效的訓(xùn)練和推理,在前文我們發(fā)表了《基于 OpenVINO
    的頭像 發(fā)表于 11-03 14:30 ?638次閱讀
    基于<b class='flag-5'>OpenVINO</b> C++ API部署RT-DETR模型

    基于OpenVINO Python API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基礎(chǔ)上進行改進的,一種基于 DETR 架構(gòu)的實時端到端檢測器,它通過使用一系列新的技術(shù)和算法,實現(xiàn)了更高效的訓(xùn)練和推理,我們將在 Python、C++、C# 三個
    的頭像 發(fā)表于 10-20 11:15 ?778次閱讀
    基于<b class='flag-5'>OpenVINO</b> Python API部署RT-DETR模型

    OpenVINO? C# API詳解與演示

    OpenVINO C# API 支持 NuGet 程序包安裝方式,這與 OpenVINO C++ 庫的安裝過程相比,更加簡單。如果使用 Visual Studio 開發(fā) AI 項目,則可以通過 NuGet 程序包管理功能直接安裝即可
    的頭像 發(fā)表于 10-13 16:39 ?608次閱讀
    <b class='flag-5'>OpenVINO</b>?  C# API詳解與演示

    OpenVINO場景文字檢測與文字識別教程

    OpenVINO是英特爾推出的深度學(xué)習(xí)模型部署框架,當(dāng)前最新版本是OpenVINO2023版本。OpenVINO2023自帶各種常見視覺任務(wù)支持的預(yù)訓(xùn)練模型庫Model Zoo,其中支持場景文字
    的頭像 發(fā)表于 09-24 15:31 ?1296次閱讀
    <b class='flag-5'>OpenVINO</b>場景文字<b class='flag-5'>檢測</b>與文字識別教程