TvOSScribble,为tvOS构建涂鸦

正如我在“成为tvOS开发人员”中提到的那样,使用Apple TV时,其遥控器上缺少按键是最大的挑战之一。

对于非常常见的动作,有时很难找到直观的手势。 这些动作之一肯定是在频道之间切换的动作。

基本上没有办法使用数字键盘,P +或P-按钮进行调换,这在任何其他电视平台中都存在,而Apple Tv中则没有。

为AppleTv创建涂鸦

我很久以前与同事谈论Siri Remote的问题时,这是一个疯狂的主意。

拥有涂鸦手势识别器来代替传统的数字键盘不是很好吗? 类似于我们在Apple Watch中已经拥有的东西…

在接下来的几天里,我们进行了交谈之后,我做了一些尝试来创建这个概念的非常简单的原型,但每一个都失败了。

我发现的最大限制是,无论手势的实际初始位置如何,SDK报告的起始位置始终是数字化仪的中心,这意味着位置(x:960,y:540)。 随后的滑动将值作为与该起点的偏移量。

因此,实际上在Siri Remote中可能发生的情况是,手指完全位于同一点,您会从SDK获得不同的位置,因为它们取决于手指到达该点的顺序…🤕

第1集:路线

使用顺序说明是解决此问题的首次尝试,避免了SDK的先前限制。

由于手指的实际位置不可靠,随后的滑动从那里获取偏移值,因此很容易获得手势的方向顺序。 并根据这些指示来推断结果。

因此,如果用户以↗️➡️↘️⬇️↙️↙️➡️的顺序进行手势操作,我可以自动推断出2的结果,依此类推:

  0:“⬅️↙️⬇️↘️➡️↗️↗️⬆️↖️⬅️” 
1:“↗️⬇️”
2:“↗️➡️↘️⬇️↙️➡️➡️”
3:“↗️➡️↘️⬇️↙️➡️➡️↘️⬇️↙️”
4:“↙️➡️⬆️⬇️”
5:“⬅️⬇️➡️↘️⬇️↙️⬅️⬅️”
6:“⬅️↙️⬇️↘️➡️➡️↗️⬆️↖️⬅️”
7:“➡️↙️”
8:“⬅️↙️⬇️↘️➡️↘️⬇️↙️↙️⬅️↖️⬆️↗️➡️↗️↗️⬆️↖️↖️⬅️”
9:“⬅️↙️⬇️↘️➡️➡️↗️↗️⬆️↖️↖️↘️⬇️↙️↙️”

这是一个非常理论上的情况,基本上不会发生。 在现实世界中,总是存在错误和重复手势,这些错误和重复手势会生成疯狂的序列,与我们的任何理论模式都不匹配。

因此,我介绍了一些代码,以在获取方向序列之前清理一下手势……为了避免数字化仪的高精度导致错误的方向,将点移到与上一个位置过于接近的位置。

一旦确定了方向序列,就将Levenshtein距离应用于每个模式,结果得到最接近的匹配。

听起来是个不错的计划,对吧?

好吧,我不得不说实际上不是

我反复进行了很多工作,结果总是非常糟糕,特别是对于最长的手势(6、8或9)。

所以,我放弃了……

第2集:CoreML

我已经把这个随意的想法放在失败的项目的抽屉里,然后继续我的生活,仿佛什么都没有发生😀

几个月后。 我当时在圣何塞参加WWDC 2017,甚至没有想到这个疯狂的主意。 那时Craig Federighi先生主持了会议,并提出了我实际上缺少创建涂鸦的工具……CoreML。

此时此刻,我立即再次谈到了涂鸦,并希望借助这项惊人的新技术再给它一次机会。

目前,我对机器学习的知识基本上为零,所以我一回到家就开始寻找更多信息。

我真的很惊讶,那里写满了关于机器学习的大量废话。 许多文档将其视为黑匣子,您在其中放入了一些数据,但没有对过程背后的数学进行任何解释,就得到了结果。

如果您此时也希望对机器学习有一个很好的介绍,建议您通过Google查看此youtube播放列表。 在短短的视频中,您会获得一个非常清晰的指南,适合没有魔术盒的初学者。

在我研究所有新世界的同时,Sri Raghu对机器学习有更好的了解,已经在使用CoreML,他发表了这篇出色的文章。

iOS中的计算机视觉– CoreML + Keras + MNIST
你好,世界! 自从我上一个关于iPhone上的对象识别– iOS的计算机视觉的博客以来,已经有一段时间了…… sriraghu.com

通过他的发表,我学到了很多东西,并且为我的目的得到了训练有素的CoreML模型。

但是您一定想知道……这些手势呢? 难道无法获得可靠的手指位置吗? 您实际上如何期望从那里获得图像?

好吧,我意识到实际上,我实际上并不需要准确的初始位置来获得路径的视觉表示。 我需要做的就是跟踪点的完整序列,构造结果并重新调整路径中的点以匹配新边界。 然后,我可以将结果放在的中心,仅此而已…

经过这个过程,我得到了手势的28×28图像表示,可以将其用作CoreML模型的输入,最终获得更可靠的预测🎉

您可以在以下链接中的TvOSScribble中找到所有此过程的结果:

dcordero / TvOSScribble
TvOSScribble – Siri Remote github.com的手写数字识别器