什麼是聯結主義時間分類 (CTC)?
我正在尋找一個光學字符識別(OCR)項目。在做了一些研究之後,我發現了一個看起來很有趣的架構:CNN+RNN+CTC。我熟悉卷積神經網絡 (CNN) 和循環神經網絡 (RNN),但什麼是連接主義時間分類 (CTC)?我想要通俗易懂的解釋。
您有一個數據集,其中包含:
- 圖像 I1、I2、…
- 地面實況文本 T1、T2、… 用於圖像 I1、I2、…
所以你的數據集可能看起來像這樣:
神經網絡 (NN) 為圖像的每個可能的水平位置(在文獻中通常稱為時間步長t)輸出一個分數。對於寬度為 2(t0,t1)和 2 個可能的字符(“a”,“b”)的圖像,這看起來像這樣:
| t0 | t1 --+-----+---- a | 0.1 | 0.6 b | 0.9 | 0.4
要訓練這樣的 NN,您必須為每個圖像指定地面實況文本的字符在圖像中的位置。例如,考慮一個包含文本“Hello”的圖像。您現在必須指定“H”開始和結束的位置(例如,“H”從第 10 個像素開始,一直到第 25 個像素)。“e”, “l, … 這聽起來很無聊,對於大型數據集來說是一項艱鉅的工作。
即使您設法以這種方式註釋了完整的數據集,還有另一個問題。NN 在每個時間步輸出每個字符的分數,請參閱上面顯示的表格以獲取玩具示例。我們現在可以在每個時間步長中選取最有可能的字符,即玩具示例中的“b”和“a”。現在考慮一個更大的文本,例如“Hello”。如果作者的寫作風格在水平位置使用大量空間,則每個字符將佔用多個時間步長。取每個時間步最可能的字符,這可以給我們一個像“HHHHHHHHeeeellllllllloooo”這樣的文本。我們應該如何將此文本轉換為正確的輸出?刪除每個重複的字符?這會產生“Helo”,這是不正確的。所以,我們需要一些巧妙的後處理。
CTC 解決了這兩個問題:
- 您可以從對 (I, T) 中訓練網絡,而無需使用 CTC 損失指定字符出現在哪個位置
- 您不必對輸出進行後處理,因為 CTC 解碼器會將 NN 輸出轉換為最終文本
這是如何實現的?
- 引入一個特殊字符(CTC-blank,在本文中表示為“-”)以表示在給定時間步沒有看到任何字符
- 通過插入 CTC 空白並以所有可能的方式重複字符,將基本事實文本 T 修改為 T'
- 我們知道圖像,我們知道文本,但我們不知道文本的位置。所以,讓我們嘗試文本“Hi—-”,“-Hi—”,“–Hi–”,…的所有可能位置
- 我們也不知道每個字符在圖像中佔據多少空間。因此,讓我們通過允許字符重複來嘗試所有可能的對齊方式,例如“HHi—-”、“HHHi—”、“HHHHi–”…
- 你看到這裡有問題嗎?當然,如果我們允許一個字符重複多次,我們如何處理真正的重複字符,比如“Hello”中的“l”?好吧,在這些情況之間總是插入一個空格,例如“Hel-lo”或“Heeellll——-llo”
- 計算每個可能的 T' 的分數(即每個轉換和這些的每個組合),對所有分數求和,從而產生對 (I, T) 的損失
- 解碼很簡單:選擇每個時間步得分最高的字符,例如“HHHHHH-eeeellll-lll–oo—”,丟棄重複字符“H-el-lo”,丟棄空白“Hello”,然後我們完成。
為了說明這一點,請看下圖。它是在語音識別的上下文中,但是,文本識別是一樣的。即使字符的對齊方式和位置不同,解碼也會為兩個說話者生成相同的文本。
進一步閱讀:
- 直觀的介紹:https ://medium.com/@harald_scheidl/intuitively-understanding-connectionist-temporal-classification-3797e43a86c (鏡像)
- 更深入的介紹:https ://distill.pub/2017/ctc (鏡像)
- Python 實現,您可以使用它來“玩” CTC 解碼器,以更好地了解它的工作原理:https ://github.com/githubharald/CTCDecoder
- 當然,還有Graves、Alex、Santiago Fernández、Faustino Gomez 和 Jürgen Schmidhuber 的論文。“連接主義時間分類:用循環神經網絡標記未分段的序列數據。” 在第 23 屆機器學習國際會議論文集上,第 369-376 頁。ACM,2006 年。