ENVI深度学习使用概述(V1.1.1)

您所在的位置:网站首页 envi里面调出工具箱 ENVI深度学习使用概述(V1.1.1)

ENVI深度学习使用概述(V1.1.1)

2024-07-11 10:20| 来源: 网络整理| 查看: 265

 使用深度学习  ENVI深度学习过程概述

深度学习是机器学习的一种更复杂的形式,它使系统能够自动发现数据中的表示形式。深度学习与机器学习的不同之处在于,它能够在没有外部指导或干预的情况下自行不断改进预测的能力。深度学习算法通过遍历神经网络中的所有层来得出结论来学习模式,这类似于大脑如何处理信息。

对于遥感,深度学习尝试发现图像中的空间和光谱表示。它通常用于识别特征,例如车辆、公用设施、道路等。训练深度学习模型以使用一组标记的像素数据为参考来识别特定特征。借助ENVI深度学习,可以在训练模型时尝试不同的参数以获得最佳解决方案。

从图像中提取特征的过程涉及几个步骤,如下图所示。这些步骤不一定是线性顺序,并且可能需要一个以上的迭代才能产生最佳结果。

TensorFlow模型是整个过程的核心。TensorFlow是ENVI用于执行深度学习任务的开源库。TensorFlow模型由一组基础的神经网络参数定义。必须使用一组已知特征样本的输入标签栅格来训练模型进而寻找特定特征。

在TensorFlow模型从标签栅格中了解特定特征后,可以通过使用经过训练的模型对其他图像进行分类,从而在其他图像中寻找相似特征。例如,可能在比模型训练的更大的图像中找到相同的特征,或者甚至找到具有相似空间和光谱特性的不同图像。最终结果是各种要素的分类栅格。如果只对某个特定功能感兴趣,则结果将是一个二进制分类栅格,其值为0(背景)和1(特征)。如果要提取多个要素,则分类栅格的像素值范围为0(背景)到类数。

分类步骤的第二个输出是类激活栅格,它是灰度图像,每个特征一个波段,显示了像素属于感兴趣特征的概率。

初始分类栅格和类别激活栅格可能并不完全准确,这取决于输入训练样本的质量。可选步骤是通过创建最高像素值的ROI来优化标签栅格,然后编辑ROI以消除误报。可以将精炼的ROI与原始ROI结合使用,以再次训练新模型或完善训练后的模型。

 使用“Deep Learning Guide Map”工具

