姿态矫正app-不良坐姿语音提示

news2024/11/15 9:13:52

“让爷康康”是一款应用于安卓平台的手机应用,可以实时监测不良坐姿并给出语音提示。本项目主要基于 [Tensorflow Lite 官方示例 - 姿态估计]
在这里插入图片描述

文件结构

├───android
│   ├───app
│   │   └───src
│   └───gradle
├───doc_images
├───main
│   └───pose_data
│       └───train
│           ├───forwardhead
│           └───standard

项目的两个主要文件夹为 android/main/android/ 下包含了所有与移动 App 相关的代码,main/ 文件夹下则是分类网络的训练数据与记录了训练过程的 pose_classification.ipynb 文件,训练数据存放在 main/pose_data/train/ 目录下,为精简项目体积,只上传了 pose_classification.ipynb 用到的两张示例图片。如果需要训练分类模型,可以按 pose_classification.ipynb 上面的指示填充 main/pose_data/train/main/pose_data/test/ 两个文件夹。doc_images/ 文件夹下是本文档所用到的示例图片,并不包括项目代码。

在 Android Studio 中编译程序并运行

本项目 Android 工程部分已编译为 apk 安装包,可直接在项目发布页面下载安装进行测试。如需进一步开发测试,可以在 Android Studio 中对安卓工程文件进行编译。

准备工作

  • 安卓项目的编译需要 Android Studio,可以进入官方网站按照说明进行下载安装。

  • 需要准备一部安卓手机。

编译程序

  • 通过 git clone 克隆本项目,或者以压缩包形式下载项目文件并解压。

  • 打开 Android Studio,在初始的 Welcome 界面选择
    Open an existing Android Studio project,打开项目中的安卓工程文件夹。

  • 安卓工程文件位于本项目的 android/ 文件夹下。在 Android Studio 的提示窗口中选择该文件夹。项目打开后软件可能会提示需要进行 Gradle 同步,同意并等待同步完成即可。

  • 将处于开发者模式的手机通过 USB 线连接到电脑,具体连接方法可以参考官方教程。如果程序顶部工具栏右侧正确显示了你的手机型号,说明设备连接成功。

  • 如果是首次安装 Android Studio,可能还需要安装一系列开发工具。点击软件界面右上角的绿色三角按钮Run 'app'直接运行程序。如果有需要安装的工具,系统会进行提示,按照提示依次安装即可。

模型介绍

本项目需要用到两个神经网络模型文件,均已包含在本项目中,不需要额外下载。第一个是 int8 格式的 MoveNet Thunder 神经网络模型,可以点击官方模型文件链接进一步了解。MoveNet 是谷歌推出的轻量级人体姿态估计模型,有 Thunder 和 Lightning 两个版本。其中 Thunder 版本运行速度较慢,但准确率更高,本项目使用的是 Thunder 版本。该版本又分为 float16int8 两种数据格式。其中 float16 模型只能在通用 GPU 上运行,而 int8 模型既可以运行于通用 GPU 之上,也可以在高通骁龙处理器的 Hexagon DSP 数字信号处理器上运行。运行在 Hexagon 处理器上时,AI 程序运行速度更快、也更省电,建议对 AI 模型进行移动部署时优先选择 Hexagon 处理器。目前谷歌也推出了自研的 Google Tensor 处理器,最新型号为 Tensor G2,如何调用 Tensor 处理器的 AI 加速单元尚不清楚,未来拿到设备实测确认后会更新文档。

训练自己的分类网络

在这里插入图片描述

