基于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 —来自摄像机的视频流
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
基于OpenCV和Tensorflow的深蹲检测器相关推荐
- 基于OpenCV与tensorflow实现实时手势识别
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 干货-阅读需10分钟左右 基于OpenCV与tensorflow ...
- opencv jpg作为png背景_基于OpenCV与tensorflow实现实时手势识别
公众号[OpenCV学堂],致力于计算机视觉开发技术传播,原创技术文章200+的,涉及OpenCV开发.tensorflow开发.模型解析与训练.传统图像处理算法解析,对图像与视觉感兴趣的强烈推荐关注 ...
- 【机器学习】最容易实现的基于OpenCV的人脸检测代码、检测器及检测效果
基于opencv自带的人脸检测模型,实现简单的人脸检测功能,可作为机器学习初学者练手使用.简单易学,具体的方法及代码如下. 1.运行结果 输入原图 输出结果 2.工程需要加载的opencv库如下: 3 ...
- mediapipe KNN 基于mediapipe和KNN的引体向上计数/深蹲计数/俯卧撑计数【mediapipe】【KNN】【BlazePose】【K邻近算法】【python】
Mediapipe KNN引体向上计数/深蹲计数/俯卧撑计数 引言 功能 说明 步骤 训练样本 获取归一化的`landmarks` 使用KNN算法分类 计数器 入口函数main 过程中遇到的问题 检测 ...
- mediapipe KNN 基于mediapipe和KNN的引体向上计数/深蹲计数/俯卧撑计数【mediapipe】
原文链接:https://blog.csdn.net/m0_57110410/article/details/125569971 Mediapipe KNN引体向上计数/深蹲计数/俯卧撑计数 引言 功 ...
- 基于mediapipe和KNN算法的深蹲/引体向上计数检测【mediapipe】【BlazePose】【KNN邻接算法】
深蹲/引体向上计数检测 前言 一.什么是mediapipe 二.什么是BlazePose 三.KNN算法 四.软件环境 五.参考文档 一.代码实现 二.可能出现的问题 一.字体问题 二.upper_b ...
- 基于Opencv实现眼睛控制鼠标
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方 ...
- 基于opencv实战眼睛控制鼠标
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方 ...
- 基于OpenCV的视频处理管道
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目前可依靠模块化方式实现图像处理管道,检测一堆图像文件中的人脸,并 ...
最新文章
- JavaEE学习笔记之Servlet
- 面包板上的高频放大电路
- 图像处理之霍夫变换(直线检測算法)
- 使用elasticsearch-php需要注意的问题
- 第十一章:WEB浏览器中的javascript
- antlr 语言 库_关于ANTLR的通用库的需求:使用反射来构建元模型
- 区块链100讲:不做码农做矿工,该怎么和爹妈解释
- caffe 图片数据的转换成lmdb和数据集均值(转)
- java获取当前执行文件的路径
- 转一篇:如何快速的修改参考文献
- L1-024 后天 (5 分) — 团体程序设计天梯赛
- [Algorithm] Fibonacci Sequence - Anatomy of recursion and space complexity analysis
- 进阶篇|选购手游联运系统的注意事项有哪些?
- MOOS-ivp app发布车辆位置及控制车辆运动
- KDA,token.Kadena链的一些常识
- mysql内存会持续上涨,每天增加一点,一直到100%
- 英伟达或推出没有光线追踪的新款图灵架构GPU,这里有几个猜想...
- ios 判断手机角度_iOS 角度获取及旋转
- 低调推广重疾险 滴滴公司的金融帝国美梦能否真正实现?
- 海思[hi3531]编译环境搭建(针对用于编译程序不制作内核和系统的开发者)