深度學習大概分成兩部分,模型訓練和影像識別,模型訓練涉及樣本訓練和樣本驗證,這個部分為深度學習的主要部分,通過調節樣本集和訓練引數控制結果精度,鑒于樣本獲取及計算機性能,這里使用現成的訓練結果集,訪問地址:https://github.com/isikdogan/deepwatermap,
1、安裝環境

這里需要手動安裝tensorflow,因為GUP版本計算速度比CPU版本快數十倍,因此安裝GPU版本,GPU版本安裝時,應注意對應的CUDA驅動,安裝可參照:https://zhuanlan.zhihu.com/p/37086409,其他三個包為依賴包,必須安裝,
2、識別影像準備
遙感影像進行深度學習,本文使用的模型涉及以下幾個波段,需將下載的原始影像進行多波段融合,涉及的波段如下:
B2: Blue
B3: Green
B4: Red
B5: Near Infrared (NIR)
B6: Shortwave Infrared 1 (SWIR1)
B7: Shortwave Infrared 2 (SWIR2)
這里使用代碼實作波段融合,代碼如下:
import numpy as np
from osgeo import gdal_array
from osgeo import gdal
"""存盤檔案的串列維度為:imgs*11,既每個影像的波段檔案都存放在單個串列里"""
import os
def read_landsat8_bands(base_path):
"""保存landsat8不同波段的路徑(共11個波段)
base_path: 存盤了多張影像的檔案夾
mid_path: 存盤了不同波段的檔案夾,對應著單張影像
final_path: 最后一層可以直接打開的單張波段檔案
bands:包含了波段路徑的串列
"""
# 用于存盤不同波段路徑,維度是影像數量*波段數(11)
bands = []
num_bands = 11
# 用于定位波段用的關鍵字串列
keys = []
for k in range(num_bands):
key = 'B{num}.TIF'.format(num = k + 1)
keys.append(key)
# 讀取最外層檔案
base_files = os.listdir(base_path)
for i in range(len(base_files)):
bands.append([])
# 讀取中層檔案
mid_path = base_path + '\\' + base_files[i]
mid_file = os.listdir(mid_path)
# 得到最內層的波段檔案
for final_file in mid_file:
final_path = mid_path + '\\' + final_file
for j in range(num_bands):
if keys[j] in final_file:
bands[i].append(final_path)
# 原始串列排序是1,10,11,2,3,...
# 按照倒數第5個字符進行排序(XXXB1.TIF)
bands[i].sort(key=lambda arr: (arr[:-5], int(arr[-5])))
# 回傳波段串列和影像數量
return bands
base_path = r'G:\洞庭湖\input'
bands = read_landsat8_bands(base_path)
print(bands[0][:11])
# 讀取波段
B2 = bands[0][1]
B3 = bands[0][2]
B4 = bands[0][3]
B5 = bands[0][4]
B6 = bands[0][5]
B7 = bands[0][6]
B2_np = np.array(gdal_array.LoadFile(B2))
B3_np = np.array(gdal_array.LoadFile(B3))
B4_np = np.array(gdal_array.LoadFile(B4))
B5_np = np.array(gdal_array.LoadFile(B5))
B6_np = np.array(gdal_array.LoadFile(B6))
B7_np = np.array(gdal_array.LoadFile(B7))
# 轉化成ndarray形式
#B1_np = np.array(B1_gdal)
B_merger = np.array([B2_np, B3_np, B4_np,B5_np, B6_np, B7_np])
# 獲取tif遙感影像的資料與投影資訊
dataset1 = gdal.Open(B2)
im_geotrans = dataset1.GetGeoTransform()
im_proj = dataset1.GetProjection()
im_data = dataset1.ReadAsArray()
im_width = dataset1.RasterXSize
im_height = dataset1.RasterYSize
#im_bands = B_merger.shape
im_bands =6
band1 = dataset1.GetRasterBand(1)
datatype = band1.DataType
# 生成tif遙感影像
driver = gdal.GetDriverByName('GTiff') # 資料型別必須有,因為要計算需要多大記憶體空間
dataset = driver.Create(base_path+'\merger.tif', im_width, im_height, im_bands, datatype)
dataset.SetProjection(im_proj) # 寫入投影
dataset.SetGeoTransform(im_geotrans) # 寫入仿射變換引數
if im_bands == 1:
dataset.GetRasterBand(1).WriteArray(B_merger) # 寫入陣列資料
else:
for i in range(im_bands):
dataset.GetRasterBand(i + 1).WriteArray(B_merger[i])
del dataset
合并后結果如下:

3、運行模型識別湖泊
需下載好源代碼和模型包,運行使用python代碼,官方樣例如下:
$ python inference.py --checkpoint_path checkpoints/cp.135.ckpt --image_path sample_data/sentinel2_example.tif --save_path water_map.png
其中–checkpoint_path 為模型存放位置標識,使用時將checkpoints/cp.135.ckpt改為模型存放位置,–image_path 為輸入影像位置標識,使用時將sample_data/sentinel2_example.tif改為輸入影像位置,–save_path為輸出影像位置標識,使用時將water_map.png改為輸出影像位置,
模型運行時,輸入影像如下:

識別的結果如下:

柵格轉矢量后:

按照模型設計者的說法,識別準確度達百分之九十以上…
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423165.html
標籤:AI
