動作識別網(wǎng)絡(luò)
深度學習在人體動作識別領(lǐng)域有兩類主要的網(wǎng)絡(luò),一類是基于姿態(tài)評估,基于關(guān)鍵點實現(xiàn)的動作識別網(wǎng)絡(luò);另外一類是直接預(yù)測的動作識別網(wǎng)絡(luò)。關(guān)于姿態(tài)評估相關(guān)的網(wǎng)絡(luò)模型應(yīng)用,我們在前面的文章中已經(jīng)介紹過了。OpenVINO2021.2版本中支持的動作識別網(wǎng)絡(luò)都不是基于關(guān)鍵點輸出的,而是基于Box直接預(yù)測,當前支持動作識別的預(yù)訓練模型與識別的動作數(shù)目支持列表如下:
表-1
這些網(wǎng)絡(luò)的輸出都是基于SSD檢測頭實現(xiàn)對象檢測與動作預(yù)測。
輸入與輸出格式
以person-detection-action-recognition-0005模型為例說明它們的輸入與輸出數(shù)據(jù)格式支持,我也不知道什么原因(個人猜測因為Caffe框架的原因),網(wǎng)絡(luò)的輸出居然都是SSD原始檢測頭,怎么解析,我有妙招,稍后送上!先看一下輸入與輸出格式說明:
輸入格式:
格式 NCHW=[1x3x400x680] ,Netron實際查看:
注意:OpenVINO2021.2安裝之后的文檔上格式說明是NHWC
輸出格式:
輸出有七個分支頭的數(shù)據(jù),它們的名稱跟維度格式列表如下:
表-2
關(guān)于輸出格式的解釋,首先是num_priors值是多少,骨干網(wǎng)絡(luò)到SSD輸出頭,是實現(xiàn)了16倍的降采樣,最終輸出的h x w=25x43然后每個特征點預(yù)測4個PriorBox, 每個特征點預(yù)測動作,總計有三類的動作,所以動作預(yù)測輸出為: [b, 3, h, w] = [1x3x25x43],總計PriorBoxes數(shù)目為:num_priors=25x43x4=4300,這些都是SSD檢測頭的原始輸出,沒有非最大抑制,沒有經(jīng)過轉(zhuǎn)換處理,所以想直接解析它們對開發(fā)應(yīng)用的人來說是一個大麻煩!
輸出數(shù)據(jù)解析與處理問題
person-detection-action-recognition-0005網(wǎng)絡(luò)推理之后的輸出數(shù)據(jù)解析跟后處理特別的復雜,怎么解析原始輸出頭是個技術(shù)活,我從示例代碼中提取跟整理出來兩個C++文件,它們是:
action_detector.h
cnn.h
以及它們的實現(xiàn)文件:
action_detector.cpp
cnn.cpp
這個其中最重要的就是有個ActionDetection類,它有幾個方法,分別是:
void enqueue(const cv::Mat &frame)
void submitRequest()
void wait()
DetectedActions fetchResults()
這幾個方法的解釋分別如下:
enqueue方法的就是實現(xiàn)了推理請求創(chuàng)建與圖像數(shù)據(jù)的輸入設(shè)置,它的代碼實現(xiàn)如下:
if (!request) {
request = net_.CreateInferRequestPtr();
}
width_ = static_cast《float》(frame.cols);
height_ = static_cast《float》(frame.rows);
Blob::Ptr inputBlob = request-》GetBlob(input_name_);
matU8ToBlob《uint8_t》(frame, inputBlob);
enqueued_frames_ = 1;
submitRequest方法,就是執(zhí)行推理,支持同步與異步推理執(zhí)行模型,它的代碼實現(xiàn)如下:
if (request == nullptr) return;
if (isAsync) {
request-》StartAsync();
}
else {
request-》Infer();
}
wait方法,當同步推理時候無需調(diào)用,異步推理調(diào)用
fetchResults方法,該方法是推理過程中最復雜的部分,負責解析輸出的七個分支數(shù)據(jù),生成Box與action標簽預(yù)測。簡單的說它的執(zhí)行過程是這樣,首先獲取輸出的七個輸出數(shù)據(jù),然后轉(zhuǎn)換為基于Mat的數(shù)據(jù),然后循環(huán)每個特征圖的特征點預(yù)測Box與置信得分,大于閾值的置信得分對應(yīng)的預(yù)測Box與PriorBox計算真實的BOX坐標,同時閾值化處理Action的置信得分,最終對結(jié)果完整非最大抑制之后輸出,得到數(shù)據(jù)結(jié)構(gòu)為:
struct DetectedAction {
/** @brief BBox of detection */
cv::Rect rect;
/** @brief Action label */
int label;
/** @brief Confidence of detection */
float detection_conf;
/** @brief Confidence of predicted action */
float action_conf;
這樣就完成了對輸出的數(shù)據(jù)解析。
這個就是上述四個相關(guān)依賴文件,我已經(jīng)把其他不相關(guān)的或者非必要的依賴全部去掉,基于這四個相關(guān)文件,就可以實現(xiàn)對表-1中動作識別模型的推理與解析輸出顯示。
動作識別代碼演示
動作識別代碼演示基于person-detection-action-recognition-0005網(wǎng)絡(luò)模型完成,該模型是基于室內(nèi)場景數(shù)據(jù)訓練生成的,適合于教育智慧教室應(yīng)用場景。首先需要初始化動作檢測類與初始化推理引擎加載,然后配置動作檢測類的相關(guān)參數(shù),這些參數(shù)主要包括以下:
- 模型的權(quán)重文件路徑
- 推理引擎的計算設(shè)備支持
- 對象檢測閾值
- 動作預(yù)測閾值
- 支持動作類別數(shù)目
- 是否支持異步推理
等等。
配置完成之后設(shè)置與初始化ActionDetection類,然后就可以直接調(diào)用上述提到幾個類方法完成整個推理與輸出,根據(jù)輸出結(jié)果繪制與顯示即可,這部分的代碼如下:
cv::Mat frame = cv::imread(“D:/action_001.png”);
InferenceEngine::Core ie;
std::unique_ptr《AsyncDetection《DetectedAction》》 action_detector;
// Load action detector
ActionDetectorConfig action_config(model_xml);
action_config.deviceName = “CPU”;
action_config.ie = ie;
action_config.is_async = false;
action_config.detection_confidence_threshold = 0.1f;
action_config.action_confidence_threshold = 0.1f;
action_config.num_action_classes = 3;
action_detector.reset(new ActionDetection(action_config));
action_detector-》enqueue(frame);
action_detector-》submitRequest();
DetectedActions actions = action_detector-》fetchResults();
std::cout 《《 actions.size() 《《 std::endl;
for (int i = 0; i 《 actions.size(); i++) {
std::cout 《《 actions[i].rect 《《 std::endl;
std::cout 《《 actions[i].label 《《 std::endl;
cv::rectangle(frame, actions[i].rect, cv::Scalar(0, 0, 255), 2, 8, 0);
putText(frame, action_text_labels[actions[i].label], actions[i].rect.tl(), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(0, 0, 255), 2, 8);
}
cv::imshow(“動作識別演示”, frame);
cv::waitKey(0);
return 0;
責任編輯:haq
-
深度學習
+關(guān)注
關(guān)注
73文章
5466瀏覽量
120891
原文標題:OpenVINO? 室內(nèi)動作識別
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論