AI识万物:从0搭建和部署手语识别系统 ⛵

手语图像识别系统设计 这些算法可以根据输入的手语图像,将其分为不同的手势类别,并输出相应的结果。数据集的收集可以通过拍摄手语专家的实际动作,或者通过模拟手语动作的虚拟环境来完成。特征提取:在手语图像识别系统中,提取有效的手势特征是非常重要的。通过合理设计数据集、提取有效特征、选择合适分类算法和实现系统集成,我们可以构建出一个准确、实时、稳定的手语图像识别系统,为听力障碍者提供更好的交流体验。手语图像识别系统是一种基于计算机视觉和机器学习的技术,它能够将手语动作转化为文字或语音输出,从而帮助听力障碍者与其他人进行无障碍的沟通。 阅读详情

💡 作者:韩信子@ShowMeAI
📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42
📘 计算机视觉实战系列: https://www.showmeai.tech/tutorials/46
📘 本文地址:https://www.showmeai.tech/article-detail/292
📢 声明:版权所有,转载请联系平台与作者并注明出处
📢 收藏ShowMeAI查看更多精彩内容

据北京听力协会预估数据,我国听障人群数量已过千万。而在全球范围内有4.66亿人患有残疾性听力损失,约占全世界人口的5%。聋哑人士很特殊,他们需要使用手语进行交流,其他与常人无异,我国存在特殊教育水平在各城市中发展力度具有较大差异,国家通用手语推广程度浅,但不懂手语,与听力障碍者交流会非常困难。

在本篇内容中,ShowMeAI 借助深度学习与神经网络技术,针对这个问题从 0 构建 1 个应用程序,检测手语并将其翻译给其他人进而打破手语隔阂。

搭建和部署完成后,你可以通过摄像头,轻松测试模型,如下图所示,快来一起试试吧。这个动图中的手势代表的单词,见文末哦!

💡 手语介绍

我们先来简单了解一下手语,它由 3 个主要部分组成:

  • 手指拼写:这是一种手动的交流方式,用双手和手指拼写单词。每个字母都用指定的手位置表示。
  • 单词级符号词汇:这是一个大型视频数据集,用于识别单词或字母的整个手势。
  • 非手部特征:包括任何面部表情、嘴巴、舌头或身体姿势。

在本文中,我们先解决第①个部分的问题。我们准备使用的解决方案是基于视觉数据的神经网络

💡 深度学习与计算机视觉

人工智能和计算机视觉的最典型的模型是卷积神经网络(CNN),它在典型的计算机视觉应用中(如图像识别、目标检测等)应用广泛。我们在本次应用的核心技术也将采用 CNN。

CNN 网络有着如上图所示的网络结构,典型的结构包括卷积层、池化层、激活层、全连接层等,对于输入图像,可以有效抽取图像内容表征,并进行分类或其他处理。卷积层等特殊结构,可以在控制参数量的前提下,保证良好的图像特征提取能力。

关于卷积神经网络的详细知识可以参考ShowMeAI下述教程:

💡 小试牛刀,打通流程

我们来构建一个 CNN 识别的流程,会分成以下基础步骤:

  • 数据读取与切分
  • 数据可视化及预处理
  • CNN网络构建与训练

① 导入相关库

我们在这里主要使用 TensorFlow 构建网络与训练,会使用 Numpy 做数据计算与处理,以及使用 Matplotlib 进行简单可视化。

对于这些工具库,ShowMeAI都制作了快捷即查即用的速查表手册,大家可以在下述位置获得:

我们先把这些工具库导入。

# 导入工具库
import string
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
from functools import partial
from tensorflow.keras.preprocessing.image import ImageDataGenerator, array_to_img

② 读取数据集

本数据集为手语字母对应的数据集,图片 size 不大,所以也叫做 sign_mnist 数据集(类比手写数字数据集 mnist),部分示例图片如下

数据集大家可以在 🏆Kaggle平台对应数据集页面 下载,也可以通过ShowMeAI的百度网盘地址下载。

