基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(三)

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 1. 数据预处理
    • 2. 数据增强
    • 3. 模型构建
    • 4. 模型训练及保存
      • 1)模型训练
      • 2)模型保存
    • 5. 模型评估
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

本项目依赖于Keras深度学习模型,旨在对手语进行分类和实时识别。为了实现这一目标,项目结合了OpenCV库的相关算法,用于捕捉手部的位置,从而能够对视频流和图像中的手语进行实时识别。

首先,项目使用OpenCV库中的算法来捕捉视频流或图像中的手部位置。这可以涉及到肤色检测、运动检测或者手势检测等技术,以精确定位手语手势。

接下来,项目利用CNN深度学习模型,对捕捉到的手语进行分类,经过训练,能够将不同的手语手势识别为特定的类别或字符。

在实时识别过程中,视频流或图像中的手语手势会传递给CNN深度学习模型,模型会进行推断并将手势识别为相应的类别。这使得系统能够实时地识别手语手势并将其转化为文本或其他形式的输出。

总的来说,本项目结合了计算机视觉和深度学习技术,为手语识别提供了一个实时的解决方案。这对于听觉障碍者和手语使用者来说是一个有益的工具,可以帮助他们与其他人更轻松地进行交流和理解。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括 Python 环境、TensorFlow环境、 Keras环境和Android环境。

模块实现

本项目包括6个模块:数据预处理、数据增强、模型构建、模型训练及保存、模型评估和模型测试,下面分别介绍各模块的功能及相关代码。

1. 数据预处理

在Kaggle上下载相应的数据集,下载地址为https://www.kaggle.com/ardamavi/sign-language-digits-dataset。

详见博客。

2. 数据增强

为方便展示生成图片的效果及对参数进行微调,本项目未使用keras直接训练生成器,而是先生成一个增强过后的数据集,再应用于模型训练。

详见博客。

3. 模型构建

数据加载进模型之后,需要定义模型结构,并优化损失函数。

详见博客。

4. 模型训练及保存

本部分包括模型训练和模型保存的相关代码。

1)模型训练

定义模型结构后,通过训练集训练模型,使模型能够识别手语数字。此处将使用训练集、验证集和测试集用于拟合并保存模型。在训练模型过程中,为防止训练过度造成的模型准确度下降,还使用了early stopping技术在一定条件下提前终止训练模型。相关代码如下:

from keras.callbacks import EarlyStopping
def split_dataset(X, y, test_size=0.3, random_state=42):      #分割数据集X_conv=X.reshape(X.shape[0], X.shape[1], X.shape[2],1)return train_test_split(X_conv,y, stratify=y,test_size=test_size,random_state=random_state)
callbacks=None
X_train, X_validation, y_train, y_validation = split_dataset(X_added, y_added)
X_validation, X_test, y_validation, y_test = split_dataset(X_validation, y_validation)
#epochs=80
earlyStopping = EarlyStopping(monitor = 'val_loss', patience=20, verbose = 1) 
if callbacks is None:callbacks = [earlyStopping]#模型训练#history = LossHistory()history = model.fit(X_train, y_train, validation_data=(X_validation, y_validation),callbacks=[earlyStopping],epochs=80,verbose=1)
test_scores=model.evaluate(X_test, y_test, verbose=0)   #模型评估
train_scores=model.evaluate(X_validation, y_validation, verbose=0)
print("[INFO]:Train Accuracy:{:.3f}".format(train_scores[1]))
print("[INFO]:Validation Accuracy:{:.3f}".format(test_scores[1]))
print(plt.plot(history.history["acc"]))
print(plt.plot(history.history["val_acc"]))
from sklearn.metrics import confusion_matrix
#生成混淆矩阵
X_CM=np.reshape(X_test,(X_test.shape[0],64,64,1))
y_pred=model.predict(X_CM)                   #使用整个数据集的数据进行评估
y_ture=decode_OneHotEncoding(y_test)       #One-hot编码的解码
y_ture=correct_mismatches(y_ture)           #图像标签的修正
y_pred=decode_OneHotEncoding(y_pred)
y_pred=correct_mismatches(y_pred)
confusion_matrix(y_ture, y_pred)             #绘制混淆矩阵

