進階設定
調用 MRZScanner 模型時,你可以透過傳遞參數來進行進階設定。
Initialization
以下是在初始化階段的進階設定選項:
1. Backend
Backend 是一個列舉類型,用於指定 MRZScanner 的運算後端。
它包含以下選項:
- cpu:使用 CPU 進行運算。
 - cuda:使用 GPU 進行運算(需要適當的硬體支援)。
 
from capybara import Backend
model = MRZScanner(backend=Backend.cuda) # 使用 CUDA 後端
#
# 或是
#
model = MRZScanner(backend=Backend.cpu) # 使用 CPU 後端
我們是使用 ONNXRuntime 作為模型的推論引擎,雖然 ONNXRuntime 支援了多種後端引擎(包括 CPU、CUDA、OpenCL、DirectX、TensorRT 等等),但限於平常使用的環境,我們稍微做了一點封裝,目前只提供了 CPU 和 CUDA 兩種後端引擎。此外,使用 cuda 運算除了需要適當的硬體支援外,還需要安裝相應的 CUDA 驅動程式和 CUDA 工具包。
如果你的系統中沒有安裝 CUDA,或安裝的版本不正確,則無法使用 CUDA 運算後端。
- 如果你有其他需求,請參考 ONNXRuntime 官方文件 進行自定義。
 - 關於安裝依賴相關的問題,請參考 ONNXRuntime Release Notes
 
2. ModelType
ModelType 是一個列舉類型,用於指定 MRZScanner 使用的模型類型。
目前包含以下選項:
- spotting:使用端到端的模型架構,僅會載入一個模型。
 - two_stage:使用二階段的模型架構,會載入兩個模型。
 - detection:僅載入 MRZ 的偵測模型。
 - recognition:僅載入 MRZ 的辨識模型。
 
你可以透過 model_type 參數來指定使用的模型。
from mrzscanner import MRZScanner
model = MRZScanner(model_type=MRZScanner.spotting)
3. ModelCfg
你可以透過 list_models 來查看所有可用的模型。
from mrzscanner import MRZScanner
print(MRZScanner().list_models())
# {
#    'spotting': ['20240919'],
#    'detection': ['20250222'],
#    'recognition': ['20250221']
# }
選定你要的版本,並透過 spotting_cfg、detection_cfg、recognition_cfg 等參數,搭配 ModelType 來指定使用的模型。
- 
spotting:
model = MRZScanner(
model_type=ModelType.spotting,
spotting_cfg='20240919'
) - 
two_stage:
model = MRZScanner(
model_type=ModelType.two_stage,
detection_cfg='20250222',
recognition_cfg='20250221'
) - 
detection:
model = MRZScanner(
model_type=ModelType.detection,
detection_cfg='20250222'
) - 
recognition:
model = MRZScanner(
model_type=ModelType.recognition,
recognition_cfg='20250221'
) 
你也可以完全不指定,反正我們都有配置每個模型的預設版本。
ModelType.spotting
這個模型是端到端的模型,會直接偵測 MRZ 的位置並進行辨識,缺點是準確度較低,而且不會回傳 MRZ 的座標。
使用範例如下:
import cv2
from skimage import io
from mrzscanner import MRZScanner, ModelType
# 建立模型
model = MRZScanner(
   model_type=ModelType.spotting,
   spotting_cfg='20240919'
)
# 讀取線上影像
img = io.imread('https://github.com/DocsaidLab/MRZScanner/blob/main/docs/test_mrz.jpg?raw=true')
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
# 模型推論
result = model(img, do_center_crop=True, do_postprocess=False)
# 輸出結果
print(result)
# {
#    'mrz_polygon': None,
#    'mrz_texts': [
#        'PCAZEQAOARIN<<FIDAN<<<<<<<<<<<<<<<<<<<<<<<<<',
#        'C946302620AZE6707297F23031072W12IMJ<<<<<<<40'
#    ],
#    'msg': <ErrorCodes.NO_ERROR: 'No error.'>
# }
ModelType.two_stage
這個模型是二階段的模型,會先偵測 MRZ 的位置,再進行辨識,優點是準確度較高,而且會回傳 MRZ 的座標。
使用範例如下,最後我們還能畫出 MRZ 的位置:
import cv2
from skimage import io
from mrzscanner import MRZScanner, ModelType
# 建立模型
model = MRZScanner(
   model_type=ModelType.two_stage,
   detection_cfg='20250222',
   recognition_cfg='20250221'
)
# 讀取線上影像
img = io.imread('https://github.com/DocsaidLab/MRZScanner/blob/main/docs/test_mrz.jpg?raw=true')
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
# 模型推論
result = model(img, do_center_crop=True, do_postprocess=False)
# 輸出結果
print(result)
# {
#     'mrz_polygon':
#         array(
#             [
#                 [ 158.536 , 1916.3734],
#                 [1682.7792, 1976.1683],
#                 [1677.1018, 2120.8926],
#                 [ 152.8586, 2061.0977]
#             ],
#             dtype=float32
#         ),
#     'mrz_texts': [
#         'PCAZEQAQARIN<<FIDAN<<<<<<<<<<<<<<<<<<<<<<<<<',
#         'C946302620AZE6707297F23031072W12IMJ<<<<<<<40'
#     ],
#     'msg': <ErrorCodes.NO_ERROR: 'No error.'>
# }
# 畫出 MRZ 的位置
from capybara import draw_polygon, imwrite, centercrop
poly_img = draw_polygon(img, result['mrz_polygon'], color=(0, 0, 255), thickness=5)
imwrite(centercrop(poly_img))

