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

news2025/2/28 7:03:08

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 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_io
    init_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=0
    while capture.isOpened():
         iteator=iteator+1
         if iteator>1000 :
            iteator=0
         pressed_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=0
         if y>20 :y=y-20 
         else :y=0
         h=h+30
         w=w+50
         cv2.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/255
         chepai=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_classes
         result = 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.coloradmin.cn/o/1026971.html

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

相关文章

JavaWeb学习总结(在IntelliJ IDEA中配置使用Tomcat)

1、配置 ​​​​​​​ 在 Libray 中选 Java 选项(也就是安装Tomcat的路径) 如果运行时端口被占用可以修改端口 例如:原8080,可改为8081(也可修改其他) 2、使用Serlvet package com.company;import java…

将近 5 万字讲解 Python Django 框架详细知识点(更新中)

Django 框架基本概述 Django 是一个开源的 Web 应用后端框架,由 Python 编写。它采用了 MVC 的软件设计模式,即模型(Model)、视图(View)和控制器(Controller)。在 Django 框架中&am…

Oracle查询固定时间间隔

获取每一天 SELECT (trunc(to_date(2023-01-01,YYYY-MM-DD), dd) LEVEL -1) as DATA_TIME FROM dual CONNECT BY LEVEL < 3;解释&#xff1a; 这个 SQL 查询语句的目的是生成一个包含三个日期的结果集。查询的结果是从当前日期开始的三个连续日期。让我解释一下查询的各个…

ClickHouse与Elasticsearch比较总结

目录 背景 分布式架构 存储架构 写入链路设计 Elasticsearch 再谈Schemaless 查询架构 计算引擎 数据扫描 再谈高并发 性能测试 日志分析场景 access_log&#xff08;数据量197921836&#xff09; trace_log&#xff08;数据量569816761&#xff09; 官方Ontime测…

爬虫入门基础与Selenium反爬虫策略

目录 一、爬虫入门基础 1、什么是爬虫&#xff1f; 2、爬虫的分类 3、爬虫的基本流程 二、Selenium简介 1、Selenium是什么&#xff1f; 2、Selenium的用途 三、应对反爬虫的Selenium策略 1、使用代理IP 2、模拟用户行为 3、设置合理的请求间隔时间 4、随机化请求参…

社区活跃开发者 Aaron 加入 sCrypt

Aaron&#xff08;周全&#xff09;是资深的 BSV 开发者&#xff0c;前 nChain BSV 基础架构团队成员&#xff0c;也是比特币协会在中国任命的首位技术推广专家。作为 BSV 社区的活跃成员&#xff0c;他多次作为演讲者参与区块链技术会议&#xff0c;开发了 Webot 应用、Witnes…

【完美解决】GitHub连接超时问题 Recv failure: Connection was reset

问题&#xff1a; 已经开了梯子但是在Idea中使用git&#xff08;GitHub&#xff09;还是连接超时Recv failure: Connection was reset。此时需要让git走代理。 解决方案&#xff1a; 1.对右下角网络点击右键 -> 打开网络和Internet设置 2.代理 -> 查看到地址和端口号…

智能生活从这里开始:数字孪生驱动的社区

数字孪生技术&#xff0c;这个近年来备受瞩目的名词&#xff0c;正迅速渗透到社区发展领域&#xff0c;改变着我们居住的方式、管理的方式以及与周围环境互动的方式。它不仅仅是一种概念&#xff0c;更是一种变革&#xff0c;下面我们将探讨数字孪生技术如何推动社区智能化发展…

淘宝分布式文件存储系统( 二 ) -TFS

淘宝分布式文件存储系统( 二 ) ->>TFS 目录 : 大文件存储结构哈希链表的结构文件映射原理及对应的API文件映射头文件的定义 大文件存储结构 : 采用块(block)文件的形式对数据进行存储 , 分成索引块,主块 , 扩展块 。所有的小文件都是存放到主块中的 &#xff0c;扩展块…

湖南湘潭家具3D轮廓扫描测量家居三维数字化外观逆向设计-CASAIM中科广电

