新闻中心

EEPW首页 > 智能计算 > 进阶指南 > 用OpenVINO自制简易控制系统

用OpenVINO自制简易控制系统

作者:时间:2020-09-18来源:收藏

  2006 年 11 月任天堂推出新一代电玩主机「Wii」,同时搭配具有「重力传感器(或称线性加速度计)」的游戏杆,让玩电动不再只有香菇头和按键,而是可以透过挥动手把来体验更仿真的运动类游戏,如网球、桌球等,从此开启「体感游戏」新世代。
  虽然后续有更多厂商加入,甚至加入了陀螺仪(或称角加速度器)来侦测手把转动角度、速度,还有利用地磁传感器来感知玩家面对的方向使得体感游戏更加逼真,但玩家对于手上握着的那个手把仍感到有些累赘。
  2010 年 11 月微软为了挽救Xbox360 的销售业绩推出了「Kinect」,这项划时代的产品让玩家从此抛开手把,只需摆动肢体就能操作游戏中的虚拟人物或对象。这项技术主要结合了一个红外线雷射发射器(产生光斑)、一个红外线摄影机及一个普通的彩色摄影机,经过复杂计算后就能得出场景中各项对象的深度(距离)信息,进而分析出玩家的骨架(头、手、脚)位置及姿势,如此即可精准控制游戏的进行。
  也正因有这项便宜又好用的工具诞生,且可同时侦测多人(最多六人)的动作,所以有更多的互动游戏及应用装置产生。虽然后来微软及其它厂商陆续推出改良产品,并将市场延伸至简易型 3D 对象及室内环境扫描用途,随着风潮淡去,2017 年微软已正式停止生产这项产品。
  好姨说:「为什么?为什么?为什么让我用到一套这么好用的体感互动工具,以后我用不到怎么办?」(星爷食神经典桥段)。各位看倌请不用担心,我帮大家找到了一个解决方案,只要用使用一组网络摄影机加上 Intel 的 ™开源软件套件包中的 human-pose-estimation 预训练模型就可以办到了。
  星爷说:「只要有 ™,人人都可是互动之神」。对!你没听错,连 Kinect 这样的深度传感器都不用,不管你是用 CPU、GPU、VPU(神经运算棒)都可以一次搞定。

本文引用地址:http://www.eepw.com.cn/article/202009/418494.htm


1600398850534869.jpg

人体姿态定义
  当然以上是比较搞笑的说法,以 2D 人体姿态估测是无法完全取代像 Kinect 这类深度传感器所产生的 3D 骨架(skeleton)分析,不过对大多数的姿态估测及互动应用应该还是游刃有余的,接下来就先帮大家说明一下什么是 2D 姿态估测及如何应用。
  一般来说人的姿态是包括 3D(上下左右前后)位置信息,但被拍成 2D 照片或视频后,自然失去深度(前后位置)信息,所以仅能就人的肢体重要关节(关键)点位置进行分析,进而建立人体骨架及姿态。
  目前最常见的 2D 姿态估测关键点开放数据集包括微软 COCO(17点),CMU OpenPose(18/25点),MPII(16点),AI Challenge(14点),LSP(14点),FLIC(9点),本次要使用的为卡内基梅隆大学(CMU)感知计算实验室所开源的 OpenPose 18 点骨架数据格式(如下图a)。除此之外这个数据集还提供另三种输出格式,用于表示人体骨架(25点)、脸部动作(70点)及手部动作(22点),如下图所示。

1600398850767012.jpg

  OpenPose支持输出格式,(a)类COCO 18点,(b) BODY 25点,(c) 脸部70点,(d)手部22点
  此次会用到的 OpenPose 18 关键点格式和常用的微软 COCO 17 关键点格式非常相似,最主要差别是编号序顺不同及 OpenPose 多了脖子点作人体中心点。如有需要相互转换时,可自行转换。
MS COCO:(17点)
  0:鼻子、1:左眼、2:右眼、3:左耳、4:右耳、5:左肩、6:右肩、7:左肘、8:右肘、9:左腕、10:右腕、11:左臀(腰)、12:右臀(腰)、13:左膝、14:右膝、15:左踝、16:右踝。
  CMU OpenPose:(18点)(如上图a)
  0:鼻子、1:脖子、2:右肩、3:右肘、4:右腕、5:左肩、6:左肘、7:左腕、8:右臀(腰)、9:右膝、10:右踝、11:左臀(腰)、12:左膝、13:左踝、14:左眼、15:右眼、16:左耳、17:右耳。
