分类

节列表 ↓

本章阐述了如何基于深度学习进行分类,涵盖训练阶段与推理阶段的应用。

基于深度学习的分类是一种方法,其中图像会被分配一组置信度值。这些置信度值表明图像属于每个区分类别可能性的大小。因此,若仅考虑最高预测值,分类即意味着从给定类别集合中为图像分配特定类别。下图对此进行了说明。

image/svg+xml orange: 0.03 apple: 0.85 lemon: 0.12
一个可能的分类示例,其中网络区分出三类。输入图像被分配了针对三类对象的置信度值: “apple” 0.85,“lemon” 0.03,“orange” 0.12。最高置信度预测表明该图像被识别为“apple”。

为了完成您的特定任务,即将数据分类到您希望区分的类别中,分类器必须经过相应训练。在 HALCON 中,我们采用一种称为迁移学习的技术(参见 深度学习 一章)。因此,我们提供预训练网络,这些网络代表了在海量标注图像数据上训练的分类器。这些分类器经过训练和测试,能够在工业图像分类任务中表现出色。其中一个已针对通用分类训练的分类器,现将重新训练以适应您的特定任务。为此,分类器需要了解需要区分的类别及其样本特征。这些信息由您的数据集(即带有对应真实标签的图像)所体现。更多数据要求详见“数据”一节。

在 HALCON 中,基于深度学习的分类功能是在更通用的深度学习模型框架内实现的。有关后者的更多信息,请参阅 深度学习 / 模型 一章。应用深度学习所需的具体系统要求,请参阅 HALCON “安装指南”

以下各节将介绍分类所需的一般工作流程、涉及的数据与参数相关信息,以及评估指标的说明。

一般工作流程

本节描述基于深度学习的分类任务的一般工作流程。该流程分为四个部分:数据预处理、模型训练、训练模型评估以及新图像推理。在此我们假设您的数据集已完成标注,详见下文“数据”一节。您可参考 HDevelop 示例系列 classify_pill_defects_deep_learning 了解具体应用场景。

预处理数据

本部分介绍如何对数据进行预处理。具体步骤也可在 HDevelop 示例文件 classify_pill_defects_deep_learning_1_preprocess.hdev 中查看。

  1. 需要传输的是训练数据集中哪些图像所包含的信息。该操作通过以下函数实现:

    • read_dl_dataset_classification.

    由此创建了一个名为 DLDataset 的字典,它作为数据库存储了关于数据的所有必要信息。有关数据及其传输方式的更多信息,请参阅下文的“数据”部分以及 深度学习 / 模型 一章。

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

    • split_dl_dataset.

    生成的分割结果将通过键 split 保存至 DLDataset 中每个样本条目中。

  3. 读取预训练网络使用算子:

    当您需要读取自己训练好的网络时,同样可以使用此算子,前提是您已通过 write_dl_modelwrite_dl_modelWriteDlModelWriteDlModelWriteDlModelwrite_dl_model 将其保存。

    该网络将对图像提出若干要求,包括图像尺寸和灰度值范围。默认值在 read_dl_modelread_dl_modelReadDlModelReadDlModelReadDlModelread_dl_model 中列出,这些是网络预训练时使用的参数。网络架构支持不同图像尺寸,可通过 set_dl_model_paramset_dl_model_paramSetDlModelParamSetDlModelParamSetDlModelParamset_dl_model_param 设置,但根据具体网络类型,更改参数可能需要重新训练。实际设置的参数值可通过以下方式获取:

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

    • preprocess_dl_dataset

    若需自定义预处理,本函数将提供实施指导。

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

    • create_dl_preprocess_param.

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

模型训练

本部分介绍如何训练分类器。具体步骤也可在 HDevelop 示例文件 classify_pill_defects_deep_learning_2_train.hdev 中查看。

  1. 设置训练参数并将其存储在字典 TrainParam 中。这些参数包括:

    • 超参数,概述请参见 深度学习 一章。

    • 用于可能的数据增强的参数(可选)。

    • 用于训练期间评估的参数。

    • 用于训练结果可视化的参数。

    • 用于序列化的参数。

    这可以通过以下函数实现:

    • create_dl_train_param.

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

    • train_dl_model.

    该函数要求:

    • 模型句柄 DLModelHandleDLModelHandleDLModelHandleDLModelHandleDLModelHandledlmodel_handle

    • 包含数据信息的字典 DLDataset

    • 包含训练参数 'TrainParam'"TrainParam""TrainParam""TrainParam""TrainParam""TrainParam" 的字典

    • 训练应运行多少个 epoch(周期) 的信息。

    若使用 train_dl_model 函数,则会可视化总损失值以及可选的评估指标。

训练模型评估

