发布时间:2019年9月26日下午10时43分PDT
vFlat鸟瞰图
虽然许多移动应用程序扫描可供下载,大部分apps're集中在数字化平板文档页面弯似在展开时,这本书往往是不正确扫描。当扫描文本,印刷面,页面扫描的扫描出共敲诈结合,或者只是因为它们是供你怎么不舒服选择虽然读弯曲文本书籍或其他出版物,图像通过摄像头拍摄的图像后,一。
这就是为了解决这个问题VoyagerX深度学习 vFlat 就是开发一个Android应用程序。 vFlat应用程序中的目标是让用户能够轻松地扫描图书,而不必担心弯曲页面。另外,通过自动地确定所述书页的边界,由用户减少人工输入。
左:一本书的弯曲页面图像捕捉常见的移动摄像机。右:使用vFlat相同版本的扫描图像
当你使用这个应用程序,你可以提取经书页通过OCR拍摄的照片文本(光学字符识别)是方便。 以上 当你提取从 “左” 的形象文字,OCR无法正确识别,因为文本的某些单词和线变得过于弯曲。但是, 如果你在 “正确” 的 图像 错误应用 相同的OCR技术, 可以用很少的文字占有更高的识别成功率提取。
OCR结果为在应用内的图像B vFlat
如何构建应用程序vFlat
我们决定在运行移动这种模式已经建立了深厚的学习模式趋于平缓弯曲的书页,为客户提供最佳的用户体验。 “实时预览”里面vFlat应用,看看书页面的用户是由实时功能的平板(超过20FPS)。如果用户可以预览扫描的页面只是为了使用这个应用程序的实时平面图像,你就可以调整框架的角度后拍照。
vFlat的实时预览功能
我们已经优化了人才培养模式,实现从移动应用的实时推理,并采取硬件加速的优势。因为它被认为使用了OpenGL本身从一开始就实行推理模块,我正准备实现与GLSL(OpenGL着色语言)的分层模型。
幸运的是,我们要利用它来发现TensorFlow精简版查看GPU的支持(谁在写这篇文章的时候 “tensorflow -精简版GPU的” 包版本“org.tensorflow:tensorflow -精简版,GPU :0.0.0-夜间更新为“下)。我们采取了TFLite GPU代表(代表)的优势,带来了该模型的轻型版本降低了重量和复杂的操作(OPS)的硬件加速的数量。
GPU是一种深层神经网络非常适合,因为计算能力比CPU可以处理大量卓越和并行工作负载。但它不是使用移动GPU简单的事情,它只是在这一点上需要TFLite GPU的代表。
TFLite GPU委托创建一个计算着色器(计算着色器),该优化神经网络图形用于在移动GPU和异步运行和编译。得益于TFLite GPU硬件加速,委托必须实现自己的推理模块已经被淘汰,节约几个月的开发时间。
ahkkyeot时间和精力感谢TFLite来使用GPU代表,但被撞转换自己的模型到模型,并将其与TFLite TFLite GPU整合代表的问题。该GPU代表的测试版本,主要用于MobileNet 仅支持业务 ,不支持一些我们所创建的操作模式。
为了不影响模型的性能,利用GPU代表的优势,我们有整个网络结构是一样的变化,同时保持某些操作。我们在转换过程中都出现了。因为那个时候还没有公布的源代码是难以正确地打赌指出,我们遇到了错误的原因。 (代码TFLite目前GPU代表 GitHub上 被公布)
例如,委托TFLite GPU不支持LeakyReLU操作,我们需要支持它的代表在以下方式PReLU操作的优势。
变更前:
> Tf.keras.layers.LeakyReLU(阿尔法= 0.3)
变更后:
> Tf.keras.layers.PReLU(alpha_initializer =常数(0.3 ),shared_axes = [1,2],可训练=假)
然而,通过共享PReLU操作的参数对所有轴(shared_axes = [1,2,3])它有发生意外的行为时开路参数以减少1。该代码是很好的,但CPU的操作模式,GPU代表失败,错误消息:“线性α形状不匹配输入信道的数目”( 一个直链α-尺寸不匹配输入信道的数目)。出于这个原因,毕竟共享轴1和2唯一的参数。
从网络的拉姆达层-1和1,输入数据之间归一化时所面临的另一问题是引起的。
> Tf.keras.layers.Lambda(拉姆达X:(X / 127.5) - 1.0)
此代码似乎在GPU上代表工作,由CPU实际执行haebomyeon被替换没有警告。通常TFLite如果发生此问题,“无法应用的代表。警告诸如仅前M OPS将上运行的GPU,并且CPU“上的剩余N( 无法应用该委托执行第一次计算的M仅在GPU和N的操作的其余部分=在CPU上运行。)显示该消息。因此,使用LAMBDA层测量实际推理小时后应始终在处理时要注意。
结论
相比CPU GPU推理的平均时间推断中的各种Android设备实现vFlat模型的时间
已经有许多障碍,到目前为止,我们已经降低了使用GPU TFLite委托推理模型,超过一半的时间。最后,我们能够提供“实时预览”功能平板显示在实时用户页面。
TFLite GPU和使用这个我可以自信地告诉你,这是一个很好的选择,委托,谁希望部署用于移动设备的人才培养模式的开发是强烈建议尝试它TFLite GPU的代表。
|
发布时间:2019年9月27日上午02时08分PDT
上一页 谷歌I / O ,可以实现对一个负责任的架构以及动画技术,我有几句话。 TL; DW?
由于分gyesil不介意32分钟看老电影,我们引入一个音符的覆盖以书面形式呈现的主题。
#AnimationsMatter
动画被认为是在应用程序的可用性,以发挥重要的作用。描述变革和转型的状态,以动画,或建立空间模型,或者是因为它可以吸引眼球。动画将帮助您了解正确的应用程序,并导航到所需的画面。
上面的例子是使用相同的流,除了动画或没有。如果动画是没有改变的状态说明什么,我觉得是一个突然的变化。
我认为动画是很重要的,同时也降低了想法越来越难以实现动画为一体的应用变化的现代建筑方法。 外视图层次 那里去大部分的管理控制器(如视图模型),这种控制器封装需要渲染视图对象的应用程序的当前状态的状态:帖子(如UiModel)。例如,如在网络请求,或者您已经开始完成的工作,并公布封装的整个状态的新UI模型更新的东西时在数据模型发生变化。
视图模型发布状态的对象流
今天我不想把重点放在模式及其优势,当谈到这个问题上,有许多伟大的资源。浏览单向数据流或MVI MvRx 或 莫比乌斯 找到像库。相反地,该视图观察模型流,并且我想集中在流上的另一端被结合到UI。这部分是等给出任何新的状态的纯函数是完全结合到UI。我不想去想UI的当前状态。换句话说,该数据 必须被 结合用于UI状态 未跟踪(无状态)。 但动画是 一种 状态 (有状态)。 动画从一个值随时间移动到一个不同的值。从本质上讲,在这一点上,我有冲突。出于这个原因,这些天是从应用的动画去掉,我确实担心,导致可用性的损失问题。
有什么问题?
有一个非常小的例子,我们可以看看以具体鉴定所面临的挑战以及如何保持动画在此反应环境是登录屏幕。
登录按钮和进度指示器的方式淡入/淡出显示或消失的登录界面
如果你按下按钮,用户登录,并且我会隐藏登录按钮显示进度指示器,在登录按钮淡出和淡入让我们削减我们要处理的方式进度指示器。
状态对象屏幕(静态)绑定逻辑可能看起来像下面的一个。
第一次尝试,如果你想表达的 动画 这种变化 将显示器类型值,如果可以像下面,这里的alpha属性的动画,最后淡出。
然而,这可能导致意想不到的结果如下:
当您添加动画到一个响应的应用程序可能会出现的问题,
在这里,每按一个键,但新的UI模型发布,并有望看到进度指标继续显示不同的!或(在演示过分地增加动画持续时间条件),按提交按钮,并可能导致错误的消失,最终,无论是按钮和进度指示器。它不能正确处理动画 关闭监听器 是因为不利的影响,因为这样的。
当您从一个反应环境的动画,也有动画代码所需的几个特点。这些特性haebwatseupnida分类如下:
重入
再入在任何时候停止动画,这意味着必须再次调用。如果对象的新状态张贴, 即使 在动画运行, 你需要准备动画以便为新状态的动画具有约束力。要做到这一点,你可以取消或重新瞄准正在运行的动画,潜在的不利影响,必须能够消除所有的(例如,监听器)。
演替
连续性,请考虑是为了避免发生在动画本新闻为证明财产或当您将视图动画的大小和颜色值的突然变化。
当按下格兰特动画的大小和颜色,
当您运行动画结束一切看起来很好看,但如果你这样做,你很快挖掘动画的大小变化和颜色间断。这是在结合代码归属的结果(例如,假定的动画渐变总是从零阿尔法开始)。
润滑
为了理解Properties视图中,认为例如移动到响应于某些事件,如下面的上向左或向右:
装模作样动画
如果视图很快在右上角视图发送连续两次是继续在中间停车后向目的地移动缓慢。如果您更改目标的中间替代了移动方向突然停止再次查看。这可爱的方向那种突然停止或改变看起来不自然。在现实世界,因为它不以这种方式移动。因此,要保持持续平稳的动画,你需要避免这种行为。
FIXME
现在,让我们回到绑定功能解决这个问题。首先, 让我们来看看连续性。奥飞动漫是始终从初始值到最终值:你可以看到运行(例如,从0到1淡入)。这也可以省略,而不是初始值,并提供了最终值。
现在 提出让我们松了一口气, 可 在任何时间, 重新进入 并再次调用 该函数 。这项工作并不需要首先做的是安心当你没有做任何事情。如果视图已在目标值可能会提前。
接下来,保存正在运行的动画师和侦听器必须让他们开始新的动画之前取消。这种逻辑的保存位置,但在视图本身,查看已经是一个非常方便的机制 ViewPropertyAnimator 报价。该机构为对象,从到View.animate()的调用返回,如果你开始一个新的动画任何属性, 将自动取消 该属性上所有正在运行的动画。 去过太神奇了! ViewPropertyAnimator也当只有当动画正常运行运行和动画的结尾被取消不运行 withEndAction 该方法还提供了一个疑问,到底是什么,我们是适得其反如果动画因为你需要,输入一个新的目标值行为取消:这意味着(例如,显示类型的变化)也将被执行。到ViewPropertyAnimator过渡成为可能重入功能。
ViewPropertyAnimator会跟取消对同一属性在动画的运行,并开始一个新的动画。这 可能导致的问题和自然的动画单元, 触痛 是违反属性在动画突然停止之前,另一个启动动画如(更短的距离,但持续时间相等)。在那里,你可以看到动画库来解决这个问题,我认为开发人员熟悉的库andago得多。
Springterlude
春天 “动态的动画” Jetpack的图书馆 是一部分。我想很多人在看,说明非常有弹性否认地图跳过刚刚库中的动画。这可能是采取该效果是有用的,但它会ahniraseo并不总是必要或适宜。但这种弹性可以 禁用 并停止 在一个系统中使用了一些 有用的 功能,动画和 物理动画 和 属性 共同再次启动动画。
如果你回到春季实施的重新动画的前面的例子,你可以看到,不会出现问题的柔软度。相反,该过程被重复启动问题和目标的变化通过保持目前的速度,以创建一个平滑的动画。
在基于弹簧的动画维护的速度重新定位
SpringAnimation 写作是在长相一般的动画师和很多方面是相似的,不只是调用start() animateToFinalPosition 使用该方法的一个很大的优势点。这种方法是 很重要的 动画用于启动动画,如果它尚未启动,但动画正在运行,如果 重新定位 的动画到新的目标 维持势头没有突然变化。
Ahswipgin无法查看API很容易使用,就像一个春天,但View.animate(仅支持的Jetpack),可用于构建扩展功能如下:
该给定 VIEWPROPERTY ( 平移,旋转,如 创建上的弹簧),或者可以存储呼叫的标签和视图,以便可以使用animateToFinalPosition方法,绑定该显示类型容易地更新正在运行的动画,如下:使用功能。
你也应该改用弹簧动画末监听工作终止。 要点 你可以找到在这个完整的代码。也是,我可以做动画,一定程度上思考。不同于常规的动画,指定的持续时间和内插器中,弹簧可以通过刚度和阻尼比设置进行配置。但是,让你可以轻松地配置调用点,可以提高扩展功能允许以提供实用的默认适当的参数。更完整的实现描述 在这里 ,请访问。
绑定功能创建成具有再入境,连续性和性能的平滑度。为了实现这一目标,所有的绑定功能可能会出现有关,但实际上,如果他们几个人可以在所有的应用中使用。 在这里 ,以帮助在一个易于使用的弹簧机构发现在包装上的库。
项目动画
在这个例子中模拟而在动画运行,使用混洗按钮出现在数据集中的更新。请注意,当你按下按钮快速连续两次naendaneun使基于弹簧的动画的平滑度有很大的区别。在左侧,只有改变方向跟在停顿中,更改平滑了正确的方向。大部分这些应用程序可能会投注将被显示在RecyclerView加载从网络上的许多来源的信息,利用这种动画,应用的更高,更灵活的完整性创建一个更柔和的环境。 这里 的 格纹样品 添加动画的这种以 找到PR。
更智能的动画
我们希望,在这篇文章中所描述的原则,将帮助你自然动画以快速响应的应用提高了可用性。有在重要事实的差异,讨论的原理。
再入是其准确性的属性。如果没有这个属性,动画可以使用.ViewPropertyAnimator断开,或者被关注的动画停止动画代码被适当处理的情况下,可以再次调用。
香格里拉元素,允许不仅让动画可以更愉快和有趣的应用程序,它可以更容易地理解毫无疑问的。要了解这些技术希望借此在应用程序中的优秀动画的优势。 |
评论
发表评论