训练过程如图所示。

在这里插入图片描述

2)模型保存

为使训练的模型能够应用于Android Studio工程,将模型保存为.pb格式。相关代码如下:

from keras.models import Model
from keras.layers import *
from keras.models import load_model
import os
import tensorflow as tf
def keras_to_tensorflow(keras_model, output_dir, model_name,out_prefix="output_", log_tensorboard=True):#如果目的路径不存在则新建目的路径if os.path.exists(output_dir) == False:  os.mkdir(output_dir)#根据keras模型构建tensorflow模型out_nodes = []for i in range(len(keras_model.outputs)):  out_nodes.append(out_prefix+str(i+1))tf.identity(keras_model.output[i],out_prefix+str(i+ 1))#将tensorflow模型写入目标文件sess=K.get_session()from tensorflow.python.framework import graph_util, graph_ioinit_graph=sess.graph.as_graph_def()    main_graph=graph_util.convert_variables_to_constants(sess,init_graph,out_nodes)graph_io.write_graph(main_graph,output_dir,name=model_name,as_text=False)#展示相关信息if log_tensorboard:from tensorflow.python.tools import import_pb_to_tensorboard        import_pb_to_tensorboard.import_to_tensorboard(os.path.join(output_dir,model_name),output_dir)
output_dir="/Users/chenjiyan/Desktop/信息系统设计项目"   #目的路径
keras_to_tensorflow(model,output_dir=output_dir,model_name="trained_model_imageDataGenerator.pb")
print("MODEL SAVED")

5. 模型评估

由于网络上缺乏手语识别相关模型,为方便在多种模型中选择最优模型,以及进行模型的调优,模型应用于安卓工程之前,需要先在PC设备上使用Python文件进行初步的运行测试,以便验证本方案的手语识别策略是否可行并选择最优的分类模型。具体步骤如下:

(1) 定义皮肤粒子的识别函数,在原图中将不符合肤色检测阈值的区域涂黑。

相关代码如下:

#导入相应包
import cv2
import numpy as np
import keras
from keras.models import load_model
#肤色识别,函数引用自https://blog.csdn.net/qq_23149979/article/details/88569979
def skin(frame):lower = np.array([0, 40, 80], dtype="uint8")upper = np.array([20, 255, 255], dtype="uint8")converted = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)skinMask = cv2.inRange(converted, lower, upper)  #构建提取阈值skinMask = cv2.GaussianBlur(skinMask, (5, 5), 0)skin = cv2.bitwise_and(frame, frame, mask=skinMask)  #将不满足条件的区域涂黑
return skin

(2)打开本地摄像头权限,加载训练好的模型,在while()函数中设定识别手部区域的时间间隔。

(3)使用肤色进行轮廓提取,将提取到的区域进行高斯滤波以及二值化,并使用find-Contour()函数进行轮廓提取,对比每个轮廓大小,并将面积小于阈值的连通域忽略。

(4)使用boundingRect()函数提取原图的手部区域后,将所提取到的区域送至训练好的模型进行分类。相关代码如下:

