1. 程式人生 > >(Keras/監督學習)15分鐘搞定最新深度學習車牌OCR

(Keras/監督學習)15分鐘搞定最新深度學習車牌OCR

   作者:石文華          

編輯:祝鑫泉          

前  言


文章來源:https://hackernoon.com/latest-deep-learning-ocr-with-keras-and-supervisely-in-15-minutes-34aecd630ed8

640?wx_fmt=png
大家好,本教程在15分鐘之內為大家介紹如果使用深度學習來構建現代文字識別系統,你將學會如何使用keras和監督學習解決這個問題,本指南適合對深度學習進行影象文字識別技術感興趣的人們。
思考現實世界中一個簡單的例子:車牌識別,這是一個很好的起點,你可以輕鬆的使用它來定製你的任務,關於車牌識別簡單的教程,你可以在這裡找到它:https://towardsdatascience.com/number-plate-detection-with-supervisely-and-tensorflow-part-1-e84c74d4382c
640?wx_fmt=png


當我們進入這個領域時,面臨著網上資源缺乏的問題,通過長期的研究和閱讀很多論文,對構建有效的識別系統的原理我們有了自己的理解,我們在社群中用了2個小時的視訊講座分享了我們的想法,並用簡單的語言解釋了它是如何工作的,我們覺得這個內容是非常有價值的,因為你很難找到關於如何構建現代識別系統方面好的資源和淺析,我們強烈建議你在開始這篇文章之前觀看它,因為它會給你很多直觀的認識。
要順利完成本教程,你需要Ubuntu, GPU 和 Docker.
所有的資源都可以在github(https://github.com/DeepSystems/supervisely-tutorials)上找到。原始碼位於一個單獨的jupyther筆記本上(https://github.com/DeepSystems/supervisely-tutorials/blob/master/anpr_ocr/src/image_ocr.ipynb),並帶有解釋和必要的視覺化。
640?wx_fmt=png

1

在哪裡獲得訓練資料

對於本教程,我們人工生成了超過10k的影象資料集,它們跟真實的車牌非常相似,這些圖片如下:
640?wx_fmt=png
你可以很容易的從Supervisely(https://supervise.ly/)獲取資料集,我們也在DeepSyetems(https://deepsystems.ai/)上做了很多像自動駕駛汽車,收據識別系統,道路缺陷檢測等計算機視覺開發的案例。作為資料科學家,我們花費了很多時間處理訓練資料集:建立自定義影象註釋,將資料與公共資料集合並在一起,進行資料增強等,Supervisely這個網站簡化了你使用訓練資料,並自動執行許多日常任務。我們相信你會發現它真的很有用。
第一步是在Supervisely中註冊。下一步是進入“匯入” - >“資料集庫”選項卡並單擊“anpr_ocr”專案。
640?wx_fmt=png


接著鍵入名稱“anpr_ocr”並單擊“下一步”按鈕。
640?wx_fmt=png
然後點選“上傳”按鈕,專案“anpr_ocr”就被新增到您的帳戶。
640?wx_fmt=png
它由兩個資料集組成:“訓練集”和“測試集”。
640?wx_fmt=png
如果你想預覽影象,只需點選資料集,你會立即進入註釋工具。對每張圖片,我們都會有一段文字說明,將用作地面實況來訓練我們的系統。要檢視它,只需點選所選影象對應的小圖示(紅色框所示)。
640?wx_fmt=png
現在我們必須以特定格式下載它。要做到這一點,只需點選“匯出”頁面,並將此配置插入文字區域。如下圖所示:
640?wx_fmt=png
在上面的截圖中,你可以看到說明匯出步驟的方案,我們不會深入研究技術細節(如果需要,你可以閱讀官方文件https://docs.supervise.ly/)但是你要認真理解下面的過程:在“anpr_ocr”專案中,有兩個資料集,“測試”資料集按照原樣匯出,“Train”資料集被分為兩組,“訓練集”和“驗證集”,“Train”中95%的作為訓練集,5%作為驗證集。
現在你可以點選“開始匯出”按鈕,等待兩分鐘,系統準備存檔下載。點選下圖紅色框的按鈕獲取訓練資料(以紅色標記)。
640?wx_fmt=png

2

開始我們的實驗

我們在git倉庫中準備了所有需要用到的東西。用下面的命令克隆它。
git clonehttps://github.com/DeepSystems/supervisely-tutorials.git
cd supervisely-tutorials/anpr_ocr
目錄結構如下:
.
├── data
├── docker
│ ├── build.sh
│ ├── Dockerfile
│ └── run.sh
└── src
├── architecture.png
├── export_config.json
└── image_ocr.ipynb
將下載的壓縮檔案放入“data”這個目錄並執行下面的命令。
unzip .zip -d .
我的例子中使用:
unzip test1–1703.zip -d .
現在讓我們構建並執行準備好的工作環境(tensorflow和keras)。只需轉到“docker”目錄並執行以下命令:
./build.sh
./run.sh
之後,你將在容器內。執行下一個命令啟動Jupyther筆記本
jupyter notebook
在終端,你將看到:
640?wx_fmt=png
你必須複製選定的連結並將其貼上到Web瀏覽器中。請注意,你的連結與我的略有不同。

最後一步是執行整個“image_ocr.ipynb”筆記本。點選“單元格” - >“全部執行”。

image_ocr.ipyn筆記本由幾個主要部分組成:資料載入和視覺化,模型訓練,模型評估以及測試。此資料集訓練過程大約需要30分鐘。

如果執行正常,你會看到下面的輸出:
640?wx_fmt=png

正如你所看到的,預測的字串將與地面實況相同。因此,我們在一個非常清晰的jupyther筆記本(https://github.com/DeepSystems/supervisely-tutorials/blob/master/anpr_ocr/src/image_ocr.ipynb)中構建了現代OCR系統。接下來,我們將介紹並解釋它的工作原理。

3

它是怎樣工作的

對我們來說,理解神經網路架構是關鍵。
640?wx_fmt=png
首先,將影象輸入到CNN以提取影象特徵。 接著將這些特徵輸入到迴圈神經網路中,然後經過特殊的解碼演算法。 這種解碼演算法從每個時間步獲得lstm輸出併產生最終標籤。
詳細的架構如下。 FC - 完全連線層,SM - softmax層。
640?wx_fmt=png
圖片的維度是高度為64,長度為128,通道數為3
上圖可以看出我們的原始圖片經過CNN特徵提取之後,維度變成了4*8*4,在實際應用中,我們的輸出特徵圖可能有很多,也就是圖片長寬在縮小,但是我們的特徵圖的深度在增加。
接著進行維度轉換操作。得到16*8的向量序列,上圖所示,有8個列向量,每個列有16個元素。 我們將這8個列向量輸入LSTM網路並獲得輸出。 然後,我們使用全連線層+softmax層,並獲得6個元素的向量。 該向量裡面元素的含義是每個LSTM步驟預測的字母符號的概率。
在實際問題中,CNN輸出向量的數量可以達到32,64甚至更多。所以最好使用多層雙向LSTM。
如何解析得到的預測結果呢?如下圖所示,我們輸出了8個概率值,我們將連續的重複字元去掉,以及刪除空格等特殊的字元,最後合併成一個字串輸出,也就是我們的預測結果。
640?wx_fmt=png
我們在訓練網路的時候,使用了CTC損失層代替瞭解碼演算法,我們在第二個幻燈片上提到過,雖然現在只有俄語版本,但是我們有英文幻燈片,並且很快釋出英文版。
在實際中我們使用了更加複雜的NN價架構,如下圖所示,但是原理的基本思想是相同的。
640?wx_fmt=png
訓練好模型之後,模型在測試集上也得到了很高的準確率, 我們將每個RNN步驟的概率分佈視覺化為一個矩陣。如下圖所示:
640?wx_fmt=png
上圖的縱座標是預測的符號和空白,橫座標表示時序。也就是輸出結果的順序。

總結

我們很高興在社群分享我們的經驗。我們希望視訊講座和本教程,以及我們的資料和原始碼將帶你入門影象文字識別,並且希望每個人都可以從頭開始構建現代OCR系統。

end

機器學習演算法全棧工程師

                            一個用心的公眾號

640?wx_fmt=jpeg

長按,識別,加關注

進群,學習,得幫助

你的關注,我們的熱度,

我們一定給你學習最大的幫助