ModelType.detection
這個模型僅會偵測 MRZ 的位置,不會進行辨識。
使用範例如下:
import cv2
from skimage import io
from mrzscanner import MRZScanner, ModelType
# 建立模型
model = MRZScanner(
   model_type=ModelType.detection,
   detection_cfg='20250222',
)
# 讀取線上影像
img = io.imread('https://github.com/DocsaidLab/MRZScanner/blob/main/docs/test_mrz.jpg?raw=true')
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
# 模型推論
result = model(img, do_center_crop=True)
# 輸出結果
print(result)
# {
#     'mrz_polygon':
#         array(
#             [
#                 [ 158.536 , 1916.3734],
#                 [1682.7792, 1976.1683],
#                 [1677.1018, 2120.8926],
#                 [ 152.8586, 2061.0977]
#             ],
#             dtype=float32
#         ),
#     'mrz_texts': None,
#     'msg': <ErrorCodes.NO_ERROR: 'No error.'>
# }
這裡 MRZ 定位的結果和剛才一樣,我們就不再重複畫出來了。
ModelType.recognition
這個模型僅會進行 MRZ 的辨識,不會偵測 MRZ 的位置。
要執行這個模型,你得先準備好 MRZ 裁切後的影像,並且將其傳入模型。
我們先準備一下 MRZ 裁切後的影像,直接取用剛才定位的座標:
import numpy as np
from skimage import io
from capybara import imwarp_quadrangle, imwrite
polygon = np.array([
    [ 158.536 , 1916.3734],
    [1682.7792, 1976.1683],
    [1677.1018, 2120.8926],
    [ 152.8586, 2061.0977]
], dtype=np.float32)
img = io.imread('https://github.com/DocsaidLab/MRZScanner/blob/main/docs/test_mrz.jpg?raw=true')
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
mrz_img = imwarp_quadrangle(img, polygon)
imwrite(mrz_img)
執行上面程式後,我們可以取出 MRZ 裁切後的影像:

有了影像之後,我們就可以單獨執行辨識模型:
from mrzscanner import MRZScanner, ModelType
# 建立模型
model = MRZScanner(
   model_type=ModelType.recognition,
   recognition_cfg='20250221'
)
# 輸入 MRZ 裁切後的影像
result = model(mrz_img, do_center_crop=False)
# 輸出結果
print(result)
# {
#     'mrz_polygon':None,
#     'mrz_texts': [
#         'PCAZEQAQARIN<<FIDAN<<<<<<<<<<<<<<<<<<<<<<<<<',
#         'C946302620AZE6707297F23031072W12IMJ<<<<<<<40'
#     ],
#     'msg': <ErrorCodes.NO_ERROR: 'No error.'>
# }
要注意這裡的參數設定是 do_center_crop=False,因為我們已經裁切好了。