译者:Adrian Rosebrock

译者:吴振东

校订:赵蓓蕾

责任编辑约5700字,提议写作16两分钟。

这篇讲义会说你怎样借助OpenCV和广度自学来同时实现人类文明姿势辨识。

透过写作这篇讲义,你能教给怎样借助OpenCV和广度自学来同时实现人类文明姿势辨识。

他们同时实现的人类文明公益活动辨识数学模型能辨识少于400类公益活动,当中准确度在78.4-94.5%间(依赖于各项任务类型)。 比如说,公益活动类型的可主要包括:

1. Archery 摔跤

2. arm wrestling 掰手腕

3. baking cookies 烤巧克力

4. counting money 大凡

5. driving tractor 开推土机

6. eating hotdog 吃薯条

7. flying kite 唱歌跳舞

8. getting a tattoo 刺刺青

9. grooming horse 给马梳毛

10. hugging 亲吻

11. ice skating 滑板

12. juggling fire 闪电杂技

13. kissing 亲吻

14. laughing 大笑

15. motorcycling 骑摩托车

16. news anchoring 播报新闻

17. opening present 拆礼物

18. playing guitar 弹吉他

19. playing tennis 打网球

20. robot dancing机械人跳舞

21. sailing 开帆船

22. scuba diving 潜水

23. snowboarding 单板滑雪

24. tasting beer 喝啤酒

25. trimming beard 修剪胡子

26. using computer使用电脑

27. washing dishes 洗盘子

28. welding 焊接

29. yoga 练瑜伽

30. …and more! 其他

人类文明公益活动辨识可用于的实践应用主要包括:

给硬盘中的视频数据集自动分类/分组。训练或监察新员工准确地完成各项任务(例如做披萨时的步骤和流程是否合适,当中主要包括揉面团、上烤炉加热、加盐、加芝士、加馅料等等)。验证食品的服务生从洗手间出来或手工处理食物时有没有洗手,以免出现交叉污染(比如说说鸡肉上的沙门氏菌)。检查酒吧或饭店里的顾客没有被过度服务(灌酒)。

想要自学怎样借助OpenCV和广度自学来同时实现人类文明姿势检测,请继续写作本讲义。

在这篇讲义的第一部分,他们先来讨论下Kinetics数据集,该数据集用来训练人类文明公益活动辨识数学模型。

在那之后他们能聊聊怎样来扩展ResNet, 该网络通常使用2D核函数,而他们将采用3D核函数,这样就引入了公益活动辨识数学模型可借助的时空维度成分。

接下来他们将会同时实现两种版本的人类文明公益活动辨识,使用的都是OpenCV库和Python编程语言。

最后,他们应用人类文明公益活动辨识数学模型到几个视频样例上,并看一下验证结果。

Kinetics数据集

图1:讲义中所采用的人类文明公益活动辨识广度自学数学模型是借助Kinetics 400数据集来完成预训练的

他们的人类文明公益活动辨识数学模型是借助Kinetics 400数据集来完成训练的。

该数据集主要包括:

400种人类文明公益活动辨识分类。每个类型至少400个视频片段(下载自YouTube)。一共有300,000个视频。

你能点击这一镜像来查询该数学模型能辨识的类型名单:

https://github.com/opencv/opencv/blob/master/samples/data/dnn/action_recongnition_kinetics.txt

想要了解关于该数据集的更多信息,主要包括是怎样去整合数据,请参考Kay 等人在2017年发表的论文《The Kinetics Human Action Video Dataset》。

《The Kinetics Human Action Video Dataset》

https://arxiv.org/abs/1705.06950

用于人类文明姿势辨识的3D ResNet

自动草稿

图2:广度神经网络借助ImageNet在图像辨识上的进度已经使广度自学在公益活动辨识方面趋于成功(在视频方向),在这篇讲义中,他们会借助OpenCV进行广度自学的公益活动辨识(照片源自Hara等人的论文)

他们用于人类文明公益活动辨识的数学模型来自于Hara 等人在2018年发表于CVPR的论文《Can Spatiotemporal 3D CNNs Retrace the History of 2D CNNs and ImageNet》

该论文译者对现有的最先进的2D结构(比如说说ResNet,ResNeXt,DenseNet等)进行了探索,将它们扩展为3D核函数从而用于视频分类。

