制作遥感标签样本的一般流程

制作遥感标签样本,可以分为3个步骤:

1.画矢量

2.矢量转栅格

3.分块分割影像

画矢量

这个步骤是最耗费时间的、最麻木的一个过程。

一般是在arcgis勾画目标的轮廓。

矢量的格式一般为shp,而深度学习输入数据一般为栅格,如png、bmp等等。

所以需要对矢量进行转换,即下一步。

矢量转栅格

我写好了python代码,代码大概50行左右,很短。小白可以参考。

再详细记录这个矢量转栅格的过程。

首先在arcgis新建一个字段叫做ID,字段的名字我是随便起的,你可以起其他的名字,无所谓的。

对这个字段赋值。赋值的大小,由你的需求决定,由你的深度学习预设的标签样本决定。

如果是目标只有一类,我一般赋值为255。

举个例子,底图如下。

image-20250102160320906

我们要勾画植被、建筑物,勾画后的矢量如下:

image-20250102160422929

属性表如下:

image-20250102160454106

from osgeo import gdal, ogr


def shp_to_tiff(shp_file, refore_tif, output_tiff, type='int'):
    '''
    函数作用:将shp文件转换成tif文件

    形参解释:
    shp_file: shp文件路径
    reference_tif: 参考tif文件路径
    output_tiff: 输出tif文件路径
    type: 输出tif文件类型,int为整型,float为浮点型

    注意:    shp文件和tif文件的投影必须一致
    '''
    # 读取shp文件
    driver = ogr.GetDriverByName("ESRI Shapefile")
    data_source = driver.Open(shp_file, 1)
    # 获取图层文件对象
    shp_layer = data_source.GetLayer()

    img = gdal.Open(refore_tif)
    projection = img.GetProjection()
    transform = img.GetGeoTransform()
    cols = img.RasterXSize
    rows = img.RasterYSize

    # 根据模板tif属性信息创建对应标准的目标栅格
    if type == 'int':
        target_ds = gdal.GetDriverByName('GTiff').Create(output_tiff, cols, rows, 1, gdal.GDT_Byte)
    elif type == 'float':
        target_ds = gdal.GetDriverByName('GTiff').Create(output_tiff, cols, rows, 1, gdal.GDT_Float32)


    target_ds.SetGeoTransform(transform)
    target_ds.SetProjection(projection)

    band = target_ds.GetRasterBand(1)
    # 设置背景数值
    NoData_value = 0
    band.SetNoDataValue(NoData_value)
    band.FlushCache()

    # 调用栅格化函数。gdal.RasterizeLayer函数有四个参数,分别有栅格对象,波段,矢量对象,value的属性值将为栅格值
    gdal.RasterizeLayer(target_ds, [1], shp_layer, options=["ATTRIBUTE=ID"])

    # gdal.RasterizeLayer(target_ds, [1], shp_layer)

    y_buffer = band.ReadAsArray()
    target_ds.WriteRaster(0, 0, cols, rows, y_buffer.tobytes())
    target_ds = None  # todo 释放内存,只有强制为None才可以释放干净
    del target_ds, shp_layer


if __name__ == '__main__':

    shp_file = r'vector.shp'
    reference_tif = r'rgb_unit8.tif'
    output_tiff =  r'label.tif'
    shp_to_tiff(shp_file, reference_tif, output_tiff, type='int')

上面代码中,可能需要修改的是,这个参数我填的ID,与arcgis的属性表的字段名字保持一致。

image-20250102160830525

输入参数有三个:

shp_file是矢量文件

reference_tif是底图

output_tiff是输出的标签栅格文件

image-20250102160923246

标签文件在arcgis可视化如下:

image-20250102163452219

青色代表了数值1,而蓝色代表数值255。这两个数值是由之前我们在arcgis设置的。

标签栅格文件的大小是与底图大小保持一致。

标签栅格文件的大小是545x387,如下:

image-20250102163554583

底图大小也是545x387,如下:

image-20250102163657954

二者保持一致,目的是为了下一步:分块分割影像。

分块分割影像

遥感影像作为一种大型栅格文件,一般情况下,不能直接输入到神经网络里,

据我观察,很多的输入栅格的大小是小于1000x1000的。

所以,我们需要分块切割影像。把影像分为256x256或者其他尺寸。

具体的代码不放出来了,这里可以参考之前所写的遥感影像分块技术文。