介紹
MRZ(Machine Readable Zone,機器可讀區)指護照、簽證、身分證等旅行證件上的一段特定區域,該區域內的資訊可以被機器快速讀取。 MRZ 依照國際民航組織(ICAO)第 9303 號文件的規定進行設計和生成,用於加快邊境檢查和提高資訊處理的準確性。
人們可能不知道 MRZ 是什麼,但通常手上都有一本護照,上面就有 MRZ 區塊,長得類似這樣,紅色框的部分:
除了護照之外,某些國家的身分證、駕照、簽證等證件上也有 MRZ 區塊。
我們可以看到 MRZ 區塊有幾個明顯的特點:
- 結構固定:不同類型的 MRZ 有不同的結構,且每個欄位的意義也是固定的。
- 文字區域乾淨:MRZ 背景是單色,文字是黑色,且字元間有一定的間隔。
- 分類簡單:MRZ 區塊的文字只有數字和大寫英文字母,全部也才 37 個字元。
MRZ 的結構因不同類型的證件而有所不同,主要包括以下幾種:
- TD1(身分證等): 由三行每行 30 個字元組成,共 90 個字元。
- TD2(護照卡等): 由兩行每行 36 個字元組成,共 72 個字元。
- TD3(護照等): 由兩行每行 44 個字元組成,共 88 個字元。
- MRVA(簽證類型 A): 由兩行每行 44 個字元組成,共 88 個字元。
- MRVB(簽證類型 B): 由兩行每行 36 個字元組成,共 72 個字元。
結構介紹
我們引用知名的 MRZ 解析相關的 Github 專案 Arg0s1080/mrz 來說明 MRZ 的結構:
從上圖中我們可以明確的知道每個 MRZ 區塊的意義:
- Type:證件類型,包括護照、身分證、簽證等
- Country Code:發證國家代碼
- Surname:姓氏
- Given Names:名字
- Document Number:證件號碼
- National:國籍
- Date of Birth:出生
- Date of Expiry: 有效期限
- Optional: 自定義欄位
文字辨識
我們這次的主題是「MRZ 文字辨識」,這個題目比較冷門,研究論文沒幾篇。但只要把問題拆解一下,這不外乎就是個 OCR 的問題,找幾個 OCR 的模型微調一下,問題就解決了。
但是浪費啊!太浪費了!
OCR 模型通常設計用來辨識各種不同的文字類型,包括數字、大小寫字母、標點符號等,預測頭可能涵蓋數千個文字類別,這樣的模型比較複雜,且會需要更多的計算資源。
如果將這樣的模型直接應用於 MRZ 辨識,會顯得我們不夠專業,是不是?
因此,我們必須針對 MRZ 的特點,重新設計模型。這樣的專用模型能更高效地完成任務,無需處理多餘的文字類型,從而節省計算資源並提升辨識速度與準確性。
兩階段辨識
既然要設計專用的模型,我們可以將 MRZ 辨識分為兩個階段:
- 區域定位:使用一個輕量的模型,專注於定位圖片中的 MRZ 區塊。
- 文字辨識:使用一個輕量的模型,專注於辨識圖片中的 MRZ 區塊中的文字。
說做就做,我們花了一個禮拜完成了 MRZ 定位模型,再接著花了一個禮拜完成了 MRZ 辨識模型。兩個模型加起來大概也就 5 MB,單幀影像的辨識正確率大概可以達到 95%。
定義: 上文中的正確率,指的是所有 MRZ 區域內的文字辨識正確,即視為整張圖片的辨識正確,錯一個字就算全錯。
真的要說,這樣的做法唯一的缺點就是......
太無聊了
不管你怎麼看,我們覺得這樣「順風順水」完成這個題目,只能說是公事公辦。
既然客戶發來了需求,我們就按表操課地完成了,所以在我們交付給客戶之後,就把這個解決方案扔到了角落裡,然後開始思考新的解決方案。
- 如果不用兩階段辨識,那只能是單階段辨識了!
我們必須直接從原始圖像中辨識出 MRZ 區塊的文字。
單階段辨識
然後我們繼續花了三個月的時間,完成了一個單階段的 MRZ 辨識模型。
坦白講,我們花了比預期之外更多的時間,真的有點虧。
這個問題比我們想像中的困難。有好幾次我們想著不如就算了,二階段解決方案無聊歸無聊,至少它很準啊!我們幹嘛要找自己的麻煩?
單階段的模型的困難點在於模型必須在全圖範圍搜索大小尺度不一致,且方向不定的 MRZ 區塊,並且辨識出其中的文字。在這個前提之下,模型又必須保持輕量,以滿足移動端應用的需求。種種因素使得模型收斂困難,且效果不佳。
詳細的技術細節我們在後面的章節中會進行介紹: 模型設計
總之,雖然我們在開發過程中一度感到很沮喪,但還是堅持做完一個段落。
既然花出去的錢和時間已經不能回來,乾脆把這個方案開源出來,跟大家分享一下。
整個單階段的解決方案,我們認為只是一個「階段性的成果」。在我們心目中的完全體應該是一個更穩健、更準確的模型,且應該能夠應對更多的應用場景。
我們會努力地閱讀更多論文,在未來持續改進模型的性能。
模型評估
這個部分,真的沒辦法。
首先這種題目根本沒有標準的數據集,我們只能自己合成數據集,然後自己標註,這樣的數據集的可信度是很低的。其次,雖然 MIDV 有提供一定數量的資料,但也多是基於合成的樣本,拿來微調模型的效果也不是很好,更別說直接拿來評估模型的性能了。
所以我們在這個專案中,無法像之前的專案一樣,提供一個完整的模型評估報告。
最後
我們在這個專案中,完成了幾項功能:
- 驗證了合成資料集的有效性。
- 整合 MRZ 定位與辨識,完成了一個單階段辨識模型。
- 整合所有格式的 MRZ 文件,並提供一個統一的解析介面。
我們也跟朋友借了一些真實的護照和居留證,對各國護照上進行了測試:在場景受到一定規範的條件下,可以達到比較穩定的辨識效果。
如果你對這個題目感興趣,歡迎自行測試,我們期待你提供反饋給我們。
也歡迎你留下建議,我們很樂意與你交流。