人体姿态估测实作
  接下来开始说明如何使用 Intel ™结合 OpenPose 预训练模型「human-pose-estimation-0001」来完成「简易体感控制系统」。这里还是使用Win 10 搭配 OpenVINO™ 2019 R2 环境执行,如果需要在 Linux 环境开发的,请自行参考官网提供安装程序。
  首先利用 OpenVINO™工具包的下载工具下载预训练好的模型「human-pose-estimation-0001」,更进一步说明及使用方法可参考官方文件。
  https://docs.openvinotoolkit.org/latest/_demos_human_pose_estimation_demo_README.html
  /* 切换至下载工具路径 */
  cdC:Program Files(x86)IntelSWToolsopenvino_2019.2.242deployment_toolstoolsmodel_downloader
  /*下载预训练模型到指定路径 */
  python3 downloader.py --namehuman-pose-estimation-0001 --output_dir 指定路径名称
  完成下载后,会在指定路径下得到三种格式(INT8、FP16、FP32)已优化过 IR 中介檔(bin、xml),可直接给 OpenVINO™的推论引擎(Inference Engine)使用,不须再进行模型优化器(Model Optimizer)动作,其档案存放路径结构如下所示。
  /* 下载至指定路径下的优化模型中介文件存放路径*/
  指定路径名称
  Transportation
  human_pose_estimation
  mobilenet-v1
  dldt
  INT8
  human-pose-estimation-0001.bin (16MB)
  human-pose-estimation-0001.xml (597KB)
  FP16
  human-pose-estimation-0001.bin (8MB)
  human-pose-estimation-0001.xm (65KB)
  FP32
  human-pose-estimation-0001.bin (16MB)
  human-pose-estimation-0001.xm (66KB)
  由于 OpenVINO™在运作时要引用很多路径,所以执行编译及执行前要先设定工作环境,只需依下列指令操作即可完成工作环境设定。
  /* 切换至设定工作环境路径 */
  cd C:Program Files(x86)IntelSWToolsopenvino_2019.2.242bin
  /* 执行设定环境变量批处理文件 */
  setupvars
  目前 OpenVINO™提供的范例原始码默认会在下列路径:
  /* 范例程序原始码路径 */
  C:Program Files(x86)IntelSWToolsopenvino_2019.2.242deployment_toolsinference_enginedemoshuman_pose_estimation_demo
  本范例为 C++ 程序,这里使用 Visual Studio 2017 进行编译,默认所有展示用的程序范例项目文件 Demos.sln 会在下面路径。
  /* 范例程序Visual Studio项目文件路径 */
  C:Users使用者名称DocumentsIntelOpenVINOinference_engine_demos_build
  本项目中共包含 22 个子项目,而 human_pose_estimation_demo 即为本次范例。如果想要修改内容时,记得以系统管理员身份执行 VS2017,以免因范例程序在 C:Program Files (x86) 下而无法直接编辑。如想直接使用,那进行重建(编译)后即可得到执行档 human_pose_estimation_demo.exe,默认会生成在下面路径。
  /* 执行文件生成路径 */
  C:Users使用者名称DocumentsIntelOpenVINOinference_engine_demos_buildintel64Release
  /* 执行档操作命令 */
  human_pose_estimation_demo -i 输入影片文件名 -m 模型优化中介文件.xml-d 运算装置名称
  参数说明:
  -i 输入影像方式
  目前这个范例可支持二种视频输入方式,一种是直接从网络摄影机,直接设定 -i cam 即可,预设为第 0 号摄影机。另一种为从视频档案输入,由于底层是利用 OpenCV 的 VideoCapture 读取视频影像,所以目前能支持的视频格式不多,主要是以 *.avi, *.mp4 为主,可设定 -i xxx.mp4。
  -m 模型优化中介文件 .xml 所在路径
  一般来说推论计算数值精度可分为 FP32、FP16 及 INT8,而所需运算时间也随精度降低(推论速度提升),但通常推论正确率也会随之略减。运算时 CPU 及 GPU 三种精度都可使用,但 VPU(神经运算棒 NCS1、NCS2)则能选择 FP16 格式运行,要特别注意不要选错。设定时如 -m 用户指定路径Transportationhuman_pose_estimationmobilenet-v1dldtFP16human-pose-estimation-0001.xml。
  -d 运算装置名称
  可设为 CPU、GPU 和 MYRIAD,而 MYRIAD 就是 VPU,或称神经运算棒,不管是 NCS 一代或二代皆设为 MYRIAD 即可,例如 -d MYRIAD。如果执行时未插入神经运算棒至 USB,则程序会直接中断。
  实验结果
  接下来我们就测试一下这个范例带来的效果。这里使用四种测试装置,分别是:
  1.CPU:Intel i7-8950 8GBRAM
  2.GPU:Intel UHD Graphics630
  3.NCS1:Movidius (Intel)Neural Compute Stick(一代)
  4.NCS2:Intel Neural ComputeStick 2(二代)
  首先以视频影像做为输入进行测试,分别测试不同装置在不同精度下指令周期及人体姿态估测结果。为方便大家测试,我们直接从 YOUTUBE 下载了一段微软 Kinect Dance 的测试影片(1280×720 30fps),
  https://youtu.be/Y-iKWe-U9bY
  并抽取其中五小段作为此次测试及比较依据,相关影片可直接到 GITHUB 下载。
  https://github.com/OmniXRI/OpenVINO_human-pose-estimation
  这里利用其中一小段影片测试,结果如下图所示。大致上可看出姿态估测部份几乎没差,主要差异在指令周期,这里使用 FPS(每秒多少影格)作为单位,数值越高表示反应速度越快。若能达到 30 FPS 以上则已达一般影片播放速度,满足实时处理的需求。

