使用深度学习分类对象 (影像分析)

获得 Image Analyst 许可后可用。

摘要

用于运行输入栅格和可选要素类上的训练深度学习模型,以生成要素类或表,其中每个输入对象或要素均具有一个分配的类或类别标注。

该工具需要包含经过训练的模型信息的模型定义文件。 可以使用训练深度学习模型工具或第三方训练软件(例如 TensorFlow、PyTorch 或 Keras)训练模型。 模型定义文件可以是 Esri 模型定义 JSON 文件 (.emd) 或深度学习模型包,它必须包含为处理每个对象调用的 Python 栅格函数的路径以及经过训练的二进制深度学习模型文件的路径。

使用情况

  • 您必须在 ArcGIS AllSource Python 环境中安装适当的深度学习框架 Python API(PyTorch 或 Keras);否则在将 Esri 模型定义文件添加至工具时会发生错误。 Esri 模型定义文件的创建者应提供相应的框架信息。

    要设置计算机以在 ArcGIS AllSource 中使用深度学习框架,请参阅安装 ArcGIS 的深度学习框架

  • 该工具将调用第三方深度学习 Python API(例如 PyTorch 或 Keras),并使用指定的 Python 栅格函数来处理每个对象。

  • 可以在 Esri Python 栅格函数 GitHub 页面中找到此工具的示例用例。 您还可以按照以下示例和说明编写自定义 Python 模块。

  • 模型定义参数值可以是 Esri 模型定义 JSON 文件 (.emd)、JSON 字符串或深度学习模型包 (.dlpk)。 当在服务器上使用此工具时,JSON 字符串十分有用,因为您可以直接粘贴 JSON 字符串,而无需上传 .emd 文件。 .dlpk 文件必须存储在本地。

  • 以下示例适用于 .emd 文件:

    {
        "Framework": "Keras",
        "ModelConfiguration":"KerasClassifier",
        "ModelFile":"C:\\DeepLearning\\Damage_Classification_Model_V7.h5",
        "ModelType":"ObjectClassification",
        "ImageHeight":256,
        "ImageWidth":256,
        "ExtractBands":[0,1,2],
        "CropSizeFixed": 1,
        "BlackenAroundFeature": 1,
        "ImageSpaceUsed": "MAP_SPACE", 
        "Classes": [
        {
           "Value": 0,
           "Name": "Damaged",
           "Color": [255, 0, 0]
        },
        {
           "Value": 1,
           "Name": "Undamaged",
           "Color": [76, 230, 0]
        }
        ]
    }
  • CropSizeFixed 属性可定义每个对象周围的栅格切片的裁剪模式。 值 1 表示将使用由 .emd 文件内的 ImageHeightImageWidth 属性定义的固定栅格切片。 对象位于固定切片大小的中心。 值 0 表示将使用可变切片大小,其中栅格切片将使用对象周围的最小边界框进行裁剪。

  • BlackenAroundFeature 属性指定是否掩膜每个对象外部的像素。 值 0 表示不会掩膜对象外部的像素。 值 1 表示将掩膜对象外部的像素。

  • 该工具可以处理地图空间或像素空间中的输入影像。 地图空间中的影像位于基于地图的坐标系中。 像素空间中的影像位于原始影像空间中,没有旋转和变形。 可以在导出训练数据进行深度学习工具中使用参考系统参数生成训练数据时指定参考系统。 如果使用第三方训练软件对模型进行训练,则必须在 .emd 文件使用 ImageSpaceUsed 参数指定参考系统,可以设置为 MAP_SPACEPIXEL_SPACE

  • 输入栅格可以是单个栅格、多个栅格或附加影像的要素类。 有关附件的详细信息,请参阅添加或移除文件附件

  • 增加批处理大小可以提高工具性能;但是,随着批处理大小的增加,会占用更多内存。 如果发生内存不足错误,请使用较小的批处理大小。 可以使用参数参数调整 batch_size 值。

  • 批处理大小为平方数,例如 1、4、9、16、25、64 等。 如果输入值不是完美平方,则使用可能的最高平方值。 例如,如果指定值为 6,则表示批处理大小设置为 4。

  • 有关运行此工具的要求以及您可能遇到的问题的信息,请参阅深度学习常见问题

  • 有关深度学习的详细信息,请参阅 ArcGIS Image Analyst 扩展模块中的深度学习

