深度学习

理解和使用深度学习网络

覆盆子PI扑克玩家

今天,我想从技术营销中介绍Dan Doherty,讨论使用Matlab使用覆盆子PI的深入学习。
我们的开发团队的一些成员是自称的覆盆子PI和德克萨斯州持有的书呆子,所以我们决定建立一个覆盆子PI扑克玩家,为游戏提供帮助,以帮助进行智能赌注。
在这里是一段视频。扑克玩家执行3个主要步骤:(1)识别牌,(2)识别手,(3)下注。我将展示如何使用MATLAB来编写这些步骤,然后将算法部署到树莓派上。

硬件使用

  • 树莓派:这个项目的大脑
  • USB网络摄像头:读取卡片的图像。
  • Raspberry PI显示:帮助可视化。
  • 按钮:呼叫/取消投注。

图1:项目使用的硬件;图中是树莓派3B+

*考虑到性能问题,建议使用RPi 3B+或更高版本

识别卡

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

第一步是覆盆子PI识别卡片。连接到PI的网络摄像头捕获卡的图像,深度学习模型识别它们。Matlab支金宝app持几个受欢迎的深度学习网络,包括SqueezeNetAlexNet.googlenet..选择挤压尖端,因为它足够小才能部署到覆盆子PI并且具有相对高的预测精度。在这里是一个简单的DOC示例,展示了如何使用alexNet进行传输学习,但您可以轻松地将alexNet交换为Squeezenet或Reset等其他(现代)的网络。

图3:收集转移学习数据

为了训练深度学习算法,我们需要收集我们想要识别的卡片的图像。我们使用网络摄像头拍摄了一系列快照,确保在不同的灯光和方向显示卡片。在手动选择图像以最小的模糊/失真捕获每张卡片的特征后,我们旋转每张图像,以避免网络过度拟合,并确保它可以识别不同方向的卡片。
生成培训数据的代码相当简单,完整代码是generatecarddata.m.
% %初始化变量NumImages = 200;% Max = 1000 suits = ['D' 'C' ' 'H' 'S'];排名=(“A”“2”“3”“4”的5 ' 6 ' ' 7 ' ' 8 ' ' 9 ' ' T '“J”“问”“K”);%%从命令行获取输入并验证DISP('将卡显示到网络摄像头,并以简短的形式输入卡片名称。前:“2D”为钻石二,AC为Club-ACE');CardName =输入(“以简短的形式输入卡片名称:','s');如果〜irchar(cardname)||(numel(cardname)〜= 2)||〜包含(等级,CardName(1))||〜包含(适合,CardName(2))错误(“无效的CardName”);结尾 ...%从网络摄像头捕获输入并保存到文件。for i = 1:1000 waitbar(i/1000,waitBarHandle,['Saving image: ' num2str(i)]); / /保存图像我=快照(cam);If mod(i,2) im = imrotate(im,180);end if i <= NumImages imwrite(im,fullfile(cardsDirectory,[cardname,num2str(i)))' . png]));其他imwrite (im, fullfile (unusedImgsDirectory [cardname, num2str(我)' . png]));end end waitbar(1,waitBarHandle,['Capturing images for ',cardname,' completed.']);
我们最终有超过10,000张图片,用于培训模型。我们在训练期间将每个图像文件加载到内存中,而不是将每个图像文件加载到内存中imageageAtastore.这让我们使用整体图像集合。功能AugmentedimageGedataStore.用于将图像调整为预定义的SqueezeNet输入大小。这个函数可以在一行代码中快速调整图像大小,如下所示。
网= squeezenet;inputSize = net.Layers (1) .InputSize;audsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain);augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);
在使用这些图像进行迁移学习后,我们的网络能够有效地识别所有测试图像的卡片。

识别手牌并下注

识别单个卡后,PI扑克玩家准备识别手。图4中的流程图介绍了这是如何实现的。

图4:识别手的流程图

让我们使用下表中的示例手来更好地理解这个流程图。需要注意的是,每一手中的最后5张牌是所有玩家共享的社区牌。
示例手
球员1 球员2. 球员3.
独特的卡片 4 c、4 d 6 d, JC jh,js.
共享社区卡 8s,4h,9s,ts,qs
步骤1.分开等级和套装
排名 44849TQ. 6J849TQ. JJ849TQ
套装 CDSHSS DCSHSSS HSSHSSS
步骤2。把等级和套装都分类
分类等级 44489 tq操作 4689年tjq 489年tjjq
排队 CDHSSS CDHSSS HHSSSS.
步骤3.随后的排名和西装之间的差异
差异排序等级 004111 221111 411101
排序套装(二进制) 111000 111000 010000.
步骤4.计数并决定
排名中的零数(从第3步)
0 =高卡1 =对2(按顺序)= 3种2(不依次)= 2对3(依次)= 4种> = 3(序列中有2个)=满屋
计数:2(按顺序)
3种
数:0
Highcard
数:1
一对
排名中的#排名(从第3步)
<4 =不是直的> = 4 =直
数:3
不是一个直的
数:4
直的
数:4
直的
# of 0 in suit (from Step 3)
<4 =没有任何刷新>=4 =刷新
数:3
不是一个平
数:3
不是一个平
数:5
fl
3种 直的 直冲洗
识别卡片和手后,(PI)扑克玩家准备投注。投注算法非常简单,仅基于所识别的手。它为1美元为高速公司开始,每个后续增加1美元排名的手最多10美元的皇家冲洗。当然,如果您正在进行此算法,您可以根据您的感受返回算法更多(或更少)攻击。

将算法嵌入到覆盆子pi上

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

图5:使用MATLAB编码器生成代码并部署到覆盆子PI

要更详细地了解这个工作流程并找到额外的资源,请参阅视频这里

结论

我们已经看到了如何在Matlab中建立覆盆子PI扑克牌。虽然这是一个很好的开始,但肯定有改进的领域,我鼓励你修改代码以使这更好。例如,您可以尝试构建更复杂的投注算法,该算法能够升级赌注甚至诈唬。
该代码可在fileexchange.GitHub..分享您的评论,以及有关如何改进扑克玩家的想法!
要为特定应用程序请求RasperBery PI和MATLAB,请联系RASPBeryPI@mathworks.com。
|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击这里登录到您的MathWorks帐户或创建一个新帐户。