除了 MoveNet Thunder,本项目还使用了一个简单的全连接网络对 MoveNet 输出的姿态信息(人体 17 个关键点的坐标)进行分类,用来判断画面中的人处于“标准坐姿”、“翘二郎腿”、“脖子前倾驼背”中的哪一种状态。关于该分类网络的介绍以及训练过程实际演示,可以参考 Tensorflow Lite 的 Jupyter Notebook 教程,或是本项目中修改并注释过的版本。本项目为了对“标准坐姿”、“翘二郎腿”、“脖子前倾驼背”三种姿态进行分类,为每种姿态采集了约 300 张照片作为训练集(共 876 张照片),为每种姿态采集了约 30 张作为测试集(共 74 张照片)。其中训练集与测试集为不同人物主体,以此来在训练过程中及时发现模型的过拟合问题。训练数据应存放于 main/pose_data/train/ 路径下的 standardcrosslegforwardhead
三个文件夹中,测试数据则位于 main/pose_data/test/ 路径下。本项目中用于训练分类网络的 Jupyter Notebook 会将原始数据自动转化为训练数据包,在此过程中生成每张照片的 MoveNet 检测结果,并将每张照片标记为三种姿态中的一种,最后将所有信息存储在 main/pose_data/train_data.csvmain/pose_data/test_data.csv,并生成记录标签信息的文本文件 main/pose_data/pose_labels.txt。在 Notebook 中训练完毕后,在 main/pose_data/ 路径下会自动生成 .tflite 权重文件,导入至 Android Studio 项目中,替换掉本项目中的 android\app\src\main\assets\classifier.tflite 即可使用。

运行效果

将手机连接至电脑,Android Studio 可以对本项目进行编译并将 App 安装至手机。打开应用,授权使用相机后,App 便可以监测人体坐姿并根据实时检测结果给出语音提示。程序的显示界面主要分为上、中、下三部分,顶部显示 AI 对当前姿态的判断结果,中部为摄像头实时画面,底部为信息显示界面,其中“运算设备”一栏可以选择不同选项,使用 CPU、GPU 或 NNAPI(Hexagon AI 加速器)进行计算,其中 NNAPI 速度最快,也最省电。为了避免程序误报,App 加入了一系列判断逻辑以提高 Precision(精确率)。连续 30 帧出现不健康坐姿时,程序会进入警戒状态,此时如果接下来 30 帧画面同样均判定为不健康坐姿,程序才会发出语音提示。效果如图所示:

在这里插入图片描述
在这里插入图片描述

最后:计算机视觉、图像处理、毕业辅导、作业帮助、代码获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科普文:JUC系列之Java中7种阻塞队列DelayQueue用法

阻塞队列DelayQueue是一种无界阻塞队列,‌用于放置实现了Delayed接口的对象。‌这些对象只能在其到期时才能从队列中取走,‌这种队列是有序的,‌即队头对象的延迟到期时间最长。‌如果没有任何延迟到期的对象,‌那么就不会有任何头…

示例:在ML.NET中应用Model Builder模型生成器构建图片对象检测模型

一、目的:ML.NET 是一个开源且跨平台的机器学习框架,专为 .NET 开发人员设计。它允许你在 .NET 应用程序中构建、训练和部署机器学习模型,而无需离开 .NET 生态系统。ML.NET 支持多种机器学习任务,包括分类、回归、聚类、异常检测…

五、栈与队列(2)