参数

标注说明数据类型
输入栅格

用于分类对象的输入图像。

输入可以是镶嵌数据集、影像服务或影像文件夹中的一个或多个栅格,或者具有影像附件的要素类。

Raster Dataset; Raster Layer; Mosaic Layer; Image Service; Map Server; Map Server Layer; Internet Tiled Layer; Folder; Feature Layer; Feature Class
输出分类对象要素类

包含输入要素类中对象或要素周围几何的输出要素类,以及用于存储分类标注的字段。

Feature Class
模型定义

模型定义参数值可以是 Esri 模型定义 JSON 文件 (.emd)、JSON 字符串或深度学习模型包 (.dlpk)。 当在服务器上使用此工具时,JSON 字符串十分有用,因为您可以直接粘贴 JSON 字符串,而无需上传 .emd 文件。 .dlpk 文件必须存储在本地。

其中包含深度学习二进制模型文件的路径、待使用的 Python 栅格函数的路径以及其他参数,例如首选切片大小或填充。

File; String
输入要素
(可选)

用于标识要分类或要标注的每个对象或要素位置的点、线或面输入要素类。 输入要素类中的每一行表示一个对象或要素。

如果未提供任何输入要素类,将假设每个输入影像包含单个待分类对象。 如果一个或多个输入影像使用空间参考,则工具的输出为要素类,其中每个影像的范围将用作每个标注要素类的边界几何。 如果一个或多个输入影像没有使用空间参考,则工具的输出为包含影像 ID 值和每个影像类标注的表。

Feature Class; Feature Layer
类标注字段
(可选)

包含输出要素类中类或类别标注的字段名称。

如果未提供任何字段名称,则会在输出要素类中生成一个 ClassLabel 字段。

String
处理模式
(可选)

指定处理镶嵌数据集或影像服务中的所有栅格项目的方式。 当输入栅格是镶嵌数据集或影像服务时,将应用此参数。

  • 以镶嵌影像方式处理将镶嵌在一起并处理镶嵌数据集或影像服务中的所有栅格项目。 这是默认设置。
  • 单独处理所有栅格项目将作为独立影像处理镶嵌数据集或影像服务中的所有栅格项目。
String
参数
(可选)

模型定义参数中的信息将用于填充此参数。 这些参数将有所不同,具体取决于模型架构。 以下是在 ArcGIS 中训练的模型支持的模型参数: ArcGIS 预训练模型和自定义深度学习模型可能具有该工具支持的其他参数。

  • batch_size - 模型推断每个步骤中处理的影像切片数。 这取决于显卡的内存。 此参数适用于所有模型架构。
  • test_time_augmentation - 在预测期间执行测试时数据增强。 如果值为 true,则输入影像的翻转和旋转变体的预测将合并到最终输出中。 此参数适用于所有模型架构。
  • score_threshold - 高于此置信度得分的预测将包含在结果中。 允许的值范围为从 0 到 1.0。 此参数适用于所有模型架构。

Value Table
说明文字
(可选)

包含输出要素类中文本或标题的字段名称。 仅当使用“影像描述生成器”模型时才支持此参数。

如果未指定字段名称,则会在输出要素类中生成一个 Caption 字段。

注:

此参数不会出现在地理处理窗格中。 要更改默认字段名称,请使用类标注字段参数。

String

ClassifyObjectsUsingDeepLearning(in_raster, out_feature_class, in_model_definition, {in_features}, {class_label_field}, {processing_mode}, {model_arguments}, {caption_field})
名称说明数据类型
in_raster

用于分类对象的输入图像。

输入可以是镶嵌数据集、影像服务或影像文件夹中的一个或多个栅格,或者具有影像附件的要素类。

Raster Dataset; Raster Layer; Mosaic Layer; Image Service; Map Server; Map Server Layer; Internet Tiled Layer; Folder; Feature Layer; Feature Class
out_feature_class

包含输入要素类中对象或要素周围几何的输出要素类,以及用于存储分类标注的字段。

Feature Class
in_model_definition

in_model_definition 参数值可以是 Esri 模型定义 JSON 文件 (.emd)、JSON 字符串或深度学习模型包 (.dlpk)。 当在服务器上使用此工具时,JSON 字符串十分有用,因为您可以直接粘贴 JSON 字符串,而无需上传 .emd 文件。 .dlpk 文件必须存储在本地。