随着科技的不断进步&#xff0c;CASAIM三维扫描技术在各个行业中得到了广泛应用&#xff0c;家具行业也不例外。传统的家具设计和展示方式已经无法满足现代消费者的个性化、多元化需求&#xff0c;而三维扫描技术的出现为家具行业带来了新的机遇和可能性。 家具表面有雕刻图案…

Selenium和Requests搭配使用

Selenium和Requests搭配使用 前要1. CDP2. 通过requests控制浏览器2. 1 代码一2. 2 代码2 3. 通过selenium获取cookie, requests携带cookie请求 前要 之前有提过, 用selenium控制本地浏览器, 提高拟人化,但是效率比较低,今天说一种selenium和requests搭配使用的方法 注意: 一定…

企业该如何选择数字化转型工具?_光点科技

随着科技的不断进步和数字化的浪潮席卷全球&#xff0c;企业数字化转型已经成为了保持竞争力和持续增长的关键因素之一。无论企业规模大小&#xff0c;数字化转型都可以提高效率、降低成本、改善客户体验&#xff0c;从而实现更好的业务结果。然而&#xff0c;要成功进行数字化…

Unity云原生分布式运行时

// 元宇宙时代的来临对实时3D引擎提出了诸多要求&#xff0c;Unity作为游戏行业应用最广泛的3D实时内容创作引擎&#xff0c;为应对这些新挑战&#xff0c;提出了Unity云原生分布式运行时的解决方案。LiveVideoStack 2023上海站邀请到Unity中国的解决方案工程师舒润萱&#x…

iPhone辐射超标,发布三年突然禁售了

昨晚 iPhone 15 预售大家抢到了吗&#xff1f; 虽然13日发布会后大家的反应十分冷静&#xff0c;但身体还是很诚实&#xff0c;官网都排到6-7周以后了... 在大伙都争着第一波尝鲜的时候&#xff0c;有一个地方正准备禁售 iPhone 。 不用想肯定是欧盟某个国家啦&#xff0c;这…

python正则表达(06)

python正则表达(06) 文章目录 python正则表达(06)1 正则表达式概念2 正则的三个基础方法2.1 match、search、findall三个基础方法2.2 re.match() 函数2.2.1 re.match(匹配规则&#xff0c;被匹配字符串)2.2.2验证是否开头匹配&#xff0c;match是匹配开头&#xff0c;后面的是不…

Ingress Controller

什么是 Ingress Controller &#xff1f; 在云原生生态中&#xff0c;通常来讲&#xff0c;入口控制器( Ingress Controller )是 Kubernetes 中的一个关键组件&#xff0c;用于管理入口资源对象。 Ingress 资源对象用于定义来自外网的 HTTP 和 HTTPS 规则&#xff0c;以控制进…

Ae 效果:CC Ball Action

模拟/CC Ball Action Simulation/CC Ball Action CC Ball Action &#xff08;CC 球体动作&#xff09;基于源图像转换为网格&#xff0c;并基于网格生成一个个继承源图像像素颜色的具有 3D 深度的小球体。 效果名称左侧出现的立方体图标&#xff0c;表示本效果支持 3D 摄像机。…

2023_Spark_实验七:Scala函数式编程部分演示

1、Scala中的函数 在Scala中&#xff0c;函数是“头等公民”&#xff0c;就和数字一样。可以在变量中存放函数&#xff0c;即&#xff1a;将函数作为变量的值&#xff08;值函数&#xff09;。 def myFun1(name:String):String"Hello " nameprintln(myFun1("…

EasyExcel导出转换@ExcelProperty注解中converter不生效,以及EasyExcel导入日期转换失败问题

用EasyExcel做导出&#xff0c;需要用ExcelProperty做格式转换&#xff0c;比如日期转换&#xff0c;枚举类转换 然后新建一个转换类 里面有两个实现方法&#xff0c;converToJavaData是导入时&#xff0c;数据转换定义格式&#xff0c;converToExcelData是导出时做数据转换的。…

Python爬虫基础(三):使用Selenium动态加载网页

文章目录 系列文章索引一、Selenium简介1、什么是selenium&#xff1f;2、为什么使用selenium3、安装selenium&#xff08;1&#xff09;谷歌浏览器驱动下载安装&#xff08;2&#xff09;安装selenium 二、Selenium使用1、简单使用2、元素定位3、获取元素信息4、交互 三、Phan…