MRZ 生成
本功能在 0.5.0 版新增。
完成 WordCanvas
的開發之後,我們可以利用這個工具來做點其他事情。
在本章節中,我們開發一個生成「機器閱讀區域(Machine Readable Zone, MRZ)」的功能。
什麼是 MRZ?
MRZ(Machine Readable Zone,機器可讀區)指護照、簽證、身分證等旅行證件上的一段特定區域,該區域內的資訊可以被機器快速讀取。 MRZ 依照國際民航組織(ICAO)第 9303 號文件的規定進行設計和生成,用於加快邊境檢查和提高資訊處理的準確性。
MRZ 的結構因不同類型的證件而有所不同,主要包括以下幾種:
-
TD1(身分證等):
- 由三行每行 30 個字元組成,共 90 個字元。
- 包含的資訊:證件類型、國家代碼、證件號碼、出生日期、性別、有效期限、國籍、姓氏、名稱、可選資料 1、可選資料 2。
-
TD2(護照卡等):
- 由兩行每行 36 個字元組成,共 72 個字元。
- 包含的資訊:證件類型、國家代碼、姓氏、名稱、證件號碼、國籍、出生日期、性別、有效期限、可選資料。
-
TD3(護照等):
- 由兩行每行 44 個字元組成,共 88 個字元。
- 包含的資訊:證件類型、國家代碼、姓氏、名稱、證件號碼、國籍、出生日期、性別、有效期限、可選資料。
-
MRVA(簽證類型 A):
- 由兩行每行 44 個字元組成,共 88 個字元。
- 包含的資訊:證件類型、國家代碼、姓氏、名稱、證件號碼、國籍、出生日期、性別、有效期限、可選資料。
-
MRVB(簽證類型 B):
- 由兩行每行 36 個字元組成,共 72 個字元。
- 包含的資訊:證件類型、國家代碼、姓氏、名稱、證件號碼、國籍、出生日期、性別、有效期限、可選資料。
合成影像
當我們要訓練一個 MRZ 的檢測模型時,我們需要大量的資料集,但顯然地,這些資料都帶有個人隱私,因此難以收集。為了解決這個問題,我們可以使用 WordCanvas
來合成 MRZ 影像。
相關功能我們已經完成,請直接參考以下範例,調用 MRZGenerator
:
import docsaidkit as D
from wordcanvas import MRZGenerator
mrz_gen = MRZGenerator(
text_color=(0, 0, 0),
background_color=(255, 255, 255),
interval=None,
delimiter='&',
)
在這個設定中,你可以手動指定文字顏色、背景顏色,以及分隔符號。由於 MRZ 的文字是 2~3 行,分隔符號的目的是輸出時可以區分每一行的文字,預設為 &
。
完成設定後,直接當成函數來呼叫即可,我們已經實作了 __call__
方法:
output_infos = mrz_gen()
這樣就可以得到一張合成的 MRZ 影像,資料輸出格式為:
typ
:MRZ 類型。text
:MRZ 文字。points
:MRZ 每個文字的座標。image
:MRZ 影像。
在輸出時,若沒有給定參數,則會隨機決定 MRZ 類型(TD1、TD2、TD3)。接著隨機生成 MRZ 文字,並且將其合成影像。
以下為輸出影像範例:
D.imwrite(output_infos['image'])
展示每個文字的座標
你可能對每個文字的位置感興趣,這樣可以幫助你訓練文字檢測模型。我們已經提供了這個功能,只需要調用 points
屬性就可以得到,我們直接畫張圖來看看:
import cv2
import docsaidkit as D
from wordcanvas import MRZGenerator
def draw_points(img, points, color=(0, 255, 0), radius=5):
for point in points:
cv2.circle(img, point, radius, color, -1)
return img
mrz_gen = MRZGenerator(
text_color=(0, 0, 0),
background_color=(255, 255, 255),
interval=None,
delimiter='&',
)
output_infos = mrz_gen()
img = draw_points(results['image'], results['points'])
D.imwrite(img)
修改文字背景顏色和間距
透過 text_color
和 background_color
參數,我們可以修改文字和背景的顏色:
mrz_gen = MRZGenerator(
text_color=(255, 0, 0),
background_color=(0, 127, 127),
)
output_infos = mrz_gen()
D.imwrite(output_infos['image'])
使用 interval
參數可以調整文字之間的間距:
mrz_gen = MRZGenerator(
interval=100,
)
output_infos = mrz_gen()
D.imwrite(output_infos['image'])
指定 MRZ 文字
如果你想要指定 MRZ 文字,可以在呼叫時傳入 mrz_type
和 mrz_text
參數,在函數中我們有做一些基本的檢查,例如文字長度和類型是否匹配上之類的。
請注意,我們沒有做 Hash 檢查,本功能只是為了合成影像,不需要真實有效的 MRZ 文字。
mrz_gen = MRZGenerator(interval=32)
output_infos = mrz_gen(
mrz_type='TD1',
mrz_text=[
"I<SWE59000002<8198703142391<<<",
"8703145M1701027SWE<<<<<<<<<<<8",
"SPECIMEN<<SVEN<<<<<<<<<<<<<<<<"
]
)
D.imwrite(output_infos['image'])