《深度学习流程化工具》旨在帮助用户轻松进行ENVI深度学习。它突出显示了可能希望在每个步骤中使用的工具,并解释了为什么要使用它们。同时,还会跟踪过程中生成的结果(训练模型,标记栅格,分类栅格等。

 标注特征

为深度学习模型提供希望它找到的特征样本--这个过程称为“标注”。结果是一个标签栅格,它被用作训练深度学习模型的输入。可以是二维特征,例如,建筑物和停车场的轮廓。一维特征包括道路和铁轨。点特征包括树木或站牌的位置。

可以训练一个深度学习模型来寻找一个特征,从而得到一个二分类图像。或者可以训练它寻找多个特征,从而得到一个具有多个类的分类图像。

 从ROI构建标签栅格

创建标签栅格最常用的方法是在训练栅格中的特征上绘制兴趣区域(ROI)。通过ENVI深度学习,需要更多的ROI来识别特征样本。相比之下,传统的监督式分类方法只需要几个ROI就能产生良好的结果。虽然只标注几个特征就可以得到足够的结果,但在这个过程中投入一些时间,你会得到更准确的结果。

Prepare Training Rasters   准备训练栅格数据Label Training Rasters   标注训练栅格数据 Set up a Deep Learning Project   建立深度学习工程Define Classes   定义类别Add Training Rasters   添加训练栅格数据Draw ROIs   画感兴趣区域Optional:Import Existing ROIs   导入已有的感兴趣区域(可选)Optional:Import Vectors   导入矢量数据(可选)Create Label Rasters   创建标注栅格View Project and Labeling Statistics   查看工程和标签统计信息Train the Deep Learning Model   训练深度学习模型Optional:Use the Build Label Raster From ROIs Tool   使用 "从ROI工具构建标注栅格"(可选) Label Training Rasters   标注训练栅格数据Build Label Rasters   构建标注栅格 准备训练栅格

训练栅格是用ROI标记的图像。它们可以是ENVI支持的任何格式。

如果使用的是一个大型的训练栅格数据,则可能需要太多时间来标记整个图像中的所有要素。考虑创建图像的空间子集以用于训练目的,然后在子集图像中的特征上绘制ROI。要创建空间子集,从ENVI菜单栏中选择“文件”>“另存为”,选择要子集的文件,然后单击“空间子集”按钮。

还可以使用多个图像进行训练,然后在每个图像上绘制ROI。图像可以是不同的尺寸。例如,可能有数十个UAV图像,每个图像都覆盖一个小区域。与使用单一图像相比,从多张图像中定义ROI可以在深度学习模型中提供更普遍的结果。在多个训练栅格上绘制ROI的最简单方法是使用深度学习标注工具,如下所述。

从ENVI深度学习中获得高质量的结果,部分取决于图像中光谱数据的质量和完整性。一些预处理步骤可能是必要的,以便于对训练和不同分类图像进行标准化。用于分类的图像应该与标记用于训练的图像具有相同的光谱特征。所有用于训练和分类的图像应具有相同的数据类型(字节)和数据值范围。为了获得更好的效果,在使用深度学习标注工具之前,先使用构建深度学习栅格工具,所有图像的最小和最大像素值相同。

注意:虽然当图像不是字节数据类型时,深度学习标签工具会自动进行转换。但它会用自己的最小值和最大值来转换每张图像,而对于每个图像的最小值和最大值并不是单个最小值和最大值那样最佳。

来自不同日期和视角的图像对于训练是可以接受的,并且通常是首选的。但是,图像应来自同一传感器。如果图像具有适当的元数据,可以使用ENVI辐射校准工具将训练和分类图像校准为辐射度或大气层顶部反射率。这是确保所有图像具有一致数据单位的常用方法。 标注训练栅格数据

介绍如何从一个或多个训练栅格和感兴趣的特征的 ROI 创建标签栅格。标记训练栅格的最简单方法是使用深度学习标记工具。还可以使用从 ROI 工具构建标签栅格来创建标签栅格。

一旦为每个训练栅格定义一组ROI,深度学习标签工具就会自动创建标签栅格。不必采取任何额外步骤来构建标签栅格。

要开始使用,在ENVI工具箱中选择 "深度学习">"深度学习标注工具"。将使用该工具来定义输出类,并管理工程文件、ROI和训练栅格。也可以通过从深度学习流程工具中启动深度学习标签工具。训练一个新模型 > 训练一个多类模型 > 标注栅格:

建立一个深度学习工程

工程可以组织与记录过程相关的所有文件,包括训练栅格和ROI。它们还可以跟踪类别名和训练参数值。

从"深度学习标注工具"菜单栏中选择"文件">"新建项目"。出现"创建新标签项目 "对话框。

输入一个工程名称。选择一个空文件夹,用于存储工程文件。

注意:该文件夹必须是空文件夹。

单击 "确定"。

创建新项目并定义训练栅格时,ENVI会对输入的每个训练栅格创建子文件夹。每个子文件夹将包含在标注过程中创建的ROI和标签栅格。

ENVI还在每个子文件夹中创建一个名为source_raster.json的文件。这是训练栅格的简化版本(dehydrated),其中所有信息都压缩为JSON代码。如果将项目文件夹移动到其他位置,则每个项目子文件夹中的source_raster.json文件将告诉ENVI在哪里可以找到训练栅格。

要恢复先前创建的项目,在深度学习标签工具菜单栏中选择文件>打开项目。导航到项目文件夹,然后选择文件deep_learning_labeling.json。

设置项目后,下一步是定义输出类。

定义类别

使用 "深度学习标签工具 "的 "定义类别 "部分来定义要标记的特征。特征名称决定了输出分类图像中的类名称。

单击 "类定义 "部分左下角的 "添加 "按钮。

为要标记的第一个特征输入一个名称,然后单击按钮。该特征被添加到 "类定义 "列表中。可选项。单击 "颜色 "列来更改类的颜色。

如果要提取多个特征,根据需要重复步骤1-3来提取其他特征(类)。

下图显示了代表住宅不同类型财产损失的四个类的示例(来自ENVI深度学习教程:提取多个特征):

接下来,将选择要用于训练的栅格。

添加训练栅格数据单击深度学习标签工具的栅格部分下方的添加按钮。 出现“数据选择”对话框。

选择一个或多个训练栅格,然后单击“确定”。 所有训练栅格必须具有相同数量的波段。如果一幅图像的波段数量与其他图像不同,则可以在“数据选择”对话框中选择该图像,然后单击“光谱子集”按钮。 然后选择适当的波段数。训练栅格在“栅格”部分中列出。要删除所有训练栅格,单击全选按钮,然后单击删除所选按钮。 可选:选择一个训练栅格,然后单击“重命名所选”按钮,以提供比其文件名更有意义的名称。注意:一次只能重命名一个栅格。

现在,可以通过在训练栅格中绘制ROI来标记特征。

画感兴趣区域

对于每个训练栅格,"ROI(s) "列显示绘制的ROI占类别总数的比例。按照以下步骤开始绘制ROI。

从列表中选择一个训练栅格,然后单击"绘制"按钮,训练栅格将被显示。ENVI 将创建一组新的 ROI,其名称和颜色与定义的类相同。ROI在图层管理器和数据管理器中列出。出现感兴趣的区域 (ROI) 工具,并选择第一个 ROI。如下图所示:

     

光标会变为十字线,这样就可以开始绘制ROI多边形。

深度学习标注工具会同步类的名称和颜色及其相关的ROI。如果更改类的名称或颜色,ROI名称或颜色将自动更新(反之亦然)。还可以根据需要添加或删除ROI。

注意:不要使用ROI工具来更改ROI的文件位置、创建或删除ROI或更改其颜色。相反,使用 "深度学习标签工具 "来进行这些更改,以便将它们应用于所有的训练栅格。

可选。使用ENVI工具栏中的"拉伸类型"下拉列表试验不同的对比度拉伸,以确保感兴趣的特征能从背景中清晰地分辨出来。饱和、褪色或对比度低的训练图像会使标记过程更加困难。下图显示了对龙卷风后连根拔起的树木图像应用对比度拉伸的一个例子。想要给左边图像中的树木打上标签就太困难了。

在图像中尽可能多的特征实例上绘制ROI。参阅为深度学习标注特征的提示。要标记不同的训练栅格,在"深度学习标记工具"中选择其名称并单击"绘制 "按钮。前一个训练栅格中的"ROI(s) "列会更新,以显示绘制的ROI占定义的ROI总数的比例。继续以这种方式为每个 ROI/类标注图像。即使关闭深度学习标签工具,进度也会自动保存到当前项目中。 导入已有的感兴趣区域(可选)

可以将一个或多个训练栅格的现有的ROI文件导入项目。ROI名称不必与指定的类名相匹配。参照以下步骤:

如前所述,定义类别。如前所述,添加训练栅格。在"深度学习标签工具"中,选择要导入ROI文件的训练栅格。然后单击"选项"按钮,选择"导入ROI"。

选择一个ROI文件(.xml),然后单击"打开"。出现"将输入ROI匹配到类定义"对话框。在 "输入ROI"列下选择一个ROI名称,然后选择ROI所代表的类名称(在"类定义"列下)。或者,反过来也可以这样做。一条线将ROI与关联的类名称连接起来。对其余的ROI和类重复上述操作,然后单击"确定"。ROI被导入到项目中。 导入矢量数据(可选)

可以将矢量文件导入到项目中以获取一个或多个训练栅格。例如,如果已经具有要用于标记的要素的shapefile。参照以下步骤:

定义类,如前所述。如前所述,添加训练栅格。在深度学习标签工具中,选择要为其导入矢量文件的训练栅格,然后单击“绘制”按钮以显示训练栅格。在深度学习标签工具中,单击选项按钮,然后选择导入矢量。从矢量导入对话框出现。

单击输入矢量旁边的浏览按钮,然后选择一个矢量文件。

矢量文件中的属性列将填充“属性名称”下拉列表。如果它没有任何属性,则唯一的选择是。从“属性名称”下拉列表中选择一个属性。出现“字段选择”对话框。 如果不进行选择,则矢量文件中的所有记录都将被导入到一个类中。在这种情况下,单击所有记录应与之关联的类。 在“记录”和选定的类之间画一条线;

如果从“属性名称”下拉列表中选择一个选项,则“记录选择”对话框的左侧会列出唯一的属性值;

单击属性名称,然后在“类定义”下单击关联的类名称,两者之间画一条线。对所有属性和类重复此步骤;

如果所选属性具有20个以上的唯一值,则只能选择一个值与给定类关联。

在“字段选择”对话框中,单击“确定”。 矢量记录将导入到所选训练栅格的当前项目中。 创建标注栅格

查看工程和标签统计信息

单击"选项"下拉列表,选择 "显示标签统计",可查看有关当前项目的信息以及执行了多少标签。

在 "项目统计 "对话框中,报告的开头提供了有关项目的一般信息,包括:

项目名称和位置类别数量及其名称每个训练栅格中的波段数(所有训练栅格的波段数应该是相同的)。训练栅格的数量

之后是关于用于标记每个训练栅格的ROI的细节。本节的目的是报告每个训练栅格中做了多少标记。可以快速确定某些训练栅格是否没有足够的ROI,或者其他栅格是否有较高的ROI平衡。下图显示了一个训练栅格的ROI统计:

要将项目统计数据保存到文本文件,单击 "项目统计 "对话框中的 "保存 "按钮。然后选择一个位置来保存文本文件。默认的文件名是 report.txt。

要将项目统计数据复制到系统的剪贴板,单击 "项目统计 "对话框中的 "复制 "按钮。

训练深度学习模型

用ROI标记所有训练栅格后,下一步就是训练深度学习模型。深度学习标签工具提供了一种简化的模型训练方法。完整的训练场景包括创建标签栅格,初始化TensorFlow模型以及设置多个训练参数。当使用深度学习标签工具训练深度学习模型时,将自动完成创建标签栅格和初始化TensorFlow模型的步骤。

参照以下步骤:

单击深度学习标签工具中的训练按钮。出现训练深度学习模型对话框。从提供的下拉列表中选择Patch Size。Patch是提供给模型进行训练的小图像。Patch Size是指正方形Patch的一条边缘的像素数。默认值是572,这意味着Patch Size是572 x 572像素。Patch尺寸越大,分类速度越快。但对于训练来说,Patch尺寸必须小于标签栅格的尺寸,同时也要小到每批至少有一个Patch可以放入图形内存。一般来说,如果标签栅格小于默认的Patch尺寸,选择能适合栅格的最大尺寸。如果显卡内存超过8GB,可能需要增加Patch尺寸。使用“训练/验证拆分(%)”滑块指定用于训练与验证的数据百分比。启用“随机栅格”选项可以在分割训练和验证栅格之前对其进行随机选择。这样可以确保训练不会产生偏差。禁用此选项意味着每次训练运行都将使用相同的图像进行训练和验证,这将有助于获得更多可重复的结果。每幅图像的Patchs参数直接与Epoch的Patch数参数相关。将 "每幅图像的Patch数乘以训练栅格的数量,就会产生"每Epoch的Patch数"。通常情况下,每当添加更多的训练栅格时,都需要增加 "每Epoch的Patch数"。每幅图像的Patch数的默认值是100,这是一个很好的起点。将其设置为更大的值会增加训练时间。在“Epoch数”参数中,输入要运行的Epoch数。训练参数在每个时期结束时进行调整。默认值为20。在“实心距离(Solid Distance)”参数中,对于每个类别,输入应该被视为目标要素一部分的点或折线标签周围的像素数。要对所有类使用相同的值,单击“全部设置为相同值”按钮。在“设置值”对话框中,输入要用于所有类的值,然后单击“确定”。在“模糊距离(Blur Distance)”参数中,为每个类别输入最小和最大距离(以像素为单位),以将正(非背景)区域扩展到超出实体距离扩展的范围。扩大的区域是模糊的,从正区域的边缘减小到模糊距离。最大模糊距离在训练开始时使用,并在训练结束时减小到最小模糊距离。要对所有类使用相同的值,单击“全部设置为相同值”按钮。在“设置值”对话框中,输入要用于所有类的值,然后单击“确定”。在“类别权重(Class Weight)”参数中,输入最小和最大权重,以便在采样时获得更均衡的类别(包括背景)平衡。采样的多样性在训练开始时由最大值加权,而在训练结束时减小到最小值。通常,将稀疏训练集的最大值设置为较高。最大值的有用范围是0.0到6.0。在“损失权重(Loss Weight)”参数中,输入介于0和1.0之间的值,默认值为0.8。损失权重用于使损失函数产生偏差,相较于背景像素,从而更加重视正确识别特征像素。当要素稀疏或未标记所有要素时,此功能很有用。值为0表示模型应平等对待特征像素和背景像素。增加损失权重会使损失函数偏向寻找特征像素。指定输出模型的文件名(.h5)和位置。这将是“最佳”训练后的模型,这是从Epoch起具有最小验证损失的模型。默认情况下,该工具将保存最佳和最新模型。在大多数情况下,与上一个模型相比,最好的模型将表现最佳。但并非总是如此。同时具有两个输出可以选择最适合的方案的模型。为输出最后一个模型指定文件名(.h5)和位置。这将是最后一个时期的训练模型。单击确定。 ENVI自动为训练创建标签栅格,并为每个训练栅格在“标签栅格”列中填充“ok”。由于涉及到计算,因此训练模型需要大量时间。根据系统和图形硬件,处理可能需要几分钟到几小时。训练模型对话框显示了训练的进度以及更新的验证损失值;

同时,在新的Web浏览器中会显示一个TensorBoard页面。TensorBoard是TensorFlow随附的可视化工具包,用于报告实时指标。

使用 "从ROI工具构建标注栅格"(可选)

如果选择不使用深度学习标签工具来创建标签栅格,那么将需要自己定义和组织训练栅格和ROI,而无需使用标签工具提供的项目文件。然后使用“从ROI构建标签栅格”工具创建标签栅格。

也可以使用ENVIBuildLabelRasterFromROITask编写脚本以从ROI构建标签栅格。

标注训练栅格数据

首先,准备好训练栅格,参照以下步骤标注训练栅格数据:

在 ENVI 中打开一个训练栅格,然后在图层管理器中右击它的名称,选择新建感兴趣的区域。然后在图层管理器中右击其名称,并选择新建感兴趣区域。此时会出现感兴趣区域 (ROI) 工具。将 ROI 名称改为要标注的第一个特征的名称,例如道路或建筑物。按Enter键接受该名称。ROI 名称将决定输出分类图像中的类别名称。可选择更改 ROI 的颜色。在训练栅格中感兴趣的特征上绘制多边形、多段线或点ROI。如果需要提取多个特征,单击 "添加 ROI "按钮,为下一个特征创建 ROI。然后对该特征重复步骤3-5。当完成绘制训练栅格的 ROI 时,从 ROI 工具菜单栏中选择文件 > 另存为。为 ROI 文件 (.xml) 选择一个文件名和位置,然后单击 "确定"。如果有多个训练栅格,必须为每个栅格创建单独的 ROI 文件,并为每个栅格分别贴上标签。

构建标注栅格

对每个训练栅格和相关的 ROI 文件,参照以下步骤:

使用以下选项之一打开 "从ROI构建标签栅格 "对话框。 在ENVI工具箱中,选择深度学习>从ROI构建标签栅格。在 "深度学习流程化工具 "中,单击 "训练新模型",然后单击 "从 ROI 构建标签栅格"。在 "Build Label Raster from ROI "对话框的输入栅格字段中,选择一个训练栅格。在 "输入 ROI "字段中,选择一个 ROI 文件 (.xml),该文件表示训练栅格中所需类的标签像素。ROI 必须落在输入栅格的边界内。在 "类别名称 "参数中,输入ROI中定义的类的名称,每行一个。最好的方法是单击 "导入 ROI 名称 "按钮,然后从输入 ROI 文件中选择单个 ROI。输出的分类图像将使用这些名称。在 "Output Raster"(输出栅格)字段中,为输出标签栅格(.dat)选择一个位置和文件名。点击 "确定"。处理完成后,ENVI 将标签栅格添加到数据管理器中。标签栅格包含原始图像带加上一个称为 "Label Mask(标签掩膜)"的附加波段。Mask波段表示训练栅格中哪些像素对应于感兴趣的特征,每个特征用一个整数(1到特征数)表示。值为0表示背景。

现在可以将标签栅格传递给Train TensorFlow Mask Model工具。

 从分类图像建立标签栅格

可以使用分类图像来构建用于训练深度学习模型的标签栅格。例如,已经拥有一张分类图像,它提供了感兴趣的特征的准确位置。分类图像提供了标记的像素数据,可以将其传递给深度学习模型,以学习特征的样子。

所有用于训练的图像应该具有相同的数据类型(字节)和数据值范围。为了获得更好的效果,在使用Build Label Raster from Classification工具之前,使用Build Deep Learning Raster工具,所有图像的最小和最大像素值都要相同。注意,虽然图像不是字节数据类型时,Build Label Raster from Classification将自动进行这种转换,但它以自己的最小值和最大值转换每个图像,这不如为所有图像提供一个单一的最小值和最大值来的理想。

可以用ENVIBuildLabelRasterFromClassificationTask写一个脚本,从分类图像中创建一个标签栅格。

例如,这是一个住宅区的多光谱输入图像:

这是一个由同一地理区域创建的二分类图像,该图像由一个“屋顶”类组成,该类是通过ENVI支持向量机分类工具创建的:

分类图像的像素值由每个类别的唯一整数组成。值为0表示背景。

该工具分别对每个输入栅格进行归一化。对于多光谱栅格,它会在所有波段上将像素值拉伸到相同的最小值和最大值之间。

对每个栅格和关联的分类图像,执行以下步骤:

在ENVI工具箱中,从分类中选择深度学习>构建标签栅格。将显示“Build Label Raster from Classification”对话框。在输入栅格字段中,选择一个训练栅格。在“输入分类栅格”字段中,选择一个ENVI分类图像,该图像为输入训练栅格中的所需类别提供带标签的像素数据。与分类图像关联的头文件(.hdr)必须包含CLASS_NAMES(名称)和CLASS_COLORS字段(颜色)。同样,分类图像必须具有与输入栅格相同的尺寸。在“类名”参数中,输入分类图像中的类名,每行一个。输出分类图像将使用这些名称。在“输出栅格”字段中,选择输出标签栅格(.dat)的位置和文件名。如果输入栅格不是字节数据,则输出栅格的每个波段都会拉伸到其最小值和最大值。单击确定。处理完成后,ENVI将标签栅格添加到数据管理器中。标签栅格包含原始图像带以及一个称为“标签掩膜”的附加波段。Mask波段指示训练栅格中的哪些像素对应于感兴趣的特征,每个特征都用整数(1到特征数)表示。值为0表示背景。

现在,可以将标签栅格传递到Train TensorFlow mask model工具。

 深度学习中标注特征的技巧

提供一些关于选择ROI类型和绘制ROI作为ENVI深度学习的标签过程的指导。首先,决定哪种类型的ROI最适合要标注的特征。

如果想对特征进行计数和定位,而不是定义它们的边界和形状(称为分割),则选择点或多线ROI。点和多段线比多边形更容易和更快地绘制,它们是标记具有类似尺寸和形状的特征的最佳选择。点可用于识别单个特征,如汽车或树木。多线可用于识别线性特征,如道路或河流。对于点和多段线,可以在以后的训练中使用 Solid Distance 参数 "增长 "特征的大小,以反映其真实世界的大小。

多边形 ROI 是标记具有不规则尺寸和形状的特征的最佳选择。当想定义特征的边界和形状时,使用多边形。然而,绘制多边形可能会比使用点或多线花费更多时间。

对于点ROI,在图像窗口中单击对象的中心添加点。然后右键单击并选择 "接受点"。下图显示了在住宅车道上绘制点 ROI:

对于多条线或多边形,在 "图像 "窗口中单击以添加线段。要在绘制每条多线后完成每条多线,选择完成并接受多线。要在绘制后完成每个多边形,选择 "完成并接受多边形"。如下图所示:

     

在训练栅格中的每个特征实例上绘制ROI。尽量包含感兴趣的特征的各种形状、颜色和纹理,这将有助于提高最终分类的准确性。

在某些情况下,可能希望创建一个完全由背景像素组成的标签栅格,而没有特征像素。要做到这一点,在 "图层管理器 "中右键单击输入的栅格,然后选择 "新建感兴趣区域"。在 "感兴趣区域(ROI)工具 "中,接受ROI #1的默认ROI名称,将创建一个空的ROI。然后在从ROI工具中构建标签栅格的输入ROI字段中选择ROI。

 训练深度学习模型

标记好训练栅格后,可以训练基于mask的TensorFlow模型,从而了解特征。该模型可以为空,也可以事先进行训练。

训练深度学习模型涉及许多随机过程,这些过程包含一定程度的随机性。使用相同参数进行训练将产生不同的模型,这是因为算法尝试收敛到结果的方式,并且它是训练过程的基本部分。

还可以编写脚本来使用ENVITrainTensorFlowMaskModelTask训练模型。

可以分为以下几个部分:

Initialize a TensorFlow Model   初始化TensorFlow模型Select Training and Validation Rasters   选择训练和验证栅格Set Training Parameters   设置训练参数Train Deep Learning Models Using the ENVI Modeler   使用ENVI Modeler训练深度学习模型  初始化TensorFlow模型

在开始训练之前,必须建立或初始化TensorFlow模型。这定义了模型的结构,包括体系结构,补丁大小和将用于训练的波段数。如果要恢复以前训练的模型,则无需初始化。

还可以编写脚本来使用ENVIInitializeENVINet5ModelTask(单类)或ENVIInitializeENVINet5MultiModelTask(多类)来初始化模型。

架构是定义底层卷积神经网络的一组参数。 ENVI深度学习使用的架构(称为ENVINet5和ENVINet5Multi)基于Ronneberger,Fischer和Brox(2015)开发的U-Net架构。与U-Net一样,它们是基于掩码的编码器-解码器体系结构,可对图像中的每个像素进行分类。

Patch是提供给模型进行训练的小图像。可以在以下步骤中初始化模型时指定Patch Size和波段数量:

在ENVI工具箱中,选择深度学习>深度学习流程化工具。

在深度学习流程化工具中,单击训练新模型按钮。

单击以下按钮序列之一: 训练单类模型>训练模型:选择此选项以训练模型以查找单个特征。训练多类模型>训练模型:选择此选项可以训练模型以查找多个特征。

出现训练TensorFlow Mask Model对话框。

在训练TensorFlow Mask Model对话框中,单击新建模型链接。 如果正在训练模型以查找一个特征,则会出现“Initialize ENVINet5 Single-Class Model”对话框。如果正在训练一个模型以查找多个特征,则会出现“Initialize ENVINet5 Multi-Class Model”对话框。可选:在“模型名称”字段中,输入模型的自定义名称。可选:在“模型描述”字段中,输入模型的自定义描述。可选:从提供的下拉列表中选择Patch Size。Patch是提供给模型进行训练的小图像。Patch Size是沿着正方形一个边缘的像素数。默认值为464,这意味着Patch Size为464 x 464像素。较大的Patch尺寸会导致更快的分类,但是对于训练而言,Patch尺寸必须小于标签栅格的Patch,并且还必须足够小,以使每批至少有一个Patch可以装入图形内存。通常,如果标签栅格小于默认Patch Size,选择适合栅格的最大大小。如果图形卡具有超过8 GB的内存,则可能需要增加Patch Size。在“波段数”字段中,输入标签栅格中用于训练的波段数(不包括mask波段)。在“类数”字段中(仅在“Initialize ENVINet5 Multi-Class Model”对话框中可用),输入要训练模型查找的类/特征的数量。在“输出模型”字段中,以HDF5格式(.h5)输入初始化模型的路径和文件名。单击确定。  选择训练和验证栅格 单击“训练栅格”旁边的“添加文件”按钮,出现文件选择对话框。选择一个或多个要用于训练的标签栅格,然后单击“打开”。标签栅格在“训练栅格”字段中列出。可以使用从ROI构建标签栅格或从分类工具构建标签栅格来创建标签栅格。对验证栅格重复步骤1-2。这是单独的标签栅格,可用于评估TensorFlow模型的准确性。尽管使用不同的标签栅格进行训练和验证,通常分类精度会更高,但是仍然可以对两个栅格使用相同的栅格。

也可以单击从数据管理器添加按钮以加载一个或多个在数据管理器中已经打开的标签栅格。

 设置训练参数

此处描述的参数是为为了在训练期间更好地控制TensorFlow模型学习识别特征。都是可选的,可以参阅“训练背景“以了解有关这些参数的更多信息。

如果不确定如何设置这些字段的值,则可以使用ENVI Modeler创建随机值。有关详细信息,参见下面的使用ENVI Modeler训练深度学习模型。

如果有训练效果较好的参数,也可以单击从模型导入参数以使用先前训练过的TensorFlow模型中的相同值。

在“Number of Epochs”字段中,输入要运行的Epoch数。训练参数在每个时期结束时进行调整。默认值为25。在“Number of Patches per Epochs”字段中,输入每个Epoch要使用的训练Patch的数量。如果未指定值,则ENVI将自动确定要使用的合适值。在“Number of Patches per Batch”字段中,输入每批要运行的训练Patch的数量。如果未指定该值,则ENVI将自动确定合适的值。

一个Batch包括一次完整的训练。模型参数在每次迭代结束时进行调整。Batch在一个Epoch中运行,直到达到或超过每个Epoch的Patch数量。下表提供了一些有关选择此值的粗略指导,具体取决于指定的Patch Size和图形卡的内存大小。每Batch至少4个Patch,训练通常更稳定。具体值可以根据其他进程消耗多少图形内存以及选择多少个波段而有所不同。

Graphics Memory

Patch Size

Patches per Batch

16 GB

704

4

16 GB

464

9

12 GB

608

4

12 GB

464

7

8 GB

672

2

8 GB

464

4

4 GB

464

2

4 GB

320

4

2 GB

464

1

2 GB

224

2

在“Patch Sampling Rate(Patch采样率)”字段中,输入训练和验证栅格中每个像素将属于的Patch平均数量,默认值为16。在Train TensorFlow Mask Model对话框中,输入一个或多个表示感兴趣特征的类名称。 如果已经在ROI文件中定义了类名称,单击从ROI导入名称按钮。使用“ ROI选择”对话框选择包含类名称的ROI,然后单击“确定”。单击“同步参数”按钮,以类名称填充“实心距离”和“模糊距离”字段,以便可以为每个类指定不同的值。在“Solid Distance(实心距离)”字段中,对于每个类别,输入应该被视为目标要素一部分的点或折线标签周围的像素数。要对所有类使用相同的值,单击“全部设置为相同值”按钮。在“设置值”对话框中,输入要用于所有类的值,然后单击“确定”。在“Blur Distance(模糊距离)”字段中,为每个类别输入最小和最大距离(以像素为单位),以将特征像素扩展到超出实体距离扩展的范围。扩展区域变得模糊,从特征像素的边缘到模糊距离减小。最大模糊距离在训练开始时使用,并在训练结束时减小到最小模糊距离。要对所有类使用相同的值,单击“全部设置为相同值”按钮。在“设置值”对话框中,输入要用于所有类的值,然后单击“确定”。在“Class Weight(类别权重)”字段中,输入最小和最大权重,以便在采样时获得更均衡的类别(包括背景)平衡。采样的多样性在训练开始时由最大值加权,而在训练结束时减小到最小值。通常,将稀疏训练集的最大值设置为较高。最大值的有用范围是0.0到6.0。在“Loss Weight(损失权重)”字段中,输入介于0和1.0之间的值,默认值为0.8。损失权重用于使损失函数产生偏差,从而比识别背景像素更加重视正确识别特征像素。当要素稀疏或未标记所有要素时,此功能很有用。值为0表示模型应平等对待特征像素和背景像素。增加损失权重会使损失函数偏向寻找特征像素。指定输出模型的文件名(.h5)和位置。这将是“最佳”训练后的模型,这是从第一个Epoch起具有最小验证损失的模型。默认情况下,该工具将保存最佳和最新模型。在大多数情况下,与上一个模型相比,最好的模型将表现最佳,但并非总是如此。同时具有两个输出可选择最适合方案的模型。为输出最后一个模型指定文件名(.h5)和位置。这将是最后一个时期的训练模型。

在Train TensorFlow Mask Model对话框中单击确定。

由于涉及到计算,因此训练模型需要大量时间。根据系统和图形硬件,处理可能需要几分钟到几小时。训练模型对话框显示了进度以及更新的验证损失值:

同时,在Web浏览器中会显示一个TensorBoard页面。TensorBoard是TensorFlow随附的可视化工具包,用于报告训练期间的实时指标,例如损失、准确性、准确性和召回率。

在每个Epoch,都会调整模型的权重以使其更正确,并且标签栅格将再次暴露给模型。产生最小验证损失的Epoch的权重将用于最终的训练模型。例如,如果希望模型完成25个Ecpoch,并且在第20个Ecpoch期间实现了最低的验证损失,则ENVI将在训练的模型中保留并使用该Ecpoch的权重。

 使用ENVI Modeler训练深度学习模型

ENVI深度学习包括两个可以在ENVI Modeler中运行的预构建模型。ENVI Modeler是一个可视化的编程工具,可让ENVI中构建自定义数据处理工作流。

注意:此处描述的预构建“模型”不是深度学习模型,而是与ENVI Modeler一起使用的模型文件。

可以从“深度学习流程化工具”中的“工具”菜单访问预构建的模型。一种模型提供用于训练深度学习模型的简单工作流,另一种模型为各种训练参数生成随机值。

训练深度学习模型(简单工作流)

Deep_Learning_Tutorial.model模型文件可以训练一个深度学习模型并用来多分类。输入训练栅格和 ROI 文件,并使用它们来训练 TensorFlow 模型。它使用训练的模型对输入的栅格进行分类。这个示例模型提供了一种在ENVI深度学习中一次性运行所有步骤的方法,而不必单独选择和运行工具。

在ENVI工具箱中,选择深度学习>深度学习流程化工具。在“Deep Learning Guide Map”菜单栏中,选择“工具”>“Train a Deep Learning Model Using the ENVI Modeler”。将显示“ ENVI Modeler”窗口,其中显示了Deep_Learning_Tutorial模型。

模型中的每个黄色节点均基于特定的ENVITask。在这种情况下,模型将运行以下任务:

构建深度学习栅格从ROI构建标签栅格提取属性和元数据初始化ENVINet5多类模型训练TensorFlow Mask模型TensorFlow Mask分类单击任何任务节点中的按钮以查看该任务的参数。根据需要更改参数的值。单击ENVI Modeler中的运行按钮。出现输入参数对话框。在输入栅格字段中,选择一个训练栅格。在“输入ROI”字段中,选择一个ROI文件(.xml),其中包含感兴趣的功能的带标签的示例。在“类数”字段中,输入输出要素/类的数目。单击确定。

该模型运行了几分钟。完成后,结果分类栅格将显示在“图像”窗口中,并将其添加到数据管理器中。

随机化训练参数

名称为Deep_Learning_Randomize_Training.model的ENVI Modeler文件,该文件可多次运行ENVI深度学习,每次都有一组不同的随机训练参数。它接受输入TensorFlow模型以及训练和验证栅格。每次训练运行都会产生一个新的TensorFlow模型,该模型用于对图像进行分类。 每个结果分开显示,以便确定哪个训练运行产生最佳的TensorFlow模型。 当不熟悉用于数据的最佳训练参数值时,运行此ENVI Modeler模型文件可提供一种有效的方法来训练TensorFlow模型。

在ENVI工具箱中,选择深度学习> Deep Learning Guide Map。在“Deep Learning Guide Map”菜单栏中,选择“工具”>“Randomize Training Parameters Using the ENVI Modeler”。 将显示“ ENVI Modeler”窗口,其中显示了Deep_Learning_Randomize_Training模型。

模型中的每个黄色节点均基于特定的ENVITask。灰色节点提供有关使用和修改模型的提示。

可选:可以设置模型用于训练参数的“随机性”。单击“随机化训练参数”节点中的 按钮。在“随机化参数”对话框中,从“方法”下拉列表中选择一个选项: Sobol序列[g_1] (默认):此选项可确保局部扰动在参数空间上均匀分布。它总是产生相同的参数值序列,因此它不是纯随机的。这可以从序列中的不同点开始。例如,继续在序列中停下来的地方,或在不同的系统上运行序列的不同部分。随机均匀:此选项根据随机均匀分布选择参数。尽管此模型的目的是为训练参数生成随机值,但仍然可以通过在“随机化参数”对话框的相应字段中输入固定值来将其设置为固定值。可选:单击“筛选器迭代器”节点中的按钮。显示“迭代器”对话框。

该节点的目的是设置ENVI Modeler模型运行的条件。例如,可以选择仅在输入栅格满足特定条件(例如多光谱,具有有理多项式系数(RPC)空间参考或数据类型为“字节”)时运行模型。要查看和选择任何这些条件,单击“迭代器”对话框中的“示例”下拉列表。

过滤器表达式可用于跳过Sobol序列的一部分以继续或分配实验。例如,如果随机化程序最初以五次迭代运行,那么将完成五次深度学习运行,每一次都有不同的参数集。如果这些结果不可接受,则可以通过将“迭代次数”值设置为10并在“过滤器表达式”字段中键入%i ge 5来在序列中再运行五次迭代。同样,可以在多个ENVI实例之间(也许在不同的系统上)拆分运行。

要运行模型,在ENVI Modeler中单击“运行”按钮。出现输入参数对话框。在迭代字段中,输入运行ENVI深度学习的次数。默认值为25。单击输入模型旁边的浏览按钮,然后选择一个初始化的TensorFlow模型或以前训练的模型(.h5)进行训练。单击“训练栅格”旁边的“添加文件”按钮。选择一个或多个使用ROI中的构建标签栅格或分类工具中的构建标签栅格创建的标签栅格。或者,单击“从数据管理器中添加”按钮以选择当前在ENVI中打开的标签栅格。单击“验证栅格”旁边的“添加文件”按钮,然后选择要用于验证的任何标签栅格。如果没有单独的标签栅格,则可以指定用于训练的栅格。单击要分类的栅格旁边的浏览按钮,然后选择要分类的栅格。它必须包含至少与用于训练模型的栅格一样多的波段。可选:为类激活栅格选择输出目录。在“输入参数”对话框中单击“确定”以继续运行ENVI Modeler模型。

由于它为每次迭代执行完整的训练,所以该模型需要很长时间才能运行。完成后,结果分类和类激活栅格将显示在“图像”窗口中,并添加到数据管理器中。将色彩密度分割应用于类激活栅格。

 训练的背景知识

训练的实质是将标签栅格重复暴露于模型。随着时间的流逝,模型将标签栅格中的光谱和空间信息转换为类激活栅格,以突出显示训练期间明显的特征。在第一轮训练中,模型尝试进行初始猜测并生成随机类激活栅格,将其与标签栅格的mask波段进行比较。通过拟合函数(也称为损失函数)的优度,模型可以了解其随机猜测在哪里出现误差。以调整模型的内部参数或权重以使其更正确,然后将标签栅格再次暴露给模型。

但在实际操作中,数据并不是一次性全部用于训练。而是从标签栅格中提取给定大小的方形Patch,每次只给几个Patch进行训练。

ENVINet5架构图显示了一个模型如何处理单个Patch。ENVINet5架构是为单类训练工作流程设计的。该架构有5个 "层次 "和27个卷积层。每个层次代表模型中不同的像素分辨率。本例使用的Patch Size为464 x 464,有3个波段。输出结果之一是类激活栅格,它被转换为掩码,并与标签栅格的mask波段进行比较。

在ENVI Deep Learning 1.1版本中,引入了该架构的变体(称为ENVINet5Multi)来处理多个特征/类的训练。

架构的上下文视野(contextual field of view)表示在训练过程中,周围区域对每个像素的贡献有多大。对于ENVINet5架构,上下文视野是185 × 185像素。比上下文视场大的Patch Size可以一次进行更多的训练,分类速度更快。为了让模型学习大于185 x 185像素的形状,必须对训练栅格进行降采样[g_2] 。

可以通过指定Epoch数、每个Epoch的Patch数和每个Batch的Patch数来指示要执行多少训练。下面将介绍这些内容:

Epochs和Batches

在传统的深度学习中,一个Epoch是指将整个数据集通过一次训练。然而,在ENVI深度学习中,Patches是以一种智能的方式从标签栅格中提取的。因此,在训练开始时,特征像素密度高的区域比密度低的区域被看到的次数更多。在训练结束时,所有的区域被看到的频率更加平等。由于这种偏向性决定了补丁的提取方式,ENVI深度学习中的一个Epoch则是指在调整偏向性之前训练了多少个Pctches。

为了充分训练一个模型,需要多个epochs。Epochs数和每个Epoch的Patches数取决于正在学习的特征集的多样性,没有确切的数字。一般来说,应该有足够多的epochs来顺利地调整权重;建议的数值是 10 到 30。一旦指定了epochs的数量,每个epoch的Patchs数量就决定了训练的数量。对于小数据集,Patchs数量应该较低。对于大数据集,这个数字应该较高,数值通常在 200 到 1000 之间,但对于大型数据集来说可能会高得多。

训练过程通常不会一次只训练一个Patch。通常在一次迭代中同时使用多个Patch。batch指的是在一次迭代训练中使用的训练Patch集。Batch在一个 epoch 中运行,直到达到或超过每个 epoch 中指定的Patch数量。通常情况下,应该尽可能多地指定适合图形处理单元(GPU)内存的Patches数量。例如,对于大小为464 x 464和三个波段的Patch,以及8 GB的GPU内存,该值约为4。

名词

定义

Epoch

使用训练集的全部数据对模型进行一次完整训练,被称之为“一代训练”

Batch

使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据”

Iteration

使用一个Batch数据对模型进行一次参数更新的过程,被称之为“一次训练”

epoch:训练时,所有训练数据集都训练过一次。

batch_size:在训练集中选择一组样本用来更新权值。1个batch包含的样本的数目,通常设为2的n次幂,常用的包括64,128,256。网络较小时选用256,较大时选用64。

iteration:训练时,1个batch训练图像通过网络训练一次(一次前向传播+一次后向传播),每迭代一次权重更新一次;测试时,1个batch测试图像通过网络一次(一次前向传播)。所谓iterations就是完成一次epoch所需的batch个数。

Epoch:一个超参数,定义了学习算法在整个训练数据集中的工作次数。通俗点,Epoch的值就是整个训练数据集被反复使用几次。“Number of Epochs”参数,输入要运行的Epoch数。训练参数在每代结束时进行调整。默认值为25。回答了全部训练数据使用了多少遍?

Batch:使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据”。“Number of Patches per Batch”参数,输入每Batch(批次)要运行的训练Patch(样本)的数量,称为Batch Size。如果未指定该值,则ENVI将自动确定合适的值。每批次更新参数需要训练多少Patch(样本)?

Patch:Patch是提供给模型进行训练的小图像(样本)。“Number of Patches per Epochs”参数,输入每个Epoch要使用的训练Patch(样本)的数量。如果未指定值,则ENVI将自动确定要使用的合适值。每遍训练的输入多少Patch(样本)?

问题:一个Epoch包含了多少个Batch?Batch在一个Epoch中运行,直到达到或超过每个Epoch的Patch数量,所以Batch数量是1至Patch数量。

Number of Batches=Number of Patches/ Batch Size

即:Number of Batches=Number of Patches per Epoch/Number of Patches per Batch)

