Skip to content

pcrmcw0486/dataflood

Repository files navigation

Data Flood

데이터청년 캠퍼스 부산대학교 프로젝트
2020년 07월 발생한 초량 제1지하차도 침수사건으로 인명피해가 발생하였다
이에 Data Flood 팀은 침수를 예측해보고자 하였다.
예측 방법은 거시적으로 강수량, 지형 정보, 펌프 및 불투수면, 침수 이력을 통해
캠퍼스 기간 동안 학습한 머신러닝을 통해 예측해보고자 하였고
미시적으로 cctv 영상을 학습시켜 확실하게 실시간으로 예측하고자 하였다
두 방법은 서로 상호보완적으로 침수 예방에 도움을 줄 수 있을 것이다.

데이터 수집 및 전처리 과정과 학습 방법 그리고 웹(django)에 대해 설명.
실행방법은 7.실행방법참조


python 3.7.6 가상환경 virtualenv 20.0.31

https://github.com/pcrmcw0486/dataflood

목차

  1. 디렉토리 설명
  2. 데이터 수집
  3. 전처리 과정 및 데이터 flow
  4. Machine Learning
  5. 영상 Machine Learning
  6. Django
  7. 실행 방법

1. 디렉토리 설명

dataflood

├─Data : 프로젝트에 사용되는 데이터 모음
│ ├─final_data : 최종적으로 사용 용도에 따라서 응용될 데이터
│ │ ├─DB : for Django
│ │ ├─model : 추후 모델이 필요할 시 사용
│ │ │ ├─geo_model
│ │ │ └─video_model
│ │ └─training : 학습에 사용 될 데이터
│ │ ├─cctv_data : 영상 학습 용 데이터
│ │ │ ├─flood
│ │ │ ├─flood_clahe
│ │ │ ├─no_flood_new
│ │ │ ├─no_flood_new_clahe
│ │ │ └─video
│ │ └─geo_data : 머신 러닝 학습 용 데이터
│ ├─processing_data : 전처리 되면서 만들어지는 데이터
│ │ ├─1st : 1차 가공
│ │ └─2nd : 2차 가공( 추후 활용되어 final_data 또는 training_data로 변경)
│ └─rawdata

├─ML_model_code : 모델 학습 코드
| |
│ ├─Geo_Model
│ │
│ └─Video_Model

├─Processing_code : 전처리 및 django DB data 생성용 코드

└─Web : Django 코드

2. 데이터 수집

모델 학습에 필요한 데이터 수집은 아래의 주소에서 다운 받아 편의상 이름을 변경하여 사용하였다. 해당 데이터들은 Data/raw_data 에 저장한다.

  1. 부산 코드 https://www.code.go.kr/stdcode/regCodeL.do 접속 > 부산 조회 후 다운로드 법정동코드 조회자료.zip → busan_code_data.xls

Readme%20md%2099629370fe664b84b98f21911af9cff2/Untitled.png

  1. 침수흔적정보 : 태풍,호우,해일 등으로 인한 침수발생일시, 면적 등 침수지역에 대한 정보 https://www.data.go.kr/data/15048634/fileData.do FL_DATAUPMNG.csv

  2. 침수흔적정보_기상별 강우량 FL_DATAUPMNG에 침수된 위치에 따른 침수 기간 동안의 기상별 강우량(시간별) https://www.data.go.kr/data/15048637/fileData.do FL_TIMERAIN.csv

  3. 불투수면 비율(환경부)) http://egis.me.go.kr/atlas/view.do?id=64&section=02&pageNo=13&keyword= 불투수면 비율.xlsx(전국 데이터) → imper_ratio_data.xlsx

Readme%20md%2099629370fe664b84b98f21911af9cff2/Untitled%201.png

  1. API_xycode.csv https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15057682 초단기예보조회를 사용 기상청18_동네예보 조회서비스_오픈API활용가이드_격자_위경도(20200706) → API_xycode.xlsx

  2. simulation_rain.csv 모델 학습 이후 초량 제1지하차도 침수사건 당일의 침수를 예측하기 위해 해당 날짜의 강수량 데이터를 수집 기상청 데이터를 통해 수작업

3. 전처리 과정 및 데이터 flow

