在使用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)
這樣就可以完美的解決這些超大圖像的讀入問題啦!