基于OpenCV和Tensorflow的深蹲检测器

重磅干货,第一时间送达

本期我们将介绍如和使用OpenCV以及Tensorflow实现深蹲检测

在检疫期间,我们的体育活动非常有限,这样并不好。在进行一些居家运动时,我们必须时刻保持高度的注意力集中,以便记录自己每天的运动量。因此我们希望建立一个自动化的系统来实现运动量计算。考虑到我们在深蹲时,有明确阶段和大幅度变化的基本运动,实现对深蹲的计数会相对比较简单。

下面我们就一起尝试实现它吧!

数据采集

使用带相机的Raspberry Pi来获取图片是非常方便的,完成图像的拍摄后再利用OpenCV即可将获取的图像写入文件系统。

运动识别

最初,我们打算使用图像分割完成人物的提取工作。但是我们都知道图像分割是一项非常繁琐的操作,尤其是在Raspberry资源有限的情况下。

除此之外,图像分割忽略了一个事实。当前我们所拥有的是一系列图像帧,而不是单个图片。该图像序列具有明显功能,并且我们后续将要使用到它。

因此,我们从OpenCV 着手进行背景去除,以提供了可靠的结果。

背景扣除

首先,创建一个背景减法器:

backSub = cv.createBackgroundSubtractorMOG2()

向其中添加图像帧:

mask = backSub.apply(frame)

最后我们可以得到一张带有身体轮廓的图片:

然后扩大图像以突出轮廓。

mask = cv.dilate(mask, None, 3)

将此算法应用于所有图像帧可以得出每一幅图像中的姿势。之后,我们将它们分类为站立,下蹲以及无三种情况。

接下来我们要把图像中的人提取出来,OpenCV可以帮助我们找到相应的找到轮廓:

cnts, _ = cv.findContours(img, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)

这种方法或多或少适用于人物的最大轮廓的提取,但不幸的是,这样处理的结果并不稳定。例如,检测得到最大的轮廓只能包括人的身体,而不包括他的脚。

但不管怎么说,拥有一系列图像对我很有帮助。通常情况下我们做深蹲运动都发生在同一地点,因此我们可以假设所有动作都在某个区域内进行并且该区域是稳定的。为此我们可以迭代构建边界矩形,如果需要,可以以最大轮廓增加边界矩形。

有一个例子:

· 最大的轮廓是红色

· 轮廓边界矩形为蓝色

· 图边界矩形为绿色

通过以上的边缘提取以及轮廓绘制,可以为进一步处理做好充足准备。

分类

接下来我们将从图像中提取出边界矩形,并将其转化为按尺寸64x64正方形。

以下Mask用作分类器输入:

站立姿势:

下蹲姿势:

接下来我们将使用Keras 与Tensorflow进行分类。

最初,我们使用了经典的Lenet-5模型,运行结果良好。随后由于阅读了一些有关Lenet-5变体的文章后,我们决定尝试简化架构。

事实证明,简化后的CNN在当前示例中的精度几乎相同:

model = Sequential([ Convolution2D(8,(5,5), activation='relu', input_shape=input_shape), MaxPooling2D(), Flatten(), Dense(512, activation='relu'), Dense(3, activation='softmax') ])model.compile(loss="categorical_crossentropy", optimizer=SGD(lr=0.01), metrics=["accuracy"])

10个纪元的准确度为86%,20个的准确度为94%,而30个的准确度为96%。训练如果在增加的话可能会导致过拟合引起准确度的下降,因此接下来我们将把这个模型运用到生活中去。

模型运用

我们将在Raspberry上运行。

加载模型:

with open(MODEL_JSON, 'r') as f:model_data = f.read()model = tf.keras.models.model_from_json(model_data)model.load_weights(MODEL_H5)graph = tf.get_default_graph()

并以此对下蹲Mask进行分类:

img = cv.imread(path + f, cv.IMREAD_GRAYSCALE)img = np.reshape(img,[1,64,64,1])with graph.as_default():c = model.predict_classes(img)return c[0] if c else None

在Raspberry上,输入为64x64的分类调用大约需要60-70毫秒,几乎接近实时。

最后让我们将以上所有部分整合到一个应用程序中:

· GET / —一个应用页面(下面有更多信息)

· GET / status-获取当前状态,下蹲次数和帧数

· POST / start —开始练习

· POST / stop —完成练习

· GET / stream —来自摄像机的视频流

如果本文对小伙伴有帮助,希望可以在文末来个“一键三连”。

交流群

(0)

