【实战】AI怎么打麻将?
【实战】AI怎么打⿇将?
说起打⿇将我⼀直是处于⽐较业余并且不思进取的⽔平,各个地⽅的⿇将规则不⼀,繁琐的规则也懒得放脑袋⾥记忆了,于是每次跟朋友打⿇将都是现场临时约定规则,怎么简单怎么来,周边也有不少年轻的⼩伙伴我⼀样。
年前回家前跟朋友聚会⼜打了⼏圈⿇将,⼏个⼈⼜经历了⼀遍边上⽹查算番规则边打牌,⽣怕少算番多亏了五⽑钱的过程,于是萌⽣做个⿇将算番APP的想法,解决我们⼏个懒⼈的打牌需求。
当时趁着那⼏天想法热乎,花了⼀周多撸了⼀个iOS App 取名叫【⼩番】就给弄上架了(第⼀次写swift,发现居然有双感叹号!!这样的运算符,当时我就惊呆了)。
⼩番使⽤国标规则来算番, 最⼤番数88番,当⼀副牌有多种胡法时取最⼤番数的胡法(基本牌划分的动态规划怎么写来着?),其中各种特殊规则wikipedia⾥可以写出满满⼏屏,照着学了⼀遍。⼀开始我们就对【⼩番】的需求⽐较明确,把在线⿇将游戏的便捷性融⼊到线下朋友间社交打牌欢乐⾥。
所以【⼩番】刚诞⽣就带了⼀副AI的眼睛,以便更快更好的服务好⼤家。
刚开始的【⼩番】认识⿇将牌的能⼒⼀般,70%左右。基本上摄像头识别完还需要⼿动再补上⼏张牌,所谓⼈⼯+智能结合。
AI模型准备上我只是做完⼀次⽬标检测深度学习模型的数据采集,标注,训练,评估及移动端推理的实现流程。中间没有太多优化,本着先看看有多少⼈愿意为这项功能买单的想法,把App撸完就上架了 。
App出来后碰上疫情期间⼤家也都家⾥呆着了,App好久也没实践上,中间去江西朋友家呆了⼀段时间打牌⽤了⼀次,发现⼀些易⽤性的问题修正了⼀下,在统⼀算番规则⽅⾯【⼩番】发挥了实际作⽤起到了公平公正的效果(让我当晚输了100块钱)。
App上架后忙别的事情有段时间也没多管了。最近各地疫情反复,周末看了⼀下App Store排⾏榜,发
现在没有任何推⼴的情况下,⼩番最近还爬到过娱乐版前50名内,改变了我对⽬前的应⽤市场没有推⼴不会有⼈购买的看法。
于是周末花了点时间再好好优化了⼀把模型,把【⼩番】识别牌的精准度提到98%以上。
骑士队球员名单优化后的【⼩番】,即使是带有⼀定透视⾓度的,20多张不同牌同屏也可以⼀次轻松识别,做到快速认牌算番的效果。⾏⽂⾄此,好玩的东西就介绍完了。
各位看官,⽬前【⼩番】新版本上线,特价2折优惠活动中,赶紧App Store搜索下载⼀个收藏起来,以备逢年过节打牌使⽤吧 (近30层深度神经⽹络,平均每层不到3⽑钱哦)。
下⾯进⼊技术⼲货的部分,实践中怎么提⾼模型⿇将牌识别的精确度和召回率?⾏业内的⼈清楚,AI模型是容易做出demo,但产品化过程中需要投⼊⾮常多精⼒打磨的⼀项技术。以前做个性化推荐和定
向⼴告推荐,深知数据的优化对效果的作⽤远⼤于算法⾃⾝形式的优化作⽤。所以这次在模型效果打磨的过程中,我优先着重考虑数据⽅⾯的优化。
问题定义
⿇将牌识别是⼀类⽬标检测问题(Object Detection),⽬标检测与只输出单⼀标签的图像分类问题(Image Classification)不同,⽬标检测问题的输出包含两个信息:图⽚中可能包含的多个物体的位置,以及各⾃的分类标签。
⿇将牌识别在⽬标检测问题⾥属于多个⼩⽬标(⽬标相对于完整图像⼤⼩)的同时检测,含34个分类(不计花牌),需要考虑不同灯光亮度,投影⾓度,桌⾯背景,⿇将牌⾯样式变化下的识别。
类似的,⾃动驾驶的视觉感知部分也包含了⼀些⽬标检测(红绿灯,车辆,雪糕筒等)问题。
⽬标检测算法
解决⽬标检测算法的常见模型主要分为两类,以R-CNN/Fast R-CNN/Faster R-CNN为代表的两步法:先⽤启发式搜索(R-CNN/Fast
R-CNN)的算法或者特定的⽹络(Faster R-CNN)出图⽚中可能的物体区域(region proposals),然后⽤卷积神经⽹络对各个物体区域做⼀次图像分类。
Faster R-CNN可以做到⽐较⾼的精确度检测⽬标,但检测延迟⽅⾯⽐较⾼,不适于需要视频实时检测的场景。
另⼀类算法是以SSD(Single Shot MultiBox Detector)和YOLO(You Only Look Once)为代表的⼀步检测法,这类算法将位置检测的外包矩形和分类概率统⼀编码到⼀个卷积神经⽹络预测输出⾥。
具体的,图像可以以⼀定的步长划分成格⼦,每个格⼦关联⼏个(⽐如6个)不同⽐例的Anchor Box(⽐如1:1, 1:2, 2:1等),每个格⼦的每个Anchor Box可以预测⼀个中⼼点(x, y)和长宽(l, w)的偏移量以及对应区域是某个分类的概率p,训练过程中通过梯度下降来调整模型参数最⼩化损失函数。
冰柠檬张兆艺官宣产女⽬标检测的损失函数由两部分组成:分类损失函数及定位误差,为减少过拟合的情况也会加⼊正则化损失,3者做⼀个加权线性组合。在职研究生有用吗
SSD及YOLO算法在延时和精确度⽅⾯平衡⽐较好,可以满⾜视频实时检测(30FPS)的需求。
本质上SSD和YOLO这类⽬标检测算法可以理解成⼀个框架,在这个框架⾥有多个组成部分或决策算法,不同的选择组成具体的⽬标检测模型。
⽐如框架中做为主⼲的特征抽取⽹络部分,ssd原始使⽤的vgg16,yolo使⽤的Darknet53,在平衡速度和精确度时,也可以选择其他的特征抽取⽹络,如为移动设备优化的mobilenet v1,v2,或者inception等,不同的选择可以组合出多种不同的具体模型。
今年最新发布的YOLO v4模型在COCO的数据集上速度和精确度都达到了不错的提升。电脑密码
⿇将识别模型训练
⾸先是训练数据准备,尝试在⽹上搜了⼀圈没有到现有的⿇将牌⽬标检测的标注数据,于是开始⾃⼰的数据采集和标注。
训练数据分为两部分,⼀部分⼈⼯真实数据,⼀部分⽣成数据(⼤量)。真实数据采集使⽤视频录制的⽅式,分两种场景,单个⿇将牌(34类),以及多张牌组合(14张)。摆好牌后移动⼿机拍摄不同⾓度下的成像,完了⽤脚本从视频⾥⾃动截取出来x张图⽚进⾏标注。
标注⼯具使⽤labelimg⼯具,可以⽐较⽅便的框出⿇将牌打上标签,准备就绪后就是⼀顿狂标注,标注后的图⽚类似这个样⼦,⽣成对应的PASCAL VOC格式的xml⽂件。
在这⾥插⼊图⽚描述!
[037导弹艇
第⼀部分数据接近真实使⽤场景(⼀次检测⼤于14张牌,牌相对于图像的⼤⼩也接近实际情况)。但由于只有⼀副⿇将牌,场景⽐较单⼀数据量也⽐较⼩,训练过程种容易产⽣过拟合的情况于是引⼊第⼆部分数据。
第⼆部分数据是真正帮助提⾼模型泛化能⼒的⽣成数据,这部分数据使⽤了两个数据源来合成,34张⿇将牌的不同样式的图⽚共600多张,以及4000多张纹理图⽚的数据集。
清蒸鱼的做法
随机合成⽣成的场景图⽚:每次挑两张⿇将进⾏⼀定的随机旋转/缩放/亮度及对⽐度调整/投影变换后放在⼀张随机选的纹理图上作为背景,⽣成合成图⽚以及对应的标注数据(⿇将牌的外框作为最⼩外包矩形参与随机变换使得标注信息需要的label&bounding box都是已知信息,可以按模版⽣成标注xml⽂件不需要⼈⼯标注)。⽤这个办法可以轻松⽣成数万个标注图⽚,⽣成的数据长下⾯这个样⼦。
注意⽣成数据时直接⽣成模型输⼊需要的分辨率,减少模型预处理的resize步骤和加载图⽚数据不必要的内存开销。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。