深度 OCR

算子列表 ↓

本章介绍如何使用基于深度学习的光学字符识别技术(Deep OCR)。

深度 OCR 旨在检测和/或识别图像中的文本。该技术能识别连贯的字符组合,这些组合将被称为“单词”(区别于仅能识别单个字符的传统 OCR 方法)。

image/svg+xml
基于深度学习的光学字符识别可能示例:检测并识别图像中的单词。

深度 OCR 模型可包含两个组件,分别负责两个独立任务:单词检测(即定位)与单词识别。默认情况下,模型会同时创建这两个组件,但也可仅限于执行其中任一任务。

HALCON 已提供预训练组件,这些组件无需额外训练即可适用于多种应用场景——因模型基于多样化数据集训练,故能处理众多不同字体。可通过 get_deep_ocr_paramget_deep_ocr_paramGetDeepOcrParamGetDeepOcrParamGetDeepOcrParamget_deep_ocr_param 获取可用字符集及模型参数信息。若需针对特定任务进一步调整识别效果,可使用深度学习片子在指定应用领域单独对识别或检测组件进行重新训练。请注意每次仅能对单个组件进行重新训练。

image/svg+xml
检测功能可通过使用自定义数据重新训练深度OCR模型来针对特定应用进行微调。
image/svg+xml 'lemon'
识别功能可通过使用自定义数据重新训练深度OCR模型来针对特定应用进行微调。

以下段落将描述常规工作流程以及重新训练的相关内容。

深度 OCR 推理的一般工作流程

本段落描述了如何使用深度 OCR 模型实现文字定位与识别的工作流程。具体应用场景可参考 HDevelop 示例文件 deep_ocr_workflow.hdev

深度 OCR 模型的创建

使用 create_deep_ocrcreate_deep_ocrCreateDeepOcrCreateDeepOcrCreateDeepOcrcreate_deep_ocr 算子创建一个深度 OCR 模型,该模型可包含以下两个模型组件中的一个或两个:

  • detection_model

  • recognition_model

若要使用重新训练的模型组件替代默认组件,请通过 set_deep_ocr_paramset_deep_ocr_paramSetDeepOcrParamSetDeepOcrParamSetDeepOcrParamset_deep_ocr_param 设置重新训练的模型组件为 'recognition_model'"recognition_model""recognition_model""recognition_model""recognition_model""recognition_model"'detection_model'"detection_model""detection_model""detection_model""detection_model""detection_model" 来调整已创建的模型。

推理

模型参数(例如所用设备、图像尺寸或最低评分)可通过 set_deep_ocr_paramset_deep_ocr_paramSetDeepOcrParamSetDeepOcrParamSetDeepOcrParamset_deep_ocr_param 进行设置。

深度 OCR 模型通过 apply_deep_ocrapply_deep_ocrApplyDeepOcrApplyDeepOcrApplyDeepOcrapply_deep_ocr 应用于采集的图像。推理结果取决于所用模型组件。有关每个模型组合计算哪些单词条目的详细信息,请参阅 apply_deep_ocrapply_deep_ocrApplyDeepOcrApplyDeepOcrApplyDeepOcrapply_deep_ocr 的算子参考文档。

推理结果可从字典 DeepOCRResultDeepOCRResultDeepOCRResultDeepOCRResultdeepOCRResultdeep_ocrresult 中检索。提供以下函数用于可视化结果和分数图:

  • 使用 dev_display_deep_ocr_results 显示位置和/或识别单词。

  • 使用 dev_display_deep_ocr_results_preprocessed 在预处理图像上显示位置(若已推断则包含识别单词)(前提是模型包含 detection_model)。

  • 使用 dev_display_deep_ocr_score_maps 显示分数图(前提是模型包含 detection_model)。

模型组件的训练与评估

本段落描述了使用自定义数据对深度 OCR 模型的识别或检测组件进行重新训练和评估的过程。有关应用场景,请参阅 HDevelop 示例文件 deep_ocr_recognition_training_workflow.hdevdeep_ocr_detection_training_workflow.hdev

预处理数据