相关推荐

  • Opencv实践

    Opencv实践 前言 一.安装库 二.基本操作 三.问题解决 结束语 前言  最近项目需要对图像进行一些预处理,想起了opencv这个好工具,话不多说,直接上笔记! 一.安装库 1.网上查找代码会看 ...

  • Python+opencv 图像处理(五)

        灰度反转 "你说的黑是什么黑......"有一首歌的歌词是这样的. 在图像中,黑是什么? 很简单,就是0嘛. 因为在数字图像里,用0表示黑. 那么,"你说的白是什 ...

  • 使用深度学习进行视频修剪

    介绍 在本教程中,我们将构建深度学习任务,自动修剪我们的视频使用标志!这样的应用程序可以让那些不擅长编辑视频的人们的生活变得更容易. 我们使用像"拇指朝上"和"拇指朝下& ...

  • OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  • OpenCV学习28

    查找轮廓 什么是轮廓:一个轮廓是由图像中的一系列点组成的,也就是图像中的一条曲线.在OpenCV中一般用序列来存储轮廓信息.序列中的每个元素是曲线中每个点的位置. 关于序列:序列是内存存储器中可以存储 ...

  • 图像旋转90/180 opencv坐标系

    问题描述: 图像旋转90.180.270等 使用类似下面的代码,会有黑边,图像变形之类的问题 其实windows系统自带类似的功能,但是我需要批量处理图像,因此尝试自己写 算法基础: 这种直角的旋转, ...

  • python+opencv图像处理(二)

    python+opencv图像处理(二) ----图像变换 自然界中有很多的颜色,红红的花,绿绿的草,蓝蓝的天,白白的云,多姿多彩的世界,美轮美奂的图像. 通过手机,照相机就可以定格每一个美的瞬间. ...

  • python+opencv图像处理(四十三)

    Luplacian算子 1.Luplacian算子 可以用二阶导数可以用来检测边缘,拉普拉斯算子是线性二阶微分算子. 2.Luplacian算子实现 在 OpenCV 中, 可以用函数Laplacia ...

  • python 图像处理:一福变五福

    快过年了,各种互联网产品都出来撒红包.某宝一年一度的集五福(shua hou)活动更是成为每年的必备活动.虽然到最后每人大概也就分个两块钱,但作为一个全民话题,大多数人还是愿意凑凑热闹.毕竟对于如今生 ...

  • 基于OpenCV的多位数检测器

    重磅干货,第一时间送达 现在数字无处不在,无论是闹钟.健身追踪器.条形码还是包装好了的送货包裹.利用MNIST数据集,机器学习可用来读取单个手写数字.现在,我们可以将其扩展为读取多个数字,如下所示.底 ...

  • 为了老后不卧床 这样的“柔性深蹲”建议50岁后1天做10个

    年龄增加,肌肉逐渐减少,且下半身肌肉更易减少,导致膝盖弯曲幅度变小.步伐变小,若到肌少症的程度,将提高老后卧床的风险! 深蹲可以增加下肢力量,但有些50岁后的人会担心深蹲伤腰与膝盖,或是体力上无法应付 ...

  • 徒手深蹲,怎样训练更有效?!

    深蹲是健身的王牌动作,深受健身者的喜爱,它作为下肢训练的黄金动作,特别是对于大腿.股四头肌的刺激和肺活量的提高有着重要而且不可替代的作用,是不可不练的动作. 徒手深蹲这个训练动作,是负重深蹲的基础,是 ...

  • 男子经常深蹲锻炼,把半月板蹲坏!医生告诉你:深蹲为何伤膝盖

    男子经常深蹲锻炼,把半月板蹲坏!医生告诉你:深蹲为何伤膝盖

  • 21种自重深蹲练法,在家就能练出翘臀美腿

    21种自重深蹲练法,在家就能练出翘臀美腿

  • 胯都没开,做什么深蹲?练什么臀腿?效果能好吗?

    男性比女性更需要做以下的练习! 倒不是说不开胯就不能做深蹲, 只是为了引起大家的重视, 小编我也是操碎了心那! 在日常的生活中, 人们越来越长时间的与椅子.办公桌为伴, 无论是上班族.还是学生, 每天 ...

  • 新手深蹲的致命错误,深蹲蹲得太低,腰椎受了大罪

    一般来讲,深蹲蹲得越低,训练效果越好,因为深蹲蹲的也低,臀腿肌肉的活动幅度就会越大,肌肉刺激效果就会更好. 但是有些玩家反映,深蹲蹲的越低,腰部酸痛会更加强烈.在这里需要提醒的是,新手深蹲幅度不能太低 ...

  • 深蹲--翘臀瘦腿

    深蹲--翘臀瘦腿

  • 深蹲:为了老后不卧床这样的“柔性深蹲”建议50岁后1天做10个

    年龄增加,肌肉逐渐减少,且下半身肌肉更易减少,导致膝盖弯曲幅度变小.步伐变小,若到肌少症的程度,将提高老后卧床的风险! 深蹲可以增加下肢力量,但有些50岁后的人会担心深蹲伤腰与膝盖,或是体力上无法应付 ...