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

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

3天内不再提示

深度学习中动作识别网络学习

英特尔物联网 来源:英特尔物联网 作者:英特尔物联网 2021-06-25 10:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

动作识别网络

深度学习在人体动作识别领域有两类主要的网络,一类是基于姿态评估,基于关键点实现的动作识别网络;另外一类是直接预测的动作识别网络。关于姿态评估相关的网络模型应用,我们在前面的文章中已经介绍过了。OpenVINO2021.2版本中支持的动作识别网络都不是基于关键点输出的,而是基于Box直接预测,当前支持动作识别的预训练模型与识别的动作数目支持列表如下:

12dd20c8-d50f-11eb-9e57-12bb97331649.png

表-1

这些网络的输出都是基于SSD检测头实现对象检测与动作预测。

输入与输出格式

以person-detection-action-recognition-0005模型为例说明它们的输入与输出数据格式支持,我也不知道什么原因(个人猜测因为Caffe框架的原因),网络的输出居然都是SSD原始检测头,怎么解析,我有妙招,稍后送上!先看一下输入与输出格式说明:

输入格式:

格式 NCHW=[1x3x400x680] ,Netron实际查看:

注意:OpenVINO2021.2安装之后的文档上格式说明是NHWC

输出格式:

输出有七个分支头的数据,它们的名称跟维度格式列表如下:

12f04c16-d50f-11eb-9e57-12bb97331649.png

表-2

关于输出格式的解释,首先是num_priors值是多少,骨干网络到SSD输出头,是实现了16倍的降采样,最终输出的h x w=25x43然后每个特征点预测4个PriorBox, 每个特征点预测动作,总计有三类的动作,所以动作预测输出为: [b, 3, h, w] = [1x3x25x43],总计PriorBoxes数目为:num_priors=25x43x4=4300,这些都是SSD检测头的原始输出,没有非最大抑制,没有经过转换处理,所以想直接解析它们对开发应用的人来说是一个大麻烦!

输出数据解析与处理问题

person-detection-action-recognition-0005网络推理之后的输出数据解析跟后处理特别的复杂,怎么解析原始输出头是个技术活,我从示例代码中提取跟整理出来两个C++文件,它们是:

action_detector.h

cnn.h

以及它们的实现文件:

action_detector.cpp

cnn.cpp

这个其中最重要的就是有个ActionDetection类,它有几个方法,分别是:

void enqueue(const cv::Mat &frame)

void submitRequest()

void wait()

DetectedActions fetchResults()

这几个方法的解释分别如下:

enqueue方法的就是实现了推理请求创建与图像数据的输入设置,它的代码实现如下:

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方法,就是执行推理,支持同步与异步推理执行模型,它的代码实现如下:

if (request == nullptr) return;

if (isAsync) {

request-》StartAsync();

}

else {

request-》Infer();

}

wait方法,当同步推理时候无需调用,异步推理调用

fetchResults方法,该方法是推理过程中最复杂的部分,负责解析输出的七个分支数据,生成Box与action标签预测。简单的说它的执行过程是这样,首先获取输出的七个输出数据,然后转换为基于Mat的数据,然后循环每个特征图的特征点预测Box与置信得分,大于阈值的置信得分对应的预测Box与PriorBox计算真实的BOX坐标,同时阈值化处理Action的置信得分,最终对结果完整非最大抑制之后输出,得到数据结构为:

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;

这样就完成了对输出的数据解析。

这个就是上述四个相关依赖文件,我已经把其他不相关的或者非必要的依赖全部去掉,基于这四个相关文件,就可以实现对表-1中动作识别模型的推理与解析输出显示。

动作识别代码演示

动作识别代码演示基于person-detection-action-recognition-0005网络模型完成,该模型是基于室内场景数据训练生成的,适合于教育智慧教室应用场景。首先需要初始化动作检测类与初始化推理引擎加载,然后配置动作检测类的相关参数,这些参数主要包括以下:

- 模型的权重文件路径

- 推理引擎的计算设备支持

- 对象检测阈值

- 动作预测阈值

- 支持动作类别数目

- 是否支持异步推理

等等。

配置完成之后设置与初始化ActionDetection类,然后就可以直接调用上述提到几个类方法完成整个推理与输出,根据输出结果绘制与显示即可,这部分的代码如下:

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

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

    关注

    73

    文章

    5610

    浏览量

    124654