本部分介绍如何对数据进行预处理。有关在深度 OCR 工作流程的哪个阶段需要提供哪些数据的信息,请参阅下文的“数据”部分。

  1. 需要从训练数据集的图像中获取的信息需要进行传输。此操作通过以下函数实现:

    • read_dl_dataset_ocr_recognition 用于深度 OCR 模型的识别组件。

    • read_dl_dataset_ocr_detection 用于深度 OCR 模型的检测组件。

    它创建了一个名为 DLDataset 的字典,该字典充当数据库,存储关于数据的所有必要信息。有关数据集的更多信息,请参阅 深度学习 / 模型 一章。

  2. 将字典 DLDataset 表示的数据集进行拆分。可通过以下函数实现:

    • split_dl_dataset.

  3. 网络对图像提出了若干要求。这些要求(例如图像尺寸和灰度值范围)可以获取,通过算子

    为此,您需要先使用

  4. 现在您可以对数据集进行预处理。为此,您可以使用以下函数:

    • preprocess_dl_dataset

    要使用此函数,请指定预处理参数(例如图像尺寸)。将所有参数及其值存储在字典 DLPreprocessParam 中,为此可使用函数

    • create_dl_preprocess_param_from_model

    我们建议保存此字典 DLPreprocessParam,以便在后续推理阶段能够访问预处理参数值。

模型训练

本部分说明如何训练深度OCR模型的识别或检测组件。

  1. 设置训练参数并将其存储在字典 TrainParam 中。可通过以下函数实现

    • create_dl_train_param

  2. 训练模型。这可以通过以下函数实现

    • train_dl_model

    该函数要求:

    • 模型句柄 DLModelHandleDLModelHandleDLModelHandleDLModelHandleDLModelHandledlmodel_handle

    • 包含数据信息的字典 DLDataset

    • 包含训练参数的字典 TrainParam

重新训练模型的评估

在本部分中,我们将评估深度 OCR 模型。

  1. 设置可能影响评估的模型参数。

  2. 评估可以便捷完成,使用函数

    • evaluate_dl_model

    该函数需要一个包含评估参数的字典 GenParamEval

  3. 字典 EvaluationResult 存储了评估指标。要了解重新训练的模型相对于预训练模型的表现,可比较它们的评估值。要理解不同的评估指标,请参阅“深度 OCR 结果的评估指标”一节。

成功评估后,重新训练的模型即可用于推理(参见上文“深度 OCR 推理的一般工作流程”部分)。

数据

本节说明在深度 OCR 工作流程的不同阶段需要提供的数据信息。

我们将用于训练和评估的数据(包含图像及其实例信息)与用于推理的数据(仅包含原始图像)区分开来。数据的具体提供方式将在下文相关小节中说明。

作为基础概念,该模型通过字典处理数据,即接收以字典 DLSampleDLSampleDLSampleDLSampleDLSampledlsample 形式输入的数据,并分别返回字典 DLResultDLResultDLResultDLResultDLResultdlresultDLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result。有关数据处理的更多信息,请参阅 深度学习 / 模型 一章。

训练和评估数据

该数据集包含图像及其对应信息。这些数据必须以模型可处理的形式提供。关于图像要求,请参阅下文“图像”部分获取更多信息。

训练数据用于针对您的特定应用场景训练和评估网络。借助这些数据,网络能够学习识别或检测与推理过程中出现的文本相似的文本样本。通过为每幅图像提供所示单词,即可获得必要的信息。

关于数据在 HALCON 中如何格式化以供深度学习模型使用,请参阅 深度学习 / 模型 一章。简而言之,字典 DLDatasetDLDatasetDLDatasetDLDatasetDLDatasetdldataset 作为训练和评估流程所需信息的数据库。

根据所使用的模型类型,可通过 read_dl_dataset_ocr_recognitionread_dl_dataset_ocr_detection 读取 DLDatasetDLDatasetDLDatasetDLDatasetDLDatasetdldataset 的数据。

基于带有单词标签的图像的数据集

在此情况下,需提供带有旋转边界框标注单词的图像。您可使用 MVTec 官网提供的 MVTec 深度学习工具(DLT)对数据进行标注。数据集必须按以下方式构建:

  • 'class_ids':类 IDs

  • 'class_names':类名称(必须包含 'word' 类。其他类将被忽略。)

  • 'image_dir':图像目录路径

  • 'samples':字典元组,每个样本对应一个字典

    • 'image_file_name':图像文件名

    • 'image_id':图像 ID

    • 'bbox_col':边界框列坐标

    • 'bbox_row':边界框行坐标

    • 'bbox_phi':边界框角度

    • 'bbox_length1':边界框边长 1 的一半

    • 'bbox_length2':边界框边长 2 的一半

    • 'label_custom_data':包含每个边界框自定义标签数据的字典列表

      • 'text' 待读取单词

基于单词裁剪图像的数据集(仅识别)