#主函数
def main():capture = cv2.VideoCapture(0)#model = load_model("/Users/chenjiyan/Desktop/信息系统设计项目/trained_model_ResNet.h5")   #加载模型model = load_model("/Users/chenjiyan/Desktop/信息系统设计项目/trained_model_2.h5")  #加载模型iteator=0while capture.isOpened():iteator=iteator+1if iteator>1000 :iteator=0pressed_key = cv2.waitKey(1)_, frame1 = capture.read()frame1=cv2.flip(frame1,1)#显示摄像头#cv2.imshow('Original',frame1)#皮肤粒子识别frame = skin(frame1)#灰度frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #高斯滤波frame = cv2.GaussianBlur(frame, (5, 5), 0)#二值化ret, frame = cv2.threshold(frame, 50, 255, cv2.THRESH_BINARY)#轮廓_,contours,hierarchy = cv2.findContours(frame,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#print("number of contours:%d" % len(contours))cv2.drawContours(frame, contours, -1, (0, 255, 255), 2)#找到最大区域并填充area = []for i in range(len(contours)):area.append(cv2.contourArea(contours[i]))max_idx = np.argmax(area)for i in range(max_idx - 1):cv2.fillConvexPoly(frame, contours[max_idx - 1], 0)cv2.fillConvexPoly(frame, contours[max_idx], 255)#处理后显示x, y, w, h = cv2.boundingRect(contours[max_idx])if x>20 :x=x-20 else :x=0if y>20 :y=y-20 else :y=0h=h+30w=w+50cv2.rectangle(frame1,(x,y),(x+w, y+h),(0,255,0), 2)if iteator%5==0 :#模型预测chepai_raw = frame1[y:y + h, x:x + w]   #提取识别的矩形区域chepai=cv2.flip(chepai_raw,1)             #水平镜像翻转cv2.imshow("Live",chepai)                  #显示输入图像chepai=cv2.resize(chepai,(64,64),interpolation=cv2.INTER_CUBIC)#chepai = np.array(chepai)chepai=cv2.cvtColor(chepai,cv2.COLOR_RGB2GRAY)   #转换为灰度图片chepai=chepai/255chepai=np.reshape(chepai,(1,64,64,1))label_map={0:9,1:0, 2:7, 3:6, 4:1, 5:8, 6:4, 7:3, 8:2, 9:5}#result=model.predict_classes(chepai)#由于没有使用model=Sequential()序列化模型,所以不能使用predict_classesresult = model.predict(chepai)result=np.argmax(result,axis=1)print(label_map[result[0]])#显示图像#cv2.imshow("Live",frame)       #轮廓cv2.imshow('Original',frame1)  #原始图像if pressed_key == 27:break
cv2.destroyAllWindows()
capture.release()

相关其它博客

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(一)

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(二)

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(四)

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(五)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

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

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

相关文章

Mybatis-Flex框架初体验

本篇文章内容主要包括: MyBatis-Flex 介绍 MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用Mybaits-Flex链接任何数据库,其内置的QueryWrapper亮点帮助我们极大的减少了SQL编写的工…

企业虚拟化KVM的三种安装方式(1、完全文本2、模板镜像+配置文件3、gustos图形方式部署安装虚拟机)

一、安装完虚拟机后的操作 第一步: 第二步:分配的内存大一下,处理器多些 第三步:打开虚拟化 打开虚拟机、安装KVM 一般企业如果使用kvm虚拟化平台,都会把物理服务器装成Centos的操作系统,然后装上kvm,创建…

crypto:摩丝

题目 根据题目所给的压缩包下载后解压,打开文本提示 摩斯密码,对照表可解码得到flag

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测&#…

Cesium 问题:三维场景下添加的实体会被遮挡

文章目录 问题分析 问题 在三维场景下,我们添加的实体会被遮挡导致显示不够完整,例如 而应该的效果如下 分析 在三维场景中,实体可能会被以下几类物体或因素所遮挡: 地形:如果实体位于地球表面附近,地形…

GoLang 百行代码实现小项目《家庭收支软件》

界面显示 实现思路 GoLang 百行代码实现的小项目《家庭收支软件》是一个简单的家庭收支记账软件,可以通过命令行界面记录和显示收支明细。 在代码中,定义了两个结构体类型:record(代表一条收支记录)和software&#…

Tomcat部署、优化、以及操作练习

目录 一.Tomcat的基本介绍 1.1.Tomcat是什么? 1.2.Tomcat的组件构成 1.3.Tomcat功能组件结构的核心功能 1.4.Tomcat的顶层架构 1.5.Tomcat的请求过程 1.6.Tomcat的配置文件 二.Tomcat服务部署 2.1.搭建Tomcat运行环境 2.2.安装启动Tomcat 三.Tomcat服务优…

