在使用Keras训练模型的时候,需要从文件夹中读取一系列的图片,由于Keras在将图片输入模型中时,使用的是PIL来进行导入,在我的样本中有一些很大图片,例如卫星影像,大尺寸地图等;由于超过了PIL尺寸的限制,会报错:
DecompressionBombWarning: Image size (139332960 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.
解决的办法是使用其他的开源库,来打开这些大图片,试了一下Opencv,skimage都不行,由于楼主有遥感专业背景,就想着能不能分波段将图片读进去,然后将这些大图进行降采样,这样就可以解决这个警告啦!而且也不会影响模型的训练!那这个时候就需要使用到我们今天的主角:
GDAL - Geospatial Data Abstraction Library
Python安装GDAL非常的简单,网上一大堆的教程,简单编译一下就是了!这里楼主就不再提了,如果你实在不会编译的话,那么就用我这边已经编译好的吧:
当安装完毕后,直接将每个波段读取进来:
r = dataset.GetRasterBand(1) g = dataset.GetRasterBand(2) b = dataset.GetRasterBand(3)
然后将每个波段进行降采样:
# 设定新图像的宽和高 newX = 2000 newY = 2000 # 对每个波段进行resize data1 = r.ReadAsArray(0, 0, x, y, newX, newY) data2 = g.ReadAsArray(0, 0, x, y, newX, newY) data3 = b.ReadAsArray(0, 0, x, y, newX, newY) # print(data1.mean(), data2.mean(), data3.mean())
然后拼接成一个新的array就可以了:
# 将波段融合在一起 data = np.dstack([data1, data2, data3]) # 波段转化为图像 im = Image.fromarray(data)
这样就可以完美的解决这些超大图像的读入问题啦!