在此情况下,仅包含被裁剪为单个单词的图像。数据集必须按以下方式构建:

  • 'image_dir':图像目录路径

  • 'samples':字典元组,每个样本对应一个字典

    • 'image_file_name':图像文件名

    • 'image_id':图像 ID

    • 'word':图像中待读取的单词

示例程序 deep_ocr_prelabel_dataset.hdev 可通过预先标注数据来提供帮助。

您的训练数据应涵盖推理过程中可能出现的全部字符。若某字符未包含于训练数据集或仅极少出现,模型可能无法正确学习识别该字符。为追踪数据集内的字符分布情况,我们提供了 gen_dl_dataset_ocr_recognition_statistics 函数,该函数可生成数据集中每个字符的出现频率统计数据。

你还需要足够的训练数据,以便将其划分为三个子集,分别用于训练、验证和测试网络。这些子集最好是独立且同分布的,详见 深度学习 一章中的“数据”部分 。

图像

该模型对图像提出了要求,例如尺寸、灰度值范围和类型。有关可训练深度 OCR 模型的具体参数值,请参阅 read_dl_modelread_dl_modelReadDlModelReadDlModelReadDlModelread_dl_model 的文档。对于已读取的模型,可通过 get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param 查询这些参数。为满足这些要求,您可能需要对图像进行预处理。针对整个样本(包括图像)的标准预处理已在 preprocess_dl_samples 中实现。

用于推理的图像要求详见 apply_deep_ocrapply_deep_ocrApplyDeepOcrApplyDeepOcrApplyDeepOcrapply_deep_ocr

模型输出

网络输出取决于任务:

训练

作为输出,该算子将返回一个名为 DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result 的字典,其中包含总损失的当前值以及模型中所有其他损失的值。

推理与评估

作为输出,网络将为每个样本返回一个字典 DLResultDLResultDLResultDLResultDLResultdlresult。该字典包含识别出的单词,以及该单词每个字符的候选词及其置信度。

深度 OCR 结果评估指标

深度 OCR 检测

HALCON 支持以下评估指标。为计算这些指标用于测试或验证,需要真实标注数据。

  • 精确率、召回率和 F 分数

    深度 OCR 检测的性能评估基于单词框的精确率和召回率。评估采用交并比(IoU)来比较真实与预测的单词框。匹配的默认 IoU 阈值为 0.5,可根据需要增减。

    image/svg+xml image/svg+xml IoU=
    ( 1) ( 2)
    IoU 的可视化示例:(1) 输入图像包含真实边界框(橙色)与预测边界框(浅蓝色);(2) IoU 即区域交集面积与并集面积之比。

    精确率是指真正类与所有正类(真正类与假正类)之比。因此,它是衡量检测器可靠性的指标。

    召回率是指正确检测到的单词数量与所有标注单词数量之比。

    要用单一数字表示该指标,我们计算 F 分数,即精确率与召回率的调和平均值。

  • 角度精度评分(SoAP)

    SoAP 值是衡量推断方位角精度的评分指标。该评分由推断边界框(I)与对应真实值标注(GT)之间的角度差异决定: 其中索引 遍历所有推断出的边界框。

深度 OCR 识别

深度 OCR 识别任务的准确率定义为数据集中正确识别单词(CR)占真实单词(GT)的百分比。准确率计算公式如下:


算子列表

apply_deep_ocrApplyDeepOcrapply_deep_ocrApplyDeepOcrapply_deep_ocr应用深度光学字符识别
在一组图像上应用深度光学字符识别模型进行推理。
create_deep_ocrCreateDeepOcrcreate_deep_ocrCreateDeepOcrcreate_deep_ocr创建深度光学字符识别
创建深度 OCR 模型。
get_deep_ocr_paramGetDeepOcrParamget_deep_ocr_paramGetDeepOcrParamget_deep_ocr_param获取深度光学字符识别参数
返回深度 OCR 模型的参数。
read_deep_ocrReadDeepOcrread_deep_ocrReadDeepOcrread_deep_ocr读取深度光学字符识别
从文件中读取深度 OCR 模型。
set_deep_ocr_paramSetDeepOcrParamset_deep_ocr_paramSetDeepOcrParamset_deep_ocr_param设置深度光学字符识别参数
设置深度 OCR 模型的参数。
write_deep_ocrWriteDeepOcrwrite_deep_ocrWriteDeepOcrwrite_deep_ocr写入深度光学字符识别
在文件中写入深度 OCR 模型。