文字識別中CTC損失的直覺解釋
編輯:zero
關注 蒐羅最好玩的計算機視覺論文和應用,AI演算法與影象處理
微信公眾號
,獲得第一手計算機視覺相關資訊
本文轉載自:公眾號:AI公園
作者:Harald Scheidl
編譯:ronghuaiyang
導讀
非常直觀的解釋了文字識別中非常常用的CTC損失和解碼的操作。
如果你想讓計算機識別文字,神經網路(NN)是一個不錯的選擇,因為它們目前的表現優於所有其他方法。這裡的神經網路通常由
卷積層(CNN)
和
遞迴層(RNN)
組成,前者用於提取特徵序列,後者用於透過該序列傳遞資訊。它輸出每個序列元素的字元得分,它只需要用一個
矩陣
來表示。現在,我們想對這個矩陣做兩件事:
訓練:計算神經網路的損失來訓練網路
推斷:解碼矩陣,得到包含在輸入影象中的文字
這兩項任務都由
CTC操作
完成。手寫識別系統概述如圖1所示。
讓我們更仔細地看看
CTC操作
,並討論它是如何工作的,剖析一下它所基於的複雜公式背後的巧妙思想。最後,如果你感興趣,我會給你一些參考資料,你可以在其中找到Python程式碼和(不太複雜的)公式。
圖1:手寫字識別的概要圖
我們為什麼要用CTC
當然,我們可以用文字行影象建立一個數據集,然後為影象的每個水平位置指定相應的字元,如圖2所示。然後,我們可以訓練一個神經網路輸出每個水平位置的字元得分。然而,這種解決方案有兩個問題:
在字元級標註資料集非常耗時(而且枯燥)。
我們只得到字元分數,因此需要進一步處理才能得到最終文字。一個字元可以跨越多個水平位置,例如,我們可以得到“ttooo”,因為“o”是一個寬字元,如圖2所示。我們必須刪除所有重複的“t”和“o”。但如果被認可的文字是“too”呢?刪除所有重複的“o”會得到錯誤的結果。如何處理這個問題?
圖2:影象中每個水平位置的標註
我們只需要告訴CTC loss函式影象中出現的文字。因此,我們忽略了影象中字元的位置和寬度。
不需要對已識別的文字進行進一步處理。
CTC如何工作
正如已經討論過的,我們不希望在每個水平位置上對影象進行標註(從現在開始,我們將其稱為
time-step
)。神經網路的訓練將以CTC損失函式為指導。我們只將神經網路的輸出矩陣和相應的ground-truth(GT)文字輸入到CTC損失函式中。但是它如何知道每個字元出現在哪裡呢?它不知道。相反,它嘗試影象中GT文字的所有可能的對齊,並對所有的得分求和。這樣,如果對齊分數的求和值很高,則GT文字的分數就很高。
文字編碼
還有一個問題是如何編碼重複的字元(還記得我們說過的“too”嗎?),它透過引入一個偽字元(稱為blank,但不要將它與“真正的”blank混淆,即空白字元)來解決。在下面的文字中,這個特殊字元將被表示為“-”。我們使用一個聰明的編碼模式來解決重複字元的問題:在編碼文字時,我們可以在任何位置插入任意多的空格,而在解碼時這些空格將被刪除。但是,我們必須在重複的字元之間插入空格,比如“he
ll
o”。此外,我們可以重複每個字元,只要我們喜歡。
我們來看一些例子:
“to”→“ttttttooo”,或“-t-o”,或“to”
“too”- >“ttttto - o”或“- t - o - o”,或“- o”,但不能是“too”
正如你所看到的,這個模式還允許我們輕鬆地建立相同文字的不同對齊,
例如“t-o”和“too”以及“-to”都表示相同的文字(“to”),但是對影象的對齊不同。該神經網路被訓練成輸出編碼文字(編碼在神經網路輸出矩陣中)。
損失的計算
我們需要計算給定對影象和GT文字的損失值來訓練神經網路。你已經知道,NN在每個時間步長輸出一個矩陣,其中包含每個字元的得分。一個極小矩陣如圖3所示:有兩個時間步長(t0, t1)和三個字元(“A”,“b”和空白“-”)。每個時間步的字元得分總和為1。
圖3:神經網路的輸出矩陣。字元機率用顏色編碼,數值在每個矩陣條目旁邊列印。細線是表示文字“a”的路徑,而粗虛線是表示文字“”的唯一路徑。
此外,你已經知道損失的計算方法是將GT文字的所有可能對齊的所有得分相加,這樣,文字在影象中出現的位置就不重要了。
一個對齊(或
path
,通常在文獻中稱為
path
)的得分是透過將相應的字元得分相乘來計算的。在上面的例子中,路徑“aa”的得分為0。4·0。4=0。16,路徑“a-”的得分為0。4·0。6=0。24,路徑“a”的得分為0。6·0。4=0。24。為了得到給定GT文字的分數,我們對與此文字對應的所有路徑的分數求和。假設示例中的GT文字是“a”:我們必須計算長度為2的所有可能路徑(因為矩陣有2個時間步長),即:“aa”、“a-”和“a-”。我們已經計算了這些路徑的得分,所以我們只需要對它們求和,得到0。4·0。4+0。4·0。6+0。6·0。4=0。64。假設GT文字為“”,我們看到只有一條對應的路徑,即“——”,得到總分0。6·0。6=0。36。
如果你仔細看,你會發現我們計算的是GT文字的機率,而不是損失。然而,損失只是機率的負對數。損失值透過神經網路反向傳播,神經網路的引數根據所使用的最佳化器進行更新,在此不再贅述。
解碼
當我們有一個訓練過的神經網路時,我們通常想要用它來識別以前沒有見過的影象中的文字。或者用更專業的術語來說>我們希望計算給定神經網路輸出矩陣的最有可能的文字。你已經知道了計算給定文字得分的方法。但這一次,我們沒有得到任何文字,事實上,這正是我們要找的文字。如果只有幾個時間步驟和字元,那麼嘗試所有可能的文字都是可行的,但是對於實際的情況下,這是不可行的。
一個簡單而快速的演算法是
最佳路徑解碼
,它包括兩個步驟:
它透過在每個時間步中選擇最可能的字元來計算最佳路徑。
它首先刪除重複的字元,然後從路徑中刪除所有空格,從而撤消編碼。剩下的表示已識別的文字。
如圖4所示。字元是“a”、“b”和“-”(空白)。有5個時間步驟。讓我們對這個矩陣應用我們最好的路徑解碼器:t0最可能的字元是“a”,同樣適用於t1和t2。空白字元在t3處得分最高。最後,“b”最有可能出現在t4。這給出了路徑aaa-b。我們刪除重複的字元,這將生成“a-b”,然後從剩餘的路徑中刪除任何空白,這將生成文字“ab”,我們將其輸出為可識別的文字。
圖4:神經網路的輸出矩陣,粗虛線表示最佳路徑。
當然,最佳路徑解碼只是一種近似。對於它給出錯誤結果的例子很容易構造:如果你從圖3中解碼矩陣,你將得到“”作為可識別的文字。但是我們已經知道“”的機率只有0。36而“a”的機率是0。64。然而,這種近似演算法在實際應用中往往能得到較好的結果。還有一些更高階的譯碼器,如beam-search解碼器、prefix-search解碼器和令牌傳遞譯碼器,它們也利用語言結構的資訊來改進解碼結果。
總結
首先,我們研究了神經網路解決方案所產生的問題。然後,我們看到CTC是如何解決這些問題的。然後,我們透過研究CTC如何編碼文字、如何進行損失計算以及如何解碼CTC訓練的神經網路的輸出來研究CTC的工作原理。
這將使你可以很好地理解在TensorFlow中呼叫ctc_loss或ctc_greedy_decoder等函式時,幕後發生了什麼。然而,當你想要自己實現CTC時,你需要了解更多的細節,尤其是想使它執行得更快。Graves等人[1]介紹了CTC運算,並給出了所有相關的數學計算。如果你對如何改進解碼感興趣,請參閱有關beam-search解碼的文章。我用Python和c++實現了一些解碼器和損失函式,你可以在github上找到。最後,如果你想了解如何識別(手寫)文字的全域性,請參閱我關於如何構建手寫文字識別系統的文章。
其他參考資料:
https://www。
cs。toronto。edu/~graves/
icml_2006。pdf
https://
towardsdatascience。com/
5a889a3d85a7
https://
towardsdatascience。com/
b051d28f3d2e
githubharald/CTCDecoder
githubharald/CTCWordBeamSearch
https://
towardsdatascience。com/
build-a-handwritten-text-recognition-system-using-tensorflow-2326a3487cd5
翻譯原文連結:
文字識別中CTC損失的直覺解釋
英文原文連結:
https://
towardsdatascience。com/
intuitively-understanding-connectionist-temporal-classification-3797e43a86c
翻譯和整理不易,希望大家能用你們發財的小手,點個贊支援哈~
歡迎關注:辛苦翻譯的小夥伴
AI公園
和辛勤的搬運工
AI演算法與影象處理
關注 蒐羅最好玩的計算機視覺論文和應用,AI演算法與影象處理
微信公眾號
,獲得第一手計算機視覺相關資訊
上一篇:拋開無職轉生,你怎麼看待lex?
下一篇:新基金又賣不動了!