训练参数

ENVI使用专有技术来训练深度学习模型,该技术基于偏置的Patch选择。通常,训练TensorFlow模型时以相等的概率选择Patch训练。如果图像中代表感兴趣的特征的像素是稀疏的,那么在整个图像中平均选择Patch可能会导致模型学习产生一个完全由背景像素组成的Mask。

为了避免这种情况,ENVI引入了一个偏置,使模型更频繁地看到具有较高特征像素密度的斑点。该方法基于一种称为逆向变换采样的统计技术,其中喂给模型的样本与它们对概率密度函数的贡献成正比。这种偏置是使用"类别权重 "参数来控制的。可以为"类别权重 "设置最小值和最大值。最大值用于在训练开始时偏置选择Patch。当训练结束时,该值会降低到最小值。

在大多数情况下,最小值应该是0,以便在最后一个Epoch模型完成时看到特征与背景像素的实际比例。为了帮助确定一个合适的最大值,记住,当正例与负例的比例约为 1:100 时,机器和深度学习应用通常会产生更好的结果。

可以使用附加的“损失权重”参数来使损失函数产生偏差,从而比识别背景像素,更侧重于正确识别特征像素。当要素稀疏或未标记所有要素时,此功能很有用。值为0表示模型应平等对待特征像素和背景像素。增加损失权重会使损失函数偏向寻找特征像素。有用的值范围在0到1.0之间,默认值为0.8。

