使用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鳥瞰圖

相關文章
相關標籤/搜索