could be decompression bomb DOS attack

在使用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)

这样就可以完美的解决这些超大图像的读入问题啦!

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页