- 심층학습 기반 영상 패턴 추출 기술 개발
- K-최근접 이웃그래프 기반 검색 기술 개발
- 심층학습 기반 초단기 영상 예측 기술 개발
- 비지도 학습 기반 이상 탐지 기술 개발
- 유사 벡터 탐색의 높은 정확도 (유사도 지표 기준 0.80 이상)
- 실시간 검색 기능
- 방대한 양의 누적된 데이터에서 실시간으로 유사사례 검색 가능
- 유사 사례 참고를 통한 예보 품질 향상
- 실시간 영상 패턴 인식 및 위험 기상 사전 탐지 가능
COMS 위성에서 4개의 다른 채널이 보여주는 이미지 예시
모든 위성 데이터에 대해 살펴본 결과를 다음과 같이 정리함.
위성 | 파일 크기 | 기간 | 채널 종류 | 관측 주기 | 이미지 크기 | 이미지 해상도 (직접 분석) | 이미지파일 형태 |
---|---|---|---|---|---|---|---|
COMS | 2,021GB | 2010-2020 | 5 | 15분 | (1300,1500,3) | 4km (4km) | png |
GK2A | 3,449GB | 2017-2021 | 16 | 10분 | (1332,1500,3) | 2km (4km) | png |
GMS5 | 17GB | 1991-2003 | 3 | 3시간 | (512,512,4) | 1.25km (1km) | gif |
Himawari | 5,876GB | 2015-2021 | 14 | 10분 | (1300,1500,3) | 0.5~2km (4km) | png |
MTSAT1R | 64GB | 2010-2014 | 4 | 15분-1시간 | (1300,1500,3) | 4km (4km) | png |
MTSAT2 | 445GB | 2010-2015 | 4 | 15분-1시간 | (1300,1500,3) | 4km (4km) | png |
전체 데이터셋은 링크에서 다운로드 가능함.
COMS 위성 이미지 파일을 예시로, 데이터셋 분석을 위한 코드를 제공함 (jupyternotebook).
- 유효한 이미지 분포 파악
- 관측 주기에 관한 분포 분석
- 6시간 길이의 비디오를 구성하기에 적절한 이미지 개수 분석
- 이미지를 N x N 격자로 분할.
- 각 격자 내의 픽셀 값을 B개의 구간으로 나누어진 분포료 표현.
- 격자 간의 (1 - D-statistic) 계산하여 유사도 측정.
- 격자 간의 유사도 평균으로 이미지 간의 유사도 측정.
- 이미지 간의 유사도 평균으로 영상 간의 유사도 측정.
- (왼쪽) 2012년 10월 03일 18시 15분 / (가운데) 2012년 10월 03일 16시 00분 / (오른쪽) 2012년 11월 27일 16시 30분
- 왼쪽과 가운데의 유사도 = 0.807
- 왼쪽과 오른쪽의 유사도 = 0.354
- ground_truth 폴더에 있는 3개의 예시 영상 video_1, video_2, video_3 참고
- 격자 개수(N)과 픽셀 분포의 구간 개수(B)를 다음과 같이 설정하여, 다음과 같이 main.cpp C++ 코드를 컴파일 및 실행:
컴파일: g++ -o run main.cpp
실행 : ./run [Video1의 경로] [Video2의 경로] [격자개수 N] [분포구간개수 B]
- 실행 예시:
입력: ./run video_1 video_2 24 20
출력: 0.807409
입력: ./run video_1 video_3 24 20
출력: 0.354187
- 이미지 너비 및 높이 모두 300 픽셀 이상이 되는 최소한의 크기로 줄임.
- 줄이고자 하는 이미지를 rawdatapath 로 지정한 뒤, 줄여진 이미지를 저장할 폴더를 outputpath로 지정하여 줄일 수 있는 코드를 제공함 (jupyternotebook).
- 예시로, Raw Image 를 줄여 Reduced Image 로 저장함.
- 비디오를 구성하는 이미지 개수를 20개로 통일하게 위해 무작위 선택을 적용함.
- 예시로, RawImages 폴더에 있는 이미지로 6시간 길이의 비디오를 생성하는 방식의 코드를 제공함 (jupyternotebook).
- 이미지 간의 유사도가 다차원 영상 벡터 간의 유사도에서 유지되도록 학습
- 모델 구조는 다음과 같이 설계:
- 각 채널 이미지를 flatten하여 112,500차원 벡터로 표현.
- 채널별로 독립적인 인코더를 통과하여 32차원 벡터로 표현.
- 채널별 벡터를 concatenate하여 이미지를 128차원 벡터로 표현.
- 20개의 이미지를 mean하여 영상을 128차원 벡터로 표현.
- 손실함수로는 Log-Ratio Loss 활용
- 2013년 1월 1일 00시 00분부터 2013년 1월 7일 23시 45분까지의 전처리된 567개의 영상
- 이미지를 구글 드라이브에서 다운로드하여 sample_code에 옮긴 후 압축해제:
unzip images.zip
- i-번째 이미지는
images/image_[i]
에 폴더에 저장됨.
- 각 영상을 구성하는 20장의 이미지 (video2image.txt):
예시:
19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,38,39,40
20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40
21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
- 567개의 영상을 20:20:60의 비율로 나눈 학습 데이터 (train.txt), 검증 데이터 (valid.txt), 평가 데이터 (test.txt)
- 각 데이터는 다음과 같이 표기:
[영상 1]<tab>[영상 2]<tab>[영상 3]<tab>[영상 1과 영상 2의 유사도]<tab>[영상 1과 영상 3의 유사도]
예시:
350 347 383 0.891016 0.541287
498 499 95 0.954669 0.439012
80 84 81 0.832623 0.925232
-
실행 방법: sample_code 폴더에 있는 main.py를 실행
- 실행 방법:
python main.py --epochs [학습횟수] --dim [벡터 차원] --learning_rate [학습률] --batch_size [배치 크기] --video_size [영상 길이] --log_path [로그 저장로] --gpu [GPU 번호] --N [격자 개수] --B [분포구간 개수]
- 실행 예시:
python main.py --epochs 100 --dim 128 --learning_rate 1e-5 --batch_size 32 --video_size 20 --log_path log.txt --gpu 0 --N 24 --B 20
-
실행 결과
- 결과 1: 로그 저장로에 다음과 같이 학습 추이 기록
기록 예시: epoch 1 loss 0.6586444973945618 runtime 5.312704086303711 epoch 2 loss 0.2081376053392887 runtime 4.766304016113281
- 결과 2: models 폴더에 학습된 모델 저장
모델 로드 예시: trained_model = torch.load(os.path.join('models', 'model_ep_100.pt'))
- 학습에 따른 손실 (loss) 변화
- 영상 간의 유사도와 벡터 간의 거리 간의 연관도 (Pearson Correlation)
- (왼쪽) 학습에 활용한 영상의 쌍의 연관도 = -0.975
- (오른쪽) 학습에 활용하지 않은 영상의 쌍의 연관도 = -0.955
- 평가 코드를 참고