HALCON 21.11:深度学习笔记---分类(10)
HALCON 21.11.0.0中,实现了深度学习方法。
本章介绍了如何在训练和推理阶段使用基于深度学习的分类。
基于深度学习的分类是一种对一幅图像分配一组置信值的方法。这些置信度值表明图像属于每个可分辨类的可能性有多大。如果我们只考虑顶部的预测,分类就是在给定的类集合中指定一个特定的类给一幅图像。下面的模式说明了这一点。
分类示例: 网络区分三个类别. 输入图像获得三个可分辨类的置信值:“apple”0.85、“lemon”0.03和“orange”0.12. 上面的预测告诉我们,这张照片被识别为“苹果”
为了完成特定的任务,为了将数据分类到您想要区分的类中,分类器必须进行相应的训练。在HALCON中,我们使用了一种称为迁移学习的技术(参见深度学习一章)。因此,我们提供了预先训练的分类器,这些分类器已经训练了大量的标记图像数据。这些分类器经过训练和测试,能够很好地执行工业图像分类任务。这些分类器已经为一般分类训练过,现在为您的特定任务重新训练。为此,分类器需要知道要区分哪些类以及这些示例是什么样子的。这是由您的数据集表示,也就是说,您的图像与相应的ground truth标签。关于数据需求的更多信息可以在“数据”一节中找到。
在HALCON中,深度学习分类是在更通用的深度学习模型中实现的。关于后者的更多信息,请参见深度学习/模型一章。为了应用深度学习,具体的系统要求请参阅HALCON《安装指南》。
以下各节将介绍分类所需的一般工作流程,所涉及的数据和参数的相关信息,以及评价措施的解释。
一般工作流程
在本节中,我们描述了基于深度学习的分类任务的一般工作流程。该算法分为数据预处理、模型训练、训练模型评价和推理新图像四个部分。因此,我们假设,您的数据集已经标记,参见下面的“数据”部分。参看HDevelop示例系列classify_pill_defects_deep_learning的应用程序。
预处理数据
这一部分是关于如何预处理数据的。在HDevelop示例classify_pill_defects_deep_learning_1_preprocess.hdev中也显示了单个步骤。
- 通过函数read_dl_dataset_classification读取您的训练数据集,确定图像需要传输的信息是什么,并因此创建了字典DLDataset,它充当数据库并存储关于您的数据的所有必要信息。要了解更多关于数据及其传输方式的信息,请参阅下面的“数据”一节和深度学习/模型一章。
- 使用函数split_dl_dataset拆分字典DLDataset表示的数据集。结果分割将保存在DLDataset的每个样例条目的键分割上。
- 使用函数read_dl_model在预先训练好的网络中读取数据。同样,当您用write_dl_model保存网络之后,希望读取自己训练过的网络时,也可以使用该函数。网络会对图像提出若干要求,如图像的尺寸和灰度值的范围。默认值在read_dl_model中列出。这些都是网络预先训练出来的值。网络架构允许不同的图像尺寸,可以用set_dl_model_param设置,但根据网络的不同,更改可能需要重新训练网络。可以通过函数get_dl_model_param检索实际设置的值。
- 现在可以使用函数preprocess_dl_dataset对数据集进行预处理了。要使用这个函数,请指定预处理参数,如图像的大小。可以使用函数create_dl_preprocess_param将所有参数及其值存储在DLPreprocessParam字典中。我们建议保存这个字典DLPreprocessParam,以便稍后在推理阶段访问预处理参数值。
训练模型
这一部分是关于如何训练分类器的。在HDevelop示例classify_pill_defects_deep_learning_2_train.hdev中也显示了单个步骤。
1. 设置训练参数并将它们存储在字典'TrainingParam'中。这些参数包括:
- 超参数,请参阅深度学习一章。
- 用于可能的数据扩充的参数(可选)。
- 训练期间评估的参数。
- 训练结果可视化的参数。
- 序列化参数。
这可以使用函数create_dl_train_param来完成。
2. 训练模型。这可以使用函数train_dl_model来完成。这个函数需要:
- 模型句柄DLModelHandle;
- 包含DLDataset数据信息的字典;
- 带有训练参数'TrainParam'的字典;
- 训练将进行多少个epochs的信息。
当使用train_dl_model函数时,可以直观地看到总损失和可选的评价措施。
评估训练模型
在这一部分中,我们评估训练好的分类器。在HDevelop示例classify_pill_defects_deep_learning_3_evaluate.hdev中也显示了单个步骤。
- 使用函数evaluate_dl_model可方便地评价模型。
- 字典EvaluationResults保存所要求的评估度量。您可以使用函数dev_display_classification_evaluation可视化您的评估结果。
- 可以使用函数gen_dl_model_heatmap或gen_dl_model_classification_heatmap为使用的指定样本生成一个热图。
推理新图像
本部分介绍了基于深度学习的分类模型的应用。在HDevelop示例classify_pill_defects_deep_learning_4_helper .hdev中也显示了单个步骤。
- 使用函数set_dl_model_param设置诸如'batch_size'等参数。
- 使用函数gen_dl_samples_from_images为每个图像生成一个数据字典DLSample。
- 建议使用函数preprocess_dl_samples对图像进行预处理,就像对训练做的那样。当您在预处理步骤中保存DLPreprocessParam字典时,您可以直接使用它作为输入来指定所有参数值。
- 使用函数apply_dl_model应用模型。
- 从字典'DLResultBatch'中检索结果。
数据
我们区分用于训练的数据和用于推理的数据。后者由裸露的图像组成。但是对于前者,您已经知道图像属于哪个类,并在相应的标签上提供此信息。
作为一个基本概念,模型通过字典处理数据,这意味着它通过字典DLSample接收输入数据,并分别返回字典DLResult和DLTrainResult。关于数据处理的更多信息可以在深度学习/模型一章中找到。
用于训练和评估的数据
数据集由图像和相应的信息组成。必须以模型能够处理它们的方式提供它们。关于图像要求,请在下面的“图像”部分找到更多信息。
训练数据用于针对您的特定任务训练和评估网络。有了这些数据的帮助,分类器可以知道哪些类要区分,以及它们的代表是什么样子的。在分类中,将图像作为一个整体进行分类。因此,训练数据由图像及其ground truth标签组成,也就是您所说的该图像属于的类。请注意,图像应该尽可能地代表您的任务。有不同的方法来存储和检索这些信息。在深度学习/模型一章中解释了如何在HALCON中为DL模型格式化数据。简而言之,字典DLDataset可作为训练和评价函数所需信息的数据库。函数read_dl_dataset_classification支持图像的ground truth标签的以下来源:
- 包含图像的最后一个目录名;
- 文件名字。
为了训练分类器,我们使用一种叫做迁移学习的技术(参见深度学习一章)。为此,您需要较少的资源,但仍然需要一组合适的数据。一般来说,在较大的数据集上进行训练时,网络应该更加可靠,但训练所需的数据量也取决于任务的复杂性。您还需要足够的训练数据来将其划分为三个子集,用于训练、验证和测试网络。这些子集最好是独立的、同分布的,请参阅深度学习一章中的“数据”一节。
图像
不管应用程序如何,网络都对图像提出了要求,例如图像的尺寸。具体的值取决于网络本身,可以用get_dl_model_param查询。为了满足这些要求,您可能必须对您的图像进行预处理。对于单个样本,标准预处理分别在preprocess_dl_dataset和preprocess_dl_samples中实现。在定制预处理的情况下,这些过程提供了实现的指导。
网络输出
作为训练输出:函数将返回一个字典DLTrainResult,其中包含总损失的当前值以及模型中包含的所有其他损失的值。
作为推理和评估输出:网络将为每个样本返回一个字典DLResult。为了分类,本字典将为每个输入图像包含一个元组,该元组包含每个按递减顺序区分的类的置信值,以及第二个元组,该元组包含相应的类id。
解释分类结果
当我们对一幅图像进行分类时,我们得到了一组置信值,告诉我们该图像与每个类的亲缘关系。也可以计算下列值。
混淆矩阵,精度,召回率和f分数
分类是对整个图像进行分类。因此,混淆矩阵的实例是图像。关于混淆矩阵的解释,请参阅深度学习章节。
您可以借助函数gen_confusion_matrix和gen_interactive_confusion_matrix生成混淆矩阵。因此,交互式过程为您提供了选择特定类别的示例的可能性,但它不能用于导出的代码。
从这样一个混淆矩阵中,你可以推导出各种各样的值。精度是所有正确预测阳性与所有预测阳性(真阳性和假阳性)的比例。因此,它是一种衡量有多少积极预测真正属于所选类别的方法。
召回率,也称为“真实阳性率”,是所有正确预测阳性结果与所有真实阳性结果的比例。因此,它是一种度量有多少属于所选类别的样本被正确预测为阳性的方法。
具有高召回率但低精度的分类器会找到大多数正数成员(即类成员),但代价是还要将许多负数分类为类成员。一个精度高但召回率低的分类器正好相反,只将少数样本分类为阳性,但这些预测大多数是正确的。一个理想的高精度、高召回率的分类器可以将很多样本分类为正确率高的样本。
为了用一个数字来表示这一点,我们计算f1得分、精度和召回率的调和平均值。因此,它是分类器准确性的度量。
以深度学习中显示的混淆矩阵为例,我们得到类‘apple’的值precision: 1.00 (= 68/(68+0+0)), recall: 0.74 (= 68/(68+21+3)), F1-score: 0.85(=2*(1.00*0.74)/(1.00+0.74))。
转载自:https://blog.csdn.net/liubing8609/article/details/121526377