加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 姿態(tài)評估技術與框架
    • 頭部姿態(tài)評估模型
    • 代碼實現(xiàn)
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

OpenVINO? 頭部姿態(tài)評估網(wǎng)絡應用演示

2021/05/21
694
閱讀需 12 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

姿態(tài)評估技術與框架

姿態(tài)評估(Pose estimation)是計算機視覺的研究熱點之一,姿態(tài)評估的算法應用主要可以分為兩部完成,第一步是對象檢測,對象區(qū)域的定位與查找,截取圖像ROI,第二步是根據(jù)對象檢測定位截取ROI區(qū)域作為輸入,完成姿態(tài)評估與預測。當前主要用于姿態(tài)評估的深度學習網(wǎng)絡框架有以下幾種:

OpenPose框架:

是一個開源的姿態(tài)評估算法框架,支持多任姿態(tài)評估,可以實現(xiàn)實時的人體對象檢測、身體、頭部、手部姿態(tài)評估與人臉關機點檢測,支持2D與3D,簡易的C++接口調(diào)用與自定義訓練。

DeepCut框架:

跟OpenPose類似的姿態(tài)評估框,支持多人檢測與姿態(tài)評估,特別是在圖像與視頻中運動場景下,包括足球與籃球運動場景。

其它的類似框架還包括有AlphaPose、DeepPose、PoseNet等。姿態(tài)評估算法主要應用場景在移動機器人、虛擬現(xiàn)實、人體跌倒檢測、危險動作識別、機器人動作訓練、活體驗證等。

OpenVINO™ 2021.02版本中涉及到姿態(tài)評估方面的支持主要有下列幾個預訓練模型:

模型名稱

模型說明

head-pose-estimation-adas-0001

頭部姿態(tài)評估,簡單的全卷積網(wǎng)絡

human-pose-estimation-0001

基于OpenPose, MobileNetv1做特征提取,18對關鍵點

human-pose-estimation-0002

基于EfficientHRNet,17對關鍵點檢測

human-pose-estimation-0003

基于EfficientHRNet,17對關鍵點檢測

human-pose-estimation-0004

基于EfficientHRNet,17對關鍵點檢測

表-1

從human-pose-estimation-0002到human-pose-estimation-0004輸入圖像的分辨率增大,計算復雜度增加,檢測精度提升。從human-pose-estimation-0001到human-pose-estimation-0004都支持多人的姿態(tài)評估。OpenVINO™ 通過上述五個模型實現(xiàn)基本的人體姿態(tài)評估需求。這里我們以頭部姿態(tài)評估為例來完成姿態(tài)評估模型的OpenVINO™ 部署與代碼演示。

頭部姿態(tài)評估模型

OpenVINO™ 支持的頭部姿態(tài)評估模型head-pose-estimation-adas-0001的輸入與輸出格式分別如下:

輸入格式為NxCxHxW=1x3x60x60,期望的彩色圖像通道順序BGR、大小為60x60

輸出層名稱與格式如下:

name: "angle_y_fc", shape: [1, 1] - Estimated

name: "angle_p_fc", shape: [1, 1] - Estimated pitch

name: "angle_r_fc", shape: [1, 1] - Estimated roll

在三個維度方向?qū)崿F(xiàn)頭部動作識別,它們分別是:

pitch是俯仰角,是“點頭“

yaw是偏航角,是‘搖頭’

roll是旋轉(zhuǎn)角,是“翻滾

它們的角度范圍分別為:YAW [-90,90], PITCH [-70,70], ROLL [-70,70]

這三個專業(yè)詞匯其實是來自無人機與航空領域,計算機視覺科學家一大愛好就是搞新詞,就把它們借用到頭部姿態(tài)評估中,它們的意思圖示如下:

圖-1(來自網(wǎng)絡)

對應到頭部姿態(tài)評估中:

圖-2 (來自網(wǎng)絡)

 

該網(wǎng)絡模型的格式通過Netron查看之后你會發(fā)現(xiàn)就是一些簡單的Conv-ReLU-BN的疊加,最后是一個多任務的分支輸出,模型結(jié)構(gòu)跟2017年一篇論文里面的模型有點相似,我大膽猜測一波,OpenVINO™ 頭部姿態(tài)模型的開發(fā)者肯定是了解過此篇論文的,論文地址如下:

https://arxiv.org/pdf/1710.00925.pdf

論文中給出的模型結(jié)構(gòu)如下:

