15分鐘用 Keras 和 Supervisely 搞定車牌識別技術

先說好,我們今天識別的不是這種車牌↓↓↓

本教程將簡單講解如何在 15 分鐘內用深度學習搭建一個現代的文字識別系統,主要是教你如何使用 Keras 和 Supervisely 來解決文字識別問題的主要原理。任何想學慣用深度學習技術識別圖像中文字但又毫無頭緒的人,都應該參考本篇指南。

文字識別在現實世界中有一個簡單的應用:車牌號識別。車牌號識別是一個非常好的入門實例,並且你能夠根據自己的問題進行針對性的調整。今天我們就來看看如何用 Keras 和 Supervisely 識別出車牌號。

在深入這一領域時,我們面臨的首要問題就是互聯網上缺少足夠的資料和資源。經過長期的研究並閱讀了大量的論文後,我們終於對如何創建一套有效的識別系統確立了一些主要理念同時,我們在下面兩段視頻中(part1 和 part2)以通俗易懂的方式分享了我們自己的理解和觀點。我們認為其中的內容非常有價值,它簡單而又有效地解釋了如何構建現代化的識別系統,這是非常難能可貴的。因此我們強烈建議你先觀看一下這些視頻,它們能夠帶給你許多解決識別問題的直觀認識。

https://www.zhihu.com/video/959783554071388160

視頻 Part2 超過 15 分鐘被編輯器限制了,傳送門:

https://www.youtube.com/watch?v=eYIL4TMAeRI?

www.youtube.com

為了萬無一失地學習本教程,你需要準備好 Ubuntu 操作系統、GPU 和 Docker。

本文中所有的資源都可以在 github 上獲取,源代碼以及注釋和可視化信息都存儲在一個單獨的 jupyther 筆記本中。(資源地址見文末)

哪裡能夠獲取訓練數據?

針對這篇教程,我們生成了 10K 以上的與真實車牌號相似的人工數據集,它們的樣子是這樣的:

通過 Supervisely 你可以方便的得到這份數據集。關於這份數據集,我們在 DeepSystems 中做了大量的計算機視覺方面的開發工作,比如自主駕駛汽車、發票識別系統、道路缺陷探測等,針對訓練數據,數據科學家花費了大量時間做了大量工作,包括創建特殊的圖像注釋,將數據與公開的數據集合併,進行數據擴展等。Supervisely 簡化了使用數據集的工作,並能自動完成許多例行的任務,我們相信在日常工作中,你一定會發現它的用處和價值。

首先我們要在 Supervisely 上註冊賬戶 supervise.ly/ 完成註冊後依次點擊「Import」—> 「Datasets library」並選擇我們的「anpr_ocr」項目。

之後輸入項目名字 「anpr_ocr」 並點擊「Next」按鈕。

隨後點擊「Upload」按鈕。此時,項目「anpr_ocr」便完成創建並添加進了你的賬戶中。

它有兩個數據集組成:「train」 和 「test」,即訓練集和測試集。

如果你想預覽圖片,只需點擊數據集即可,會馬上進入注釋工具。對於每一張圖片,我們都有一個描述性的文本,它將被作為真實的車牌號來訓練我們的系統。只需要點擊與所選擇的圖像相對的小標籤(標為紅色)就能夠瀏覽其內容。

如果要下載數據集並保存為特定的格式,只需要點擊「Export」並輸入相應的配置信息即可

https://github.com/DeepSystems/supervisely-tutorials/blob/master/anpr_ocr/data/config.json?

github.com

如下所示:

上面的截圖中對導出步驟進行了說明,此處不再贅述(可以閱讀網站文檔獲取更多信息),我們重點關注下面的處理過程。在我們的「anpr_ocr」項目中,我們有兩個數據集,「Test」數據集與導出時相同,「Train」數據集被分成了兩部分:「train」 和 「val」,隨機選擇95%的圖片添加進「train」數據集中,剩下的5%則被加入「val」數據集中。

現在,你可以點擊「Start exporting」按鈕,稍等幾分鐘待系統完成文件打包等準備工作,隨後依次點擊「Export」 -> 「Task status」 -> 「Three vertical dots」 -> 「Download」按鈕即可下載訓練數據集(標為紅色)。

開始我們的實驗

在我們的 git 倉庫中,我們準備了所有需要的東西,通過下面的命令克隆倉庫:

git clone https://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

將下載的 zip 打包文件放入 「data」 文件夾中並運行下面的命令:

unzip <archive name>.zip -d .

在我們系統上,命令是這樣的:

unzip test1–1703.zip -d .

現在我們結合預先配置好的環境(TensorFlow 和 Keras)來構建並運行 docker 容器,只需要進入「docker」文件夾並運行下面的命令:

./build.sh./run.sh

在此之後你會進入容器中,運行下面的命令來啟動 Jupyther 筆記本。

jupyter notebook

在終端中,你會看到類似下面這樣的信息:

你必須將上面所選中的鏈接複製粘貼到瀏覽器中,注意:你的鏈接和我的會略微不同。