在本部分中,我们将评估训练好的分类器。这些单个步骤也在 HDevelop 示例 classify_pill_defects_deep_learning_3_evaluate.hdev 中展示。

  1. 评估可以便捷的完成,使用算子

    • evaluate_dl_model

  2. 字典 EvaluationResult 存储所需评估指标。您可以可视化评估结果,使用算子

    • dev_display_classification_evaluation

  3. 可为指定样本生成热图,使用

    1. 算子 gen_dl_model_heatmapgen_dl_model_heatmapGenDlModelHeatmapGenDlModelHeatmapGenDlModelHeatmapgen_dl_model_heatmap

    2. 函数 gen_dl_model_classification_heatmap

新图像推理

本部分介绍了基于深度学习的分类模型应用。具体步骤也可在 HDevelop 示例文件 classify_pill_defects_deep_learning_4_infer.hdev 中查看。

  1. 设置参数,例如 'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size",使用算子

  2. 为每张图像生成一个数据字典 DLSample。可通过以下函数实现

    • gen_dl_samples_from_images

  3. 对图像进行预处理,操作方式与训练时相同。我们建议使用以下函数进行处理

    • preprocess_dl_samples

    在预处理步骤中保存词典 DLPreprocessParam 后,可直接将其作为输入来指定所有参数值。

  4. 应用模型,使用算子

  5. 从字典 'DLResultBatch'"DLResultBatch""DLResultBatch""DLResultBatch""DLResultBatch""DLResultBatch" 中检索结果。

数据

我们将用于训练的数据与用于推理的数据区分开来。后者仅包含原始图像。但对于前者,您已知晓图像所属类别,并通过对应标签提供此信息。

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

训练和评估数据

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

训练数据用于针对特定任务训练和评估网络。借助这些数据,分类器能够学习需要区分的类别及其代表样本的特征。在分类任务中,图像作为整体进行分类。因此训练数据包含图像及其真实标签,即该图像所属的类别。请注意,图像应尽可能具有代表性。存储和检索此类信息存在多种方式。HALCON 中深度学习模型的数据格式要求详见 深度学习 / 模型 一章。简而言之,字典 DLDataset 作为训练与评估流程所需信息的数据库。 read_dl_dataset_classification 函数支持以下图像真实标签数据源:

  • 包含该图像的最后一个目录名称

  • 文件名。

在训练分类器时,我们采用一种称为迁移学习的技术(参见 深度学习 一章)。此方法所需资源较少,但仍需一套合适的数据集。虽然通常而言,基于更大数据集训练的网络更可靠,但所需训练数据量也取决于任务的复杂程度。同时需确保训练数据充足,以便将其划分为训练集、验证集和测试集三个子集。这些子集应尽可能相互独立且服从相同分布,详见 深度学习 一章中的“数据”部分。

图像

无论应用场景如何,网络对图像都提出了要求,例如图像尺寸等。具体数值取决于网络本身,可通过 get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param 进行查询。为满足这些要求,您可能需要对图像进行预处理。标准预处理分别在 preprocess_dl_datasetpreprocess_dl_samples 中实现,后者用于处理单个样本。若需自定义预处理,这些函数可为实现提供指导。

网络输出

网络输出取决于任务:

训练

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

推理与评估

作为输出,网络将为每个样本返回一个 DLResultDLResultDLResultDLResultDLResultdlresult 字典。对于分类任务,该字典将包含以下内容:针对每张输入图像,一个元组按降序排列各分类的置信度值,以及另一个元组对应的分类 IDs。

解读分类结果

当我们对图像进行分类时,会获得一组置信度值,这些值反映了图像与每个类别的关联程度。同时,我们还可以计算以下值:

混淆矩阵、精确率、召回率和 F 分数

在分类任务中,对整幅图像进行分类。因此,混淆矩阵的实例均为图像。关于混淆矩阵的解释,请参阅 深度学习 一章。

您可以借助 gen_confusion_matrixgen_interactive_confusion_matrix 函数生成混淆矩阵。其中交互式函数允许您选择特定类别的示例,但该功能不适用于导出的代码。

从这样的混淆矩阵中可以推导出多种指标。精确率是指所有正确预测的正类样本占所有预测正类样本(真正类与假正类)的比值。因此,它衡量的是被预测为正类的样本中有多少真正属于目标类别。

召回率,也称为“真正类率”,是指所有正确预测的正类样本占所有真实正类样本(真正类与假负类)的比例。因此,它衡量的是属于目标类别的样本中有多少被正确预测为正类。

召回率高但精度低的分类器能识别出大多数正样本(即目标类别的成员),但代价是将大量负样本也归入该类别。精确率高但召回率低的分类器则恰恰相反,它仅将少数样本判定为正样本,但这些预测结果大多正确。理想的分类器应兼具高精确率与高召回率,能够以高准确度将大量样本正确归类为正样本。

为用单一数值表征此特性,我们计算 F1 分数——即精确率与召回率的调和平均值。因此,它成为衡量分类器准确度的指标。

根据 深度学习 中混淆矩阵的示例,对于类别“apple”,我们得到以下数值:精确率:1.00(= 68/(68+0+0)),召回率:0.74(= 68/(68+21+3)),F1分数: 0.85(=2×(1.00×0.74)/(1.00+0.74))。


节列表