圖-3 (來自論文Fine-Grained Head Pose Estimation Without Keypoints)

可以看到它的backbone部分是ResNet50,在OpenVINO™ 中考慮到圖像的輸入分辨率與速度需求ResNet50的backbone被替換為一些簡單的Conv-ReLU-BN疊加。圖示如下:

圖-4

代碼實現(xiàn)

首先需要完成人臉檢測,然后把對人臉部分ROI區(qū)域適當?shù)南蛏显黾哟笮≈笸瓿山貓D,重新resize之后再作為輸入頭部姿態(tài)評估模型推理,得到三個角度,根據(jù)角度數(shù)值的范圍獲得最終的頭部姿態(tài)評估結(jié)果。代碼實現(xiàn)部分的人臉檢測作為上一篇的對象檢測部分關聯(lián)知識,這里就不再展開詳細說明。主要說明如何通過人臉檢測結(jié)果截取ROI區(qū)域,調(diào)用頭部姿態(tài)評估模型實現(xiàn)姿態(tài)評估、預測解析與結(jié)果顯示,所以頭部姿態(tài)評估的代碼部分可以分為以下幾步,它們分別是:

第一步:加載頭部姿態(tài)識別模型與設置輸入輸出格式

// load emotion model

InferenceEngine::CNNNetworkhead_pose_net = ie.ReadNetwork(head_model_xml, head_model_bin);

InferenceEngine::InputsDataMaphead_pose_inputs = head_pose_net.getInputsInfo();

InferenceEngine::OutputsDataMaphead_pose_outputs = head_pose_net.getOutputsInfo();

std::string hp_input_name = "";

for (auto item :head_pose_inputs) {

       hp_input_name = item.first;

       auto input_data = item.second;

       input_data->setPrecision(Precision::U8);

       input_data->setLayout(Layout::NCHW);

}

for (auto item :head_pose_outputs) {

       auto output_data = item.second;

       output_data->setPrecision(Precision::FP32);

}

第二步:獲取可執(zhí)行網(wǎng)絡與推理請求

auto executable_hp_network = ie.LoadNetwork(head_pose_net, "CPU");

auto hp_request = executable_hp_network.CreateInferRequest();

第三步:截取輸入、推理與解析輸出

// check out of boundary

if (box.x< 0) {

       box.x = 0;

}

if (box.y< 0) {

       box.y = 0;

}

if ((box.width + box.x) >= curr_frame.cols) {

       box.width = curr_frame.cols - box.x;

}

if ((box.height+ box.y) >= curr_frame.rows) {

       box.height = curr_frame.rows - box.y;

}

fetch_head_pose(curr_frame, hp_request, box, hp_input_name);

其中fetch_head_pose函數(shù)方法的代碼實現(xiàn)如下:

void fetch_head_pose(cv::Mat &image, InferenceEngine::InferRequest&request, cv::Rect&face_roi,

       std::string &e_input) {

       cv::Mat faceROI = image(face_roi);

       auto blob = request.GetBlob(e_input);

       matU8ToBlob(faceROI, blob);

       request.Infer();

       // output prase

       auto output1 = request.GetBlob("angle_y_fc");

       auto output2 = request.GetBlob("angle_p_fc");

       auto output3 = request.GetBlob("angle_r_fc");

       const float* y_pred = static_cast::value_type*>(output1->buffer());

       const float* p_pred = static_cast::value_type*>(output2->buffer());

       const float* r_pred = static_cast::value_type*>(output3->buffer());

       std::string head_pose = "";

       if (p_pred[0] > 20 || p_pred[0] < -20) {

              head_pose += "pitch, ";

       }

       if (r_pred[0] > 20 || r_pred[0] < -20) {

              head_pose += "roll, ";

       }

       if (y_pred[0] > 20 || y_pred[0] < -20) {

              head_pose += "yaw, ";

       }

       putText(image, head_pose, face_roi.tl(), cv::FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255, 0, 255), 2, 8);

}

最終程序運行結(jié)果如下:

圖-5

相關推薦

電子產(chǎn)業(yè)圖譜

英特爾致力于加快智能設備的開發(fā)和部署,通過智能多層系統(tǒng)和端到端分析,在智能駕駛、智能零售、智能安防、智能制造等領域,推動企業(yè)業(yè)務轉(zhuǎn)型,改善人們的生活和工作方式,英特爾驅(qū)動物聯(lián)網(wǎng)變革。