전처리 과정 및 데이터 flow의 개요는 다음과 같다 위의 Raw, Processing Data( 1st, 2nd ) , Final Data( DB, training, model ) 각각 파일명이며 자세한 내용은 1을 참조한다.

Readme%20md%2099629370fe664b84b98f21911af9cff2/file.png

전처리 : Processing_code 내부 1, 2, 3, 4 참조
학습코드 : ML_model_code > GeoModel > Geo_ML 참조
              > VideoModel > video_ML 참조
Django DB용 코드 : Processing_code 내부 for_Django_DB 참조

전처리 과정


  • ① 부산데이터 추출 : 전국 정보를 가지고 있는 FL_DATAUPMNG(침수흔적이력) 에서 부산과 관련된 침수이력을 추출.
    또한 이와 같이 제공되고 있는 FL_TIMERAIN(침수 당일 시간당 강수량)에서 부산과 관련된 침수이력을 추출
    이 때는 과거 부산 침수이력 데이터에 존재하는 사건번호(SEQ)와 연계하여 추출
    이 후 busan_code를 사용하기 좋도록 제작.
  • ②침수데이터with 강수 및 지형 : 뽑아낸 부산 과거 침수 이력 데이터로 부터 QGIS를 이용하여 해당 지역의 지역정보(고도 및 경사도)를 생성.
    또한 그 주변의 비침수 지역 데이터도 같이 이용
    두 지역정보와 강수량 데이터를 지역 이름으로 묶어 merge 한 후 각각의 지역정보(고도 및 경사도)에 대해 가중치 부여
  • ③지역정보(구) : 부산 행정구역을 '구' 단위로 나누어 각각의 구에 해당하는 지역정보를 생성하고 가중치를 부여
    이 때 사용되는 데이터는 불투수면 비율, 구의 과거 침수 빈도 비율, pump 비율을 이용하여 가중치를 부여한다.
  • ④학습용데이터만들기 : 학습에 사용하기 좋도록 데이터를 가공하여 학습용 데이터를 생성한다. (labeling 작업)
    우선 busan_flood_data와 busan_Uflood_data와 sig_info_weight지역정보를 활용하여 데이터를 합친다.
    busan_flood_data로 부터 침수심 결측치를 선형적으로 보완하고 busan_Uflood_data의 침수심을 0으로 설정한다 . 이후 침수심 0.2m 이상이 침수이므로
    침수심에 따라 각각의 데이터에 FLOOD 열을 추가하여 1, 0으로 라벨링한다.
    이후 학습을 위한 데이터는 비율 등을 고려하여 침수 시점을 기준 busan_flood_data로 부터 데이터를 선정하고,
    이후 같은 시간대에서 busan_Ulood_data로 부터 데이터를 선정하여 training_data를 생성한다.

data flow


각각 주피터파일을 통해 전처리과정 순서대로 진행되어 파일이 생성되며, (단, QGIS로 생성된 busan_flood_geo 와 busan_Uflood_geo, busan_rain_data_mod는 제외) 마지막에 도착한 Final data 폴더에 사용 용도에 따라 저장된다.
training_data : 모델 학습을 위해 사용
DB : 이후 Web 파트에서 데이터베이스를 위해 사용
model : Web또는 추후 사용을 위해 모델을 따로 저장

4. Machine Learning

