覆盆子PI扑克玩家
今天,我想从技术营销中介绍Dan Doherty,讨论使用Matlab使用覆盆子PI的深入学习。
我们的开发团队的一些成员是自称的覆盆子PI和德克萨斯州持有的书呆子,所以我们决定建立一个覆盆子PI扑克玩家,为游戏提供帮助,以帮助进行智能赌注。
在这里是一段视频。扑克玩家执行3个主要步骤:(1)识别牌,(2)识别手,(3)下注。我将展示如何使用MATLAB来编写这些步骤,然后将算法部署到树莓派上。
识别卡片和手后,(PI)扑克玩家准备投注。投注算法非常简单,仅基于所识别的手。它为1美元为高速公司开始,每个后续增加1美元排名的手最多10美元的皇家冲洗。当然,如果您正在进行此算法,您可以根据您的感受返回算法更多(或更少)攻击。
硬件使用
- 树莓派:这个项目的大脑
- USB网络摄像头:读取卡片的图像。
- Raspberry PI显示:帮助可视化。
- 按钮:呼叫/取消投注。
识别卡
第一步是覆盆子PI识别卡片。连接到PI的网络摄像头捕获卡的图像,深度学习模型识别它们。Matlab支金宝app持几个受欢迎的深度学习网络,包括SqueezeNet,AlexNet.和googlenet..选择挤压尖端,因为它足够小才能部署到覆盆子PI并且具有相对高的预测精度。在这里是一个简单的DOC示例,展示了如何使用alexNet进行传输学习,但您可以轻松地将alexNet交换为Squeezenet或Reset等其他(现代)的网络。 为了训练深度学习算法,我们需要收集我们想要识别的卡片的图像。我们使用网络摄像头拍摄了一系列快照,确保在不同的灯光和方向显示卡片。在手动选择图像以最小的模糊/失真捕获每张卡片的特征后,我们旋转每张图像,以避免网络过度拟合,并确保它可以识别不同方向的卡片。生成培训数据的代码相当简单,完整代码是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中的流程图介绍了这是如何实现的。 让我们使用下表中的示例手来更好地理解这个流程图。需要注意的是,每一手中的最后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种 | 数:0Highcard | 数:1一对 |
排名中的#排名(从第3步)<4 =不是直的> = 4 =直 | 数:3不是一个直的 | 数:4直的 | 数:4直的 |
# of 0 in suit (from Step 3)<4 =没有任何刷新>=4 =刷新 | 数:3不是一个平 | 数:3不是一个平 | 数:5fl |
手 | 3种 | 直的 | 直冲洗 |
将算法嵌入到覆盆子pi上
我们生成c++代码从我们的MATLAB算法,并嵌入到树莓派使用MATLAB编码器.我们写了一个函数main_poker_player.cpp.它充当可执行文件的主脚本,我们在其中指定要为哪些函数生成代码。生成的代码和可执行文件(包括修改过的AlexNet和打赌逻辑算法)直接下载到Pi进行独立执行-我们只需要插入一个摄像头并运行。exe文件。 要更详细地了解这个工作流程并找到额外的资源,请参阅视频这里.结论
我们已经看到了如何在Matlab中建立覆盆子PI扑克牌。虽然这是一个很好的开始,但肯定有改进的领域,我鼓励你修改代码以使这更好。例如,您可以尝试构建更复杂的投注算法,该算法能够升级赌注甚至诈唬。该代码可在fileexchange.和GitHub..分享您的评论,以及有关如何改进扑克玩家的想法!要为特定应用程序请求RasperBery PI和MATLAB,请联系RASPBeryPI@mathworks.com。
|
评论
要留下评论,请点击这里登录到您的MathWorks帐户或创建一个新帐户。