《Can Spatiotemporal 3D CNNs Retrace the History of 2D CNNs and ImageNet》

https://arxiv.org/abs/1711.09577

上述文章的译者认为:

这些网络架构都成功地应用到了图像分类中。经过大规模数据集ImageNet的训练,这些数学模型都达到了非常高的准确度。Kinetics数据集的规范同样足够大。

…,因此这些网络架构也应该能适用于视频分类,透过:1.改变输入集的维度来引入时空维度上的信息;2.在这些网络架构中使用3D核函数。

事实证明上述文章的译者的观点是正确的!

透过改变输出集的维度和卷积核的维度,上述译者获得了如下效果:

在Kinetics测试数据集上的准确度是78.4%。在UCF-101测试数据集上的准确度是94.5%。在HMDB-51测试数据集上的准确度是70.2%。

这些结果与借助ImageNet训练的最先进的数学模型所发布的R1准确度近似,因此这证明了这些数学模型架构能用于视频分类,只需要简单地加上时空信息以及用3D核函数来代替2D核函数。

下载OpenCV人类文明公益活动辨识数学模型

图3:借助OpenCV和广度自学同时实现人类文明公益活动辨识所需文件

对于接下来的讲义,你所需要下载的有:

人类文明公益活动数学模型Python OpenCV源代码用于视频分类的样例

你能在公众号中下载含有全部内容的压缩文件。一旦完成下载,你能继续写作本讲义。

项目结构

让他们来检查一下项目文件:

自动草稿

他们的项目包含三个附属文件:

action_recognition_kinetics.txt : Kinetics数据集的类型标签。resnet-34_kinetics.onx : Hara 等人提出的人类文明公益活动辨识卷积神经网络,并已借助Kinetics数据集完成预训练和序列化。example_activities.mp4 :一段用于测试人类文明公益活动辨识的剪辑片段合集。

他们将会回顾一下两个Python脚本,每一个都会接收上面三个文件作为输入:

human_activity_reco.py :他们的人类文明公益活动辨识脚本每次将N帧图像作为取样,用于公益活动分类预测。human_activity_reco_deque.py :一个类似的人类文明公益活动辨识脚本,使用了一个移动平均数队列。这个脚本跑起来要更慢,不管怎样,我在这里提供这个同时实现方式,这样你就能对其进行试验并从中教给一些东西。

借助OpenCV的人类文明公益活动辨识同时实现

让他们开始使用OpenCV来完成人类文明公益活动辨识同时实现。这一同时实现是基于OpenCV的官方样例,而我又进行了一些调整(都位于这个和下个样例中),并新增了一些注释(对代码的作用进行了详细的解释)。

打开human_activity_reco.py文件,来看一下下面这段代码:

2-6行是引入包。对于今天这份讲义,你需要安装OpenCV4和imutils。如果你没有安装OpenCV的话,借助pip install opencv指令来进行安装。

pipinstall opencvhttps://www.pyimagesearch.com/2018/09/19/pip-install-opencv/

10-16行来解析指令行参数:

–model :训练人类文明公益活动辨识数学模型的路径。–classes :公益活动辨识类型标签文档的路径。–input 一个用于存放输入视频文件的可选路径。这个参数并没有主要包括在命令行之内,你的网络是想头也能在这里被调用。

从这里开始他们来执行初始化:

自动草稿

第21行是加载文责任编辑件中的类型标签。

第22和23行定义采样持续时长(用于分类的帧数)和采样尺寸(每一帧的空间维度大小)。

接下来,他们将会加载并初始化人类文明公益活动辨识数学模型:

自动草稿

第27行借助OpenCV的DNN模块来读取PyTorch中预训练的人类文明公益活动辨识数学模型。

第31行是对他们的视频流进行实例化,或者是选择一个视频文件,或者是使用网络摄像头。

他们现在准备开始对帧图像进行循环,并执行人类文明公益活动辨识:

第34行开始循环他们的帧图像,当中帧的批处理将会经过神经网络(第37行)。

第40-53行用于从他们的视频流中构建帧的批处理。第52行将对每一帧图像调整尺寸至400像素宽,而且保持原长宽比不变。

让他们创建自己的输入帧的二进制对象blob,他们此后把它交给人类文明公益活动辨识卷积网络来处理:

