介绍
术语“深度学习(DL)”是指一系列机器学习方法。在HALCON中,实现了以下方法:
分类:
从给定的一组类中将图像分类为一个类。有关更多信息,请参阅“深度学习/分类”一章 。
一个可能的分类示例:将图像分配给一个类。对象检测:
检测给定类的对象并将其定位在图像中。有关更多信息,请参阅“深度学习/对象检测”一章 。
一个可能的对象检测示例:在输入图像中找到三个实例并将其分配给一个类。语义分割:
为图像的每个像素分配一个类。有关更多信息,请参阅“深度学习/语义细分”一章 。
语义分割的一个可能示例:输入图像的每个像素都分配给一个类。
因此,后两者是在通用DL模型中实现的,请参阅“深度学习/模型”一章。上面列出的所有三种不同的深度学习方法都有一个网络来执行分配任务。仅通过考虑输入和输出来训练网络,这也称为端到端学习。基本上,训练算法使用图像和信息(它们在图像中可见)来调整网络,以区分不同的类别,并最终也找到如何找到相应的对象。对您来说,它不需要手动功能说明就具有不错的结果。相反,您必须选择并收集适当的数据。
系统要求
卷积神经网络(CNN)的深度学习对网络的功能训练和将网络用于推理的要求不同。
深度学习网络的培训需要NVIDIA GPU,并使用库cuDNN和cuBLAS。为了加快培训过程,我们建议在HALCON中使用足够快的硬盘驱动器。因此,固态驱动器(SSD)优于传统的硬盘驱动器(HDD)。
可以在x86和x64 CPU以及NVIDIA GPU上执行深度学习网络的推理,因此对培训的要求相同。
有关特定要求,请参阅HALCON “Installation Guide”
。
一般工作流程
由于上述DL方法的作用以及如何使用数据的方式不同,因此您需要知道哪种方法最适合您的特定任务。一旦明确这一点,您就需要收集适量的数据,即图像和该方法所需的信息。之后,所有这些DL方法都有一个通用的通用工作流程:
准备网络和数据
需要为您的任务准备网络,并使数据适应特定网络。
获取网络:阅读预先训练的网络或创建一个。
网络需要知道它将解决的问题,即,要区分哪些类别以及此类样本的外观。这由您的数据集表示,即具有相应地面真实性信息的图像。
网络将对图像施加一些要求(例如,图像尺寸,灰度值范围等)。因此,必须对图像进行预处理,以便网络可以对其进行处理。
我们建议将数据集分为三个不同的数据集,分别用于训练,验证和测试。
培训网络并评估培训进度
建立网络并准备好数据后,就可以为您的特定任务训练网络了。
设置适合您的任务和系统的超参数。
(可选)指定您的数据扩充。
开始培训并在培训期间评估您的网络。
申请并评估最终网络
您的网络已针对您的任务进行了培训,可以随时使用。但是,在将其部署到现实世界之前,您应该根据测试数据集评估网络的性能。
推理阶段
当您的网络经过培训并且对其性能感到满意时,可以将其用于推断新图像。因此,需要根据网络的要求对图像进行预处理(因此,以与训练相同的方式)。
数据
术语“数据”在深度学习的上下文中用作图像和信息以及其中的内容。必须以网络可以理解的方式提供此最后信息。毫不奇怪,不同的DL方法对必须提供哪些信息以及如何提供信息有自己的要求。有关特定要求,请参见相应的章节。
网络还对图像提出了有关图像尺寸,灰度值范围和类型的要求。具体值取决于网络本身,可以分别使用和进行查询 。另外,取决于方法,还存在关于信息的要求,例如边界框。为了满足所有这些要求,可能必须对数据进行预处理,这可以分别通过相应的过程(例如和) 最方便地完成。 get_dl_model_param
get_dl_classifier_param
preprocess_dl_samples
preprocess_dl_classifier_images
训练网络时,网络将适应其任务。但是,在某一点上,您将要评估网络学到的知识,而在以后的某个点上,您将要测试网络。因此,数据集将被分为三个子集,这三个子集应独立且分布均匀。简而言之,子集不应以任何方式相互连接,并且每个集合对于每个类别都包含相同的图像分布。这种拆分可方便地通过程序进行 split_dl_dataset
,并split_dl_classifier_data_set
, 分别。显然最大的子集将用于再培训。我们将此数据集称为训练数据集。在某一时刻,评估网络性能以检查继续进行网络优化是否有好处。对于此验证,使用第二组数据,即验证数据集。即使验证数据集与第一个数据集不相交,它也会对网络优化产生影响。因此,当模型在现实世界中部署时,为了测试可能的预测,将使用第三个数据集,即测试数据集。对于代表性的网络验证或评估,验证和测试数据集应具有统计上相关的数据,从而在所需数据量上给出了下限。
还要注意,在训练网络时,最好使用代表性图像,即像您以后要处理的图像一样的图像,而不仅仅是“完美”图像,否则网络可能会遇到非“完美”图像的问题。
网络与培训过程
在深度学习的上下文中,分配是通过通过网络发送输入图像来执行的。整个网络的输出包含许多预测。这样的预测是,例如,对于分类任务,每个类别的置信度,表示图像显示该类别的实例的可能性。
这样的网络由一定数量的以特定方式布置和连接的层或过滤器组成。通常,任何层都是执行特定任务的构件。可以将其视为一个容器,该容器接收输入,然后根据功能对其进行转换,然后将输出返回到下一层。因此,对于不同类型的层,不同的功能是可能的。中提供了几个可能的示例 “Solution Guide on Classification”
。图层的输出也称为要素图。许多层或过滤器都有权重,这些参数也称为过滤器权重。这些是在网络训练期间修改的参数。
为了训练网络执行特定任务,添加了丢失功能。根据任务有不同的损失函数,但是它们都按照以下原理工作。损失函数会将来自网络的预测与给定的信息进行比较,并在图像中找到(如果适用,还包括在哪里),并对偏差进行补偿。现在,以使损失函数最小化的方式更新滤波器权重。因此,对网络进行特定任务的训练,努力使网络的损失(误差函数)最小化,希望这样做也将改善性能指标。实际上,这种优化是通过计算梯度并相应地更新不同层的参数(过滤器权重)来完成的。通过对训练数据进行多次迭代来重复此过程。
还有一些其他参数会影响训练,但在常规训练期间不会直接学习。这些参数在开始训练之前已设置了值。我们将这最后一种类型的参数称为超参数,以便将它们与训练期间优化的网络参数区分开。请参阅“设置训练参数:超参数”一节。
为了从头训练所有过滤器重量,需要大量资源。因此,可以从以下观察中受益。第一层检测低级特征,例如边缘和曲线。以下各层的特征图较小,但它们表示更复杂的特征。对于大型网络,底层功能足够通用,因此在不同任务之间相应层的权重不会有太大变化。这导致了一种称为转移学习的技术:一个人采用一个已经受过训练的网络,并针对特定任务对其进行再训练,这得益于较低层已经非常合适的滤波器权重。结果,需要相当少的资源。通常,在较大的数据集上训练网络时,网络应该更可靠,再培训所需的数据量还取决于任务的复杂性。下图通过分类显示了转移学习工作流的基本方案。
(1) | (2) | (3) | (4) |
设置训练参数:超参数
不同的DL方法是为不同的任务设计的,并且它们的构建方式也会有所不同。但是它们都有一个共同点,那就是在网络培训期间,我们努力使相应的损失功能最小化,请参阅“网络和培训过程”一节。为此,还有一组其他参数,这些参数在开始训练之前设置,并且在训练期间未优化。我们将这些参数称为超参数。对于DL模型,您可以设置更改策略,指定在训练期间何时以及如何更改这些超参数。在本节中,我们解释了不同超参数的概念。请注意,某些方法还具有其他超参数,您可以在各自的章节中找到更多信息。
如前所述,损失会将来自网络的预测与有关图像内容的给定信息进行比较。损失现在惩罚了偏差。训练网络意味着以这样一种方式更新滤波器权重,即损失必须减少的损失更少,因此损失的结果得以优化。为此,从训练数据集中获取一定数量的数据。对于该子集,计算损耗的梯度,并相应地更新其滤波器权重来修改网络。现在,对下一个数据子集重复此操作,直到处理完所有训练数据为止。训练数据的这些子集称为批处理,这些子集的大小决定了成批处理并因此一起处理的数据数量。 'batch_size'
整个训练数据的完整迭代称为“时期”。对训练数据进行多次迭代是有益的。迭代次数由定义'epochs'
。因此,'epochs'
确定算法在训练集上循环多少次。
如前所述,在每次计算损耗梯度之后,都会更新滤波器权重(这是分批完成的,因此是通过随机梯度下降算法SGD进行的)。对于此更新,有两个重要的超参数:,用于确定更新后的损失函数自变量上的梯度权重(滤波器权重);在区间内,用于指定先前更新的影响。更多信息可以的文档中找到 和'learning_rate'
'momentum'
train_dl_classifier_batch
, 分别。简而言之,当我们更新损失函数参数时,我们仍然记得上一次更新所采取的步骤。现在,我们朝着梯度的方向迈出了一步,其长度取决于学习率。此外,我们重复上次执行的步骤,但是这次只重复了一次 。下图给出了可视化效果。学习速率太大可能会导致算法出现分歧,学习速率很小会不必要地采取许多步骤。因此,习惯上从更高的学习率开始,并有可能在训练过程中降低学习率。对于动量 ,动量方法没有影响,因此只有梯度确定更新向量。 train_dl_model_batch
'learning_rate'
'momentum'
为了防止神经网络过度拟合(请参见下面的“欠拟合和过度拟合的风险”部分),可以使用正则化。使用这种技术,损耗函数会增加一个额外的项。一种可能类型正规化是重量衰变,详见的文档和 分别。它通过惩罚较大的权重(即将权重推向零)来工作。简而言之,这种正则化倾向于使用更简单的模型,这些模型不太可能适合训练数据中的噪声并能更好地泛化。可以通过超参数设置。选择其值是模型的泛化,过度拟合和欠拟合能力之间的权衡。如果train_dl_model_batch
train_dl_classifier_batch
'weight_prior'
'weight_prior'
如果值太小,则模型可能会过拟合;如果值太大,则模型可能会失去其拟合数据的能力,因为所有权重实际上都为零。
利用训练数据和所有超参数,有许多不同方面可以影响这种复杂算法的结果。为了提高网络性能,通常添加培训数据也有帮助。请注意,收集更多数据是否是一个好的解决方案,始终取决于能否轻松收集数据。通常,一小部分额外的费用不会明显改变整体性能。
监督培训
不同的DL方法具有不同的结果。因此,他们还使用不同的方法来确定网络的“性能”。但是,在训练网络时,存在一些常见的行为和陷阱,在此进行介绍。
培训期间的验证
在验证网络性能时,必须注意这不是一个纯粹的优化问题(请参见上面的“网络和培训过程”和“设置培训参数”部分)。
为了观察训练进度,通常可以将验证措施可视化,例如,对于分类网络的训练而言,批次样品的误差。由于样本不同,分配任务的难度也可能不同。因此,对于给定批次的样品,网络的性能可能好于另一批次的样品。因此,验证度量在迭代过程中不会平滑变化是正常的。但总的来说,它应该有所改善。调整超参数 ,可以帮助再次改善验证措施。下图显示了可能的情况。
'learning_rate'
'momentum'
(1) (2) 训练期间验证度量的草图,此处以分类错误为例。(1)具有不同值的可能结果的总体趋势 ,深蓝色:学习率高,红色:学习率很高,浅蓝色:学习率高,橙色:学习率低。(2)具有学习率策略的理想情况,该策略要在给定的迭代次数后减小 值。橙色:训练错误,深蓝色:验证错误。箭头标记迭代,学习速率降低。'learning_rate'
'learning_rate'
过度拟合和过度拟合的风险
如果模型无法捕获任务的复杂性,则会发生拟合不足。它直接反映在训练集上的验证指标上,该验证指标仍然很高。
当网络开始“记忆”训练数据而不是学习如何概括时,就会发生过度拟合。这可以通过训练集上的验证度量来表明,该度量保持良好甚至改善,而验证集上的验证度量却降低了。在这种情况下,正则化可能会有所帮助。请参阅“设置训练参数:超参数”一节中对超参数的解释。注意,当模型容量相对于数据太高时,会发生类似的现象。
'weight_prior'
在概化间隙(箭头所示)上可见的可能过度拟合的场景的草图。来自分类的错误用作验证措施的示例。混淆矩阵
网络为一个实例推断出最高预测,即网络为其推论出最高亲和力的类别。当我们知道其基础事实类别时,我们可以比较两个类别的从属关系:预测的一个和正确的一个。因此,实例在不同类型的方法之间有所不同,而例如在分类中,实例是图像,在语义分割中,实例是单个像素。
当区分两个以上的类时,一个类也可以将比较简化为二进制问题。这意味着,对于给定的类别,您只需要比较是同一类别(正)还是任何其他类别(负)即可。对于此类二进制分类问题,将比较简化为以下四个可能的实体(并非所有实体都适用于每种方法):
真阳性(TP:预测阳性,标记为阳性),
真阴性(TN:预测阴性,标记为阴性),
误报(FP:预测为正,标记为负),
假阴性(FN:预测阴性,标记为阳性)。
混淆矩阵是具有这种比较的表。该表使您可以轻松查看网络对每个班级的表现。对于每个类,它列出了已预测进入哪个类的实例数。例如,对于一个区分“苹果”,“桃子”和“橙色”三个类别的分类器,混淆矩阵显示有多少个具有地面真理类别隶属关系“苹果”的图像已被分类为“苹果”,并且有多少图像已被分类如“桃子”或“橙色”。当然,这也是其他类别的清单。下图显示了此示例。在HALCON中,我们为每个类在列中表示带有地面真理标签的实例,并在一行中表示预测属于该类的实例。
(1) (2) 来自分类的混淆矩阵的示例。我们看到有68个“苹果”的图像已被归类为此类(TP),有60个显示非“苹果”的图像已被正确归类为“桃”(30)或“梨”(30)(TN), 0张图片显示“桃子”或“梨”,但已被分类为“苹果”(FP),“苹果”的24张图像被错误地分类为“桃子”(21)或“梨”(3) (FN)。(1)所有三个杰出类的混淆矩阵。似乎网络比所有其他组合更容易“混淆”苹果和桃子。(2)二进制问题的混淆矩阵,以更好地可视化“苹果”类。
词汇表
在下文中,我们描述了深度学习中使用的最重要的术语:
注解
注释是地面真相信息,即数据中给定实例所表示的内容,对于网络而言是可识别的。例如,这是对象检测中实例的边界框和相应标签。
骨干
骨干网是预先训练的分类网络的一部分。它的任务是生成各种特征图,出于何种原因删除了分类层。
批次大小-超参数
'batch_size'
数据集分为较小的数据子集,称为子集。批次大小决定了成批拍摄并同时处理的图像数量。
边框
边界框是平行于轴的矩形框,用于定义图像中的零件并指定对象在图像中的位置。
类不可知
类不可知的意思是没有不同类的知识。
在HALCON中,我们将其用于减少重叠的预测边界框。这意味着,对于类不可知的边界框抑制,忽略实例的知识就可以完成对重叠实例的抑制,因此,独立于其类的强重叠实例将被抑制。
改变策略
更改策略表示在DL模型训练期间何时以及如何更改超参数的策略。
类
类是网络区分的离散类别(例如,“苹果”,“桃子”,“梨”)。在HALCON中,实例的类由其适当的注释给出。
分类器
在深度学习的上下文中,我们将术语“分类器”称为以下内容。分类器将图像作为输入并返回推断的置信度值,以表示图像属于每个专有类的可能性。例如,区分了“苹果”,“桃子”和“梨”这三个类别。现在,我们将苹果图像提供给分类器。结果,可以返回置信度“苹果”:0.92,“桃子”:0.07和“梨”:0.01。
可可
COCO是“上下文中的常见对象”的缩写,是大型对象检测,分割和字幕数据集。每种不同的注释类型都有一种通用的文件格式。
置信度
置信度是一个数字,表示实例与类的相似性。在HALCON中,置信度是在[0,1]范围内给出的概率。备用名称:score
混淆矩阵
混淆矩阵是一个表,用于将网络(top-1)预测的类别与基本事实类别从属关系进行比较。它通常用于可视化验证或测试集上的网络性能。
卷积神经网络(CNN)
卷积神经网络是深度学习中使用的神经网络,其特征在于网络中至少存在一个卷积层。它们在图像分类方面特别成功。
数据
我们在深度学习的上下文中使用术语数据来识别要识别的实例(例如图像)及其有关可预测特征的适当信息(例如分类时的标签)。
数据扩充
数据扩充是在数据集中生成更改的样本副本。这样做是为了增加数据集的丰富度,例如通过翻转或旋转。
数据集:训练,验证和测试集
对于数据集,我们指的是用于训练的完整数据集。数据集分为三个子集(如果可能不相交):
训练集包含数据,算法可直接在该数据上优化网络。
验证集包含用于评估训练期间网络性能的数据。
该测试集用于测试可能的推断(预测),从而测试数据的性能,而不会影响网络优化。
深度学习
术语“深度学习”最初用于描述具有多个隐藏层的神经网络的训练。如今,它已被用作机器学习中几个不同概念的通用术语。在HALCON中,我们将“深度学习”一词用于使用具有多个隐藏层的神经网络的方法。
时代
在深度学习的上下文中,纪元是整个训练数据(即所有批次)的单个训练迭代。历元上的迭代不应与单批迭代(例如,在历元内)相混淆。
错误
在深度学习的上下文中,当实例的推断类与真实类不匹配时(例如分类时的地面真相标签),我们指的是错误。在HALCON中,当我们提到top-1错误时,在深度学习中使用术语错误。
功能图
要素地图是给定图层的输出
特征金字塔
特征金字塔只是一组特征图,每个特征图都来自另一个级别,即,它小于其先前的级别。
超参数
像每个机器学习模型一样,CNN包含许多带有许多参数的公式。在训练期间,模型从优化参数的意义上从数据中学习。但是,此类模型可以具有其他附加参数,这些参数在常规训练期间不会直接学习。这些参数在开始训练之前已设置了值。我们将这最后一种类型的参数称为超参数,以便将它们与训练过程中优化的网络参数区分开。或者从另一个角度来看,超参数是求解器特定的参数。
突出的例子是初始学习率或批量大小。
推理阶段
推理阶段是将训练有素的网络应用于预测(推理)实例(可以是总输入图像或只是一部分输入图像)并最终对其进行定位的阶段。与训练阶段不同,网络在推断阶段不再更改。
联合路口
联合交集(IoU)是量化两个区域重叠的一种度量。我们可以确定两个区域(相交)以及联合区域(并集)中共有的零件。IoU是两个区域的交集和并集之比。
在两个方法之间,此概念的应用可能有所不同。
标签
标签是用于定义图像类别的任意字符串。在HALCON中,这些标签由图像名称(最后是下划线和数字的组合)或文件夹名称(例如“ apple_01.png”,“ pear.png”,“ peach / 01.png”)指定。
层和隐藏层
层是神经网络中的构建块,因此执行特定任务(例如卷积,池化等,有关更多详细信息,请参阅参考资料
“Solution Guide on Classification”
)。可以将其视为一个容器,该容器接收加权的输入,对其进行转换,然后将输出返回到下一层。输入层和输出层分别连接到数据集,即图像或标签。介于两者之间的所有层称为隐藏层。学习率-超参数
'learning_rate'
学习速率是权重,在更新损失函数的自变量时,将考虑梯度(请参见随机梯度下降SGD的条目)。简而言之,当我们要优化函数时,梯度告诉我们优化的方向,学习率决定了我们沿着该方向走多远。
备用名称:,步长
水平
术语“级别”用于表示要素金字塔网络内的整个图层组,这些图层的要素图具有相同的宽度和高度。因此,输入图像表示级别0。
失利
损失函数会将来自网络的预测与给定的信息进行比较,并在图像中找到(如果适用,还包括在哪里),并对偏差进行补偿。损失函数是我们在训练过程中优化的函数,用于使网络适应特定任务。
替代名称:目标函数,成本函数,效用函数
动量-超参数
'momentum'
动量用于损失函数参数的优化。当损失函数自变量更新时(在计算完梯度之后),将添加先前更新矢量(过去迭代步骤的一部分)的一部分。这具有阻尼振荡的作用。我们将超参数 称为动量。当设置为时,动量法不起作用。简而言之,当我们更新损失函数参数时,我们仍然记得上一次更新所执行的步骤。现在,我们根据学习率在长度方向上迈出了一步,此外,我们重复了上次执行的步骤,但是这次只重复了一次 。
非最大抑制
在对象检测中,非最大抑制用于抑制重叠的预测边界框。当不同的实例重叠超过给定阈值时,仅保留具有最高置信度值的实例,而抑制其他没有最大置信度值的实例。
过度拟合
当网络开始“记忆”训练数据而不是学习如何找到分类的一般规则时,就会发生过度拟合。当模型继续使训练集上的误差最小化但验证集上的误差增加时,这变得可见。由于大多数神经网络具有大量权重,因此这些网络特别容易过拟合。
正则化-超参数
'weight_prior'
正则化是一种通过向损失函数添加额外项来防止神经网络过度拟合的技术。它通过惩罚较大的权重(即将权重推向零)来工作。简而言之,正则化倾向于使用更简单的模型,这些模型不太可能适合训练数据中的噪声并能更好地泛化。在HALCON中,正则化是通过参数来控制的 。
'weight_prior'
替代名称:正则化参数,权重衰减参数 (请注意,在HALCON中,我们用于学习率,并且在公式中使用正则化参数的符号)。
再培训
我们将再培训定义为更新已经预先训练的网络的权重,即在再培训期间,网络学习特定任务。
备用名称:微调。
解算器
求解器通过以优化(即最小化)损失的方式更新权重来优化网络。
随机梯度下降(SGD)
SGD是针对微分函数的迭代优化算法。在深度学习中,我们使用此算法来计算梯度以优化(即最小化)损失函数。SGD的关键功能是仅基于包含随机采样数据而不是所有数据的单个批次来计算梯度。
top-k错误
对于给定的图像类别,分类器推断图像属于每个杰出类别的可能性的置信度。因此,对于图像,我们可以根据分类器分配的置信度值对预测的类别进行排序。前k个错误表示预测的比率,其中地面真理类别不在k个具有最高概率的预测类别内。在top-1错误的情况下,我们检查目标标签是否与概率最高的预测匹配。在前3个错误的情况下,我们检查目标标签是否与前3个预测之一匹配(这3个标签获得该图像的最高概率)。
备用名称:top-k成绩
转移学习
转移学习是指一种基于已有网络知识构建网络的技术。具体而言,这意味着采用已经(经过预训练)的网络及其权重,并使输出层适应相应的应用程序以获取网络。在HALCON中,我们还将以下再培训步骤视为迁移学习的一部分。
不合身
当模型过度概括时,就会发生拟合不足。换句话说,它无法描述任务的复杂性。这直接反映在训练集上的误差上,不会显着降低。
重量
通常,权重是网络的自由参数,由于损失的优化,网络的自由参数会在训练过程中更改。具有权重的图层将其与输入值相乘或相加。与超参数相反,权重得到了优化,因此在训练过程中发生了变化。