还可以设置 "Patch采样率 "参数,以指示应该使用的采样密度。这是训练和验证栅格中每个像素所属的平均Patch数。当特征稀疏时,增加该值可能会有所帮助,因为选择包含特征的Patch的可能性更大。对于较小的patch sizes,在稍有不同的位置对特征像素进行过采样,增加采样值可使模型更通用。减少该值的唯一原因是要素密集并且不需要使用训练Patch多次覆盖每个像素。这可以帮助加快训练时间。

除了对特征和背景像素进行加权外,训练过程还必须考虑特征的大小和边缘。接下来会介绍这个问题。

补充内容:

逆变换采样(逆采样):在蒙特卡罗方法中,有一个关键的问题需要解决,即如何基于概率密度函数去采的n个x的样本集。对于常见的分布,如均匀分布,高斯分布,指数分布,t分布,F分布,Beta分布,Gamma分布等,可以采用逆采样的方法进行采样。

逆变换采样(Inverse Transform Sampling)。假设待采样的目标分布的概率密度函数为p(x),它的累积分布函数为

则逆变换采样法按如下过程进行采样:

(1)从均匀分布U(0,1)产生一个随机数ui;

(2)计算 是累积分布函数的逆函数。

如果待采样的目标分布的累积分布函数的逆函数无法求解或者不容易计算,则不适用于逆变换采样法。此时可以构造一个容易采样的参考分布,先对参考分布进行采样,然后对得到的样本进行一定的后处理操作,使得最终的样本服从目标分布。常见的拒绝采样(Rejection Sampling)、重要性采样(Importance Sampling)

