使用TensorFlow Lite GPU delegate进行实时推理来扫描书籍 vFlat

vFlat 是如何使用TensorFlow Lite GPU delegate进行实时推理来扫描书籍的

A guest post by Kunwoo Park, Moogung Kim, Eunsung Hangit

使用vFlat应用程序对弯曲书页进行平扫github

尽管有许多移动扫描应用程序可供下载,但大多数都专一于将平面文档数字化,在扫描书籍的弯曲页面时会遇到困难。当扫描带有文本的曲面时,人们能够经过移除书本或出版物的装订来进行破坏性扫描,或者简单地按原样接受输入并处理读取相机捕获的曲面图像。网络

这就是为何咱们在旅行者开发 vFlat, 一款使用深度学习来解决这个问题的Android应用程序。vFlat应用程序的目的是让用户轻松地浏览他们的书籍,而没必要担忧弯曲的页面。它还试图经过自动肯定书籍页面的边界来减小用户的手动输入。app

图1:普通移动相机拍摄的弯曲书页图像异步

图2:使用vFlat扫描同一图像的版本post

当用户试图经过OCR(光学字符识别)从书页的照片中提取文本时,这一点很是有用。当从上面的图像中提取文本时,OCR没法正确识别某些单词和文本行,由于它们太弯曲了。然而,将一样的技术应用到右边的图像会产生更高的成功率,而且能够在几乎没有错误的状况下提取文本。性能

vFlat应用程序中图像B的OCR结果学习

如何构建vFlat应用程序

咱们开发了一个深度学习模型,可使弯曲的书页变平,并决定在移动设备上进行,以提供最佳的最终用户体验。在vFlat应用程序中,有一个“实时预览”功能,用户能够在其中看到实时展平的书页(超过20FPS)。若是用户只需使用该应用程序就能够将扫描的页面实时预览为扁平图像,那么他们能够在拍照前调整角度和边框。优化

vFlat的“实时预览”功能google

为了在移动应用程序中实现实时推理,咱们优化了训练模型,并利用硬件加速的优势。咱们最初的想法是用OpenGL本身实现推理模块,因此咱们准备用GLSL(OpenGL着色语言)实现模型的层。 幸运的是,咱们遇到了TensorFlow Lite的GPU支持,并决定尝试一下(在编写本文时,'TensorFlow-Lite-GPU' package版本已更新为“org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly”). 咱们减小了权重和复杂操做的数量,提出了一个轻量级版本的模型,并利用TFLite GPU代理进行硬件加速。深神经网络很是适合GPU,由于它们比cpu具备更多的计算能力,而且擅长处理大量并行工做负载。可是,使用移动GPU并非一件小事;这就是TFLite GPU代理的做用所在。 TFLite GPU代理为移动GPU优化神经网络图,并生成和编译异步执行的计算着色器。感谢TFLite GPU代理,咱们没必要实现本身的硬件加速推理模块,从而节省了几个月的开发时间。 尽管咱们使用TFLite GPU代理节省了时间和精力,但咱们在将本身的模型转换为TFLite模型并将其与TFLite GPU代理集成时遇到了问题。仅GPU代理的实验版本支持的操做 它主要用于MobileNet,不支持咱们原始模型中的某些操做。 为了在不牺牲模型性能的状况下利用GPU代理,咱们必须在保持整个网络结构不变的状况下替换一些操做。咱们在转换过程当中遇到了问题,因为此时源代码还没有打开,所以很难肯定咱们看到的错误的缘由。(TFLite GPU代理的代码如今公开提供在 GitHub) 例如,因为TFLite GPU代理不支持LeakyReLU操做,所以咱们必须按如下方式使用受支持的PReLU操做: 经过改变

tf.keras.layers.LeakyReLU(alpha=0.3) to tf.keras.layers.PReLU(alpha_initializer=Constant(0.3), shared_axes=[1, 2], trainable=False) 然而,当咱们试图经过共享全部轴(shared_axes=[1,2,3])将PReLU操做中的参数数量减小到1时,咱们遇到了一个意外的行为。虽然此代码在CPU模式下运行良好,但GPU代理失败,错误为“线性alpha形状与输入通道数不匹配”。这就是为何咱们最终只沿着轴1和轴2共享参数。 咱们遇到的另外一个问题是,当咱们试图使用网络中的Lambda层规范化-1和1之间的输入数据时

tf.keras.layers.Lambda(lambda x : (x / 127.5) — 1.0)

TFLite转换器转换的Lambda层的可视化

这彷佛适用于GPU代理,但当实际运行时,它会在没有警告的状况下返回到CPU。一般状况下,当这种状况发生时,TFLite会以“未能应用代理”之类的消息警告咱们。只有第一个M操做将在GPU上运行,其他的N操做将在CPU上运行”。所以,在使用Lambda层时要当心,并在继续以前始终尝试测量实际的推断时间

结论

在不一样Android设备上,GPU上的平均推断时间与咱们模型上的基线CPU推断时间相比

尽管在这一过程当中有几个障碍,可是咱们经过使用TFLite GPU代理将模型的推理时间减小了一半以上。咱们终于可以为用户提供一个“实时预览”功能,其中扁平的页面实时显示. 咱们能够自信地说,使用TFLite GPU代理是一个很好的选择,强烈建议那些想在移动设备上部署他们的训练模型的人尝试一下。 要了解更多,并亲自尝试,请阅读TensorFlow Lite GPU delegate.

vFlat鸟瞰图

相关文章
相关标签/搜索