五、栈与队列(2) [150. 逆波兰表达式求值 ](https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/)[239. 滑动窗口最大值 ](https://leetcode.cn/problems/sliding-window-maximum/description/)[347.前 K 个高频元素 ](https:/…

python学习(day1)

1.Python 是大小写敏感的语言。 比如 print 函数名,该函数定义就是全部小写的, 不能写成 Print 或者 PRINT。 2.在Python语言中也会涉及到 对象, 这些对象包含了一定的数据信息。 Python语言中,所有的 数据 都被称之为 对象。 …

Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务

上一篇文章中,我们使用 Traefik 新版本完成了本地服务网关的搭建。接下来,来使用 Traefik 的能力,进行一系列相关的基础设施搭建吧。 本篇文章,聊聊 MinIO 的单独使用,以及结合 Traefik 完成私有化 S3 服务的基础搭建…

C语言:qsort详解

在上一篇文章我们大致的了解了回调函数的用法和作用,在这一篇让我们来了解一下在回调函数qsort的使用吧。 一.qsort qsort是一种用来排各种类型数据的函数,利用的是快速排序的方式。说到排序,我们就想到了之前学习的冒泡排序,但…

MySQL数据如何高效实时同步到Elasticsearch?【送源码】

概述 在实际的项目开发与运维过程中,MySQL 常常扮演着业务数据库的核心角色,以其强大的事务处理能力和数据完整性保障,支撑着系统的稳定运行。然而,随着数据量的急剧增长和查询复杂度的不断提升,单一依赖 MySQL 进行高…

文章管理接口——里面有动态SQL编写,在分页查询里

1.实体类和表结构 2. 新增文章分类 接口文档 实现 完整代码放在校验部分 结果: 参数校验(Validation自定义) 对state的校验(已发布|草稿),已有的注解不能满足校验需求,这时就需要自定义校验注解…

Day30 | 62.不同路径 63. 不同路径 II 343.整数拆分 96不同的二叉搜索树

语言 Java 62.不同路径 不同路径 题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问…

JVM类加载中的双亲委派机制

【1】什么是双亲委派 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理&#xff0c…

【Git企业级开发实战指南①】Git安装、基本操作!

目录 一、Git是什么?1.1特点1.2功能1.3基本概念 二、Git安装2.1Ubuntu下安装2.2Centos下安装Git 三、Git基本操作3.1创建git本地仓库3.2配置Git3.3 工作区&暂存区&版本库3.4 实操案例3.4.1添加文件 3.5 修改文件3.6版本回退3.7查看历史操作日志3.7撤销修改3…

广东省各区县农业产量数据,数据精度至各区县,2020-2023年四年数据可选!

数据名称: 广东省各区县农业产量数据 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据时间:2020-2023年 数据来源:广东省统计年鉴 数据字段: 序号字段名称字段说明1province省份名称2city城市名称3county区县名称4cou…

【C++深度探索】红黑树的底层实现机制

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:C从入门至进阶 这里将会不定期更新有关C/C的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 前言 红…

VNC未授权访问漏洞

VNC 是虚拟网络控制台Virtual Network Console的英文缩写。它是一款优秀的远程控制工具软件由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于 UNXI 和 Linux 的免费开源软件由 VNC Server 和 VNC Viewer 两部分组成。VNC 默认端口号为 5900、5901。VNC 未授权访问漏…

STM32F407移植LVGL(V8.3版本)

一、LVGL简述 1.丰富且强大的模块化图形组件:按钮、图表、列表、滑条、图片等 2.高级图形引擎:动画、抗锯齿、透明度、平滑滚动、图层混合等效果 3.支持多种输入设备:触摸屏、键盘、编码器、按键等 4.配置可裁剪,最低资源占用&am…

latex中Function函数报错

latex写伪码时,发现报错,截图如下: 解决办法,添加宏包,截图如下: \usepackage{algpseudocode}

虚幻引擎 C++ 实现平面阴影

1、平面阴影介绍 平面阴影是一种相对简单的渲染阴影的方式,可以理解为对一个模型渲染两次,一次是渲染模型本身,另一次是渲染模型的投影。渲染投影可以看作是将模型的顶点变换到地面的投影空间再渲染,可以理解为渲染了一个“压扁”…

pytorch学习笔记6 tensor拼接和拆分

cat 合并 dim必须首选相同(上例都是3),其次除了合并的dim(上例中为dim0)外,其它dim的size必须相同(dim 1的size是32,dim2的size是8),否则需要手动处理到相同…

vue3 + Spingboot + oracle 通过Base64存储图片

一 、前言 近期在做vue3 Springboot oracle 的工作&#xff0c;有个小功能通过页面导入图片保存到oracle数据库中&#xff0c;本人对前端不是很熟悉&#xff0c;借此记录一下实现方法&#xff1b; 二、前端部分代码 <template><div class"dialog-mian"&…

SQL注入实例(sqli-labs/less-7)

0、初始页面 1、确定闭合字符 确定闭合字符为单引号括号括号 )) ?id1 and 11 ?id1 and 12 ?id1 ?id1)) 2、查看securie_file_priv参数 ?id1)) and upddatexml(1,concat(0x7e,(select secure_file_priv),0x7e),1) -- 3、写入一句话木马 ?id1)) union select null,&q…