通过gdal库将矢量文件转化为栅格文件(shp2tiff)
gdal.RasterizeLayer()
- 一种方式是给定像素大小, pixel_size = 1,再通过source_layer.GetExtent(),得到矢量的边界,但是此种方法得到的栅格图像不一定是你想要的大小,一般会小一些,因为矢量是通过函数计算图线边界,有兴趣具体可以百度一下,这里不做过多阐述.
- 第二种方式就是给定一张矢量对应的栅格图像,函数会自动将shp转化为给给定tiff的大小.
具体如下:
from osgeo import gdal,ogr,osr
import glob
templateTifFileName = r"D:\ai初\traintestmin\zaiqian.tif"
print(templateTifFileName)
# templateTifFileName ='22678915_15.tif'
shpFileName = templateTifFileName[:-4]+'shp'
outputFileName = templateTifFileName[:-1]
data = gdal.Open(templateTifFileName, gdal.GA_Update)
print(data)
geo_transform = data.GetGeoTransform()
x_min = geo_transform[0]
y_min = geo_transform[3]
# gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
# # 为了使属性表字段支持中文,请添加下面这句
# gdal.SetConfigOption("SHAPE_ENCODING", "")
x_res = data.RasterXSize
y_res = data.RasterYSize
mb_v = ogr.Open(shpFileName)
mb_l = mb_v.GetLayer()
pixel_width = geo_transform[1]
target_ds = gdal.GetDriverByName('GTiff').Create(outputFileName, x_res, y_res, 1, gdal.GDT_Byte)
target_ds.SetGeoTransform((x_min, pixel_width, 0, y_min, 0, -1 * pixel_width))
band = target_ds.GetRasterBand(1)
NoData_value = -999
band.SetNoDataValue(NoData_value)
band.FlushCache()
gdal.RasterizeLayer(target_ds, [1], mb_l)
target_ds = None
使用GPU加速:cuda
在PyTorch中以下数据结构分为CPU和GPU两个版本:
- Tensor
- nn.Module
它们都带有一个.cuda
方法,调用此方法即可将其转为对应的GPU对象。tensor.cuda
会返回一个新对象,这个新对象的数据已转移至GPU,而之前的tensor还在原来的设备上(CPU)。而module.cuda
则会将所有的数据都迁移至GPU,并返回自己。所以module = module.cuda()
和module.cuda()
所起的作用一致。
nn.Module在GPU与CPU之间的转换,本质上还是利用了Tensor在GPU和CPU之间的转换。nn.Module
的cuda方法是将nn.Module下的所有parameter(包括子module的parameter)都转移至GPU,而Parameter本质上也是tensor(Tensor的子类)。
pytorch使用gpu运行
如果服务器具有多个GPU,tensor.cuda()方法会将tensor保存到第一块GPU上,等价于tensor.cuda(0)。此时如果想使用第二块GPU,需手动指定tensor.cuda(1),而这需要修改大量代码,很是繁琐。这里有两种替代方法:
- 一种是先调用t.cuda.set_device(1)指定使用第二块GPU,后续的.cuda()都无需更改,切换GPU只需修改这一行代码。
- 更推荐的方法是设置环境变量CUDA_VISIBLE_DEVICES,例如当export CUDA_VISIBLE_DEVICE=1(下标是从0开始,1代表第二块GPU),只使用第二块物理GPU,但在程序中这块GPU会被看成是第一块逻辑GPU,因此此时调用tensor.cuda()会将Tensor转移至第二块物理GPU。CUDA_VISIBLE_DEVICES还可以指定多个GPU,如export CUDA_VISIBLE_DEVICES=0,2,3,那么第一、三、四块物理GPU会被映射成第一、二、三块逻辑GPU,tensor.cuda(1)会将Tensor转移到第三块物理GPU上。
设置CUDA_VISIBLE_DEVICES有两种方法,一种是在命令行中CUDA_VISIBLE_DEVICES=0,1 python main.py,一种是在程序中import os;os.environ["CUDA_VISIBLE_DEVICES"] = "2"。如果使用IPython或者Jupyter notebook,还可以使用%env CUDA_VISIBLE_DEVICES=1,2来设置环境变量。
单机多卡的实现
要实现模型单机多卡十分容易,直接使用 new_module = nn.DataParallel(module, device_ids), 默认会把模型分布到所有的卡上。多卡并行的机制如下:
将模型(module)复制到每一张卡上,将形状为(N,C,H,W)的输入均等分为 n份(假设有n张卡),每一份形状是(N/n, C,H,W),然后在每张卡前向传播,反向传播,梯度求平均。要求batch-size 大于等于卡的个数(N>=n)
在绝大多数情况下,new_module的用法和module一致,除了极其特殊的情况下(RNN中的PackedSequence)。另外想要获取原始的单卡模型,需要通过new_module.module访问。
用我只有一块显卡(gtx1060)的笔记本测试,会出错,所以一块显卡的小伙伴就不用折腾了,直接tensor.cuda(),model.cuda(),这两个方法可以将张量和模型都转化为使用gpu运行.如果运行中出现类似张量不同的错误,注意查看是不是有的tensor没有转化.