教会AI认识麻将牌之实践篇

文 /
2020-06-19 评论 ()

这次我们将讨论人工智能技术在移动互联网和IOT设备中的应用,以及思考和实现的过程。编者按:这篇文章来自微信公众号“曲奇饼”。作者库奇·帕夫,36氪星人被授权出版。

在视频的开头,让我们来了解今天的主角,应用

(感谢周东的新歌《莫吉托》)

说到打麻将,我一直处于相对业余和低效的水平。麻将规则因地而异,乏味的规则懒得记在脑子里。因此,每次我和朋友打麻将,我都会当场达成临时协议。如何让它变得简单,如何到达那里,我身边还有很多年轻的朋友。

几年前,我回家和朋友们开派对,还打了几次麻将。有几个人在网上冲浪的时候经历了检查规则和打牌的过程。他们害怕损失50美分,所以他们想出了制作麻将计算应用程序的主意,以满足一些懒惰的人的需求。

当时,利用那些日子的温暖想法,花了一个多星期才把一款名为“范晓”的iOS应用上架(我第一次写斯威夫特的时候,发现上面有一个双惊叹号!!这种操作员,当时我很震惊)。小风扇采用国家标准规则计算风扇,最大风扇数为88,当一副牌有多个风扇数时,风扇数就是最大风扇数(如何编写基本牌划分的动态规划?),其中维基百科可以写几个各种特殊规则的全屏,并根据它们学习它们。从一开始,我们就对[范晓]有明确的需求,我们将在线麻将游戏的便利性融入了线下朋友之间的社交扑克乐趣。所以(范晓)生来就有一双人工智能的眼睛,以便更好更快地为每个人服务。

起初,知道麻将牌的能力大约是70%。基本上,摄像头识别后需要手动添加更多的卡片,即所谓的人工+智能组合。在人工智能模型的准备过程中,我只完成了一次目标检测深度学习模型的数据采集、标注、训练、评估和移动推理的实现过程。中间没有太多的优化,所以我推出了这个应用程序,并把它放在货架上,想先看看有多少人愿意为这个功能付费。

该应用发布后,在疫情期间,每个人都呆在家里。应用程序已经很久没有被使用了。中间,我去江西一个朋友家玩了一段时间的扑克牌。我发现一些可用性问题得到了纠正,[范晓]在统一计算规则方面发挥了实际作用,起到了公平公正的效果(那天晚上我损失了100元)。应用程序上架后,我有一段时间忙于其他事情,不太在意。最近,各地的疫情一再发生。上周末,我查看了应用商店排行榜,发现范晓最近在没有任何促销的情况下进入了娱乐版的前30名,这改变了我的观点,即在当前的应用市场上,没有促销就没有人会购买。因此,在周末花了一些时间优化模型,将“范晓”身份证的准确率提高到98%以上。

优化后,即使在一定的视角下,同一屏幕上的20多张不同的卡片也可以同时被轻松识别,从而达到快速识别和计数的效果。写作至此,乐趣已经结束。女士们,先生们,现在新版《范晓》上线了。在20%折扣的特别优惠中,请快速搜索并下载一个应用商店,收集它用于节日打牌(近30层深层神经网络,平均每层不到30美分)。

其次,在技术干货部分,如何在实践中提高模型麻将牌识别的准确率和召回率?业内人士知道人工智能模型是一种易于演示的技术,但在生产过程中需要大量的努力来完善。过去,当进行个性化推荐和定向广告推荐时,我知道数据优化的效果远远大于算法本身。所以这次在抛光模型效果的过程中,我优先考虑数据的优化。

问题定义

麻将牌识别是一种目标检测问题。目标检测不同于只输出单一标签的图像分类问题。对象检测问题的输出包含两个信息:图片中可能包含的多个对象的位置,以及它们各自的分类标签。麻将牌识别属于目标检测问题中多个小目标的同时检测(目标相对于完整图像的大小),包括34个类别(不包括牌)。它需要考虑不同光照亮度、投影角度、桌面背景和瓷砖表面风格变化下的识别。同样,自动驾驶的视觉感知部分也包括一些目标检测(交通灯、车辆、冰淇淋筒等)。)。

目标检测算法

解决目标检测算法的常用模型主要分为两类。该方法首先使用启发式搜索算法或特定网络在图像中寻找可能的区域建议,然后使用卷积神经网络对图像的每个区域进行分类。更快的R-CNN能够以相对较高的精度检测目标,但是检测延迟相对较高,不适合需要实时视频检测的场景。

另一种算法是一步检测法,由单次多盒检测器和YOLO检测器代表。这种算法将外包矩形和位置检测的分类概率统一编码成卷积神经网络预测输出。具体地,图像可以被分成具有特定步长的网格,每个网格与几个(例如,6个)锚盒(例如,1:1、1:2、2:1等)相关联。),每个网格的每个锚盒可以预测中心点(x,y)和长宽(l,w)的偏移量以及对应区域是某个分类的概率p,并且在训练过程中通过梯度下降来调整模型参数以最小化损失函数。目标检测的损失函数由分类损失函数和定位误差两部分组成。为了减少过度拟合,还将增加正则化损失。这三部分构成一个加权线性组合。