4.1 Geo_ML

  1. 먼저 필요한 라이브러리를 모두 import 해줌
  2. 분류모델이기에 독립변수로 사용할 데이터와 종속변수를 구분해서 나눠줌.
  3. minmaxscaler 를 이용해 data를 0~1의 값으로 전환 -> 데이터 특성상 이상치를 제거해서 사용해서는 안됨
  4. 주성분 분석(PCA)를 통해 중요 주성분(4개)를 선택 학습에 사용하기위해 4개의 차원으로 줄인 데이터로 변형
  5. 데이터를 train 과 test 로 구분 8 : 2 비율로 나눠줌
  6. bayesianoptimization 을 이용해 사용할 모델들의 최적값을 탐색함 -> 사용된 모델 KNN, SVM, DT, RF 각 모델들에 사용되는 옵션의 최적 조합을 탐색
  7. 찾아낸 최적의 조합으로 모델을 만들고 voting 앙상블을 통해 그 모델들을 묶어서 사용함 -> voting 앙상블의 경우 soft 옵션을 사용함 각 모델들에서 나오는 1일 확률과 0일 확률을 종합해서 결과를 냄 -> 한 모델의 정확도가 떨어져도 다른 모델들과의 확률 계산을 통해 결과를 도출함
  8. 데이터를 학습하고 교차검증을 다시 한번 실시하여 각 모델들의 성능을 평가함 -> f1_score 를 확인
  9. 교차검증을 통해 나온 결과를 보기 쉽게 하기위해 boxplot 으로 시각화함
  10. 위에서 구분한 test 데이터에 대한 예측 정확도를 확인함 -> 0.7정도로 train 데이터와 유사하게 나옴
  11. 실제 사고사례를 예측할 수 있는지 확인하기 위해 초량동 데이터를 사용함 -> 전처리 과정에서 사용한 가중치를 초량동 데이터에도 적용

이후 불필요한 변수들 제거 후 pca로 학습데이터와 같은 형태로 변형 -> 예측 실시 결과 -> 10시를 침수로 예측함

5. 영상 Machine Learning

  1. 영상 파일을 프레임 단위로 분할하여 영상 데이터로 변환
  2. 필요 라이브러리 import
  3. 영상 이미지를 읽어와서 침수 이미지, 비침수 이미지로 리스트 생성
  4. 각각의 원본 이미지들을 CLAHE처리를 통해 화소 전처리된 이미지로 변환후 저장
  5. CLAHE 이미지를 읽어옴
  6. 영상 학습을 위해 ImageDataGenerator를 이용하여 학습,검증 데이터셋 생성
  7. 전이학습을 위해 기존 MobileNetV2를 불러오고, 이진 분류를 위한 Dense층 노드 수 변환
  8. 학습 모델을 생성하여 first_try.h5 파일로 저장
  9. 확인하고 싶은 영상을 입력받고 opencv의 차량 분류 모델인 cars.xmml을 입력받음.
  10. 입력받은 영상의 프레임을 학습 모델에 투입하여 결과치를 영상에 텍스트로 덮어씌움
  11. 수정된 영상 프레임을 곧바로 보여주거나, 저장하여 결과를 확인할 수 있음

6. Web(Django)

6.1 Server

  • Framework : Django

6.2 Database

  • sqlite3

6.3 Frontend

① d3.js

  • 지도 시각화
  • 각 수치별 지도에 표시

② chart.js

  • 부산지역 구단위 정보페이지에서 불투수면 비율 & 침수빈도 막대그래프 표현

③ ETC : Bootstrap, CSS