LLM(二)| LIMA:在1k高质量数据上微调LLaMA1-65B,性能超越ChatGPT

本文将介绍在Lit-GPT上使用LoRA微调LLaMA模型,并介绍如何自定义数据集进行微调其他开源LLM 监督指令微调(Supervised Instruction Finetuning) 什么是监督指令微调?为什么关注它? 目前大部分LLM都是decoder-only&…

一图读懂「五度易链」大数据智慧招商解决方案,一站式招商、选商!

“五度易链”以全体量产业大数据为依托,将为区域政府或产业园区构筑智慧招商解决方案,提供从“招商渠道”到“招商评估”再到“招商管理”一站式招商、选商服务。解决招商线索匮乏、招商管理碎片化等一系列问题,还将提供企业综合能力甄别及客…

一台电脑安装多个不同版本Python

1、前提 当前Windows电脑下已经安装了一个python3.11,现在需要安装一个python3.9。下载地址:Python Releases for Windows | Python.org 2、步骤 找到对应的版本,并下载安装包。下载后,打开安装包。按图片勾选,点击n…

分布式算法相关,使用Redis落地解决1-2亿条数据缓存

面试题:1~2亿数据需要缓存,请问如何设计个存储案例 回答:单机单台100%不可能,肯定是分布式存储,用redis如何落地? 一般业界有三种解决方案: 哈希取余分区 2亿条记录就是2亿个k,v&…

6.wifi开发【智能家居:下】,正式开发:智能开关灯,智能采集温湿度,智能调彩灯

一。WEB Server开发 1.需求分析 用户通过页面操作插座彩灯温湿度 【开发前端1】:智能插座网页设计 智能插座网页设计需求 1.通过浏览器访问ESP8266 webserver 2.显示“创客学院-WiFi-智能家居” 3.显示“智能插座” 4.显示当前插座工作状态 5.按键触发插座动作 2.…

Vue3+element-plus切换标签页时数据保留问题

记录一次切换标签页缓存失效问题,注册路由时name不一致可能会导致缓存失效

【前端面试题】2023年 国庆 前端面试真题之JS篇

人的一生,总是难免有浮沉。不会永远如旭日东升,也不会永远痛苦潦倒。反复地一浮一沉,对于一个人来说,正是磨练。因此,浮在上面的,不必骄傲;沉在底下的,更用不着悲观。必须以率直、谦…

21.redo日志(下)

title: “redo日志(下)” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” redo log的刷盘时机 log buffer 空间不足时&…

selenium-webdriver 阿里云ARMS 自动化巡检

很久没更新了,今天分享一篇关于做项目巡检的内容,这部分,前两天刚在公司做了部门分享,趁着劲还没过,发出来跟大家分享下。 一、本地巡检实现 1. Selenium Webdriver(SW) 简介 Selenium Webdriver(以下简称…

多线程的死锁问题

可重入和不可重入😊😊😊 一个线程针对同一个对象,连续加锁两次,是否会有问题 ~~ 如果没问题,就叫可重入的.如果有问题,就叫不可重入的. 代码示例🍉🍉🍉: synchronized public void add(){synchronized (…

vue wangEditor富文本编辑器 默认显示与自定义工具栏配置

1.vue 显示wangEditor富文本编辑器 <template><div style"border: 1px solid #ccc;"><Toolbar style"border-bottom: 1px solid #ccc" :editor"editor" :defaultConfig"toolbarConfig" :mode"mode"/><…

在线商城项目EShop【ListView、adapter】

要求如下&#xff1a; 1、创建在线商城项目EShop&#xff1b; 2、修改布局文件activity_main.xml&#xff0c;使用LineaLayout和ListView创建商品列表UI&#xff1b; 3、创建列表项布局list_item.xml&#xff0c;设计UI用于显示商品图标、名称和价格信息&#xff1b; 4、创…

流媒体播放器EasyPlayer.js无法播放H.265的情况是什么原因?该如何解决?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…