固态硬盘和YOLO算法在延时和精度上有很好的平衡,能够满足视频实时检测的要求。本质上,固态硬盘和YOLO可以理解为一个框架,其中有多个组件或决策算法,不同的选择组成一个特定的目标检测模型。例如,框架中的特征提取网络部分,最初由ssd使用的vgg16,由yolo使用的Darknet53,在平衡速度和精度时也可以选择其他特征提取网络,例如mobilenet v1、v2或针对移动设备优化的初始等。不同的选择可以结合不同的具体模式。今年新发布的YOLO v4模型在COCO数据集的速度和准确性上有了很大的提高。

麻将识别模型训练

首先是培训数据准备。我在网上搜索了一圈,没有找到现有麻将牌目标检测的标注数据,于是我开始了自己的数据收集和标注。

训练数据分为两部分,一部分是人工真实数据,另一部分是生成数据(大量)。真实的数据收集使用视频记录方法,分为两个场景,一个麻将瓦片(34个类别)和多个瓦片的组合(14块)。整理卡片后,手机从不同角度拍摄图像。之后,脚本被用来从视频中自动捕获X张图片进行标记。贴标工具用于贴标工具。麻将牌可以方便地贴上标签。当准备好了,这是一个疯狂的标签。标记的图片如下,并生成相应的PASCAL VOC xml文件。

数据的第一部分接近实际使用场景(如果一次检测到超过14张卡片,则卡片相对于图像的大小也接近实际情况)。但是,由于麻将牌只有一套,而且场景中的数据量相对较小,训练过程容易出现过拟合,所以引入了第二部分数据。

第二部分数据是生成的数据,它确实有助于提高模型的泛化能力。这部分数据是使用两个数据源合成的。有600多张不同风格的34块麻将牌图片和4000多组纹理图片。随机合成生成的场景图片:一次选取两个麻将牌进行一定的随机旋转/缩放/亮度和对比度调整/投影变换,然后将它们放在随机选择的纹理图上作为背景,生成合成图片和相应的标注数据(麻将牌的外框作为最小的包围矩形参与随机变换,因此标注信息所需的标注和包围盒是已知信息,可以根据模板生成标注xml文件,无需人工标注)。

使用这种方法,可以很容易地生成成千上万的注释图片,并且生成的数据长度如下所示。生成数据时注意直接生成模型输入所需的分辨率,减少模型预处理的调整步骤和加载图片数据的不必要的内存开销。

固态硬盘和YOLO等算法具有一定的数据增强预处理功能,如训练数据的随机垂直/水平翻转或区域放大的随机截取等。一方面,它们提高了模型的综合能力,减少了训练数据的过度拟合问题。因为我考虑了不同的图像变换,并且在自动生成数据方面生成了大量的训练数据,所以我不太依赖模型提供的数据增强功能。

在准备好数据集(80%的数据用于训练,20%用于测试)后,使用张量流进行模型训练,并基于预先训练好的图像特征提取模型(如ssd_mobilenet_v1_coco)进行迁移学习,以减少从头训练模型所需的学习图像特征提取(学习基本图像理解能力,如边缘检测、基本形状检测等基础工作)所需的时间,也减少所需的训练图片数据量。

由于生成的模型最终是在手机上进行推理,所以我在手机上使用了Tensorflow Lite框架,训练后导出的模型需要转换成tflite格式。Tflite比tensorflow模型具有更少的操作员支持。例如,ssd模型预处理步骤需要在模型之外完成。在处理过程中,应注意根据模型输入图片的RGB信息接受的浮点数范围(模型为0,1,模型为[0,1])的相应正则化。此外,在推理过程中,还需要检测输入图片或视频的RGB通道序列是否与模型要求相同。任何小地方的数据不一致都会大大降低模型的效果。

在麻将计算的应用场景中,由于浮点tflite模型在手机上有很好的性能,模型的浮点数没有进一步的int8离散化。在iOS上性能可进一步提高:Tensorflow Lite的CoreML委托可用于推理,手机内置的人工智能芯片的并行处理能力可用于无损提高推理速度。

随着人工智能模型性能的提高,深度学习越来越多地应用于手机和IOT设备。Tensorflow Lite还在嵌入式设备甚至微控制器上提供运行时环境,为不同应用场景中的速度和精度之间的平衡提供更多选择。相信将来会产生越来越多的方便的人工智能应用。生活越来越好了。

“智能汽车与互联网技术”行业有数百人,欢迎加入微信6080901,集团所有人(注意,公司都在集团内上市)。