6.4 pandas

  • pandas 이용하여 sqlite3의 데이터를 dataframe으로 사용
    ex)pd.read_sql_query("SELECT * FROM 테이블명", db)
  • 6.5 주요 기능

    ① 부산지역 구단위 정보

    • URL : ./busanmap/
    • busanmap/map.py > busan_gu_info :부산지역 구단위 정보 페이지 부산 각 구별 불투수면, 펌프, 침수빈도를 그래프와 지도에 표시
    • 부산 각 구별 통계 (불투수면 비율, 침수빈도) 막대그래프 - chart.js 사용
    • 구별 지도 & 불투수면 비율, 침수빈도별 지도 시각화 - d3.js 사용

    ② Simulation 결과 보기

    • URL : ./busanmap/model/
    • busanmap/map.py > simulation_result : 부산지역에서 침수 사고가 있던 7월 23-24일 데이터를 이용하여 그 시간대의 침수위험도를 simulation
    • 2020년 7월 23 - 24일 데이터를 이용하여 예측모델 시뮬레이션

    ③ CCTV 영상 분석

    • URL : ./busanmap/cctv/
    • busanmap/views.py > cctv : cctv 표시
    • 침수되었던 CCTV를 통해 침수예측모델 확인

    ④ 실시간 침수 위험도

    • URL : ./busanmap/apitest/
    • busanmap/map.py > apitest : 실시간 침수 위험도 보기 페이지 실시간으로 기상 데이터를 받아온 뒤 현재시간, +1, 2, 3시간 후의 각 동별 침수 예측
    • 기상청 api를 이용하여 실시간으로 현재 날씨를 가져온 뒤 현재, +1, +2, +3 침수예상 분포 표시

    7. 실행방법

    python 3.7.6으로 돌아가는 가상환경을 구축하여 사용한다.
    가상환경을 만드는 방법은 여럿 존재하나 virtualenv와 conda를 이용한 방법을 제공한다
    conda 환경을 추천한다.

    ( 가상환경 내에 필요한 환경 구축 )

    1. 작업할 폴더 생성 및 폴더로 이동(폴더명 project)
    C:/.... > mkdir project
    C:/.... > cd project
    
    # git clone(프로젝트 파일을 가져온다.), 해당 프로젝트 폴더로 이동
    C:/..../project > git clone https://github.com/pcrmcw0486/dataflood.git
    C:/..../project > cd dataflood
    
    2. 가상환경 설치 - python virtualenv 사용 또는 conda 가상환경 둘 중 하나 사용
     ① python virtualenv 사용
        # virtualenv가 깔려 있지 않은 경우
        C:/..../project/dataflood> pip install virtualenv
    
        # 가상환경 venv 생성 (python version 3.7.6 에 맞추어야함.) => (tesnsorflow를 실행하기 위해)
        C:/..../project/dataflood> virtualenv --python=python3.7.6 venv
        
        # 가상환경 활성화 (in Windows)
        C:/..../dataflood/dataflood> venv\Scripts\activate 
        (venv) C:/..../project/dataflood>
    
     ② conda 가상환경
        (venv) C:/..../project/dataflood>
        # 가상환경 venv 생성 (python version 3.7.6 에 맞추어야함.) => (tesnsorflow를 실행하기 위해)
        C:/..../project/dataflood> conda create -n venv python=3.7.6
            ...
            ...
            Proceed ([y]/n)? y
            
        # 가상환경 활성화
        C:/..../project/dataflood> conda activate venv
    
     
    3. 가상환경 내에 requirements.txt 설치 ( 필요한 라이브러리들을 모아놓은 데이터 )
       다음과 같은 명령어를 사용하여 requirements를 한번에 설치 가능
    (venv) C:/..../project/dataflood> pip install -r requirements.txt
    
    
    4. 홈페이지 확인
       # Web 폴더로 이동 후 django runserver
    (venv) C:/..../project/dataflood> cd Web
    (venv) C:/..../project/dataflood/Web> python manage.py runserver
    Watching for file changes with StatReloader
    Performing system checks...
    
    System check identified no issues (0 silenced).
    September 18, 2020 - 16:19:18
    Django version 3.0.3, using settings 'Web.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CTRL-BREAK.
    
    5. ctrl + c로 django 서버 종료 후 전처리 코드 및 ML 코드보기
    (venv) C:/..../project/dataflood/Web> cd ..
    (venv) C:/..../project/dataflood> jupyter lab 또는 jupyter notebook
    

    URL : http://127.0.0.1:8000/

    -----------------필독-----------------

    각 페이지 별로 지도 위에 있는 circle을 클릭함으로써 해당 정보를 지도에 표시

    • 부산지역 구단위 정보 : 왼쪽에 있는 막대 그래프 위의 각 정보를 클릭할 때 그에 관한 내용을 막대그래프로 표시 지도위의 circle을 누르면 각각 불투수면, 펌프비, 침수빈도를 지도위에 표시.

    • Simulation 결과 보기 : 침수피해가 일어났던 2020년 7월 23일-24일 3시까지의 데이터를 이용하여 모델 시뮬레이션 결과를 추출, 각 시간이 표시된 circle을 눌렀을 때, 그 시간의 침수 예상 지역을 지도에 표시

    • 실시간 침수 위험도 보기 : 실시간 api를 이용하여, 현재 강우량을 받아와서 모델에 삽입하여 현재, +1, +2, +3 시간 뒤의 침수 예상 지역을 지도에 표시

    About

    datacampus

    Resources

    Stars

    Watchers

    Forks

    Releases

    No releases published

    Packages

    No packages published

    Contributors 2

    •  
    •  

    Languages