目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的扑克牌识别系统
设计思路
一、课题背景与意义
对扑克牌进行检测与识别,是以扑克牌为目标,对一幅图像中的扑克牌目标进行类别区分与位置定位。其在 实现智能斗地主的过程当中具有重要应用价值。斗地主场景下的扑克牌会出现类别数量 较多、目标相互遮挡等情况,这些都会对检测与识别的效果产生影响。针对扑克牌图像 数据的特点以及实际应用的需求,以深度学习、神经网络和目标检测为理论和技术 指导,对扑克牌图像的检测与识别进行研究。
二、算法理论原理
2.1 目标检测算法
Faster R-CNN算法主要工作是对提取候选区域阶段的优化,提出了区域建 议网络,在速度上有了更进一步的提升。在 Faster R-CNN 算法中使用了滑动窗口的方式在输 入的图像上进行体征的提取操作。Faster R-CNN 算法在一个网络中完成了特征提取、获选区域提取、边 框回归、分类,大大提高了目标检测的综合性能。RPN 提取到了质量高、数量少 的候选区域,而且 RPN 与基础的卷积神经网络共享参数,所以很大程度上提高 了检测的效率。
主要工作流程如下:
- (1)直接将原始图片输入到卷积神经网络中,执行卷积操作,提取出图像 特征信息;
- (2)对输入的图像利用区域建议网络生成候选框;
- (3)将候选框输入到 ROI Pooling 层,输出固定尺寸大小的特征图;
- (4)针对分类概率使用 Softmax 损失函数对其进行训练,针对边框回归使 用 Smooth L1 损失函数对其进行训练。
2.2 YOLOv5算法
YOLO 检测流程:
- 1) 预先指定的尺寸大小,如 448*448,然后对原始的输入图像进行缩放;
- 2) 整张图像输入卷积神经网络,然后输出结果;
- 3) 在全连接层中使用非极大值抑制(NMS)的 方法对输入数据进行处理。筛选出同一位置上重叠的区域框中置信度最大的区域 框后进行保留,删除其余的区域框。然后输出检测结果。
在对原始输入的图像完成缩放处理之后, 将图像进行平均划分,得到 7*7 的网格。然后对每一个网格进行预测目标边框的 位置和目标的置信度,并优化预测框与真实标注的框的 IoU,得到更为精准的矩形框。同时预测目标对应 N 种类别的概率,N 为 数据集中的类别数量,比如在扑克牌数据集中 N 的值为 54。
相关代码示例:
transform = torchvision.transforms.Resize((448, 448))
# 训练模型
total_epochs = 100 # 总的训练轮数
for epoch in range(total_epochs):
running_loss = 0.0
for i, data in enumerate(train_loader):
inputs, labels = data
# 对输入图像进行缩放
inputs = transform(inputs)
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 统计损失值
running_loss += loss.item()
# 打印每轮训练的损失值
print(f"Epoch [{epoch+1}/{total_epochs}], Loss: {running_loss}")
# 在全连接层中使用非极大值抑制(NMS)的方法对输入数据进行处理
# 筛选出同一位置上重叠的区域框中置信度最大的区域框后进行保留,删除其余的区域框
# 然后输出检测结果
# 根据测试结果调整学习率、迭代次数等相关参数
if accuracy < 90:
optimizer.param_groups[0]['lr'] *= 0.1 # 学习率衰减
if epoch % 10 == 0:
total_epochs += 10 # 增加迭代次数
三、检测的实现
3.1 数据集
针对目前的目标检测数据集中没有关于扑克牌数据的情况,提出制作扑克牌专题图像数据集的解决方案。首先从实际的网络斗地主平台上收集游戏中的原始图像,这样能够验证该算法在实际场景下应用的可行性; 对收集到的图像进行筛选、整理,如去除不完整图像、统一尺寸等,得到扑克牌图 像总计 4000 张,扑克牌目标数共 79040 个。
对扑克牌图像数据进行目标标注理; 最后按照一定的比例将标注后的图像数据分为训练、验证、测试等部分,再将各个部分 的图像数据和标注数据一起打包成为 TFRecord 格式的数据文件,得到训练集、验证集、 测试集。
3.2 实验环境搭建
Tensorflow是由谷歌公司正式开源的深度学习框架,它由谷歌公司 的第一代深度学习系统改造而来。github 中部分深度学习项目关注情况如下所示,可以看出 Tensorflow 是目前最流行的。
Tensorflow 具有良好的稳定性能够在多个平台上运行深度学习算法。此外, 它还支持 GPU 加速、提供了可视化的工具 TensorBoard、支持 Python、C/C++等 多种语言。因此,选择使用 Tensorflow 框架能快速地对扑克牌检测与识别网络完 成搭建工作。
3.3 实验及结果分析
在模型的训练过程 中,使用生成的扑克牌训练集对网络模型的参数进行训练模型,当训练达到一定 的次数后,对训练的模型进行测试。然后根据模型测试的结果对学习率、迭代次数等相关的参数进行调整。
从扑克牌目标检测网络模型训练的衰减图中可以看出,该模型在训练初始阶 段,模型 loss 值比较大,但随着迭代次数的增加,在训练次数达到 5k 左右的时 候, loss 的值迅速减小,网络开始收敛。继续训练,随着训练次数的增加, loss 值趋于平稳,最后达到稳定,N-SSD 网络的训练过程结束。
在扑克牌网 络模型验证结果走势图中,训练开始时,精度比较低,在训练次数达到 20000 左右,精度开始急速增长。然后继续训练,随着训练次数增加,精度缓慢增 长,趋于稳定,最终检测平均精度达到 0.9。
相关代码示例:
# 在测试集上评估模型
test_dataset = torchvision.datasets.PokerDataset(train=False)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=16, shuffle=False)
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
inputs, labels = data
outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print(f"Accuracy on test set: {accuracy}%")
# 根据测试结果调整学习率、迭代次数等相关参数
if accuracy < 90:
optimizer.param_groups[0]['lr'] *= 0.1 # 学习率衰减
if epoch % 10 == 0:
total_epochs += 10 # 增加迭代次数
实现效果图样例
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!