实心距离 Solid Distance

在标注要训练的要素时,在感兴趣的要素周围绘制多边形可能很麻烦。如果更关心对要素计数,而不是精确地捕获其形状(或对其进行mask),则可以使用折线或点来标记要素。提供“实心距离”参数可扩展线性和点要素的大小,以便它们完全代表其关联的真实世界对象。以涂漆的道路中心线为例。使用兴趣区(ROI)工具收集道路中心线的样本时,应使用折线ROI。折线的宽度为一个像素,但实际上,TensorFlow模型需要学习关联的道路中心线有限宽度(大约10英寸)。

实心距离值是指标签周围所有方向的像素数,这些像素也是目标特征的一部分。可以使用 "实心距离 "来扩展多边形特征的大小,但它的用途是有限的。它最常用于点和多线特征。定义 "实心距离 "值往往对具有相当一致宽度的线性特征(如道路、道路中心线和运输集装箱)或具有相当一致尺寸的紧凑特征(汽车和停车标志)很有效。可以使用 ENVI 工具栏中的 Mensuration 工具来测量从 ROI 点或多段线到特征边缘的长度。在出现的光标值对话框中,选择单位下拉列表中的像素选项。

例如,如果在一辆汽车的中心添加一个宽约34像素的点标签,标签周围17像素的半径将涵盖汽车的大部分。因此,实心距离值将是17。

