Skip to content
Bae-ChangHyun edited this page Nov 22, 2023 · 13 revisions

Simple Code discription

Intro

본 프로젝트는 기상, 지형, 인적 데이터를 이용하여 강원도의 산불 발생 확률을 예측하여 확률맵을 생성하는 프로젝트입니다.

프로젝트의 회고는 블로그에 간단하게 기록해놓았습니다. 블로그 바로가기

아래 작성된 폴더외에는 자동적으로 생성됩니다. 또한 생성되는 파일이나, 폴더들 혹은 디렉토리를 변경할 경우 오류가 발생합니다.

사전 준비

본 프로젝트를 실행하기 위해서는 사전 세팅이 필요하다.

폴더명들은 수정하면 안됩니다. 또한 .env에 경로를 입력할때 ""는 붙이지 않습니다.

  1. code폴더 안에 .env 파일을 생성해줍니다.
    해당 .env에는 아래를 복사하여 수정하면 됩니다.
API_1={공공데이터포털에서 발급받은 api key("" 쓰면 안됨}
# https://www.data.go.kr/index.do
filepath={폴더경로("" 쓰면 안됨)} ex) D:/firepredict
db_path ={filepath하위폴더경로("" 쓰면 안됨)} ex) D:/firepredict/data/database
image_size=24(24권장, 32 실험안해봤음)

2.data/ASOS_Hr에 구글드라이브에 업로드 되어 있는 파일 다운로드 받아 압축해제.
3.data/geo_data에 구글드라이브에 업로드 되어 있는 raw 파일 다운로드받아 압축해제

[tabular_dataset.py] description

tabular_dataset.py는 정형데이터를 수집 및 전처리하는 함수들이 담겨있는 파일입니다.
train_model.py를 실행할시 자동적으로 수행됩니다.
-> 단 초기 실행시에는 모든 데이터를 크롤링 혹은 수집하고 보간하는 작업까지 진행되기 때문에 대략 2일정도 소요됩니다.
중단하면 이후 재시작시 중단시점부터 이어서 진행하기 때문에 상관없음

def asos_crawling : 기상청_지상(종관, ASOS) 시간자료 조회서비스의 api를 이용하여 데이터를 크롤링하고 추후 작업에 필요한 형태로 전처리합니다.

def future_weather_crawling : 추후 실시간 서비스를 할 때는 과거의 기상 데이터가 아닌 예보 데이터를 수집해야합니다.기상청_단기예보 ((구)_동네예보) 조회서비스 에서 크롤링을 진행하며 역시 공공데이터 api를 이용합니다.

def collect_climate : 기상데이터를 처리하기 위하여 가장 먼저 호출되는 함수로, 사전에 asos 데이터를 csv형태로 다운받아놨다면, 저장되어있는 파일을 기준으로 과거 기상데이터를 수집하고, 없다면 위의 asos_crawling을 호출하여 데이터를 수집합니다.

def get_climate : 우리나라 전체의 기상데이터에서 산불이 발생한 지점의 기온,강수량,습도,풍속을 가져옵니다.

def make_random_dataset : 산불발생데이터는 실존하는 데이터지만, 반대되는 산불이 발생하지 않은 target=0인 데이터는 임의로 생성해야합니다. 산불발생데이터의 분포를 고려하여 임의의 target=0이되는 데이터셋을 생성합니다.

def iffuture : 추후 실시간 서비스를 진행할 시 호출되는 함수로 미래의 산불위험확률을 보고싶을 때 예보 데이터를 크롤링하고 기상데이터를 생성합니다.

def ifpast : 추후 실시간 서비스를 진행할 시 호출되는 함수로 과거 산불위험확률을 보고싶을 때 asos_crawling을 호출하여 기상데이터를 생성합니다.

def main : 데이터를 크롤링(collect_climate), 기상데이터를 보간(utils.py-idw), 산불발생지점 인덱싱(utils-findfireloc),산불발생지점 기상데이터수집(get_climate)를 진행하고 최종 데이터셋을 합쳐줍니다.

[image_dataset.py] description

