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

制作遥感标签样本的一般流程
ytkz制作遥感标签样本,可以分为3个步骤:
1.画矢量
2.矢量转栅格
3.分块分割影像
画矢量
这个步骤是最耗费时间的、最麻木的一个过程。
一般是在arcgis勾画目标的轮廓。
矢量的格式一般为shp,而深度学习输入数据一般为栅格,如png、bmp等等。
所以需要对矢量进行转换,即下一步。
矢量转栅格
我写好了python代码,代码大概50行左右,很短。小白可以参考。
再详细记录这个矢量转栅格的过程。
首先在arcgis新建一个字段叫做ID,字段的名字我是随便起的,你可以起其他的名字,无所谓的。
对这个字段赋值。赋值的大小,由你的需求决定,由你的深度学习预设的标签样本决定。
如果是目标只有一类,我一般赋值为255。
举个例子,底图如下。
我们要勾画植被、建筑物,勾画后的矢量如下:
属性表如下:
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的属性表的字段名字保持一致。
输入参数有三个:
shp_file是矢量文件
reference_tif是底图
output_tiff是输出的标签栅格文件
标签文件在arcgis可视化如下:
青色代表了数值1,而蓝色代表数值255。这两个数值是由之前我们在arcgis设置的。
标签栅格文件的大小是与底图大小保持一致。
标签栅格文件的大小是545x387,如下:
底图大小也是545x387,如下:
二者保持一致,目的是为了下一步:分块分割影像。
分块分割影像
遥感影像作为一种大型栅格文件,一般情况下,不能直接输入到神经网络里,
据我观察,很多的输入栅格的大小是小于1000x1000的。
所以,我们需要分块切割影像。把影像分为256x256或者其他尺寸。
具体的代码不放出来了,这里可以参考之前所写的遥感影像分块技术文。