通过 OCR 从护照、签证和身份证中提取机器可读的区域信息
项目描述
该软件包提供了用于从扫描的身份证明文件中识别机器可读区域 (MRZ) 的工具。文档可能位于页面上的任意位置 - 代码试图找到任何类似于 MRZ 的东西并从那里解析它。
识别过程可能相当缓慢 - 某些文档大约需要 10 秒或更长时间。它的精度并不完美,但就开发人员可用的测试文档而言似乎还不错——在大约 80% 的情况下,只要页面上有清晰可见的 MRZ,系统就会识别它并将文本提取到底层 OCR 引擎(Google Tesseract)的最佳功能。
失败的例子似乎最常见的要么是明显扫描不良的文件,其中文本过于模糊,要么更严重的是,某些类型的 ID(罗马尼亚语就是一个例子),其中 MRZ 离卡的其余部分太近- 当前算法没有很好地解释的情况。
安装
安装包的最简单方法是通过pip:
$ pip install PassportEye
请注意,PassportEye依赖于numpy、scipy、matplotlib和scikit-image等。这些要求的安装虽然是自动的,但有时可能会因各种原因(例如缺少必要的库)而花费时间或失败。如果发生这种情况,请考虑从二进制包中显式安装依赖项,例如由 OS 发行版或“wheel”包提供的依赖项。另一个方便的选择是使用带有预打包numpy / scipy / matplotlib二进制文件的 Python 发行版(Anaconda Python 目前是一个不错的选择)。
此外,您必须安装Tesseract OCR并将其添加到系统路径中:必须可以在命令行中访问tesseract工具。请注意,最新版本的 Tesseract 默认情况下在某些安装(例如 Windows)中不包含其“旧版”模型。然而,根据我们的测试,旧模型在 MRZ 文本检测方面表现出稍好的性能,因此默认使用。如果默认没有安装相应的模型,你应该下载eng.traineddata文件 [这里]( https://github.com/tesseract-ocr/tessdata ) 并用它替换(较小的)eng.traineddata文件与您的安装。
PassportEye 需要 Python 3.6 或更高版本。
用法
安装时,该软件包会将独立工具mrz安装到您的 Python 脚本路径中。跑步:
$ mrz <filename>
将处理给定的文件名,提取找到的机读区信息并以表格形式打印出来。运行mrz --json <filename>将以 JSON 格式输出相同的信息。此外,运行mrz --save-roi <roi.png>会将检测到的 MRZ(“感兴趣区域”)提取到单独的 png 文件中以供进一步探索。请注意,该工具对 PDF 文件的支持有限——它会尝试从 PDF 中提取第一个 DCT 编码图像并对其应用识别。这似乎适用于大多数扫描仪生成的一页 PDF,但尚未经过广泛测试。
如果您的 Tesseract 安装安装了“旧版” *.traineddata模型(在其tessdata目录中),请考虑运行:
$ mrz --legacy <filename>
这将启用“旧版”识别器,尽管名称如此,但它似乎更适合机读区识别。如果您不知道是否有相关文件,只需尝试运行上面的命令,看看是否出现错误。
为了在 Python 代码中使用识别功能,只需执行以下操作:
>> from passporteye import read_mrz >> mrz = read_mrz(image_file)
其中 image_file 可以是磁盘上文件的路径,也可以是包含图像数据的字节流。
返回的对象(除非它是 None,这意味着没有检测到 ROI)包含从 MRZ 中提取的字段以及一些元信息。有关可用字段的描述,请参阅passporteye.mrz.text.MRZ类的文档字符串。请注意,您可以使用to_dict()方法将对象转换为字典。
如果您想在 MRZ 旁边报告 ROI,请按如下方式调用read_mrz函数:
>> mrz = read_mrz(image_file, save_roi=True)
然后可以通过mrz.aux['roi']访问 ROI——它是一个 numpy ndarray,表示应用 OCR 的(灰度)图像区域。
最后,为了使用“遗留识别器”,将--oem 0额外命令行参数传递给 Tesseract,如下所示:
>> mrz = read_mrz(image_file, extra_cmdline_params='--oem 0')
为了获得更大的灵活性,您可以改用MRZPipeline对象,它可以让您访问所有中间计算,如下所示:
>> from passporteye.mrz.image import MRZPipeline >> p = MRZPipeline(file, extra_cmdline_params='--oem 0') >> mrz = p.result
“管道”对象将中间计算存储在其数据字典中。尽管您需要了解底层算法才能理解它,但有时它可能会提供富有洞察力的可视化。例如,此代码将绘制原始图像的二值化版本,该图像在算法中用于提取 ROI,以及与提取的 ROI 对应的框:
>> imshow(p['img_binary']) >> for b in p['boxes']: .. plot(b.points[:,1], b.points[:,0], c='b') .. b.plot()
发展
如果您打算开发或调试软件包,请考虑通过运行以下命令来安装它:
$ pip install -e .[dev]
这将以“可编辑”模式安装包并添加一些有用的附加功能(例如pytest)。然后,您可以通过键入以下内容运行测试:
$ py.test
在源分发的根目录。
命令行脚本evaluate_mrz可用于评估当前识别管道在一组样本图像上的性能:如果您想查看代码更改的效果,这很有用。赶紧跑:
$ evaluate_mrz -j 4
(其中-j 4将请求并行使用 4 个内核)。相同的脚本可用于在给定的图像目录上运行识别管道,对成功和失败进行排序,有关选项,请参见evaluate_mrz -h。
贡献
随意通过 Github 贡献或报告问题:https ://github.com/konstantint/PassportEye
版权和许可
版权所有:2016,康斯坦丁·特列季亚科夫。执照:麻省理工学院