树莓派扑克玩家
今天,我想介绍来自技术营销的Dan Doherty来谈谈如何使用MATLAB使用树莓派进行深度学习。
我们的开发团队中有一些成员自称是树莓派和德州扑克迷,所以我们决定创建一个树莓派扑克玩家,将其带到游戏中,帮助玩家进行明智的赌博。
在这里是一段视频。扑克玩家执行3个主要步骤:(1)识别牌,(2)识别手,(3)下注。我将展示如何使用MATLAB来编写这些步骤,然后将算法部署到树莓派上。
在识别出牌和手之后,(Pi)扑克玩家就可以下注了。投注算法非常简单,完全基于已识别的手。Highcard从1美元开始,以后每增加1美元排名的手皇家同花顺最多10美元当然,如果你正在研究这个算法,你可以根据你的感觉来修改算法,使其更具(或更少)侵略性。
硬件使用
- 树莓派:这个项目的大脑
- USB摄像头:读取卡片图像。
- 树莓派显示:帮助可视化。
- 按钮:呼叫/取消投注。
识别卡
第一步是让树莓派识别卡片。连接Pi的网络摄像头捕捉卡片的图像,一个深度学习模型识别它们。MATLAB支金宝app持几种流行的深度学习网络,包括SqueezeNet,AlexNet和GoogLeNet.选择SqueezeNet是因为它足够小,可以部署到树莓派上,而且预测精度相对较高。在这里是一个简单的文档示例,展示了如何使用AlexNet进行迁移学习,但你可以很容易地将AlexNet转换为其他(更现代的)网络,如SqueezeNet或ResNet。 为了训练深度学习算法,我们需要收集我们想要识别的卡片的图像。我们使用网络摄像头拍摄了一系列快照,确保在不同的灯光和方向显示卡片。在手动选择图像以最小的模糊/失真捕获每张卡片的特征后,我们旋转每张图像,以避免网络过度拟合,并确保它可以识别不同方向的卡片。生成训练数据的代码相当简单,完整的代码在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中的流程图描述了这是如何实现的。 让我们使用下表中的示例手来更好地理解这个流程图。需要注意的是,每一手中的最后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与众不同 | 数:0Highcard | 数:1一对 |
(从步骤3开始)<4 = Not a straight >=4 = straight | 数:3不是一个直 | 数:4直 | 数:4直 |
# of 0 in suit (from Step 3)<4 =没有任何刷新>=4 =刷新 | 数:3不是一个平 | 数:3不是一个平 | 数:5冲洗 |
手 | 3与众不同 | 直 | 同花顺 |
嵌入算法到树莓派
我们生成c++代码从我们的MATLAB算法,并嵌入到树莓派使用MATLAB编码器.我们写了一个函数main_poker_player.cpp它充当可执行文件的主脚本,我们在其中指定要为哪些函数生成代码。生成的代码和可执行文件(包括修改过的AlexNet和打赌逻辑算法)直接下载到Pi进行独立执行-我们只需要插入一个摄像头并运行。exe文件。 要更详细地了解这个工作流程并找到额外的资源,请参阅视频在这里.结论
我们已经看到了如何在MATLAB中构建树莓派扑克玩家。虽然这是一个良好的开始,但肯定有需要改进的地方,我鼓励您修改代码,使其变得更好。例如,您可以尝试构建一个更复杂的投注算法,它能够升级投注甚至虚张声势。该代码可在FileExchange和GitHub.分享你的评论和想法,如何提高扑克玩家!如果您需要树莓派和MATLAB的帮助,请联系raspberrypi@mathworks.com。
|
- カテゴリ:
- 深度学习
コメント
コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。