通过计算机视觉(CV)技术来处理手语数据集,对手语数据集/视频进行分类或识别
文章目录
csl-2015手语数据集
csl手语数据集,包含词和句,数量分别为500和100。
用的是cv。
以下文字及代码仅供参考。
处理 CSL-2015 手语数据集 的任务可以通过计算机视觉(CV)技术来实现。该数据集包含 500 个手语词汇和 100 个句子的手语视频,目标是通过 CV 技术对手语视频进行分类或识别。
以下是详细的步骤和代码示例。
仅供参考。
1. 数据集准备
数据集结构
假设数据集目录结构如下:
csl_dataset/
├── words/
│ ├── word_001/
│ │ ├── frame_001.jpg
│ │ ├── frame_002.jpg
│ │ └── ...
│ ├── word_002/
│ └── ...
├── sentences/
│ ├── sentence_001/
│ │ ├── frame_001.jpg
│ │ ├── frame_002.jpg
│ │ └── ...
│ ├── sentence_002/
│ └── ...
- 每个手语词汇或句子对应一个文件夹。
- 文件夹内包含按时间顺序排列的帧图像(每秒 30 帧或其他帧率)。
2. 数据预处理
将视频帧转换为适合模型输入的形式。以下是一个示例代码:
import os
import cv2
import numpy as np
def preprocess_frames(video_dir, target_size=(224, 224)):
frames = []
for frame_file in sorted(os.listdir(video_dir)):
frame_path = os.path.join(video_dir, frame_file)
frame = cv2.imread(frame_path) # 读取图像
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 转换为 RGB
frame = cv2.resize(frame, target_size) # 调整大小
frame = frame / 255.0 # 归一化
frames.append(frame)
return np.array(frames)
# 示例:预处理一个词汇视频
video_dir = 'csl_dataset/words/word_001'
frames = preprocess_frames(video_dir)
print(f"Processed {len(frames)} frames with shape: {frames.shape}")
3. 数据划分
将数据划分为训练集、验证集和测试集:
import random
import os
def split_dataset(data_dir, train_ratio=0.8, val_ratio=0.1):
categories = os.listdir(data_dir)
random.shuffle(categories)
train_num = int(len(categories) * train_ratio)
val_num = int(len(categories) * val_ratio)
train_categories = categories[:train_num]
val_categories = categories[train_num:train_num + val_num]
test_categories = categories[train_num + val_num:]
return train_categories, val_categories, test_categories
data_dir = 'csl_dataset/words'
train_categories, val_categories, test_categories = split_dataset(data_dir)
# 输出划分结果
print(f"Train: {len(train_categories)}, Val: {len(val_categories)}, Test: {len(test_categories)}")
4. 特征提取
使用预训练的卷积神经网络(如 ResNet、EfficientNet)提取每一帧的特征:
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications.resnet import preprocess_input
# 加载预训练模型(去掉顶层)
base_model = ResNet50(weights='imagenet', include_top=False, pooling='avg')
def extract_features(frames):
frames_preprocessed = preprocess_input(frames) # 预处理
features = base_model.predict(frames_preprocessed) # 提取特征
return features
# 示例:提取特征
features = extract_features(frames)
print(f"Extracted features with shape: {features.shape}")
5. 视频建模
由于手语是由一系列帧组成的序列,因此可以使用时间序列建模方法(如 LSTM 或 Transformer)对视频进行分类。
使用 LSTM 建模
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
def build_lstm_model(input_shape, num_classes):
model = Sequential([
LSTM(128, input_shape=input_shape, return_sequences=False),
Dense(64, activation='relu'),
Dense(num_classes, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
return model
# 示例:构建模型
input_shape = (None, 2048) # 假设每帧特征维度为 2048
num_classes = 500 # 词汇数量
model = build_lstm_model(input_shape, num_classes)
model.summary()
6. 数据生成器
为了高效加载数据,可以使用数据生成器:
import numpy as np
def data_generator(categories, data_dir, batch_size=16):
while True:
random.shuffle(categories)
for i in range(0, len(categories), batch_size):
batch_categories = categories[i:i + batch_size]
X, y = [], []
for category in batch_categories:
video_dir = os.path.join(data_dir, category)
frames = preprocess_frames(video_dir)
features = extract_features(frames)
X.append(features)
y.append(int(category.split('_')[-1])) # 类别编号
X = np.array(X)
y = np.eye(num_classes)[y] # One-hot 编码
yield X, y
# 示例:创建生成器
train_gen = data_generator(train_categories, data_dir)
val_gen = data_generator(val_categories, data_dir)
7. 模型训练
训练 LSTM 模型:
batch_size = 16
steps_per_epoch = len(train_categories) // batch_size
validation_steps = len(val_categories) // batch_size
model.fit(
train_gen,
steps_per_epoch=steps_per_epoch,
validation_data=val_gen,
validation_steps=validation_steps,
epochs=20
)
8. 模型评估
在测试集上评估模型性能:
test_gen = data_generator(test_categories, data_dir)
loss, accuracy = model.evaluate(test_gen, steps=len(test_categories) // batch_size)
print(f"Test Loss: {loss}, Test Accuracy: {accuracy}")
9. 推理与可视化
加载训练好的模型并进行推理:
def predict_video(video_dir, model):
frames = preprocess_frames(video_dir)
features = extract_features(frames)
predictions = model.predict(np.array([features]))
predicted_class = np.argmax(predictions, axis=1)
return predicted_class
# 示例:推理
predicted_class = predict_video('csl_dataset/words/word_001', model)
print(f"Predicted Class: {predicted_class}")
总结
以上是基于 CSL-2015 手语数据集的完整处理流程。通过计算机视觉技术,tx同学你可以:
- 提取视频帧并进行预处理。
- 使用卷积神经网络提取帧特征。
- 使用 LSTM 或 Transformer 对视频序列进行建模。
- 训练、评估和部署模型。
如果需要进一步优化,同学你也可以尝试以下方法:
- 使用更强大的特征提取模型(如 EfficientNet、ViT)。
- 尝试 Transformer 替代 LSTM。
- 增加数据增强以提高泛化能力。
有辅助创作,仅供参考,
仅供参考。