image_dataset.py는 지형 데이터와 인적데이터를 수집 및 입력형식에 맞춰주는 함수들을 모아놓았습니다.

def crop_imges :지정해놓은 cropsize를 기반으로 특정 좌표의 지형,인적데이터를 잘라줍니다.

def ndvi_filtering : 나머지 지형데이터들의 경우 몇십년에 한번 갱신되는데, ndvi의 경우 각 년마다 4번씩 관측됩니다. 따라서 각월에 맞게 ndvi image를 가져옵니다.

def crop_train : 학습에 사용될 지형,인적 이미지 데이터셋을 생성합니다. -> crop_images

def crop_test : 서비스에 사용될 지형,인적 이미지 데이터셋을 생성합니다. -> crop_images

def convert_npy : 잘라낸 이미지 셋을 npy형태로 바꾸어 저장합니다. 이때 크기는 기존에 지정해준 imagesize=24입니다.

make_train_image_data : train에 관련된 이미지 데이터셋을 생성하는 메인 함수입니다.

make_test_image_data : 서비스에 관련된 이미지 데이터셋을 생성하는 메인 함수입니다.

[utils.py] description

utils.py는 각종 지형 데이터를 다루는 함수들을 모아놓았습니다.

def idw_interpoloate : 103개의 지점에서 수집된 기상정보를 토대로 idw보간법을 실시하여 전체 지역에 대한 기상데이터를 반환합니다.

test_data_interpolation : idw_interpolate와 동일한 기능을 하지만, 실시간 데이터의 경우 단기예보 데이터를 받아오기 때문에 처리방식이 다릅니다.
idw보간법을 실행하는 함수입니다.

find_fireloc : 전체지역의 기상데이터에서 우리가 원하는 산불발생위치의 기상데이터를 얻기위해 산불발생위치의 격자 인덱스를 반환해주는 함수입니다.

나머지함수들은 실행시 직접적으로 사용되지 않습니다.

[train_model.py] description

train_model.py는 유저가 직접적으로 실행하게 될 첫번째 파일입니다.
이 파일을 실행할시 위에 적혀있는 함수들이 모두 진행됩니다.
전체 데이터 수집 및 학습까지는 대략 2일정도가 소요됩니다. 중간에 오류발생시 다시 시작하여 실행하면 멈춘부분부터 재실행됩니다.

def load_dataset : 수집된 정형데이터를 모델의 input형식으로 바꿉니다.

def cnn_layers : convolution layer을 성합니다.

def dense_layer : dense layer을 구성합니다.

def construct_model : 멀티모달 모델을 구성합니다.

def train : 모델을 훈련합니다 -> 훈련된 모델은 ../data/modeling/model에 저장됩니다.

[test_model.py] description

train_model 이후에 실행하게 될 파일입니다.
프롬프트에 원하는 날짜와 시간을 입력하면 해당 시점의 산불발생확률을 시각화하여 dbpath에 저장합니다.
-> 미래시점의 경우에는 원래는 추후 실서비스에서 매 30분마다 돌아가게 자동화하려고 기획하였기에 입력 시간 1시간30분, 2시간30분, 3시간30분 뒤의 확률을 계산합니다.(자동화는 구현하지 않았습니다)

->과거 시점의 경우 입력 시간의 산불 발생 확률을 계산합니다.

appendix

data/aws_loc_list.csv
: aws의 지점별 경위도를 저장한 파일. 크롤링을 할 때 참고함.
data/future_loc.csv
: 서비스 구현 시 미래시점의 데이터를 보간할 때 사용.
(전체 강원도를 400*278격자 형태로 나눴을 때의 각 격자의 경위도)
data/gangwon_fire.csv
: 강원도 2011~2021년 실제 산불 발생 데이터(산림청 산불 피해 대장 데이터 재가공)
geo_data/gw_boundary
: 강원도 경계에 대한 래스터파일 -> 각 지형 데이터를 강원도에 해당하는 부분만 자르기 위해 사용(좌표계,크기 모두 고정)
geo_data/raw
: 각 지형 데이터의 강원도에 해당하는 래스터 파일 -> qgis를 이용하여 후처리한 데이터.

Clone this wiki locally