模型設計
天下本無事,庸人自擾之。
對,我們就是在找自己的麻煩,一邊覺得很煩,一邊又覺得有趣。
二階段辨識模型
測試階段,我們先開放端到端的一階段模型。
拆分定位和辨識的二階段模型現在沒有開放,預計之後發佈在 V1.0 穩定版。
但不妨礙我們來討論一下具體做法。
二階 段模型指的是將 MRZ 辨識分為兩個階段:定位與辨識。
根據這個思路,我們可以開始著手設計相關模型,首先來看看定位模型。
定位模型
MRZ 區域的定位大概可以分成兩個方向:
-
定位 MRZ 區域角點:
這和之前我們做過的文件定位的專案類似,只是這裡把文件換成 MRZ 區域。
不同的地方在於文件定位的角點是「真實」存在於圖面上,不需要模型去「憑空想像」出一個角點。反觀 MRZ 區域,我們需要模型去「猜測」出這個角點。
事實證明,用這種方式做出來的模型很不穩定,只要你稍微晃動一下護照,模型預測的角點就會在 MRZ 區域周邊到處亂跑。
-
分割 MRZ 區域:
這個方法就比較穩定了,因為我們可以直接用分割模型去預測 MRZ 區域的範圍。MRZ 區域上的 文字也是真實存在於圖面上,不需要模型做「多餘」的臆測。這樣一來,我們就可以直接將 MRZ 區域分割出來,不需要再去擔心角點的問題。
我們採用的是分割的方法。
在真實使用的場景中,使用者所拿的護照必然帶有一些傾斜,因此我們需要對 MRZ 區域進行校正,使其變成一個正確的矩形。
損失函數的部分我們參考了一份綜述性的論文:
在上面這篇論文中,針對過去幾年間所提出的各種用於分割的損失函數進行統一的比較和介紹,並且針對現有的問題提出一個解決方案,也就是:Log-Cosh Dice Loss。
有興趣的讀者可以參考這篇論文,這裡就不再贅述了。
辨識模型
辨識模型就比較簡單了,因為我們已經將 MRZ 區域分割出來,只需要將這個區域丟進文字辨識模型,就可以得到最終的結果。
在這個階段,我們可以有幾個設計方向:
-
切分字串,逐一辨識:
有些 MRZ 是兩行文字,例如 TD2 和 TD3 格式;有些 MRZ 是三行文字,例如 TD1 格式。我們可以將這些文字逐一切分,然後進行辨識。
辨識模型需要處理的就是將一串文字影像轉成文字輸出,可以用的方法有很多,例如早期流行的 CRNN+CTC,或是現在比較流行的 CLIP4STR 之類的。
-
整張 MRZ 裁切影像一起辨識:
由於 MRZ 區域的長寬比例差距不大,所以我們完全可以將整張 MRZ 區域裁切下來,然後一次辨識整張影像。這種情況下,特別適合使用 Transformer 的模型來解決這個問題。
舉例來說,如果你只要使用 Transformer Encoder 的架構,那模型設計可以是這樣:
由於自注意力機制的關係,因此可能會有多個 Token 同時指向同一個文字的情況,這時候如果使用一般的解碼方式,可能會讓模型感到困惑:明明就是這個文字的影像,為什麼要解碼成另外一個文字?
這裡使用 CTC 的方式進行文字解碼的效果會比較好,因為每個 Token 都來自於「某個」文字區域的影像,我們只需要在最後階段對輸出結果合併,就可以得到最終的文字結果。
或是你不喜歡 CTC,覺得那是個麻煩的東西,那你可以採用 Encoder-Decoder 的架構,模型設計可以是這樣:
這種方式可以直接解碼字串,不需要再經過一層 CTC,因為輸入 Decoder 的 token 就是對文字的查詢,每個 token 都負責找出對應順序的文字。
提示這裡的 Decoder 可以直接平行輸出,不需要用自回歸的方式。使用自回歸是因為我們需要基於前一次的預測結果,來進行下一個預測。
這裡顯然並不需要這種操作。
試想:不論第一個位置預測的文字是什麼,都不會影響第二個位置的預測結果,他們彼此之間是獨立的。所有客觀結果都已經在 Encoder 的輸出結果內,Decoder 的工作就是負責把他們查詢出來而已。
誤差傳播
這時候其實可以回過頭去討論角點的問題。
所有二階段的模型都會面臨到一個共同的問題:誤差傳播。
我們都相信這世界上不存在 100% 準確的模型,因為我們永遠都無法對統計母體進行建模,所以凡規則必有例外,凡模型必有誤差。不管上面選擇哪種方式,最後都會面臨到同樣的困難:
- 角點估計不準確
正因為角點估計不準確,導致校正後的 MRZ 區域不準確;又因為 MRZ 區域不準確,導致文字辨識的不準確,如此這般,成為一個誤差傳播的標準教材。