深度学习

理解和使用深度学习网络

树莓派扑克玩家

今天,我想介绍来自技术营销的Dan Doherty来谈谈如何使用MATLAB使用树莓派进行深度学习。
我们的开发团队中有一些成员自称是树莓派和德州扑克迷,所以我们决定创建一个树莓派扑克玩家,将其带到游戏中,帮助玩家进行明智的赌博。
在这里是一段视频。扑克玩家执行3个主要步骤:(1)识别牌,(2)识别手,(3)下注。我将展示如何使用MATLAB来编写这些步骤,然后将算法部署到树莓派上。

硬件使用

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

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

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

识别卡

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

第一步是让树莓派识别卡片。连接Pi的网络摄像头捕捉卡片的图像,一个深度学习模型识别它们。MATLAB支金宝app持几种流行的深度学习网络,包括SqueezeNetAlexNetGoogLeNet.选择SqueezeNet是因为它足够小,可以部署到树莓派上,而且预测精度相对较高。在这里是一个简单的文档示例,展示了如何使用AlexNet进行迁移学习,但你可以很容易地将AlexNet转换为其他(更现代的)网络,如SqueezeNet或ResNet。

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

为了训练深度学习算法,我们需要收集我们想要识别的卡片的图像。我们使用网络摄像头拍摄了一系列快照,确保在不同的灯光和方向显示卡片。在手动选择图像以最小的模糊/失真捕获每张卡片的特征后,我们旋转每张图像,以避免网络过度拟合,并确保它可以识别不同方向的卡片。
生成训练数据的代码相当简单,完整的代码在generateCardData.m
% %初始化变量NumImages = 200;% Max = 1000 suits = ['D' 'C' ' 'H' 'S'];排名=(“A”“2”“3”“4”的5 ' 6 ' ' 7 ' ' 8 ' ' 9 ' ' T '“J”“问”“K”);%%从命令行获取输入并验证把信用卡在摄像头前显示,然后输入信用卡的简写形式。例如:“2D”代表Diamond-Two, AC代表Club-Ace);cardname = input('输入卡片名称的缩写形式:','s');if ~ischar(cardname) || (numel(cardname) ~= 2) || ~contains(rank,cardname(1)) || ~contains(suits,cardname(2)) error('Invalid 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.']);
我们最终获得了10000多张用于训练模型的图像。在训练过程中,我们不是将每个图像文件加载到内存中,而是使用imageDatastore这让我们可以处理整个图像集合。这个函数augmentedImageDatastore用于将图像调整为预定义的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。分为等级和套装
排名 44849 tq操作 6 j849tq JJ849TQ
西装 CDSHSSS DCSHSSS HSSHSSS
步骤2。把等级和套装都分类
分类等级 44489 tq操作 4689年tjq 489年tjjq
整理衣服 CDHSSSS CDHSSSS HHSSSSS
步骤3。后续级别与诉讼的区别
排序后的差值 004111 221111 411101
排序套装的差值(二进制) 111000 111000 010000
步骤4。计数和决定
rank中0的#(从步骤3开始)
0 = Highcard 1 = Pair 2 (in order) =3 of a kind 2 (not in order) = 2 (in order) = 2 (in order) = 4 of a kind >=3 (with 2 in order) = Full house
计数:2(依次)
3与众不同
数:0
Highcard
数:1
一对
(从步骤3开始)
<4 = Not a straight >=4 = straight
数:3
不是一个直
数:4
数:4
# of 0 in suit (from Step 3)
<4 =没有任何刷新>=4 =刷新
数:3
不是一个平
数:3
不是一个平
数:5
冲洗
3与众不同 同花顺
在识别出牌和手之后,(Pi)扑克玩家就可以下注了。投注算法非常简单,完全基于已识别的手。Highcard从1美元开始,以后每增加1美元排名的手皇家同花顺最多10美元当然,如果你正在研究这个算法,你可以根据你的感觉来修改算法,使其更具(或更少)侵略性。

嵌入算法到树莓派

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

图5:使用MATLAB Coder生成代码并部署到树莓派

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

结论

我们已经看到了如何在MATLAB中构建树莓派扑克玩家。虽然这是一个良好的开始,但肯定有需要改进的地方,我鼓励您修改代码,使其变得更好。例如,您可以尝试构建一个更复杂的投注算法,它能够升级投注甚至虚张声势。
该代码可在FileExchangeGitHub.分享你的评论和想法,如何提高扑克玩家!
如果您需要树莓派和MATLAB的帮助,请联系raspberrypi@mathworks.com。
|
  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。