深度学习

理解和使用深度学习网络

树莓皮扑克玩家

今天,我想向技术营销部的Dan Doherty介绍如何使用MATLAB使用Raspberry Pi进行深度学习。
我们开发团队的一些成员自称是Raspberry Pi和Texas hold'em的书呆子,因此我们决定构建一个Raspberry Pi扑克玩家,将其带到游戏中,以帮助进行智能下注。
在这里这是一段正在进行的视频。扑克玩家执行3个主要步骤:(1)识别牌,(2)识别手,和(3)下注。我将展示如何使用MATLAB编程这些步骤,然后将算法部署到Raspberry Pi上。

使用的硬件

  • 树莓皮:这个项目的大脑*
  • USB网络摄像头:用于读取卡的图像。
  • 树莓圆周率显示器:以协助可视化。
  • 按钮:呼叫/折叠赌注。

图1:项目中使用的硬件;图示为树莓皮3B+

*考虑到性能问题,建议使用RPI3b+及更高版本

识别卡

图2:网络摄像头图像用作识别卡的神经网络的输入

第一步是树莓Pi识别卡片。连接到Pi的网络摄像头捕捉卡的图像,并通过深入学习模型识别它们。MATLAB支持几种流行的深度学习网络,包括万博1manbetx挤压网,阿列克斯内特水壶. 选择SqueezeNet是因为它足够小,可以部署到树莓Pi上,并且具有相对较高的预测精度。在这里是一个简单的文档示例,演示了如何使用AlexNet执行迁移学习,但您可以轻松地将AlexNet替换为其他(更现代的)网络,如SqueezeNet或ResNet。

图3:为迁移学习收集数据

为了训练深度学习算法,我们需要收集我们想要识别的卡片的图像。我们使用网络摄像头拍摄了一系列快照,确保以不同的灯光和方向显示卡片。在手动选择以最小模糊/失真捕获每张卡特征的图像后,我们旋转每张图像以避免网络过度拟合,并确保它能够识别不同方向的卡。
生成训练数据的代码相当简单,完整代码在generateCardData.m
%%初始化变量数值图像=200;%最大值=1000套=['D''C''H''S'];排名=['A''2''3''4''5''6''7''8''9''T''J''Q''K'];%%从命令行获取输入并验证disp('向网络摄像头显示卡片,并以简写形式输入卡片名称。例如:“2D”表示钻石2,AC表示俱乐部Ace');cardname=input('以缩写形式输入卡片名称:','s');如果~ischar(cardname)| |(numel(cardname)~=2)| | |包含(等级,cardname(1))| | |包含(套装,cardname(2))错误('Invalid cardname');终止%从网络摄像头捕获输入并保存到文件。对于i=1:1000的waitbar(i/1000,waitBarHandle,['Saving image:'num2str(i)]);im=快照(cam);如果mod(i,2)im=imrotate(im,180);如果i<=numimagesimwrite(im,fullfile(cardsDirectory,[cardname,num2str(i)'.png']),则结束;else imwrite(im,fullfile(unusedImgsDirectory,[cardname,num2str(i)'.png']);end-end waitbar(1,waitBarHandle,['Capturing images for',cardname',completed.]);
我们最终得到了10000多张用于训练模型的图像。在训练期间,我们没有将每个图像文件加载到内存中,而是使用图像数据存储这让我们能够处理图像的整体收集增强图像数据存储用于将图像调整为预定义的挤压网输入大小。此函数可以在一行代码中快速调整图像大小,如下所示。
净=挤压净;inputSize=net.Layers(1).inputSize;audsTrain=增强图像数据存储(输入大小(1:2),imdsTrain);augimdsValidation=增强图像数据存储(inputSize(1:2),imdsValidation);
在使用这些图像应用转移学习后,我们的网络能够有效地识别所有测试图像的卡片。

认牌下注

识别单个卡后,Pi扑克玩家准备识别手牌。图4中的流程图描述了如何实现这一点。

图4:识别手的流程图

让我们使用下表中的示例手来更好地理解此流程图。请注意,每手牌的最后5张牌是所有玩家共享的社区牌。
模范手
玩家1 玩家2 玩家3
独特的卡片 4C,4D 6D,JC JH,JS
共享社区卡 8S、4H、9S、TS、QS
第一步。分门别类
等级 44849TQ 6J849TQ JJ849TQ
适合 CDSHSSS DCSHSSS 高速钢
第二步。把等级和等级都排序
排序等级 44489TQ 4689TJQ 489TJJQ
分类西装 CDHSSS CDHSSS HHSSS
第三步。后续等级和诉讼之间的差异
排序秩差 004111 221111 411101
分类套装中的差异(二进制) 111000 111000 010000
第四步。清点
#秩中零的数量(从步骤3开始)
0=高卡1=第2对(按顺序)=第2类中的3对(不按顺序)=第2对3对(按顺序)=第4对>=3对(按顺序中的2对)=满座
计数:2(按顺序)
3类
计数:0
高卡
计数:1
一对
#排名中的人的数量(从第3步开始)
<4=非直线>=4=直线
计数:3
不直
计数:4
直的
计数:4
直的
#套装中零的数量(从步骤3开始)
<4=无任何冲洗>=4=冲洗
计数:3
一文不值
计数:3
一文不值
计数:5
脸红
3类 直的 直冲
识别牌和手之后,(Pi)扑克玩家准备下注。下注算法非常简单,仅基于已识别的手。Highcard的起价为1美元,以后每次增加1美元名手皇家同花顺最高10美元。当然,如果你正在研究这个算法,你可以根据你的感受,修改算法,使其更具(或更少)攻击性。

树莓Pi的嵌入算法

我们从我们的MATLAB算法生成C++代码并嵌入到树莓PI中。MATLAB编码器. 我们写了一个函数main_poker_player.cpp它充当可执行文件的主脚本,我们在其中指定为哪些函数生成代码。生成的代码和可执行文件(包括修改后的AlexNet和Botting logic算法)直接下载到Pi以独立执行–我们只需要插入摄像头并运行.exe文件。

图5:使用MATLAB编码器生成代码并部署到Raspberry Pi

要更详细地查看此工作流并查找其他资源,请参阅视频在这里.

结论

有了这些,我们已经了解了如何在MATLAB中构建树莓皮扑克播放器。虽然这是一个良好的开端,但肯定还有需要改进的地方,我鼓励您修改代码,使其更加完善。例如,您可以尝试构建一个更复杂的下注算法,该算法能够升级下注甚至虚张声势。
该代码可在文件交换github. 在下面分享你的评论和关于如何提高扑克玩家的想法!
若要针对您的特定应用请求有关Raspberry Pi和MATLAB的帮助,请联系raspberrypi@mathworks.com.
|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。