🏆 实战数据集下载(百度网盘):公众号『ShowMeAI研究中心』回复『实战』,或者点击 这里 获取本文 [5] 从0搭建基于神经网络的手语识别系统 『sign_mnist 数据集』

⭐ ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub

下面我们加载训练集与测试集并切分特征与标签:

# 读取数据
test = pd.read_csv("sign_mnist_test.csv")
train = pd.read_csv("sign_mnist_train.csv")

# 输出基本信息
print("训练集维度", train.shape)
print("测试集维度", train.shape)
# 输出标签信息
labels = train["label"].value_counts().sort_index(ascending=True)
labels
# 切分特征与标签
train_x = train.drop(labels = "label", axis = 1)
train_y = train["label"]
test_x = test.drop(labels = "label", axis = 1)
test_y = test["label"]
train_x.head()
# 数据预处理与可视化

# 存储标签数据
test_classes= test_y
train_clasees = train_y

# 特征转为numpy格式
train_x = train_x.to_numpy()
test_x = test_x.to_numpy()

# 把数据转为3维图像数据(图片数量*宽*高,这里如果是灰度图,颜色通道为1,省略)
train_x = train_x.reshape(-1,28,28)
test_x = test_x.reshape(-1,28,28)
# 在训练集中取样30张图片,做可视化查看
def plot_categories(training_images, training_labels):
    fig, axes = plt.subplots(3, 10, figsize=(16, 15))
    axes = axes.flatten()
    letters = list(string.ascii_lowercase)

    for k in range(30):
        img = training_images[k]
        img = np.expand_dims(img, axis=-1)
        img = array_to_img(img)
        ax = axes[k]
        ax.imshow(img, cmap="Greys_r")
        ax.set_title(f"{letters[int(training_labels[k])]}")
        ax.set_axis_off()

    plt.tight_layout()
    plt.show()

plot_categories(train_x, train_y)

③ 卷积神经网络CNN搭建

我们使用 TensorFlow 的 high level API(即keras)搭建一个简易CNN神经网络,并拟合一下数据

def create_model():
    model = tf.keras.models.Sequential([
    # 卷积层
    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),
    # 池化层
    tf.keras.layers.MaxPooling2D(2,2),
    # 卷积层
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    # 池化层
    tf.keras.layers.MaxPooling2D(2,2),
    # 展平
    tf.keras.layers.Flatten(),
    # 全连接层
    tf.keras.layers.Dense(512, activation='relu'),
    # softmax分类
    tf.keras.layers.Dense(26, activation='softmax')])

    model.compile(
    optimizer='adam',  #优化器
    loss='sparse_categorical_crossentropy',  #损失函数
    metrics=['accuracy']) #评估准则
  
    return model
# 初始化模型
model = create_model()
# 拟合数据
history = model.fit(train_x, train_y, epochs=20, validation_data=(test_x, test_y))

我们这里在全量数据集上迭代20个轮次,结果如下:

我们可以看到,这里的数据并不特别复杂,在自己从头搭建的 CNN 模型上,经过训练可以达到训练集 100% 验证集 92% 的准确率。

我们再对训练过程中的「准确率」及「损失函数」变化值进行绘制,以了解模型状态。

# 获取准确率与损失函数情况
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

# matplotlib绘制训练过程中指标的变化状况
epochs = range(len(acc))

