前面我們了解OpenVINO 如何部署圖像分類網絡ResNet,本文我們將會學習OpenVINO 中對象檢測網絡的部署與推理應用。說到對象檢測網絡,我們首先需要理解兩個概念:對象檢測與對象檢測網絡。
SSD對象檢測模型
對象檢測是計算機視覺核心任務之一,也是最常見與應用最廣泛的視覺場景。OpenVINO 已經提供了以下通用場景下的對象檢測包括人臉檢測、行人檢測、物體檢測、車輛檢測、車牌檢測等,一個圖像對象檢測顯示示意圖如下:
圖-1(來自SSD論文)
相比圖像分類,對象檢測多了每個對象位置信息,所以簡單的認為對象檢測=圖像分類+Box位置信息。第一個深度學習相關的對象檢測網絡正是基于這樣思想的RCNN模型,但是它的缺點是無法實時,所以2015年底有人提出了一個實時對象檢測網絡Single Shot MultiBox Detector縮寫為SSD。它的模型結構如下:
圖2(來自SSD論文)
圖2中SSD對象檢測網絡簡單說可以分為三個部分:
- 基礎網絡(backbone) 這里為VGG16
- 特征提取Neck,構建多尺度特征
- 檢測頭 – 非最大抑制與輸出
OpenVINO 中模型庫自帶預訓練的人臉檢測網絡有很多,分別針對不同的應用場景與輸入分辨率。這里我們以face-detection-0202人臉檢測模型為例說明,它是一個MobileNetV2作為基礎網絡的SSD對象檢測模型,模型支持的輸入圖像大小與格式如下:
NCHW=1x3x384x384其中
N表示圖像數目,這里為1
C表示輸入圖像通道數目,這里彩色圖像為3
H表示圖像高度
W表示圖像寬度
期望的圖像通道順序:BGR
圖-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
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
}
}
}
預測與解析輸出結果,代碼如下:
// 執行預測
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
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
Rect rect;
rect.x = static_cast
rect.y = static_cast
rect.width = static_cast
rect.height = static_cast
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
+關注
關注
21文章
2934瀏覽量
118924 -
代碼
+關注
關注
30文章
4880瀏覽量
69982 -
人臉檢測
+關注
關注
0文章
86瀏覽量
16707 -
深度學習
+關注
關注
73文章
5547瀏覽量
122296 -
resnet
+關注
關注
0文章
13瀏覽量
3270
原文標題:OpenVINO? + SSD 實時對象檢測
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
將SSD300模型轉換為IR時收到錯誤的原因?
使用OpenVINO?模型的OpenCV進行人臉檢測,檢測到多張人臉時,伺服電機和步入器電機都發生移動是為什么?
如何部署OpenVINO?工具套件應用程序?
使用OpenVINO? 2021.4在CPU和MYRIAD上進行自定義對象檢測,為什么結果差異巨大?
為什么深度學習中的Frame per Second高于OpenVINO?演示推理腳本?
使用Yolo-v3-TF運行OpenVINO?對象檢測Python演示時的結果不準確的原因?
無法在Windows Subsystem for Linux 2上使用對象檢測Python演示運行YoloV4模型?
為什么無法檢測到OpenVINO?工具套件中的英特爾?集成圖形處理單元?
使用OpenVINO?訓練擴展對水平文本檢測模型進行微調,收到錯誤信息是怎么回事?
OpenVINO?檢測到GPU,但網絡無法加載到GPU插件,為什么?
使用OpenVINO C# API部署YOLO-World實現實時開放詞匯對象檢測

評論