티스토리 뷰

반응형

이 기사에서는 컨볼루션 신경망(CNN)을 사용하여 도시 홍수 취약성 매핑을 매핑하기 위한 데이터를 준비합니다.

모델을 개발하고 훈련된 모델을 사용하여 도시 홍수 취약성을 매핑하는 방법을 보여줍니다. 이 일련의 기사는 "베를린에서 데이터 기반 모델을 사용한 도시 홍수 감수성 매핑을 향하여" 논문을 (파이썬 코드로) 요약하고 설명합니다. 

 

컨볼루션 신경망 모델을 수행하려고 할 때
직면하는 첫 번째 문제는 
자신의 데이터 세트를 준비하는 방법입니다. 

 

모든 온라인 소스/과정은 표준 데이터 세트를 사용하므로 자신의 데이터 세트를 준비하는 방법을 모르거나 배우지 않는다.

이전 글에서 Random Forest 및 Support Vector Machine과 같은 포인트 기반 모델에 대한 데이터 세트를 준비하는 방법을 보여주었습니다. 이번 글은 간단한 코딩 기술을 사용하여 컨벌루션 신경망용 데이터를 준비하는 방법을 보여줍니다.

앞서 언급했듯이 데이터 기반 모델을 사용하여 도시의 홍수 취약성을 매핑하려면 홍수 인벤토리가 필요합니다. 홍수 인벤토리에는 침수 위치가 포인트로 포함됩니다. 

따라서 이러한 점을 이미지로 변환해야 합니다. 다음과 같이 계속하겠습니다.

 

  1. 점을 다각형으로 변환합니다(다각형 치수는 필요한 이미지 크기를 나타냄). 그런 다음 폴리곤의 shapefile을 여러 shapefile로 분할하고(각 shapefile은 하나의 폴리곤(이미지)을 나타냄) 플러드된 폴리곤과 플러드되지 않은 폴리곤을 별도의 폴더에 저장합니다.
  2. 클리핑해야 하는 래스터(예측 기능) 읽기
  3. 폴리곤의 셰이프 파일로 래스터 자르기

이 단계의 최종 결과물은 각 침수/비침수 위치(점)에 해당하는 이미지를 포함하는 두 개의 폴더(Flooded 및 Notflooded)가 있다는 것입니다.

1. 점을 이미지(다각형)로 변환하고 다각형 분할

먼저 사용할 패키지를 가져옵니다. 그런 다음 버퍼 기능을 사용하여 점 주위에 원을 만들고 Envelope 기능을 사용하여 그림 1과 같이 원을 정사각형(이미지)으로 변환합니다.

그림 1. 포인트를 크기가 있는 이미지로 변환(이미지 크기 x 이미지 크기).
<코드 1>
from osgeo import ogr
from osgeo import gdal
import numpy as np
import matplotlib.pyplot as plt

# read the points shape file using geopandas and plot the points
points=gpd.read_file('Points.shp') 
points.plot()

buffer_dist=345 #buffer distance = image size x spatial resolution /2

# Read in the shapefile
points = gpd.read_file("Points.shp")

# Create square buffers with a side length of buffer_dist units around the point features
points['geometry'] = points.buffer(buffer_dist)

points['geometry'] = points.geometry.envelope

# Save the new shapefile
points.to_file("squares.shp")
 
이제 우리는 침수된 위치와 침수되지 않은 위치를 모두 포함하는 다각형 셰이프 파일을 갖게 되었습니다. 
폴더를 만들고 분할이라고 합니다. 그런 다음 폴리곤 셰이프파일의 피처를 분할합니다
(각 피처를 별도의 셰이프파일에 저장).
<코드 2> 
# Split the flooded and nonflooded points 
#points_flooded=points[points['Label']==1]
#points_notflooded=points[points['Label']==0]

# Iterate over each feature in the shapefile
for index, feature in points.iterrows():
    # Create a new GeoDataFrame with just the current feature
    #print(index)
    
    feature_gdf = points.iloc[[index]]
    #print(feature_gdf)
    #print(feature_gdf['Label'][index])
    
    
        
    # Save the feature to a new shapefile
    feature_gdf.to_file(r"divided\feature_{}.shp".format(index))

2. 클리핑해야 하는 래스터(예측 기능) 읽기

여기에서 GDAL을 사용하여 래스터를 열고 배열로 읽습니다. 몇 가지 예측 기능이 있습니다. 따라서 모든 예측 기능을 하나의 래스터(여러 밴드 포함, 각 밴드는 하나의 예측 기능을 나타냄)에 넣거나 for 루프를 만들어 예측 기능을 반복하여 각 예측 기능에 대해 다음 단계를 반복할 수 있습니다.

복합 래스터는 복합 밴드 기능을 사용하여 Arcmap에서 만들거나 여기 에 표시된 대로 QGIS에서 만들 수 있습니다.

 

How to make band composite image in QGIS

I am wondering how I can make a band composite from three large bands files from Landsat? I was using option Raster>Miscellaneous>Merge but when I try to do it it crashes.

gis.stackexchange.com

 

<코드 3>

# Read raster files with GDAL
# import 
ds = gdal.Open("Composite_raster.tif") # open a raster with several bands, each band  represent one predictive feature
gt= ds.GetGeoTransform() #get the transformation data
proj = ds.GetProjection() #get the projection

band = ds.GetRasterBand(1) #read the first band 
array = band.ReadAsArray() #read the first band as an array

plt.figure()  #plot the raster to check that you every thing is working well
plt.imshow(array)

 

3. 폴리곤의 셰이프 파일로 래스터 자르기

이제 이미지와 예측 기능을 래스터로 나타내는 다각형이 있습니다. 따라서 다각형을 반복하고 각 다각형으로 예측 기능 래스터를 자릅니다. 따라서 출력은 이미지(tiff 형식)의 두 폴더(Flooded 및 Notflooded)가 됩니다.

 

<코드 4>

# change the path to the folder where we saved the splitted polygons
shp_path=r"D:\divided"
os.chdir(shp_path)
shp_file = glob.glob('*.shp')
#index =0
for file in shp_file:
        #print(str(file))         
        ds2 = ogr.Open(file, 1)
        layer = ds2.GetLayer()
        shp_ds=gpd.read_file(file)
        #print(shp_ds['Label'][0])
        #index+=1
        # we will clip the raster with each polygon and save the flooded and notflooded locations in different folders
        # we will check the label, if label =0 then this is not flooded location
        # Label = 0 for non-flooded locations, Label = 1 for flooded locations
        if shp_ds['Label'][0] == 0 : # clip and save not flooded locations
             #Save the feature to a new shapefile
            dsClip = gdal.Warp(r"D:\Predictive_features\NotFlooded\feature_"+str(file[:-4])+".tif", ds, cutlineDSName = file,
                       cropToCutline = True, dstNodata = np.nan)
        else: # clip and save flooded locations
            # Save the feature to a new shapefile
                  
            dsClip = gdal.Warp(r"D:\Predictive_features\Flooded\feature_"+str(file[:-4])+".tif", ds, cutlineDSName = file,
                       cropToCutline = True, dstNodata = np.nan)

 

이제 합성곱 신경망을 훈련시키기 위한 이미지를 준비했습니다. 다음 글에서는 이 이미지들을 파이썬으로 읽어서 신경망을 훈련시킬 것입니다.

2023.02.22 - [Remote Sensing] - AI 모델을 사용한 도시 홍수 취약성 지도 제작(5)

 

반응형
댓글