plt.plot(epochs, acc, 'r', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()

plt.plot(epochs, loss, 'r', label='Training Loss')
plt.plot(epochs, val_loss, 'b', label='Validation Loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

💡 问题与优化

① 深度网络与梯度消失

一般来说,随着 CNN 网络层数变深,模型的学习能力会变强,也能学到更多的信息。但训练深度CNN存在梯度消失的问题。

梯度消失和梯度爆炸部分内容也可以参考ShowMeAI的对吴恩达老师课程的总结文章 📘 深度学习教程 | 深度学习的实用层面

非常深的神经网络的梯度会很快变为零(反向传播的梯度连乘带来的问题),这最终会使整个梯度下降变慢。有一些特殊结构的神经网络,可以大程度缓解这个问题,比如最著名的 ResNet,当然,大家可以借助 ResNet 预训练模型快速迁移学习应用在我们当前的手语识别问题上,为了让大家对ResNet 细节更清晰,我们在这里手动搭建 ResNet-50(即50层的ResNet网络)来训练和做效果对比。

ResNet的详细讲解也可以参考ShowMeAI的 📘 深度学习教程 | 吴恩达专项课程 · 全套笔记解读中的文章 📘 深度学习教程 | 经典CNN网络实例详解。

② ResNet 模型简介

ResNet 是 Residual Networks 的简称,是迄今为止我们看到的最流行和最成功的深度学习模型之一。ResNets 由残差块组成,残差块的核心组件是『跳跃连接/skip-connection』。跳跃连接,也称为快捷连接,让神经网络跳过某些层并将一层的输出馈送到神经网络中另一层的输入。它能帮助模型避免乘以中间跳过的那些层的权重,从而有助于解决梯度消失的问题。

然而,使用 ResNet 和跳跃连接,由于中间有卷积层和池化层,一层输出的维度可能与另一层的输出维度不同。为了解决这个问题,可以使用两种方法:

  • 快捷连接填充多个零实体以增加其维度
  • 添加 1X1 卷积层来匹配维度。

但是,对于第二种方法,我们需要在输出中添加一个额外的参数,而第一种方法不需要。

③ ResNet为何有效

ResNet的效果核心有2点:

  • ① 它使用我们上面提到的跳跃连接,它跳过层来解决梯度消失的问题。
  • ② 它通过让模型学习恒等函数来确保最高层的性能至少与最低层一样好。

④ 构建ResNet-50

下面我们参考 keras 官方 ResNet 构建方式,构建一个 ResNet-50,如下所示,我们先构建基本模块,再组装成最终的网络。

# Defining the identity block of the Resnet-50 Model. 
def identity_block(X, f, filters, training=True):
    # filter of the three convs 
    f1,f2,f3 = filters
    X_shortcut = X 
    
    # First Component 
    X = tf.keras.layers.Conv2D(filters = f1, kernel_size = 1, strides = (1,1), padding = 'valid')(X)
    X = tf.keras.layers.BatchNormalization(axis = 3)(X, training = training) # Default axis
    X = tf.keras.layers.Activation('relu')(X)
   
    # Second Component 
    X = tf.keras.layers.Conv2D(filters = f2, kernel_size = f, strides = (1,1), padding = 'same')(X)
    X = tf.keras.layers.BatchNormalization(axis = 3)(X, training = training) # Default axis
    X = tf.keras.layers.Activation('relu')(X)
   
    # Third Component 
    X = tf.keras.layers.Conv2D(filters = f3, kernel_size = 1, strides = (1,1), padding = 'valid')(X)
    X = tf.keras.layers.BatchNormalization(axis = 3)(X, training = training) # Default axis
    
    # Adding the two tensors 
    X = tf.keras.layers.Add()([X_shortcut,X])
    X = tf.keras.layers.Activation('relu')(X)
    
    # Returning the last output
    return X
# Defining the Convolution Block of the Resnet-50 Model. 
def convolutional_block(X, f, filters, s=2,training=True):
    # filter of the three convs 
    f1,f2,f3 = filters
    X_shortcut = X 
    
    # First Component 
    X = tf.keras.layers.Conv2D(filters = f1, kernel_size = 1, strides = (1,1), padding = 'valid')(X)
    X = tf.keras.layers.BatchNormalization(axis = 3)(X, training = training) # Default axis
    X = tf.keras.layers.Activation('relu')(X)
    
    # Second Component 
    X = tf.keras.layers.Conv2D(filters = f2, kernel_size = f, strides = (s,s), padding = 'same')(X)
    X = tf.keras.layers.BatchNormalization(axis = 3)(X, training = training) # Default axis
    X = tf.keras.layers.Activation('relu')(X)
    
    # Third Component 
    X = tf.keras.layers.Conv2D(filters = f3, kernel_size = 1, strides = (1,1), padding = 'valid')(X)
    X = tf.keras.layers.BatchNormalization(axis = 3)(X, training = training) # Default axis
    
    # Converting the Input Volume to the match the last output for addition. 
    X_shortcut =tf.keras.layers.Conv2D(filters = f3, kernel_size = 1, strides = (s,s), padding = 'valid')(X_shortcut)
    X_shortcut = tf.keras.layers.BatchNormalization(axis = 3)(X_shortcut, training = training)
    X = tf.keras.layers.Add()([X_shortcut,X])
    X = tf.keras.layers.Activation('relu')(X)
    
    # Adding the last two tensors
    X = tf.keras.layers.Add()([X, X_shortcut])
    X = tf.keras.layers.Activation('relu')(X)
    
    # Returning the output tensor
    return X
# Defining a modified Resnet-50 Model using the Identity and Convolution Blocks. 
def ResNet50(input_shape = (28, 28, 1), classes = 26):
    
    # Defining the input as a tensor with shape input_shape
    X_input = tf.keras.Input(input_shape)
    
    # Zero-Padding
    X = tf.keras.layers.ZeroPadding2D((3, 3))(X_input)
    
    # Stage 1
    X = tf.keras.layers.Conv2D(64, (5, 5), strides = (1, 1))(X)
    X = tf.keras.layers.BatchNormalization(axis = 3)(X)
    X = tf.keras.layers.Activation('relu')(X)
    X = tf.keras.layers.MaxPooling2D((3, 3), strides=(2, 2))(X)

    # Stage 2
    X = convolutional_block(X, f = 3, filters = [64, 64, 256], s = 1)
    X = identity_block(X, 3, [64, 64, 256])
    X = identity_block(X, 3, [64, 64, 256])
    
    # Add an Average Pool Layer
    X = tf.keras.layers.AveragePooling2D((2,2))(X)

    # Output Layer
    X = tf.keras.layers.Flatten()(X)
    X = tf.keras.layers.Dense(classes, activation='softmax')(X)
    
    # Create Model
    model = tf.keras.Model(inputs = X_input, outputs = X)

    return model

⑤ 训练ResNet-50

下面我们在数据集上,使用 ResNet-50 网络进行训练

# 初始化模型
model = ResNet50()

# 编译
model.compile(optimizer="adam",metrics=["accuracy"],loss = "sparse_categorical_crossentropy")

# 训练
history = model.fit(train_x, train_y, validation_data = (test_x, test_y), epochs =10)

得到如下结果

💡 优化效果对比

我们对ResNet-50也绘制训练过程中准确率和损失函数的变化,如下

# 获取准确率与损失函数情况
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

# matplotlib绘制训练过程中指标的变化状况
epochs = range(len(acc))

plt.plot(epochs, acc, 'r', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()

plt.plot(epochs, loss, 'r', label='Training Loss')
plt.plot(epochs, val_loss, 'b', label='Validation Loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

对比图如下:

我们观察到,从简单的 CNN 模型换到 ResNet 模型时,测试集的准确率从92% 到 97% 。也说明了,ResNet 的结构确实能够带来效果上的提升。

💡 部署与实时测试

在这里我们做一个简单的测试,使用 OpenCV 的视频录制功能,通过 python 收集我们的摄像头的镜头采集的图像并进行实时预测。

ShowMeAI给OpenCV工具库制作了快捷即查即用的 OpenCV 速查表手册,大家可以点击查看和下载。

具体的过程是,我们解析捕获的每一帧图像,将其处理为灰度图(类似于我们模型的训练集),在图像中心抓取一个 400*400 像素的正方形区域(参见 x0,x1,y0,y1),将正方形调整为我们最初的 28x28 大小并使用我们的模型进行测试(之前保存到 .h5 文件)。

# 导入工具库
import keras
import numpy as np
from PIL import Image
import string
import pandas as pd
import tensorflow as tf
# 导入OpenCV
import cv2
from matplotlib import pyplot

# 设定维度
dim = (28, 28) # 图像维度
letters = list(string.ascii_lowercase) # 识别的字母

x0 = 1920 // 2 - 400 # 400px left of center
x1 = 1920 // 2 + 400 # 400px right of center
y0 = 1080 // 2 - 400 # 400px right of center
y1 = 1080 // 2 + 400 # 400px right of center

# 初始化视频捕获
video=cv2.VideoCapture(0)

cv2.namedWindow('Webcam') # 构建1个窗口
cv2.moveWindow('Webcam',40,30) # 放置窗口

while video.isOpened(): # 只要没有关掉实时摄像头
    ret,capture = video.read() # 抓取每个视频帧
    cropped = capture[y0:y1, x0:x1] # 截取
    img = cv2.cvtColor(cropped, cv2.COLOR_BGR2GRAY) # 转成灰度图
    img = cv2.GaussianBlur(img, (5, 5), 0) # 图像平滑
    img = cv2.resize(img, dim) # 图像大小缩放
    pyplot.imshow(img, cmap='gray') # 可视化展示图片
    pyplot.show() # 展示
    img = np.reshape(img, (1,img.shape[0],img.shape[1],1))
    img = tf.cast(img, tf.float32)
    pred=model.predict(img)

    # 可视化实时效果
    cv2.rectangle(capture, (x0,y0),(x1,y1),(255,0,0),2) # 为图片添加矩形框
    cv2.putText(capture,'{} res50'.format(letters[np.argmax(pred[0])]),(x0+25,y0+50),cv2.FONT_HERSHEY_SIMPLEX,0.9,(0,255,0),1) # 预测字母
    cv2.imshow('Webcam', capture) # 展示视频
    
    # 结果输出
    print(pred)
    print(letters[np.argmax(pred[0])])
    
    # 退出视频输入
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
video.release()
cv2.destroyAllWindows()

为了更轻松地对预估结果查看,我们把将预测的字母显示在实时画面上(请参阅下面的 gif 以测试单词 hello)。

💡 参考资料

机器学习线性模型 机器学习线性模型之线性回归以及归一化和优化处理(实验) 第一次写文章如有不足请指出,还处于正在学习中的小白。 一、实验目的 1、掌握训练样本的划分方法; 2、理解线性回归模型的意义; 3、掌握训练和预测的应用过程; 4、掌握线性回归性能评估方法(均方误差MSE); 5、算出相关线性方程; 6、掌握数据归一化; 二、实验的内容 原始数据集:Advertising.csv 数据共4列200行,每一行为一个特定的商品,前3列为输入特征,最后一列为输出特征。 TV:该产品用于电视上的广告费用(千元) radio: 阅读详情

相关推荐

基于YOLOv5的手语识别系统:深度学习应用与实现

本文详细介绍了基于YOLOv5的手语识别系统,包括数据集准备、YOLOv5模型训练、实时手语识别和UI界面设计等方面。YOLOv5作为一个高效的目标检测模型,能够准确地检测并识别手语手势。结合深度学习和计算机视觉技术,手语识别系统能够为听力障碍人士提供便捷的交流工具。未来,随着数据集的丰富和技术的进步,手语识别系统可以进一步提升检测精度,并能够支持更多复杂的手语手势。此外,结合语音识别和自然语言处理技术,可以实现更加智能的手语翻译系统。

YOLO 912

推荐一个python、AI学习社区:ShowMeAI

​推荐一个python和AI学习社区:ShowMeAI 网址:ShowMeAI知识社区 博客:ShowMeAI博客 — 专注数据算法与应用 » ShowMeAI github:https://github.com/ShowMeAI-Hub bilibili:ShowMeAI的个人空间_哔哩哔哩_Bilibili 知乎:ShowMeAI - 知乎 微博:Sina Visitor System 掘金:ShowMeAI 的个人主页 - 专栏 - 掘金 ​......

m0_61899108的博客 1814

深度学习丨基于TensorFlow与OpenCV的手语识别系统

基于TensorFlow与OpenCV的手语识别系统丨实验环境:tensorflow(2.13.0) + cv2(4.8.0)

AIGC 3万+

基于Python的手语识别系统的设计与实现开题报告

手语的思维和语言的思维是有许多不同的,这导致这些无法听到声音的人对语言逻辑和语言组织的理解困难。对于识别模块,根据用户的选择(即选择文件还是摄像头实时图像)系统获取手语图像,接下来手语图片的预处理功能将采集到的图片进行肤色检测分析,提取手部图像。随着人工智能和深度学习的发展,手语识别系统的普及更有希望了,利用现有技术开发手语识别系统帮助正常人和听障人士之间的交流,降低语言沟通障碍,减少听障人士与正常人的差异,让听障人士更好的融入社会,这对彼此生活品质的提高有着重要的社会价值和现实意义。

2301_79305643的博客 1643

【近源攻击】badusb制作

BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。

qinjilll的博客 2550

DMA学习笔记

DMA(direct memory access,直接内存访问),是一种避开CPU,可以直接对外设和内存进行访问的技术,可以实现外设与内存、内存之间、外设之间的数据的访问和搬移。

weixin_46220498的博客 3113

# AI识万物:从0搭建和部署手语识别系统

手指拼写:这是一种手动的交流方式,用双手和手指拼写单词。每个字母都用指定的手位置表示。单词级符号词汇:这是一个大型视频数据集,用于识别单词或字母的整个手势。非手部特征:包括任何面部表情、嘴巴、舌头或身体姿势。在本文中,我们先解决第①个部分的问题。我们准备使用的解决方案是基于视觉数据的神经网络ResNet 是 Residual Networks 的简称,是迄今为止我们看到的最流行和最成功的深度学习模型之一。ResNets 由残差块组成,残差块的核心组件是『跳跃连接/skip-connection』。

weixin_42907150的博客 1679

2026年AI技能进阶指南:从提示词工程到智能体开发实战

提示词工程作为AI时代的基础沟通技能,其核心原理是通过系统化的交互方法论实现与大模型的高效对话。这项技术通过明确性、具体性和可操作性的设计原则,显著提升了AI生成内容的质量和实用性。在工程实践层面,提示词工程已经发展出角色扮演、步骤分解等成熟模式,广泛应用于代码生成、技术方案设计等场景。随着AI智能体开发的兴起,提示词工程进一步演化为定义智能体身份认知和行为规范的系统接口设计,成为构建自主AI系统的关键技术基础。掌握从基础提示词到智能体开发的完整技能栈,能够帮助开发者在AI技术浪潮中保持核心竞争力。

weixin_33139275的博客 333

人工智能 | ShowMeAI资讯日报 #2022.06.12

ShowMeAI资讯日报 2022-06-12 期,图片自动去水印工具、神经网络可视化工具、深度网络训练加速代码、数据可视化书籍、微软Rust教程、Rust速查清单、隐表示与NeRF、8篇前沿论文…点击获取全部资讯

ShowMeAI研究中心 1632

【亲测有效】OpenClaw Gateway 出现 “(no output)“ 卡死问题完整解决指南:从手动重启到 systemd Watchdog 自动恢复

最近在使用 OpenClaw(自托管 AI 助手框架,前身 Clawdbot/Moltbot)时,遇到了一个非常常见的顽疾:TUI(终端界面)或 Telegram 等通道经常显示 "(no output)",消息发出去后机器人完全没反应,看起来像是卡死了。

hampeter的博客 8609

新时代多目标优化【数学建模】领域的极致探索——数学规划模型

数学规划模型是数学建模中用于描述和解决优化问题的一类模型。它通过构建目标函数和约束条件,将实际问题转化为数学形式,旨在寻找满足约束条件的最优解。数学规划模型广泛应用于各个领域,包括资源分配、生产计划、物流管理和金融投资等,通过线性规划、非线性规划、整数规划等方法,帮助决策者在复杂环境中做出最优选择。

小李很执着的博客 5884

ShowMeAI 人工智能工具笔记(一)

好了,伙计们发生了什么。欢迎回来看另一个视频在这个视频中。我们将探索如何构建更灵活的训练循环。到目前为止,我们一直在使用模型适合,如果您可以使用模型适合那是很棒的。但有时候你需要更多的灵活性。所以在这个视频中我们将看看如何自定义模型适合。然后在下一个视频中,我们将看看如何从头开始构建自定义训练循环。好的,首先,这里只是一些基本的导入,你们以前都见过这些。然后我们只需加载Ms数据集。所以我们不会做任何复杂的事情。我只是想向你展示一般结构,然后可以应用于许多不同的问题。

龙哥盟 1297

SHP转TXT、TXT转SHP工具(附工具下载链接)

关于TXT,可以选择整个图层生成一个TXT。也可以勾选“每个地块单独存TXT”,然后选择一个字段,根据字段值,给每个地块生成一个TXT文件。支持选择和数据框一样的坐标系,也可以选择一个图层,工具会采用和这个图层一样的坐标系。1、TXT数据支持输入单个或者多个TXT文件,也可以直接选择TXT所在的文件夹。所有的TXT数据都生成到一个矢量数据图层。关于这一行的内容,可以在地块坐标行设置中进行设置。其他:①面节点闭合:勾选,则回到起点。属性描述:可以直接复制粘贴进来,也可以直接修改。也可以改为任意字母。

坐听风雨 4301

《手语图像识别系统设计--人体动作识别》设计与实现

文章目录一、软硬件环境二、系统功能设计1. 视频帧处理2. OpenPose人体姿态识别3. yolov3手部模型训练4. 人体姿态数字特征提取5. beyes分类识别三、应用四、总结 一、软硬件环境 基于人体姿态的手语图像识别系统采用了软硬件相结合的方法。硬件部分主要是用于采集手语图像的单目摄像头。软件部分主要是通过ffmpeg对视频图像进行处理,然后在Anaconda下配置Python3.6的开发环境,再结合Cmake编译OpenPose模型,最后在VScode编译器中结合OpenCV中的图像算法,实现

cungudafa的博客 1万+

JeecgBoot passwordChange 任意用户密码重置漏洞复现

​JeecgBoot 框架passwordChange接口存在任意用户密码重置漏洞,未经身份验证的远程攻击者可以利用此漏洞重置管理员账户密码,从而接管系统后台,造成信息泄露,导致系统处于极不安全的状态。

0xSec 2641

Far planner 代码系列(35)动态障碍物预处理_激光雷达部分

主要讲解动态障碍物在激光雷达部分的剔除机制

博客 1057

毕业设计:基于深度学习的手语识别系统 目标检测

毕业设计:基于深度学习的手语识别系统利用深度学习算法和计算机视觉技术,将手语动作转化为文本或语音,实现手语与自然语言的转换和交流。本文详细介绍了系统的设计原理和关键技术,包括手势特征提取、深度神经网络模型构建和训练等。通过实验验证了系统在手语识别准确度和实时性方面的优势。该系统为听力障碍人士与非手语使用者之间的交流提供了一种便捷、高效的方式,具有广阔的应用前景。无论您对深度学习技术保持浓厚兴趣,还是希望探索机器学习、算法或人工智能的领域的同学,能为您提供灵感和指导。

2301_79555157的博客 4287

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java 百度AI 写一个简单的手势识别程序

教程地址:请关注我的https://edu.youkuaiyun.com/course/detail/23001 Java写一个简单的手势识别程序,这里采用百度是AI,视觉技术中的人体分析中的手势识别,识别图片中的手势类型,返回手势名称、手势矩形框、概率分数,可识别24种手势,支持动态手势识别,适用于手势特效、智能家居手势交互等场景;支持的手势列表:拳头、OK、祈祷、作揖、作别、单手比心、点赞、diss、我...

智轩软件的专栏 2755

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

手语识别系统源码分享

数据集信息展示在手语识别领域,数据集的质量和多样性直接影响到模型的训练效果和识别准确率。本研究采用的“ASL Detection”数据集专门用于训练和改进YOLOv8手语识别系统,旨在提升对美国手语(ASL)的识别能力。该数据集包含26个类别,分别对应英文字母A至Z,涵盖了手语的基本构成元素。这一结构不仅为模型提供了丰富的训练样本,还确保了其在实际应用中的广泛适用性。“ASL Detection”数据集的设计考虑到了手语的多样性和复杂性。

weixin__qunmasj的博客 1460

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【完整源码+数据集+部署教程】手语手势识别系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

【完整源码+数据集+部署教程】手语手势识别系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

weixin_43860634的博客 1706

基于深度学习YOLOv8的手语识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

本项目基于YOLOv8目标检测算法开发了一套高效的手语识别系统,专门用于识别美国手语字母表(A-Z)中的26个字母手势。系统采用深度学习技术,通过504张训练图像、144张验证图像和72张测试图像构建的数据集进行模型训练与优化。该系统能够实时检测和分类手语手势,将视觉手势转化为对应的字母输出,为手语使用者与非手语使用者之间搭建沟通桥梁。实验结果表明,该系统在测试集上达到了较高的识别准确率,展现了YOLOv8算法在手语识别领域的强大应用潜力。

斌擎科技 2332

ShowMeAI周刊 | AI独立开发者:帆船旅行但月入万刀;创业吧!新黄金时代来了;资本看好哪些创业方向;被AI震麻的一周again

AI独立开发者:一边开着帆船游历世界,一边靠网站月入1万美刀;盘点近期躬身入局的大佬们,新一轮的创业浪潮真的来了!本周融资速递;又是被 AI 震麻的一周,12家公司发布了新的 AI 产品…

ShowMeAI研究中心 7071

ShowMeAI —— Show u 三连

内容来源:系列教程 (showmeai.tech)ShowMeAI日报系列全新升级!覆盖AI人工智能 工具&框架 | 项目&代码 | 博文&分享 | 数据&资源 | 研究&论文 等方向。本文整理了ShowMeAi日报上的部分内容,有关python学习、深度学习、项目、面试、各种易用的工具框架、资源,等等。 ...

m0_61899108的博客 1285

ShowMeAI 人工智能工具笔记(六)

大家好,欢迎回来,我是布赖恩,我们将继续探索Python3的旅程。我们已经说了30多集,我们要讨论类,今天终于开始讨论类。在深入之前,我们需要覆盖一些基本概念。首先,最重要的是。你听说过OOP或面向对象编程。这是其基础。基本上,类是一个蓝图,用于创建对象。你会听到人们交替使用类和对象,但它们是两个不同的概念。类是一个蓝图或计划,用于描述对象应该如何被创建。当Python或其他语言实际创建该类的对象或实例时,就是对象的生成。我们将要创建蓝图。

龙哥盟 1459

基于深度学习的手语识别与翻译系统的设计与实现

数据集样本量类别数特点CSL-500‌250,000500中国手语连续语句ASLLVD‌410,000200包含面部表情与身体动作。

Dalu_1226的博客 3274
上一篇: 特斯拉大裁员,苹果赢麻了?维基百科:我的每一条引用都AI过;面向工业落地的目标检测框架;我的『粗野主义』操作系统;MLOps概览 | ShowMeAI资讯日报
下一篇: 滚蛋吧小广告!我现在用命令行解压缩;当哥白尼遇上人工智能;一份傲娇的深度学习技术清单;一个视频尽览旷视20项前沿技术 | ShowMeAI资讯日报
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值