第56-60行是从输入帧列表中创建二进制blob对象。

请注意他们用了blobFromImages (复数形式),而不是blobFromImage (单数形式)作为函数——原因是他们构建了一个多幅图片的批次来进入人类文明公益活动辨识网络,从而获取了时空信息。

如果你在代码中插入一行 print(blob.shape)的指令,你会注意到这个blob的维度是这样的:

(1, 3, 16, 112, 112)

让他们对这组维度有一个更清楚的了解:

1:批次维度。他们只有单个数据点经过网络(单个数据点在这里代表着N帧图像经过网络只为了获得单个类型)。3:输入帧图像的通道数。16: 每一个blob中帧图像的总数量。112(第一个):帧图像的高度。112(第二个):帧图像的宽度。

至此,他们已经做好了执行人类文明公益活动辨识推断的准备,然后在给每一帧图像标注上预测的标签,并将预测结果展示在屏幕上:

第64和65行将blob透过网络,获得输出列表(预测结果)。

随后他们选取最高的预测结果作为这个blob的标签(第66行)。

借助这个标签,他们能抽取出帧图像列表中每个帧图像的预测结果(69-73行),显示输出帧图像,直到按下q键时就打破循环并退出。

一个借助双队列(Deque)数据结构的人类文明公益活动同时实现的替代品

在上一章节关于的人类文明公益活动辨识中,你从会注意到这几行代码:

这一同时实现意味着:

程序会去从他们的输入视频中读取全部SAMPLE_DURATION帧数的图像。程序会将所有帧图像输入到人类文明公益活动辨识数学模型中来获得输出。接着程序会读取另外一部分SAMPLE_DURATION帧数的图像,然后继续重复这个过程。

因此,他们的程序同时实现并不是一个移动的预测。

与之相反,它只是简单地抓取一个样本的帧图像,然后进行分类,然后再去处理下一批次。上一批次的任意一帧图像都是被丢弃的。

他们之所以这样做是为了提高处理速度。

如果他们给每一帧单独分类的话,那他们执行脚步的时间就会被拉长。

这说明,透过deque数据结构来进行移动帧图像预测能获得更好的结果,因为它不会放弃前面全部的帧图像——移动帧图像预测只会丢弃列表中最早进入的帧图像,为那新到的帧图像腾出空间。

为了更好的展示为什么这个问题会与推断速度相关,让他们设想一个含有N帧图像的视频文件:

如果他们用移动帧图像预测,他们进行N次分类,即每1帧图像都进行1次(当然是等deque数据结构被填满时)。如果他们不用移动图像预测,他们只需要进行 N /SAMPLE_DURATION次分类,这会显著地缩短程序执行一个视频流的总时间。

图4:移动预测(蓝色)借助一个完全填充的FIFO队列窗口来进行预测

批次预测(红色)不需要一帧一帧地移动。移动预测需要更多的计算力,但对于借助OpenCV和广度自学的人类文明公益活动辨识来说会有更好的效果。

OpenCV的这一dnn模块并不被大多数GPU(主要包括英伟达的GPU)所支持,我提议你不要对于大多数应用来说还是不要使用移动帧预测。

在今天这篇讲义的.zip文件中,你会找到一个名为human_activity_reco_deque.py的文件,这一文件主要包括一个借助移动帧预测的人类文明公益活动辨识同时实现。

这一个脚本与上一个非常相似,我把它放在这里是让你去尝试一下:

引入的库与之前是完全相同的,除了需要再加上Python中collections 模块的deque 同时实现(第二行)。

在第28行,他们初始化了一个FIFO帧队列,当中最大的长度等于他们的采样时长。他们的先进先出(FIFO)队列将会自动弹出最先进入的帧并接收新的帧。他们针对帧队列进行移动推断。

其余所有的代码都是相同的,接下来让他们来检查一下处理帧图像的循环:

第41-57行与他们之前的脚本是不一样的。

在上一个版本的脚本中,他们抽取了一个带有SAMPLE_DURATION数量帧的一个批次,然后再在这个批次上进行推断。

在这个脚本中,他们依旧是以批次为单位进行推断,但现在是移动批次。不同点就在他们在第52行把帧图像放入到了FIFO队列里。如上文介绍,这个队列拥有maxlen 个单位的采样时长,而且队列的头部永远是他们的视频流的当前帧。一旦这个队列被填满,旧的帧图像就会被这个FIFO双端队列同时实现自动弹出。

