运用OpenCV和深度进修来实现人类活动识别(附链接)_人类_图像
作者: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.***
想要理解关于该数据集的更多信息,包括是如何去整合数据,请参考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.*** : 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指令来进行安装。
pip install opencv
https://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 ”获取更多讲座福利及优质内容。
本文系作者个人观点,不代表本站立场,转载请注明出处!