1600398850753580.jpg

  从这些测试结果来看,目前在 CPU 部份,FP32 及 FP16 指令周期差别不大,表示 CPU 在处理浮点数上并没有充份利用硬件特性(可能是软件函式库造成),但运算数值精度降至 INT8 时,指令周期明显提升快一倍。
  而 GPU 部份,可以看出在浮点数计算上明显有差异,所以 FP16 指令周期较 FP32 快了约 50%。奇怪的是 INT8 竟然和 FP32 接近,这是因为 GPU 本来就不支持整数运算,所以应该是函式库自动把整数转成 FP32 计算造成的结果。
  再来是神经运算棒部份,NCS2 在硬件规格上优于 NCS1,所以理所当然指令周期较快,快了约两倍。
  再来测试不同影片内容指令周期差异,为方便测试起见,这里统一使用 GPU FP16 的条件来对五小段影片进行测试,这五段影片有单人、多人、动作简单、大幅动作、轻微遮蔽及严重遮蔽。测试后发觉准确度极高,只有在严重遮蔽或移动速度过快(影像局部模糊)时会有些失误,大体上来看是非常不错的。不同影像内容在计算速度上会有些许差异,如下图所示。
  这里发现一个有趣的地方,就是影片长度较长(影格数较多)的,其指令周期会越来越快,不知是否是因影片被缓冲进内存中,所以减少一些访问时间?
  不同视频指令周期比较

1600398851253267.jpg

  实际结果如下

1600398851162522.jpg

1600398851723662.jpg

1600398508592116.gif

1600398851474755.jpg

1600398851303500.jpg

  最后是测试网络摄影机,这里使用 800×600 的分辨率,分别以 CPU 及 GPU 进行测试,测试时故意摆了一样的姿势方便比较运算差异。这里的指令周期明显比前面测试快了许多,主要原因是输入视频解析图下降。测试时虽然只有半身,但还是可以很正确判断出来,由此得知这个预训练好的模型真的很不错。

1600398851807040.jpg

  写到这里大家应该已经可以充份感受到 OpenPose 的威力了,只需 OpenVINO™加上一台网络摄影机就能搞定「简易体感控制系统」。虽然目前看起来指令周期似乎有点慢,但对于简单型的应用已绰绰有余,只要善用图像上所提取到的关节点坐标,就可轻松开发体感游戏及各种人机互动应用了。如果想要更深入了解的朋友,可自行研读范例源码。



评论


相关推荐

技术专区

关闭