模糊距离 Blur Distance

深度学习算法在学习建筑物等特征中的mask尖锐边缘时可能会有困难。在训练过程中模糊边缘并降低模糊度可以帮助模型逐渐聚焦于特征。为了控制这一点,设置最小和最大模糊距离。在训练开始时,特征会以从特征边缘(如果定义了实体距离,则包括这些距离)到最大模糊距离的衰减梯度展开。随着训练的进行,距离逐渐减小到最小值。

一般来说,设置最大模糊距离,使其在模型的上下文视野内充分模糊。在ENVINet5架构中,这是185×185像素。所以合理的最大模糊距离应该是几个像素到不超过70。将最小模糊距离设置在任何地方,从边界清晰的0到特征边界不清晰时的几个像素。

 查看训练指标

可以使用 TensorBoard 或通过查看训练模型的元数据来评估一个或多个训练会话的性能。TensorBoard 选项可提供更详细的信息和来自训练会话的实时准确性指标。

 TensorBoard

训练开始时,TensorBoard在网络浏览器中显示。TensorBoard是TensorFlow的可视化工具包。它报告与训练相关的关键指标。详细信息参阅在线文档(https://www.tensorflow.org/tensorboard )。

注意:要关闭TensorBoard,在“ ENVI首选项”中设置。

训练开始时,TensorBoard在scalars仪表板中显示损失、精度、准确性和召回率的实时图。

损失(Loss)是一个无单位的数字,表示分类器与验证训练数据的拟合程度。值为0表示完美契合。值距0越远,拟合精度越低。对于训练数据集和验证数据集,每个Epoch内完成的Batches和已完成的Epoch,都有单独的Loss图。理想情况下,在epoch_loss和epoch_val_loss图中报告的损失(loss)值应该在最初的几个epoch中迅速减少,然后随着Epoch数的增加而趋于0。epoch_val_loss 图对应于模型训练时训练模型对话框中显示的 "损失(loss)"值。下图是训练过程中的验证数据集的loss:

在这个例子中,Train TensorFlow Mask Model对话框中的Number of Epochs值最初设置为25。然而,可以看到损失(Loos)值在第8个Epoch左右接近0(图中x轴所示)。此时,可以通过单击训练模型进度对话框中的 "取消 "按钮选择停止训练,因为不需要进一步的Epoch。

TensorBoard 通过在训练过程中指定的 "Number of Epochs "来报告每个Epoch的验证损失值。每一个 epoch,都会调整模型的权重,使其更加正确,标签栅格也会再次暴露给模型。产生最低验证损失的epoch的权重将用于最终的训练模型。例如,如果想让模型完成 25 个epoch,并且在第20个epoch实现了最低的验证损失,ENVI 将在训练模型中保留并使用该纪元的权重。

TensorBoard 还会报告以下精度指标:

准确率(也叫分类准确率或总体准确率):模型得到正确预测的数量与预测总数的比率。对应于epoch_acc和epoch_val_acc图。

精确度(也叫用户精度):预测某个类别中的值确实是该类别的概率。这个概率是基于正确预测的值占预测为某类的总值的比例。对应于epoch_precision和epoch_val_precision图。

召回率(也叫生产者精度)。这是一个给定类别中的值被正确分类的概率。对应于epoch_recall和epoch_val_recall图。

补充:

二分类四个不同的结果:真正例(TP)、假正例(FP)、真反例(TN),以及假反例(FN)。

列表示真实值,行表示预测值。

准确率(Accuracy):预测正确的占总样本数的比例。

Accuracy=(TP+TN)/(TP+FP+TN+FN)

虽然准确率能够反映总的正确率,但是在样本不均衡的情况下,并不能作为很好的指标来衡量结果。

精确率(Precision):也叫查准率。代表对正样本结果中的预测准确程度。其含义是在被所有预测为正的样本中实际为正样本的概率。

       P=TP /(TP+FP)

召回率(Recall):也叫查全率。召回率是覆盖面的度量。衡量了分类器对正例的识别能力。含义是在实际为正的样本中被预测为正样本的概率。

R=TP /(TP+FN)

F1 Value

目标:希望精确率和召回率都很高,但实际上是矛盾的,无法做到双高。因此,选择合适的阈值点。但通常情况下,可以根据他们之间的平衡点,定义一个新的指标:F1分数(F1-Score)。F1同时考虑精确率和召回率,让两者同时达到最高,取得平衡。F1表达式为

如果在“Display TensorBoard During Training''首选项设置为“否”,则训练期间将不会显示TensorBoard。但是,可以按照以下步骤查看训练指标:

在ENVI工具箱中,选择深度学习>Deep Learning Guide Map。从Deep Learning Guide Map菜单栏中,选择训练指标>显示训练指标。 TensorBoard显示在单独的对话框中。

Deep Learning Guide Map中的显示训练指标选项可以管理和查看以前的训练模型的指标。默认情况下,先前训练运行的日志文件将保存到辅助文件目录下的tensorboard目录(C:\Users\gser_zhang\.idl\envi\auxiliary\tensorboard\)。要更改保存日志文件的目录,在TensorBoard对话框中单击“日志文件夹”按钮。 或者,从“Deep Learning Guide Map”菜单栏中选择“训练指标”>“设置日志文件夹位置”。

TensorBoard 对话框左侧的 "运行 "部分列出了日志文件夹中所有可用的训练日志。选择要比较的训练运行,图中显示的是所选择的训练运行的指标。例如:

要删除先前训练运行的报告,在TensorBoard对话框中单击“删除历史记录”按钮,然后选择要删除的训练日志。 或者,从“Deep Learning Guide Map”菜单栏中选择“训练指标”>“删除训练历史记录”。

还可以编写脚本以在培训期间显示TensorBoard或使用ENVITensorBoard启动和停止TensorBoard服务器。

 元数据 Metadata

深度学习模型训练完后,其元数据将包含各种准确性指标,可以通过“Deep Learning Guide Map”进行查看。参照以下步骤查看指标:

从Deep Learning Guide Map菜单栏中,选择Tools>Edit TensorFlow Model Metadata。

选择一个训练完成的模型文件(.h5),然后单击“打开”。出现Edit TensorFlow Model Metadata对话框。可选:如果有需要,编辑名称和描述属性。滚动到"Attributes(属性)"部分的文本,直到看到lastSavedEpoch字段。epoch 列出的值是达到最低 Loss 值的 epoch 编号。例如,如果训练一个模型以完成 20 个 epoch(即在训练期间为 Number of Epochs 指定了 20 的值),并且在 Epoch #17 期间达到了最低 Loss 值,则 ENVI 只报告前 17 个 epoch 的准确性指标。滚动到“metrics(度量)”部分,查看每个已完成的epoch报告的validationLoss、validationPrecision、validationRecall和validationF1值。这些值与 TensorBoard 报告的值相同,只是 TensorBoard 报告的是所有epoch的值。

验证损失(validationLoss):一个无单位的数字,表示分类器对验证训练数据的拟合程度。值为0代表完美拟合。该值离0越远,拟合的精度越低。

验证准确度(validationAccuracy):是一个无单位的数字,表示分类器与验证训练数据的拟合程度。这是模型正确的预测数与总预测数的比值。

验证精度(validationPrecision)。这是被预测为某一类的值的概率,它真的是那一类。这个概率是基于正确预测的值占预测为某类的值总数的比例。

验证召回率(validationRecall)。这是某类中的一个值被正确分类的概率。

validationF1,也叫F1得分,是精度和召回率的调和平均值。

 执行分类

使用TensorFlow Mask Classification工具,使用经过训练的TensorFlow模型对栅格进行分类。需要多次运行此工具以对多个栅格进行分类。输出是分类栅格和类激活栅格。

还可以使用ENVITensorFlowMaskClassificationTask编写脚本以对栅格进行分类。

注意:如果安装带有ENVI 5.5 Service Pack 2的ENVI®Py forArcGIS®版本1.3,则可以在ArcMap或ArcGIS Pro的ENVI深度学习工具箱文件夹中使用TensorFlow蒙版分类工具。

参照以下步骤执行分类:

使用以下选项之一打开“TensorFlow Mask Classification”对话框: 在“Deep Learning Guide Map”中,单击“Classify Raster Using a Trained Model”。此选项的优势在于:如果通过“Deep Learning Guide Map”访问深度学习标签工具并使用它来创建标签栅格并训练模型,则“Deep Learning Guide Map”会知道已训练的模型并自动填充“输入模型”字段(下面的步骤(3))与该模型文件。在ENVI工具箱中,选择深度学习> TensorFlow Mask Classification。在TensorFlow Mask Classification工具的输入栅格字段中,选择要分类的栅格。必须包含至少与用于训练模型的栅格一样多的波段。在输入模型字段中,选择经过训练的HDF5格式(.h5)的TensorFlow模型文件。在“输出分类栅格”字段中,选择输出分类栅格(.dat)的路径和文件名。必须指定此或“输出类激活栅格”,或两者都指定。在“输出类激活栅格”字段中,选择输出类激活栅格(.dat)的路径和文件名。这是一个灰度图像,每个特征一个波段,显示像素属于感兴趣特征的概率。启用每个输出栅格的显示结果,以便于在处理完成后显示它们。单击确定。 ENVI将结果输出添加到数据管理器和图层管理器。

分类栅格的像素值范围从0(背景)到类数,如下图。背景像素被涂成黑色,并指定为“未分类”。这些类别代表了龙卷风造成的不同程度的财产损失:

参照步骤将分类栅格叠加在输入栅格上:

在当前视图中显示 "输入栅格"。在 "图层管理器 "中,单击并拖动分类栅格下方的输入栅格。在 "图层管理器 "中,取消选中 "未分类 "类。

例如:

也可以通过点击ENVI工具栏中的 "注释 "下拉菜单,选择 "图例",然后在显示中点击来显示分类图例。

类激活栅格

如果选择创建并显示类激活栅格,则它将作为前三个波段的彩色复合显示,并添加到“层管理器”的顶部。 在“图层管理器”中取消选中颜色合成图层,然后将类激活栅格的各个区域从“数据管理器”拖到视图中。 例如:

类激活栅格的每个波段显示了每个特征类的匹配概率(0到1)。明亮的像素表示与特征的高匹配度。下图显示了 "表面损伤 "类(左)的类激活栅格的一个小样本,显示在真彩色图像旁边。

栅格色彩密度分割有助于可视化与感兴趣的特征匹配概率最高的像素。按照以下步骤创建色彩密度分割:

在 "图层管理器 "中右击类激活栅格,并选择 "New Raster Color Slice"。出现 "数据选择 "对话框。在类激活栅格中选择一个要应用色彩分割的波段,然后单击 "确定"。出现 "Edit Raster Color Slice "对话框。像素值被分成相等的增量,每个增量有不同的颜色。在 "Edit Raster Color Slice "对话框中单击 "确定",接受默认值和颜色。在 "图层管理器 "中的 "Raster Color Slice "图层中,取消勾选紫色和蓝色颜色片以隐藏它们。其余的颜色根据训练数据,选择识别与感兴趣的特征匹配概率较高的像素。下图显示了在输入栅格上叠加的类激活栅格的 "结构损伤 "波段的例子:

分类后工具

既然有了类激活栅格,就可以选择对其应用阈值,并将最高像素值转换为分类图像,像素ROI,多边形ROI,折线shapefile或多边形shapefile。

 优化分类结果

创建分类图像和类激活栅格是使用ENVI深度学习从图像中提取特征的最后一步。但是,结果可能包含误识别。可以优化结果并使用它们来改进训练的模型,这可以获得更准确的分类。为此,使用“ ENVI感兴趣区域(ROI)”工具编辑从“类激活到像素ROI”或“类激活到多边形ROI”工具创建的ROI。可以使用ROI工具删除误识别记录或在更多示例上绘制新的ROI。将已编辑的ROI保存到磁盘上的新文件中。可以将精炼的ROI与原始ROI结合使用,以再次训练新模型或完善训练后的模型。

 使用ENVI深度学习的技巧

标记特征和训练深度学习模型并不总是简单的过程。虽然通常可以通过只标记几个特征和接受默认的训练参数来获得良好的结果,但通过在这些步骤中投入一些时间,会得到更准确的结果。一旦建立了一个好的模型来寻找特定的特征,就不必重新训练它。可以一次建立它,并多次使用它来分类不同的图像(只要它们具有相似的光谱和空间属性)。

如果得到的类激活栅格完全是黑色的,有可能是模型无法准确重现训练数据。或者,也许训练确实收敛了,但收敛到了一个不正确的解。如果发生这种情况,需要重新运行训练步骤,看看是否产生有效的结果。也可以尝试增加 "类权重 "和/或 "模糊距离 "的最大值。

如果不确定如何设置训练参数,可以使用 ENVI Modeler尝试许多随机组合。

不应该尝试屏蔽掉输入图像中不需要的特征,如云或水像素。ENVI深度学习中不支持栅格掩膜(Mask),因为可能导致无效的分类结果。

通过Deep Learning Guide Map访问的单类训练过程使用ENVINet5架构,该架构在ENVI深度学习1.0版本中引入。

多类训练过程使用新的ENVINet5Multi架构,该架构是在ENVI深度学习1.1版本中引入的。

如果收到与CUDnn相关的错误信息,使用系统的设备管理器禁用并重新启用显卡。或者,重新启动系统。

如果收到类似以下的错误信息,尝试减少训练步骤中的Number of Patches per Batch值。这个错误信息表明在训练过程中出现了内存问题。

Error:tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[6,128,392,392] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc

如果安装了 ENVI® Py for ArcGIS® 1.3 版和 ENVI 5.5 Service Pack 2,则 ArcMap 或 ArcGIS Pro 中的 ENVI 深度学习工具箱文件夹中会有一个"TensorFlow Mask Classification"工具可供使用。

 [g_1]产生随机数,Sobol 序列着重于在概率空间中产生均匀的分布。使用一个本质上随机,但是巧妙的方法去“填满”概率空间,即之后产生的随机数会分布到之前没有采样到的区域。

 [g_2]池化,目的就是用来降低特征的维度并保留有效信息,一定程度上避免过拟合。

    压缩输入的特征图,一方面减少了特征,导致了参数减少,进而简化了卷积网络计算时的复杂度;另一方面保持了特征的某种不变性(旋转、平移、伸缩等)。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3