最後一步是運行整個 「image_ocr.ipynb」 筆記本,依次點擊「Cell」 -> 「Run all」。

筆記中包含以下幾個部分:數據載入和可視化、模型訓練、驗證集模型評估。這個數據訓練過程平均耗時約30分鐘。

如果一切順利,你將會看到像下面這樣的輸出結果:

如你所見,預測出的結果與真實值是相同的。就這樣,我們在一個非常簡潔的 jupyther 筆記本上建立了現代的 OCR 系統,在本文下面的章節中,我們將會解釋這個系統是如何工作的。

它是如何工作的?

對我們來說,理解神經網路架構是關鍵所在,不要吝惜 15 分鐘的時間,去看一看我們在開頭提到的視頻吧,它提供了神經網路架構的上層概述,能夠讓你有一個基本的理解,如果你已觀看過它 —— 那就太好了:-)。

關於 CNN 和 LSTM 的講解,也可參閱集智主站的講解:

卷積:如何成為一個很厲害的神經網路 - 集智專欄?

jizhi.im圖標一小時建立終身受害的AI創作系統 - 集智專欄?

jizhi.im圖標

現在我會做一個簡短的解釋,隨後會有更高層次的說明。

首先,將圖像輸入 CNN 中提取圖像特徵,接下來對這些特徵應用卷積神經網路,然後採用特殊的解碼演算法進行解碼,解碼演算法會利用每個時步產生的長短期記憶網路輸出,併產生最終的標籤。

詳細的架構將會在下面給出,兩個縮寫的含義分別為:

  • FC — 全連接層
  • SM – softmax層

圖片的形狀為:高 64,寬 128,3 個通道。

正如之前所見,我們將這幅圖像輸入 CNN 特徵提取器中,會輸出一個形狀為 4*8*4 的張量,我們將圖片「apple」與這個結果放在一起你就能理解如何解讀這個張量。4 就是高度,8 為寬度(這些都是空間維度),通道數為 4,也就是說我們將 3 通道的輸入圖片轉換為了 4 通道的張量。從實用的角度出發,通道數應該更多,但我們構建小型的示例網路,因為這樣更適合用幻燈片進行講解。

接下來我們進行形狀重塑,在這之後我們得到了由 8 個向量組成的序列,每個向量中含有 16 個元素,然後我們將這 8 個向量輸入 LSTM 網路中並得到相應的輸出 — 同樣是 16 個元素組成的向量,現在,我們將全連接層應用到這些輸出上,緊接著應用 softmax 層並獲得6元素的向量,這個向量包含了每一步 LSTM 中所觀察到的字元的概率分布。

實際上,CNN 輸出的向量數量可以達到 32,64 甚至更多,這取決於具體的任務。並且在部署時最好能夠使用多層雙向 LSTM,不過在這裡,我們的例子中只解釋最重要的概念。

解碼演算法又是如何起作用的呢?

在上面的圖表中,對於每一個 LSTM 時步,我們都有 8 個概率分布向量,將每個時步中最大概率對應的符號抽取出來,我們得到了由8個字元組成的字元串,然後我們必須把所有連續重複的字元合併為一個,在我們的例子中,兩個連續的字母「e」被合併成了一個。特殊的空白符使我們能夠將初始標籤中重複的字元分離開來,所以我們在字元表中加入空白字元來訓練神經網路,使其能夠預測重複字元之間的空白符,最後我們再刪除這些空白符。這個處理過程請看下面的圖示:

在訓練我們的網路時,我們用 CTC Loss 層替換了解碼演算法,這在我們的第二段視頻中有相應的解釋,不過目前視頻中用的是俄語,但我們會儘快推出英文版,對此深感抱歉。

我們的實現中使用了稍微複雜的 NN 架構,如下面所示,但核心的原理是相同的。

在模型訓練完成後,我們將其應用到驗證集上並取得了非常精確的識別效果。同時我們也對每一步 CNN 操作輸出的概率矩陣進行了可視化操作,如下所示。

矩陣的行對應所有的字元,包括空白字元,列對應著 RNN 的步驟。

總結

我們非常高興與大家分享我們的經驗,相信這些視頻課程、教程、隨時可用的人工數據以及源代碼能幫助你獲得直觀的認識,人人都能從零開始搭建一個車牌識別系統。


附:

視頻1地址:

youtube.com/watch?

視頻2地址:

youtube.com/watch?

GitHub代碼地址:

github.com/DeepSystems/

如果對車牌識別技術很感興趣,集智主站《玩兒懂深度學習》系列之文字的識別與定位不容錯過:

https://jizhi.im/blog/post/gpu-p5?

jizhi.im


推薦閱讀:

你們幾個,明早可別忘了來集智拿1070ti啊!
卜卦婆婆也要失業?AI開始預測球賽結果!
邊看邊練的簡明機器學習教程,你還不趕緊來!
遍地開花的AI助手,代表著人機交互方式的未來
如何有效鍛煉記憶力?

TAG:Keras | 景略集智 | 圖像識別 |