其中包含深度学习二进制模型文件的路径、待使用的 Python 栅格函数的路径以及其他参数,例如首选切片大小或填充。

File; String
in_features
(可选)

用于标识要分类或要标注的每个对象或要素位置的点、线或面输入要素类。 输入要素类中的每一行表示一个对象或要素。

如果未提供任何输入要素类,将假设每个输入影像包含单个待分类对象。 如果一个或多个输入影像使用空间参考,则工具的输出为要素类,其中每个影像的范围将用作每个标注要素类的边界几何。 如果一个或多个输入影像没有使用空间参考,则工具的输出为包含影像 ID 值和每个影像类标注的表。

Feature Class; Feature Layer
class_label_field
(可选)

包含输出要素类中类或类别标注的字段名称。

如果未提供任何字段名称,则会在输出要素类中生成一个 ClassLabel 字段。

String
processing_mode
(可选)

指定处理镶嵌数据集或影像服务中的所有栅格项目的方式。 当输入栅格是镶嵌数据集或影像服务时,将应用此参数。

  • PROCESS_AS_MOSAICKED_IMAGE将镶嵌在一起并处理镶嵌数据集或影像服务中的所有栅格项目。 这是默认设置。
  • PROCESS_ITEMS_SEPARATELY将作为独立影像处理镶嵌数据集或影像服务中的所有栅格项目。
String
model_arguments
[model_arguments,...]
(可选)

in_model_definition 参数中的信息将用于设置此参数的默认值。 这些参数将有所不同,具体取决于模型架构。 以下是在 ArcGIS 中训练的模型支持的模型参数: ArcGIS 预训练模型和自定义深度学习模型可能具有该工具支持的其他参数。

  • batch_size - 模型推断每个步骤中处理的影像切片数。 这取决于显卡的内存。 此参数适用于所有模型架构。
  • test_time_augmentation - 在预测期间执行测试时数据增强。 如果值为 true,则输入影像的翻转和旋转变体的预测将合并到最终输出中。 此参数适用于所有模型架构。
  • score_threshold - 高于此置信度得分的预测将包含在结果中。 允许的值范围为从 0 到 1.0。 此参数适用于所有模型架构。

Value Table
caption_field
(可选)

包含输出要素类中文本或标题的字段名称。 仅当使用“影像描述生成器”模型时才支持此参数。

如果未指定字段名称,则会在输出要素类中生成一个 Caption 字段。

String

代码示例

ClassifyObjectsUsingDeepLearning 示例 1(Python 窗口)

此示例中生成了一个新的要素类,其标注字段可用于对影像中损坏和未损坏的建筑物进行分类。

# Import system modules  
import arcpy  
from arcpy.ia import *  
 
# Check out the ArcGIS Image Analyst extension license 
arcpy.CheckOutExtension("ImageAnalyst") 
 
# Execute 
ClassifyObjectsUsingDeepLearning("C:/Data/Input_Image.tif", 
	"C:/Data/MyProject.gdb/Classified_Results", "C:/Data/BuildingDamageClassifier.emd", 
	"C:/Data/building_footprints.shp","Class_Label", 
	"PROCESS_AS_MOSAICKED_IMAGE", "padding 0;batch_size 4")
ClassifyObjectsUsingDeepLearning 示例 2(独立脚本)

此示例中生成了一个新的要素类,其标注字段可用于对影像中损坏和未损坏的建筑物进行分类。

# Import system modules  
import arcpy  
from arcpy.ia import *  
 
# Check out the ArcGIS Image Analyst extension license 
arcpy.CheckOutExtension("ImageAnalyst") 
 
# Define input parameters
in_raster = "C:/Classify_Objects/input_image.tif" 
out_feature_class = "C:/Classify_Objects/MyProject.gdb/classified_results" 
in_model_definition = "C:/Classify_Objects/BuildingDanmageClassifier.emd" 
in_features = "C:/Classify_Objects/building_footprints.shp" 
class_label_field = "Damaged_or_Undamaged"
model_arguments = "padding 0;batch_size 4"
process_all_raster_items = "PROCESS_AS_MOSAICKED_IMAGE"

# Execute 
ClassifyObjectsUsingDeepLearning(in_raster, out_feature_class, in_model_definition,
	in_features, class_label_field,  
	process_all_raster_items, model_arguments)