原文标题:OpenVINO™ 室内动作识别

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度学习为什么还是无法处理边缘场景?

    [首发于智驾最前沿微信公众号]虽然自动驾驶车辆已经完成了数百万公里的行驶测试,深度学习也已被普遍应用,但依然会在一些看似简单的场景犯下低级错误。比如在遇到一些从未见到过的边缘场景时,系统可能会
    的头像 发表于 05-04 10:16 189次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>为什么还是无法处理边缘场景?

    人工智能-Python深度学习进阶与应用技术:工程师高培解读

    深度学习的工程化落地,早已不是纸上谈兵的事。从卷积神经网络到Transformer,从目标检测到大模型私有化部署,技术栈不断延伸,工程师面临的知识体系也越来越庞杂。现根据际赛威工程师
    的头像 发表于 04-21 11:01 381次阅读
    人工智能-Python<b class='flag-5'>深度</b><b class='flag-5'>学习</b>进阶与应用技术:工程师高培解读

    深度学习驱动的超构表面设计进展及其在全息成像的应用

    可实现高质量图像的获取。基于神经网络深度学习方法进行超构表面设计的文章数量日益增多,但关于该主题的综述仍较为匮乏。据麦姆斯咨询报道,近期,中国计量大学田颖教授等人
    的头像 发表于 04-09 13:55 171次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>驱动的超构表面设计进展及其在全息成像<b class='flag-5'>中</b>的应用

    机器学习深度学习需避免的 7 个常见错误与局限性

    无论你是刚入门还是已经从事人工智能模型相关工作一段时间,机器学习深度学习中都存在一些我们需要时刻关注并铭记的常见错误。如果对这些错误置之不理,日后可能会引发诸多麻烦!只要我们密切关注数据、模型架构
    的头像 发表于 01-07 15:37 365次阅读
    机器<b class='flag-5'>学习</b>和<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>中</b>需避免的 7 个常见错误与局限性

    穿孔机顶头检测仪 机器视觉深度学习

    ,能适用恶劣工况,在粉尘、高温、氧化皮等恶劣环境均可正常工作。 测量原理 利用顶头与周围的物质(水、空气、导盘等)红外辐射能量的差异,用热成像相机拍摄出清晰的图片,再通过深度学习短时间内深度
    发表于 12-22 14:33

    如何深度学习机器视觉的应用场景

    检测应用 微细缺陷识别:检测肉眼难以发现的微小缺陷和异常 纹理分析:对材料表面纹理进行智能分析和缺陷识别 3D表面重建:通过深度学习进行高精度3D建模和检测 电子行业应用 PCB板复杂
    的头像 发表于 11-27 10:19 351次阅读

    如何在机器视觉中部署深度学习神经网络

    图 1:基于深度学习的目标检测可定位已训练的目标类别,并通过矩形框(边界框)对其进行标识。 在讨论人工智能(AI)或深度学习时,经常会出现“神经网络
    的头像 发表于 09-10 17:38 1074次阅读
    如何在机器视觉中部署<b class='flag-5'>深度</b><b class='flag-5'>学习</b>神经<b class='flag-5'>网络</b>

    深度学习对工业物联网有哪些帮助

    深度学习作为人工智能的核心分支,通过模拟人脑神经网络的层级结构,能够自动从海量工业数据中提取复杂特征,为工业物联网(IIoT)提供了从数据感知到智能决策的全链路升级能力。以下从技术赋能、场景突破
    的头像 发表于 08-20 14:56 1246次阅读

    自动驾驶Transformer大模型会取代深度学习吗?

    [首发于智驾最前沿微信公众号]近年来,随着ChatGPT、Claude、文心一言等大语言模型在生成文本、对话交互等领域的惊艳表现,“Transformer架构是否正在取代传统深度学习”这一话题一直被
    的头像 发表于 08-13 09:15 4392次阅读
    自动驾驶<b class='flag-5'>中</b>Transformer大模型会取代<b class='flag-5'>深度</b><b class='flag-5'>学习</b>吗?

    深度学习遇上嵌入式资源困境,特征空间如何破局?

    多层神经网络的非线性变换拟合规律,理论上几乎可以描述和模拟一切规律,但实际上该过程效率极低 —— 其计算复杂度往往呈指数级增长。这一特性使得深度学习与端侧设备的资源约束存在根本性矛盾,导致其在端侧 AI 实施过程
    发表于 07-14 14:50 1329次阅读
    当<b class='flag-5'>深度</b><b class='flag-5'>学习</b>遇上嵌入式资源困境,特征空间如何破局?

    使用MATLAB进行无监督学习

    无监督学习是一种根据未标注数据进行推断的机器学习方法。无监督学习旨在识别数据隐藏的模式和关系,无需任何监督或关于结果的先验知识。
    的头像 发表于 05-16 14:48 1633次阅读
    使用MATLAB进行无监督<b class='flag-5'>学习</b>

    深度学习赋能:正面吊车载箱号识别系统的核心技术

    在现代物流与智慧港口建设,集装箱的高效精准识别是提升作业效率的关键环节。基于OCR+AI深度学习技术的正面吊车载箱号识别系统,凭借99%以
    的头像 发表于 05-07 10:10 686次阅读