【導(dǎo)讀】提到 Dropbox,大家可能都知道這是一個文件同步、備份、共享的云存儲軟件。其實(shí) Dropbox 可以實(shí)現(xiàn)的功能遠(yuǎn)不止這些。今天就為大家介紹 Dropbox 一個非常強(qiáng)大又實(shí)用的功能——自動識別并提取圖片中的文本內(nèi)容,包含 PDF 文檔中的圖片。比如,當(dāng)用戶搜索其中某個文件中出現(xiàn)的一段文本時(英文文本),在搜索結(jié)果中就會顯示出這個文件。下面我們就為大家介紹這樣的功能是如何實(shí)現(xiàn)的。
前言
自動識別圖片中的文字功能有很多好處,最顯著的提升是能夠讓 Dropbox 用戶搜索從前無法搜索的內(nèi)容。Dropbox 用戶上傳的圖片和 PDF 文檔總數(shù)已經(jīng)超過了兩百億,這其中有超過百分之十的文件真正的內(nèi)容都是文本,但格式是圖片,比如說手機(jī)拍攝的小票或者白板的照片。這些就是我們要進(jìn)行文字識別的對象了。PDF 文件中有 25% 左右是文檔的掃描件,這些也屬于我們想實(shí)現(xiàn)自動文字識別的對象。
對用戶來說,文檔和文檔的掃描件好像差不太多,但對計(jì)算機(jī)來說區(qū)別可就大了。文檔可以進(jìn)行索引并搜索,而圖片說白了只是一些像素點(diǎn)罷了。像 TXT、DOCX 和 html 格式的文件一般來說都可以進(jìn)行索引,而像 JPEG、PNG 和 GIF 這些圖片格式一般來說是不能直接進(jìn)行索引的。對 PDF 文件來說要分情況,比如 PDF 里的圖片也是不能夠索引的。圖像文本自動識別功能可以智能地區(qū)分所有的文檔和文檔中包含哪類數(shù)據(jù)。
分析
講如何實(shí)現(xiàn)之前我們先要對這個問題進(jìn)行一些初步的分析,具體來說就是回答下面三個問題:
什么文件需要進(jìn)行文字識別
如何判斷文件是否包含有文字
對于 PDF 文件是否所有頁都需要全部識別?識別多少是有用的?
需要進(jìn)行識別的主要是當(dāng)前沒有可用索引文本內(nèi)容的文件,包括圖片格式和還有一部分 PDF 文檔,但其實(shí)這部分文件只占所有文件的很小一部分,所以解決這個問題很重要的一個步驟就是建立一個機(jī)器學(xué)習(xí)模型來判斷文件是否包含可識別的文字。比如說某文檔的照片我們就需要進(jìn)行識別,但如果只是自拍拍到了衣服上的字,這時候識別恐怕就沒有什么意義了。這里我們使用了一個卷積神經(jīng)網(wǎng)絡(luò)來進(jìn)行二元分類。
我們經(jīng)過統(tǒng)計(jì)發(fā)現(xiàn) JPEG 這一最常見的圖片格式中有大約 9% 可能包含文字。PDF 文件的每一頁則可能屬于下面三種情形之一:
非圖片,只有可索引的文字
含有文字的圖片
完全沒有文字內(nèi)容的圖片
這三類中我們感興趣的其實(shí)只有第二類。我們發(fā)現(xiàn)第二類情況在三種情況之中約占 28%。PDF文件的數(shù)量雖然只有 JPEG 圖片數(shù)量的一半,但每個 PDF 文件平均有 8.8 頁。所以綜合看來要處理的 PDF 文件個數(shù)超過 JPEG 圖片量十多倍。不過用下面這個很簡單的辦法就能大大降低需要處理的 PDF 文件數(shù)目。
文件總頁數(shù)
有些 PDF 文件頁數(shù)很多,可能好幾千頁的都有。如果我們沒頭沒腦的通通識別會很占時間和資源。我們統(tǒng)計(jì)了一下 PDF 文件的頁數(shù),發(fā)現(xiàn)超過一半的文件都只有一頁,超過十頁的文件大約只占 PDF 文件總數(shù)的 10%。所以我們設(shè)定了一個標(biāo)準(zhǔn),不管文件有多長只識別前面十頁。
這樣算下來 90% 的 PDF 文檔我們都能實(shí)現(xiàn)完全索引。較長的文檔我們雖然沒有完全實(shí)現(xiàn)識別和索引,但能搜十頁也比完全搜索不到好的多了。
自動文字識別系統(tǒng)
▌圖片的渲染
對于 PDF 文件中圖片的渲染由兩種可行的方式:一個是將頁面中的圖片一張張?zhí)崛〕鰜恚硪粋€是將一頁文件當(dāng)一整張圖片來處理。這兩種方法我們都測試了,不過 Dropbox 的文件預(yù)覽功能已經(jīng)有了完善的 PDF 渲染能力,所以最終我們選擇了第二個方法。這樣處理的話,像 PowerPoint 或者 Post Script 這樣的文件格式,只要能支持預(yù)覽,我們就能進(jìn)行識別,而且詞與詞、段與段之間的順序不會被打亂。
我們的渲染功能是基于谷歌的 PDFium 開發(fā)的。這其實(shí)也是 Chrome 瀏覽器所使用的 PDF 渲染引擎。渲染的過程中我們使用了并行處理來降低延遲。
▌文件圖像分類
模型方面我們先用了 GoogLeNet 來進(jìn)行特征提取,然后用了一個線性分類器來實(shí)現(xiàn)有無文字的分類。訓(xùn)練所用的圖片有些是網(wǎng)上公開的,有些是用戶和 Dropbox 員工提供的,一共有幾千張。
我們發(fā)現(xiàn)一開始訓(xùn)練模型的時候準(zhǔn)確率略低,模型把天際線、光溜溜的墻和開放水域這類圖片都判斷為有文字了。其實(shí)我們?nèi)搜鄱疾惶菀卓闯鲞@些圖片有什么共同點(diǎn),不過模型認(rèn)為只要是背景比較均一,有橫線的就是有文字。最后是通過人工標(biāo)記和給訓(xùn)練集中加入這類圖片才克服了這個問題,從而把準(zhǔn)確率提上來了。
▌識別圖片的四個角
用戶上傳的圖片因?yàn)榕恼战嵌鹊脑颍话銇碚f都不是我們想要的矩形和直角,所以必須進(jìn)行矯正。要矯正的話,就要取得圖片中文件四個角的坐標(biāo),這個功能我們也是用卷積神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)的。具體地說,就是把 Densenet-121 的輸出換成了四個角的坐標(biāo)。
訓(xùn)練這個模型用了幾百張圖。標(biāo)記數(shù)據(jù)集的過程,需要一張一張地把文件的四個邊找出來。這項(xiàng)工作我們是在亞馬遜上眾包完成的。有的圖某個角可能壓根沒拍著,那這個角的坐標(biāo)就跑到圖片外面去了,這時候就只能靠人工腦補(bǔ)了。
為了加快速度,訓(xùn)練模型的時候用的圖片分辨率比實(shí)際的圖片分辨率低,所以輸出的坐標(biāo)也是低分辨率圖片上的坐標(biāo)。為了提高精度,我們在四個角附近,用高分辨率的圖片把模型重跑了一遍。這樣既提升了訓(xùn)練的速度,又能得到高精度圖片上四個角的坐標(biāo)。
▌單詞提取
這一部分以矯正過的圖片作為輸入,輸出的則是單詞的內(nèi)容和定界框。單詞就按照識別出的順序一一加入索引。如果文件超過一頁,則繼續(xù)建立索引一直達(dá)到 10 頁的限制就停。
上面講的的這幾個部分組合起來看是這樣的:
圖中標(biāo)出的步驟我們來分別介紹一下:
通過檢查文件格式判斷是否含有圖片;判斷用戶權(quán)限
判斷圖片或 PDF 文件是否含有可識別的文字
判斷圖片的四個角以便進(jìn)行矯正
提取單詞
加入索引
圖中有一個我們之前沒有介紹過的 Auto-OCR lambda 模塊,這其實(shí)是一個 Cape 微服務(wù)。Cape 是 Dropbox 在 16 年底推出的一個異步事件流處理框架,Dropbox 很多功能都用到了Cape。有了這個 Cape 微服務(wù),當(dāng)用戶對文件進(jìn)行增改的時候文字識別功能就能自動觸發(fā)了,也就是圖中列出來的步驟 1 到 5。
得益于 Dropbox 預(yù)覽功能所提供的基礎(chǔ)設(shè)施,這一系列從讀取文件,判斷類型,矯正到最后識別操作的效率很高,而且這套系統(tǒng)對文件的操作(比如渲染)是進(jìn)行了緩存的,所以當(dāng)用戶上傳同一個文件不會造成系統(tǒng)資源的二次開銷。增加支持的文件類型和操作也是非常容易,只要為新的文件類型開發(fā)一個預(yù)覽插件就行了?,F(xiàn)在對 PDF 文件的識別也是通過插件來實(shí)現(xiàn)的。
為了提供系統(tǒng)的穩(wěn)定性,我們在插件的調(diào)用過程中使用了指數(shù)補(bǔ)償算法并加入了隨機(jī)值。拿第一步調(diào)用的插件來說,重試之后失敗率降低了 88%。
性能優(yōu)化
剛開始測試的時候我們發(fā)現(xiàn)所使用的機(jī)器學(xué)習(xí)模型所占的資源和帶來的延遲完全在我們能接受的范圍之外,所以必須進(jìn)行優(yōu)化。我們決定先從配置參數(shù)著手,因?yàn)槲覀儼l(fā)現(xiàn)如果模型的性能遭遇瓶頸,很多時候簡單地改變配置參數(shù)就能收到很好的效果。下面我們就來舉幾個例子說明一下。
我們的第一個改動是關(guān)閉了 TensorFlow 的多核支持。Dropbox 系統(tǒng)并行是在 CPU 層面實(shí)現(xiàn)的。每個核只運(yùn)行一個單線程的程序,這樣可以避免對數(shù)據(jù)的損壞也能降低惡意軟件入侵的風(fēng)險。然而,TensorFlow 默認(rèn)是開啟多核支持的。這樣相當(dāng)于每一個核又在跑多線程了,由此引起的上下文切換使得系統(tǒng)吞吐量損失了約 2/3。
關(guān)閉多核支持后性能還是不夠好。所以我們又換成了支持 AVX2 指令集的 TensorFlow 并將模型和環(huán)境用 TensorFlow XLA 提前編譯成一個 C++ 庫。此外我們還調(diào)整了一些隱藏層的節(jié)點(diǎn)數(shù)量。
圖像四個角坐標(biāo)和文本方向的判斷我們所采用的模型架構(gòu)是 Densenet-121。相比之前用過的 Inception-Resnet-v2 來說速度大概快了一倍,坐標(biāo)識別的準(zhǔn)確率只是稍遜,而且是可以忽略不計(jì)的程度。
其實(shí)我們所作的這些工作都是為了加深對文件結(jié)構(gòu)和內(nèi)容的理解,讓用戶使用 Dropbox 時可以有更好的體驗(yàn)。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4733瀏覽量
100417 -
自動識別
+關(guān)注
關(guān)注
3文章
216瀏覽量
22807 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8349瀏覽量
132312
原文標(biāo)題:Dropbox如何使用機(jī)器學(xué)習(xí)從數(shù)十億圖片中自動提取文字
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論