深度学习( DL )一词指代一类机器学习方法。在 HALCON 中,实现了以下方法:
检测三维场景中物体的抓取点。更多信息请参阅 三维匹配 / 三维抓取点检测。
为每个像素分配其呈现未知特征的概率。更多信息请参阅 深度学习 / 异常检测和全局上下文异常检测 一章。
将图像分类到给定类别集合中的某一类。更多信息请参阅 深度学习 / 分类 一章。
检测并统计图像中的目标。更多信息请参阅 匹配 / 深度计数 一章。
检测并识别图像中的单词(而非仅识别字符)。更多信息请参阅 OCR / 深度 OCR 一章。
检测给定类别的目标并在图像中定位它们。实例分割是目标检测的特殊情况,模型不仅预测出独特的目标实例,还会为检测到的实例分配其在图像中的区域。更多信息请参阅 深度学习 / 目标检测与实例分割 一章。
为图像的每个像素分配一个类别,但同一类别的不同实例不作区分。这是语义分割的特殊情况,其中输入图像的每个像素被分配到 “edge” 或 “background” 两个类别之一。更多信息请参阅 深度学习 / 语义分割与边缘提取 一章。
上述所有深度学习方法均采用网络完成分配任务。在 HALCON 中,这些方法均实现于通用深度学习模型中,详见 深度学习 / 模型。该模型仅通过输入与输出进行训练,亦称为端到端学习。其核心原理是:训练算法利用图像及其可见信息,逐步调整模型以区分不同类别,最终实现对应目标的定位。对您而言,其优势在于无需手动指定特征,只需选择并收集合适的数据即可。
深度学习需满足额外先决条件。请参阅 HALCON “安装指南” 中“深度学习及基于深度学习方法的要求”一章所列要求。
请注意,所需的模块许可证取决于您应用程序中使用的模型类型。详细说明请参阅 “安装指南” 中“基于深度学习的应用程序动态模块”一章。
由于上述深度学习方法在功能和数据需求方面存在差异,您需要明确哪种方法最适合您的具体任务。确定方法后,需收集足够的数据,包括图像及该方法所需的信息。随后,所有深度学习方法都遵循一个通用的工作流程:
网络需要为您的任务做好准备,您的数据也需要适应特定的网络环境。
获取网络:读取预训练网络或创建一个。
网络需要知道它应解决什么问题,即需要区分哪些类别以及这些样本的具体形态。这通过您的数据集来体现,即包含对应真实标注信息的图像数据。
该网络将对图像提出若干要求(例如图像尺寸、灰度值范围等)。因此必须对图像进行预处理,以便网络能够对其进行处理。
我们建议将数据集拆分为三个独立的数据集,分别用于训练、验证和测试。
当您的网络配置完成且数据准备就绪后,就该针对特定任务对网络进行训练了。
根据您的任务和系统设置适当的超参数。
可选地指定您的数据增强方案。
开始训练并评估您的网络。
您的网络已针对任务完成训练,可随时投入使用。但在实际环境中部署前,您应基于测试数据集评估该网络的性能表现。
当网络训练完成且您对其性能满意时,即可将其用于新图像的推理。此时需根据网络要求对图像进行预处理(即与训练时相同的方式)。
在深度学习领域,“数据(Data)”一词指代图像及其所承载的信息。这些信息必须以网络可理解的形式呈现。不同深度学习方法对数据形式与内容的要求各不相同,具体细节请参阅相关章节。
该网络对图像还提出了尺寸、灰度值范围及类型等要求。具体数值取决于网络本身,可通过 查询。此外,根据具体方法的不同,还对图像信息(如边界框)存在额外要求。为满足所有要求,数据可能需要预处理,最便捷的方式是使用对应的函数 get_dl_model_parampreprocess_dl_samples。
在训练网络时,网络会适应其任务。但到某个阶段,您需要评估网络的学习成果,而在更晚的阶段,您需要测试网络。因此数据集将被划分为三个子集,这些子集应相互独立且具有相同的分布特性。简而言之,各子集之间不应存在任何关联,且每个子集对各类别的图像分布应完全一致。此分割操作可通过 split_dl_dataset 函数便捷实现。其中规模最大的子集将用于重新训练,我们称之为训练数据集。在特定阶段需评估网络性能,以判断是否值得继续优化网络。验证环节使用第二组数据——验证数据集。即使验证数据集与第一组互斥,仍会影响网络优化。因此为测试模型实际部署时的预测能力,需使用第三组数据——测试数据集。要实现具有代表性的网络验证或评估,验证集与测试集应包含具有统计学意义的数据,这为所需数据量设定了下限。
请注意,在训练网络时,最好使用具有代表性的图像,即类似于后续需要处理的图像类型,而不仅仅是“完美”的图像。否则,网络在处理非“完美”图像时可能会遇到困难。
在深度学习的背景下,任务通过将输入图像传送至网络来完成。整个网络的输出包含若干预测结果。例如在分类任务中,这些预测包括每个类别的置信度,该置信度反映图像呈现该类别实例的可能性。
具体网络结构会因方法不同而有所差异,尤其在不同方法之间差异显著。某些方法(如目标检测)会使用子网络生成特征图(详见下文及 深度学习 / 目标检测与实例分割 中的说明)。本文将阐述基础卷积神经网络(CNN)的原理。此类网络由特定数量的层或滤波器构成,这些层或滤波器以特定方式排列并相互连接。通常而言,每个层都是执行特定任务的构建模块。可将其视为接收输入、根据函数进行转换并向下一层返回输出的容器。不同类型的层可实现不同的函数功能,具体示例详见 “分类解决方案指南”。多数层或滤波器都具有权重参数(亦称滤波器权重),这些参数在网络训练过程中会动态调整。绝大多数层的输出均为特征图,其数量(即层输出深度)与尺寸(宽度和高度)取决于具体层的特性。
为使网络适应特定任务,需引入损失函数。不同任务对应不同损失函数,但其运作原理均遵循以下机制:损失函数将网络预测结果与预设目标(即图像中应识别的内容及其位置)进行比对,并对偏差进行惩罚。随后通过调整滤波器权重使损失函数最小化。因此,针对特定任务训练网络时,目标在于最小化网络的损失(即误差函数),期望由此提升性能指标。实际操作中,通过计算梯度并据此更新各层参数(滤波器权重)实现优化。该过程需对训练数据进行多次迭代重复。
还有其他参数会影响训练过程,但这些参数不会在常规训练中直接学习。它们的值在训练开始前就已设定。我们将这类参数称为超参数(Hyperparameters),以区别于训练过程中优化的网络参数。详见 “设置训练参数:超参数” 一节。
从头开始训练所有滤波器权重需要大量资源。因此我们可以利用以下观察结果:前几层负责检测边缘、曲线等低级特征,后续层的特征图尺寸虽小,却能表示更复杂的特征。对于大型网络而言,低级特征具有普遍性,因此对应层的权重在不同任务间变化不大。这催生了迁移学习技术: 利用已训练好的网络,针对特定任务进行再训练,同时保留底层已相当适配的滤波器权重。由此可大幅节省资源消耗。虽然通常而言,基于更大数据集训练的网络更可靠,但再训练所需数据量也取决于任务复杂度。下图通过分类任务示例,展示了迁移学习工作流的基本框架。
| ( 1) | ( 2) | ( 3) | ( 4) |
不同的深度学习方法针对不同任务而设计,其构建方式也各不相同。它们的共同点在于模型训练过程中都面临最小化问题。训练网络或子网络时,目标是使相应的损失函数最小化,详见 “网络与训练过程” 一节。为此,训练开始前需设定一组额外参数,这些参数在训练过程中不会被优化。我们称这些参数为超参数。对于深度学习模型,可设置调整策略,指定训练过程中何时以及如何改变这些超参数。本节将阐述不同超参数的核心思想。需注意某些方法存在额外超参数,更多信息请参阅相应章。
如前所述,损失函数通过将网络预测结果与图像内容的已知信息进行对比来评估偏差。训练网络的过程就是通过调整滤波器权重,使损失函数施加的惩罚减小,从而优化损失结果。具体操作是:从训练数据集中抽取特定数据量,计算该子集的损失梯度,并据此更新网络的滤波器权重。此过程将循环进行,直至处理完全部训练数据。这些训练数据子集称为批次,其大小,即 'batch_size',决定了每个批次包含的数据数量,进而决定了同时处理的数据量。
对整个训练数据进行完整遍历称为一个 epoch(周期)。对训练数据进行多次迭代是有益的。迭代次数由 'epochs' 参数定义。因此,'epochs' 决定了算法对训练集进行循环处理的次数。
某些模型(如异常检测)采用一次性训练整个数据集的方式。对于其他模型,则需批量处理数据集,此时可采用随机梯度下降算法(stochastic gradient descent algorithm,SGD)或自适应矩估计算法(adaptive moment estimation,Adam)。这涉及更多参数,具体说明如下。每次计算损失梯度后,都会更新滤波器权重。本次更新涉及两个重要超参数: 'learning_rate' ,用于确定梯度对更新后损失函数参数(即滤波器权重)的影响权重;以及 'momentum'
,取值范围在 区间内,用于指定先前更新的影响程度。更多信息可在 的文档中找到。简而言之,当我们更新损失函数参数时,仍会记住上次更新的步长。现在,我们沿着梯度方向迈出一步,步长取决于学习率;同时重复上次的步长,但这次仅为原步长的
倍。下图给出了可视化示意。过大的学习率可能导致算法发散,而过小的学习率则会造成不必要的步数消耗。因此惯例做法是采用较大的初始学习率,并在训练过程中逐步降低。当动量
时,动量法不产生影响,此时更新向量完全由梯度决定。
train_dl_model_batch
'learning_rate' 与动量 'momentum'
在更新步长中的作用示意图。梯度步:学习率
乘以梯度 g (g——虚线)。动量步:动量 乘以前次更新向量 v(v——点线)。两者共同构成实际更新步:更新向量 v(v——实线)。
为防止神经网络过拟合(参见下文“欠拟合与过拟合风险”部分),可采用正则化技术。该方法通过在损失函数中添加额外项实现。一种常见的正则化方式是权重衰减,具体细节请参阅 文档。其原理是惩罚过大的权重值,即推动权重趋近于零。简言之,这种正则化机制更倾向于构建简单模型——这类模型不易受训练数据噪声影响,且泛化能力更强。其参数可通过超参数 train_dl_model_batch'weight_prior' 设置。其数值选择需权衡模型的泛化能力、过拟合与欠拟合问题:若 'weight_prior' 过小可能导致过拟合,若过大则因所有权重趋近于零而丧失拟合数据的能力。
在训练数据和所有超参数的共同作用下,诸多不同因素都可能影响这类复杂算法的最终结果。通常而言,增加训练数据有助于提升网络性能。但需注意的是,是否收集更多数据始终取决于其实施难度——通常少量增量数据并不会显著改变整体表现。
不同的深度学习方法会产生不同的结果。因此,它们也采用不同的评估指标来衡量网络的"表现优劣"。在训练网络时,不同模型存在特定的行为特征与常见陷阱,本文将对此进行阐述。
在验证网络性能时,需要注意这并非纯粹的优化问题(参见上文“网络与训练过程”及“设置训练参数”部分)。
为了观察训练进度,通常需要可视化验证指标,例如在训练分类网络时,可展示单批次样本的错误率。由于样本差异,分类任务的难度可能不同。因此网络对特定批次样本的表现可能优于或劣于其他批次。故验证指标在迭代过程中出现波动实属正常。但总体而言指标应持续改善。调整超参数 'learning_rate'
和 'momentum' 有助于恢复验证指标的上升趋势。下图展示了可能出现的场景。
| ( 1) | ( 2) |
'learning_rate' 值下可能结果的总体趋势:深蓝:良好学习率;灰:极高学习率;浅蓝:高学习率;橙:低学习率。(2) 采用学习率策略的理想情况:在达到指定迭代次数后降低
'learning_rate' 值。橙色曲线:训练误差;深蓝色曲线:验证误差。箭头标记学习率开始降低的迭代次数。
当模型无法捕捉任务的复杂性时,就会出现欠拟合现象。这种情况直接体现在训练集上的验证指标始终居高不下。
当网络开始“记忆”训练数据而非学习泛化能力时,就会发生过拟合。这种现象表现为:训练集上的验证指标保持良好甚至提升,而验证集上的验证指标却下降。此时正则化可能有所帮助。详见“设置训练参数:超参数”一节中对超参数 'weight_prior' 的说明。需注意:当模型容量相对于数据过高时,也会出现类似现象。
网络对某个实例推理出顶级预测,即网络推理出亲和度最高的类别。当我们知道其真实类别时,便可比较两种类别归属:预测类别与正确类别。由此可见,不同类型方法的实例存在差异——例如在分类任务中实例是图像,而在语义分割中实例则是单个像素。
当需要区分两个以上类别时,也可将比较问题简化为二元问题。这意味着对于给定类别,只需判断其是否属于自身类别(正类)或任何其他类别(负类)。对于此类二元分类问题,比较可归结为以下四种可能的情形(并非所有方法都适用所有情形):
真正类(TP:预测为正类,标记为正类),
真负类(TN:预测为负类,标记为负类),
假正类(FP:预测为正类,标记为负类),
假负类(FN:预测为负类,标记为正类)。
混淆矩阵是一张包含此类比较的表格。该表格便于直观了解网络对各类别的识别效果。它针对每个类别列出了被预测为该类别的实例数量。例如,对于区分“apple”、“peach”和“orange”三类对象的分类器,混淆矩阵会显示:标注为“apple”的真实数据中有多少被正确分类为“apple”,又有多少被错误分类为“peach”或“orange”。其他类别数据同样如此呈现,具体示例如下图所示。在 HALCON 中,我们采用列表示法呈现各类别的真实标签实例,行表示法呈现预测属于该类别的实例。
| ( 1) | ( 2) |
在以下内容中,我们将描述深度学习领域中使用的最重要术语:
自适应矩估计(adaptive moment estimation,Adam)是一种基于梯度的一阶优化算法,适用于随机目标函数,能够计算独立的自适应学习率。在深度学习方法中,该算法可用于最小化损失函数。
锚点(anchors)是固定的边界框。它们作为参考框,借助这些框,网络为待定位的对象提出边界框。
标注(annotation)是数据中某个实例所代表的真实信息,以网络可识别的形式呈现。例如在目标检测中,标注即为实例的边界框及其对应标签。
异常(anomaly)指偏离常规的事物,未知的事物。
骨干(backbone)是预训练分类网络的一部分。其任务是生成各种特征图,因此去除了分类层。
'batch_size'数据集被划分为更小的数据子集,称为批次(batches)。批次大小(batch size)决定了每个批次包含的图像数量,从而决定了同时处理的图像数量。
边界框(bounding boxes)是矩形框,用于定义图像中的某个部分,并指定图像中目标的位置。
类无关(class agnostic)指不依赖于不同类别的知识。
在 HALCON 中,我们将其用于减少重叠的预测边界框。这意味着,对于类无关的边界框抑制,对重叠实例的抑制操作会忽略类别信息,因此强烈重叠的实例将被独立于其类别而抑制。
变更策略(change strategy)指在深度学习模型训练过程中,超参数何时以及如何被调整的具体策略。
类别(classes)是网络能够区分的离散分类(例如“apple”、“peach”、“pear”)。在 HALCON 中,实例的类别由其相应的标注决定。
在深度学习的语境中,我们对分类器(classifier)有如下定义:该模型以图像为输入,输出推理出的置信度值,反映图像属于各类别的可能性。例如,当区分出“apple”、“peach”和“pear”三类时, 现在我们向分类器输入一张苹果图像。结果可能返回的置信度值为:“apple”:0.92,“peach”:0.07,“pear”:0.01。
COCO是“上下文中的常见目标(common objects in context,COCO)”的缩写,是一个大规模对象检测、分割和描述数据集。每种不同的标注类型都有一个通用的文件格式。
置信度(confidence)是一个表示实例与类之间相似度的数值。在 HALCON 中,置信度以 [0,1] 范围内的概率形式呈现。别名:分数(score)
混淆矩阵(confusion matrix)是一种表格,用于比较网络预测的类别(前1名)与真实类别归属。它常用于可视化网络在验证集或测试集上的表现。
卷积神经网络(convolutional neural networks,CNNs)是深度学习中使用的一种神经网络,其特征在于网络中至少包含一个卷积层。它们在图像分类领域表现尤为出色。
在深度学习领域,我们使用“数据(data)”一词指代待识别的实例(例如图像)及其相关信息,这些信息涉及可预测的特征(例如分类任务中的标签)。
数据增强(data augmentation)是指生成数据集内样本的变体副本。此操作旨在丰富数据集的多样性,例如通过翻转或旋转等手段实现。
数据集指用于训练的完整数据集合。 数据集被划分为三个(尽可能互不相交的)子集:
训练集(training set)包含算法直接用于优化网络的数据。
验证集(validation set)包含用于评估网络在训练期间性能的数据。
测试集(test set)用于检验可能的推理(预测),从而评估模型在不受网络优化影响的数据上的表现。
“深度学习(deep learning)”一词最初用于描述具有多个隐藏层的神经网络训练过程。如今它更多作为机器学习领域中若干不同概念的统称。在 HALCON 中,我们使用深度学习来指代采用多隐藏层神经网络的方法。
在深度学习中,一个周期(epoch)指的是对全部训练数据(即所有批次)进行一次完整的训练迭代。需要注意的是,周期层面的迭代与单个批次层面的迭代(例如在单个周期内)是不同的概念。
在深度学习的语境中,当实例的推理类别与真实类别(例如分类任务中的真实标签)不匹配时,我们称之为错误(error)。在 HALCON 中,当我们提及前1个错误时,即使用错误一词来描述深度学习中的该概念。
特征图是给定层的输出。
特征金字塔(feature pyramid)本质上是一组特征图,其中每张特征图都源自更低层级,即其尺寸小于其上层级。
头部(Heads)是子网络。在特定架构中,它们连接在选定的金字塔层级上。这些子网络处理来自网络前端部分的信息,以生成空间分辨率输出(例如类别预测)。由此它们生成网络的最终输出,并构成损失函数的输入。
与所有机器学习模型一样,卷积神经网络(CNNs)包含大量具有众多参数的公式。在训练过程中,模型通过优化参数从数据中学习。然而,此类模型可能还存在其他附加参数,这些参数不会在常规训练中直接学习。这些参数的值在训练开始前就已设定。我们将此类参数称为超参数(hyperparameters),以区别于训练过程中优化的网络参数。换言之,超参数属于求解器特有的参数。
突出的例子包括初始学习率或批次大小。
推理阶段是指将训练好的网络应用于预测(推理)实例(可以是整个输入图像或其局部区域)及其最终定位的位置。与训练阶段不同,在推理阶段网络参数不再发生变化。
交并比(intersection over union,IoU)是量化两个区域重叠程度的指标。我们可确定两个区域的共同部分(交集)以及合并区域(并集)。交并比即为交集面积与并集面积之比。
不同方法应用此概念时可能存在差异。
标签(Labels)是用于定义图像类别的任意字符串。在 HALCON 中,这些标签由图像名称(可能后跟下划线与数字组合)或目录名称构成,例如“apple_01.png”、“pear.png”、“peach/01.png”。
层是神经网络中的基本构建单元,执行特定任务(如卷积、池化等,详情参见 “分类解决方案指南”)。它可视为一个容器,接收加权输入,进行转换处理,并将输出传递给下一层。输入层与数据集(即图像)相连,输出层则与数据集(即标签)相连。其间所有层统称为隐藏层。
'learning_rate'学习率是权重,用于在更新损失函数参数时考虑梯度值。简而言之,当我们需要优化某个函数时,梯度指示了优化的方向,而学习率则决定了沿此方向移动的步长。
别名:,步长(step size)
术语“层(level)”用于表示特征金字塔网络中具有相同宽度和高度的特征图的整个层组。其中输入图像代表第 0 层。
损失(Loss)函数将网络的预测结果与给定信息进行比较——即图像中应识别的内容(以及适用的位置),并对偏差进行惩罚。该损失函数正是我们在训练过程中优化的对象,旨在使网络适应特定任务。
别名:目标函数(objective function)、成本函数(cost function)、效用函数(utility function)
'momentum'动量 用于优化损失函数的参数。当损失函数参数更新时(在计算梯度之后),会添加前一次迭代步骤更新向量的 分数。这能有效抑制振荡。我们将超参数 称为动量。当 设为 时,动量法不产生影响。简言之,在更新损失函数参数时,系统仍会保留上次更新的步长信息:当前不仅会沿梯度方向以学习率为步长推进,还会重复执行上次更新的步长操作——但本次步长仅为 倍。
在目标检测中,非最大抑制(Non-maximum suppression)用于抑制重叠的预测边界框。当不同实例的重叠程度超过给定阈值时,仅保留置信度最高的实例,其余未达到最大置信度的实例则被抑制。
当神经网络开始“记忆”训练数据而非学习如何发现分类的普遍规律时,就会发生过拟合(overfitting)现象。这种情况表现为模型在训练集上持续降低误差,但在验证集上的误差却不断增加。由于大多数神经网络具有海量权重参数,这类网络尤其容易发生过拟合。
'weight_prior'
正则化(regularization)是一种通过在损失函数中添加额外项来防止神经网络过拟合的技术。其作用机制是惩罚过大的权重,即推动权重趋近于零。简而言之,正则化倾向于更简单的模型,这类模型不易拟合训练数据中的噪声,且具有更好的泛化能力。在 HALCON 中,正则化通过参数
'weight_prior' 进行控制。
别名:正则化参数(regularization parameter)、权重衰减参数(weight decay parameter)、 (请注意在 HALCON 中, 表示学习率,而在公式中正则化参数使用符号 表示)。
我们将再训练(retraining)定义为更新已预训练网络的权重,即在再训练过程中,网络学习特定任务。
别名:微调(fine-tuning)。
求解器(solver)通过更新权重来优化网络,其方式旨在优化(即最小化)损失函数。
随机梯度下降(stochastic gradient descent,SGD)是一种针对可微函数的迭代优化算法。SGD 的关键特征在于仅基于包含随机抽样数据的单批次样本计算梯度,而非使用全部数据。在深度学习方法中,该算法可用于计算梯度以优化(即最小化)损失函数。
分类器针对给定图像推理出其属于各类别的置信度,即图像归属于每个区分类别的可能性。因此,对于一张图像,我们可以根据分类器分配的置信度值对预测类别进行排序。前 k 错误率(top-k error)表示预测结果中,真实类别未出现在置信度最高的 k 个预测类别中的比例。在前 1 错误率中,我们检查目标标签是否与概率最高的预测结果匹配。在前 3 错误率中,则检查目标标签是否与概率最高的三个预测结果之一匹配(即该图像获得最高概率的 3 个标签)。
别名:前 K 分数(top-k score)
迁移学习(transfer learning)是指基于现有网络知识构建新网络的技术。具体而言,即采用已预训练网络及其权重,通过调整输出层以适应特定应用场景来构建目标网络。在 HALCON 中,后续的再训练步骤也被视为迁移学习的一部分。
当模型过度泛化时,就会出现欠拟合(underfitting)现象。换言之,模型无法描述任务的复杂性。这种情况直接体现在训练集上的误差上——该误差不会显著降低。
通常而言,权重(weights)是网络的自由参数,在训练过程中因损失函数的优化而发生变化。含权重的层会对输入值进行乘法或加法运算。与超参数不同,权重会在训练过程中经过优化而改变。
get_dl_device_param获取深度学习设备参数optimize_dl_model_for_inference优化深度学习推理模型query_available_dl_devices查询可用深度学习设备set_dl_device_param设置深度学习设备参数