这个移动同时实现的结果就是一旦当队列被填满,每一个给出的帧图像(对于第一帧图像来说例外)就会被触碰(被包含在移动批次里)一次以上。这个方法的效率要低一些;但是它却能获得更高的公益活动辨识准确度,特别是当视频或现场的公益活动周期性改变时。

第56和57使得他们的帧队列在做出任何推断之前,把帧对列填充好。(例如在图4蓝色区域的前16帧所显示的)。

一旦这个队列被填满,他们将能执行一个移动的人类文明公益活动辨识预测:

这一段代码块包含的每一行代码与他们之前的脚本是相同的,在这里他们进行了以下操作:

从他们的帧队列中创建了一个blob。进行了推断,并获得了blob中概率最高的预测。用平均移动队列所生成的人类文明公益活动辨识标签对当前帧图像进行注释和显示。一旦按下q键,程序将会退出。

人类文明公益活动辨识在实际应用中的结果

让他们看看人类文明公益活动辨识在实际应用中的结果。

在这里,打开terminal,执行以下命令:

请注意他们的人类文明公益活动辨识数学模型要求的OpenCV最低版本是4.1.2.

如果你使用的OpenCV版本过低,那么就会收到以下报错信息:

如果你收到以上信息,说明你需要更新你的OpenCV版本至4.1.2以上。

下面这个例子就是他们的数学模型正确地给这段视频打上瑜伽的标签。

请注意他们的数学模型在辨识时对预测是瑜伽还是拉伸腿部犹豫不决——当你在做下犬式姿势时,这两个姿势术语从技术层面来看都是正确的。从定义上来讲,你在做瑜伽的同时,也是在拉伸腿部。

在下一个样例中,人类文明公益活动辨识数学模型正确地预测出了这是在做滑板运动。

你能看到数学模型也会把这个公益活动预测为跑酷。滑滑板的人在栏杆上跳跃,这很像是跑酷者可能的姿势。

有人饿了吗?

如果谁饿了,一定会对这个做披萨感兴趣:

但在你吃披萨前,请确保你已经洗手:

如果你沉浸于喝啤酒,你最好注意一下饮酒量,酒吧侍者有可能会把你灌醉:

你能看出,他们的人类文明公益活动辨识数学模型可能不够完美,但是考虑到本技术上的简单性(只是将ResNet的2D输入改为3D),它的表现还是不错的。

人类文明公益活动辨识问题还远远没有解决,但在广度自学和卷积神经网络的帮助下,他们已经朝这个方向迈出了一大步。

总结

在这篇讲义中说你怎样用OpenCV和广度自学来同时实现人类文明公益活动辨识。

为了完成这一各项任务,他们借助了Kinetics数据集对人类文明公益活动辨识数学模型进行了预训练,这一数据集包含400-700种人类文明公益活动(依赖于你使用的数据集的版本)和少于300,000个视频剪辑。

他们使用的数学模型是带有变动的ResNet, 改动的方面是用3D核函数代替了原本的2D滤镜,使得数学模型具有了可用于公益活动辨识的时间维度成分。

想要了解更多,你能写作Hara等人在2018年发表的论文《Can Spatiotemporal 3D CNNs Retrace the History of 2D CNNs and ImageNet》

最后,他们用OpenCV和Hara等人的在PyTorch上的同时实现OpenCV的dnn数学模型,生成了人类文明公益活动辨识数学模型。

基于他们所取得的结果,他们能看出这个数学模型可能不够完美,但是表现还是不错的。

原文标题:

Human Activity Recognition with OpenCV and Deep Learning

原文镜像:

https://www.pyimagesearch.com/2019/11/25/human-activity-recognition-with-opencv-and-deep-learning/

编辑:王菁

校订:林亦

译者简介

吴振东,法国洛林大学计算机与决策专业硕士。现从事人工智能和大数据相关工作,以成为数据科学家为终生奋斗目标。来自山东济南,不会开挖掘机,但写得了Java、Python和PPT。

—完—

关注清华-青岛数据科学研究院官方微信公众平台THU数据派及姊妹号数据派THU获取更多讲座福利及优质内容。

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!