데이터청년 캠퍼스 부산대학교 프로젝트
2020년 07월 발생한 초량 제1지하차도 침수사건으로 인명피해가 발생하였다
이에 Data Flood 팀은 침수를 예측해보고자 하였다.
예측 방법은 거시적으로 강수량, 지형 정보, 펌프 및 불투수면, 침수 이력을 통해
캠퍼스 기간 동안 학습한 머신러닝을 통해 예측해보고자 하였고
미시적으로 cctv 영상을 학습시켜 확실하게 실시간으로 예측하고자 하였다
두 방법은 서로 상호보완적으로 침수 예방에 도움을 줄 수 있을 것이다.
데이터 수집 및 전처리 과정과 학습 방법 그리고 웹(django)에 대해 설명.
실행방법은 7.실행방법참조
python 3.7.6 가상환경 virtualenv 20.0.31
https://github.com/pcrmcw0486/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 코드
모델 학습에 필요한 데이터 수집은 아래의 주소에서 다운 받아 편의상 이름을 변경하여 사용하였다. 해당 데이터들은 Data/raw_data 에 저장한다.
- 부산 코드 https://www.code.go.kr/stdcode/regCodeL.do 접속 > 부산 조회 후 다운로드 법정동코드 조회자료.zip → busan_code_data.xls
-
침수흔적정보 : 태풍,호우,해일 등으로 인한 침수발생일시, 면적 등 침수지역에 대한 정보 https://www.data.go.kr/data/15048634/fileData.do FL_DATAUPMNG.csv
-
침수흔적정보_기상별 강우량 FL_DATAUPMNG에 침수된 위치에 따른 침수 기간 동안의 기상별 강우량(시간별) https://www.data.go.kr/data/15048637/fileData.do FL_TIMERAIN.csv
-
불투수면 비율(환경부)) http://egis.me.go.kr/atlas/view.do?id=64§ion=02&pageNo=13&keyword= 불투수면 비율.xlsx(전국 데이터) → imper_ratio_data.xlsx
-
API_xycode.csv https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15057682 초단기예보조회를 사용 기상청18_동네예보 조회서비스_오픈API활용가이드_격자_위경도(20200706) → API_xycode.xlsx
-
simulation_rain.csv 모델 학습 이후 초량 제1지하차도 침수사건 당일의 침수를 예측하기 위해 해당 날짜의 강수량 데이터를 수집 기상청 데이터를 통해 수작업
전처리 과정 및 데이터 flow의 개요는 다음과 같다 위의 Raw, Processing Data( 1st, 2nd ) , Final Data( DB, training, model ) 각각 파일명이며 자세한 내용은 1을 참조한다.
전처리 : 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를 생성한다.
각각 주피터파일을 통해 전처리과정 순서대로 진행되어 파일이 생성되며, (단, QGIS로 생성된 busan_flood_geo 와 busan_Uflood_geo, busan_rain_data_mod는 제외) 마지막에 도착한
Final data 폴더에 사용 용도에 따라 저장된다.
training_data : 모델 학습을 위해 사용
DB : 이후 Web 파트에서 데이터베이스를 위해 사용
model : Web또는 추후 사용을 위해 모델을 따로 저장
- 먼저 필요한 라이브러리를 모두 import 해줌
- 분류모델이기에 독립변수로 사용할 데이터와 종속변수를 구분해서 나눠줌.
- minmaxscaler 를 이용해 data를 0~1의 값으로 전환 -> 데이터 특성상 이상치를 제거해서 사용해서는 안됨
- 주성분 분석(PCA)를 통해 중요 주성분(4개)를 선택 학습에 사용하기위해 4개의 차원으로 줄인 데이터로 변형
- 데이터를 train 과 test 로 구분 8 : 2 비율로 나눠줌
- bayesianoptimization 을 이용해 사용할 모델들의 최적값을 탐색함 -> 사용된 모델 KNN, SVM, DT, RF 각 모델들에 사용되는 옵션의 최적 조합을 탐색
- 찾아낸 최적의 조합으로 모델을 만들고 voting 앙상블을 통해 그 모델들을 묶어서 사용함 -> voting 앙상블의 경우 soft 옵션을 사용함 각 모델들에서 나오는 1일 확률과 0일 확률을 종합해서 결과를 냄 -> 한 모델의 정확도가 떨어져도 다른 모델들과의 확률 계산을 통해 결과를 도출함
- 데이터를 학습하고 교차검증을 다시 한번 실시하여 각 모델들의 성능을 평가함 -> f1_score 를 확인
- 교차검증을 통해 나온 결과를 보기 쉽게 하기위해 boxplot 으로 시각화함
- 위에서 구분한 test 데이터에 대한 예측 정확도를 확인함 -> 0.7정도로 train 데이터와 유사하게 나옴
- 실제 사고사례를 예측할 수 있는지 확인하기 위해 초량동 데이터를 사용함 -> 전처리 과정에서 사용한 가중치를 초량동 데이터에도 적용
이후 불필요한 변수들 제거 후 pca로 학습데이터와 같은 형태로 변형 -> 예측 실시 결과 -> 10시를 침수로 예측함
- 영상 파일을 프레임 단위로 분할하여 영상 데이터로 변환
- 필요 라이브러리 import
- 영상 이미지를 읽어와서 침수 이미지, 비침수 이미지로 리스트 생성
- 각각의 원본 이미지들을 CLAHE처리를 통해 화소 전처리된 이미지로 변환후 저장
- CLAHE 이미지를 읽어옴
- 영상 학습을 위해 ImageDataGenerator를 이용하여 학습,검증 데이터셋 생성
- 전이학습을 위해 기존 MobileNetV2를 불러오고, 이진 분류를 위한 Dense층 노드 수 변환
- 학습 모델을 생성하여 first_try.h5 파일로 저장
- 확인하고 싶은 영상을 입력받고 opencv의 차량 분류 모델인 cars.xmml을 입력받음.
- 입력받은 영상의 프레임을 학습 모델에 투입하여 결과치를 영상에 텍스트로 덮어씌움
- 수정된 영상 프레임을 곧바로 보여주거나, 저장하여 결과를 확인할 수 있음
- Framework : Django
- sqlite3
- 지도 시각화
- 각 수치별 지도에 표시
- 부산지역 구단위 정보페이지에서 불투수면 비율 & 침수빈도 막대그래프 표현
ex)pd.read_sql_query("SELECT * FROM 테이블명", db)
- URL : ./busanmap/
- busanmap/map.py > busan_gu_info :부산지역 구단위 정보 페이지 부산 각 구별 불투수면, 펌프, 침수빈도를 그래프와 지도에 표시
- 부산 각 구별 통계 (불투수면 비율, 침수빈도) 막대그래프 - chart.js 사용
- 구별 지도 & 불투수면 비율, 침수빈도별 지도 시각화 - d3.js 사용
- URL : ./busanmap/model/
- busanmap/map.py > simulation_result : 부산지역에서 침수 사고가 있던 7월 23-24일 데이터를 이용하여 그 시간대의 침수위험도를 simulation
- 2020년 7월 23 - 24일 데이터를 이용하여 예측모델 시뮬레이션
- URL : ./busanmap/cctv/
- busanmap/views.py > cctv : cctv 표시
- 침수되었던 CCTV를 통해 침수예측모델 확인
- URL : ./busanmap/apitest/
- busanmap/map.py > apitest : 실시간 침수 위험도 보기 페이지 실시간으로 기상 데이터를 받아온 뒤 현재시간, +1, 2, 3시간 후의 각 동별 침수 예측
- 기상청 api를 이용하여 실시간으로 현재 날씨를 가져온 뒤 현재, +1, +2, +3 침수예상 분포 표시
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 시간 뒤의 침수 예상 지역을 지도에 표시


