1. 들어가며
- 이번 시간에는 Sementic Segmentation (시맨틱 세그멘테이션)을 이용해서 자율주행차량이 주행해야 할 도로 영역을 찾는 상황을 가정하고 모델을 만들어보는 시간은 갖는다.
- 이전 노드에서는 Semantic Segmentation을 위한 다양한 모델을 배웠다.
- 이번 시간에는 U-Net을 사용해 이미지가 입력되면 도로의 영역을 Segmentation 하는 모델을 만들어보겠다.
2. 시맨틱 세그멘테이션 데이터셋
- 이미지, 데이터 가져오기
1) 먼저 시맨틱 세그멘테이션(semantic segmentation)으로 도로의 영역을 분리하기 위해서는 도로의 영역을 라벨로 가진 데이터셋을 가지고 학습할 수 있도록 파싱해야 한다.
2) 물체 검출(object detection)으로 사용했던 KITTI 데이터셋의 세그멘테이션 데이터를 다운로드 하자.
3) 지금까지 보던 라벨 데이터와 다르게 세그멘테이션 데이터는 이미지 형태의 라벨로 되어있다.
- 데이터 로더(data loader) 만들기
1) 이제 이미지와 데이터셋이 주어졌으니 모델을 학습시킬 수 있는 데이터 로더(data loader)를 만든다.
2) 로더는 입력값 (224, 224), 출력값(224, 224) 크기를 갖는 모델을 학습시킬 수 있도록 데이터셋을 파싱해야 한다.
3) 이 때 데이터 로더에 augmentation을 적용해보자.
4) 오늘은 파이썬에서 많이 사용되는 albumentations을 사용했다.
5) 하지만 Augmentation의 경우 imgaug 등 다른 라이브러리를 활용해도 된다.
6) 또한 학습셋의 일정량을 검증 데이터셋(validation dataset)으로 활용할 수 있도록 해야 한다.
7) 만든 후에는 직접 데이터셋이 잘 파싱되어 나오는지 꼭 확인해보자.
8) 데이터셋에 오류가 없어야 성능이 안 나오더라도 문제를 찾아내기 쉽다.
- 해당 내용은 코드로 실습했다.
3. 시맨틱 세그멘테이션 모델
- 모델 구조 만들기
1) 시맨틱 세그멘테이션을 위한 모델을 만들어보자.
2) 세그멘테이션 모델 중 구조상 비교적 구현이 단순한 U-Net을 구현해 본다.
3) 이 때 입력 이미지의 크기는 위에서 만든 데이터셋에 맞춰서 만들어야 한다.
4) 사용에 필요한 레이어와 연산은 아래와 같다. 그리고 필요에 따라서 Dropout 등의 다른 레이어를 적용해보자.
(1) Conv2D, UpSampling2D, MaxPooling2D, concatenate
5) 코드 실습을 통해서 구현했다.
- 모델 학습하기
1) 이제 모델을 만들었으니 위에서 만들어본 데이터셋과 학습을 해보자.
2) 적절한 learning rate와 epoch를 찾아서 모델을 학습하고 저장한다.
3) 코드 실습을 통해서 구현했다.
4. 시맨틱 세그멘테이션 모델 시각화
- 이번에는 학습한 모델의 결과를 눈으로 확인해볼 차례이다.
- 테스트 셋은 이미지를 제공하지만 정답 데이터를 제공하지 않으니 눈으로 확인할 수 있도록 모델이 추론(inference)한 결과를 우리의 눈으로 볼 수 있는 세그멘테이션 이미지로 만들어주자.
- 이 때 입력 이미지와 라벨을 한번에 볼 수 있도록 모델의 출력값을 입력 이미지 위에 곂쳐 보이기, 즉 오버레이(overray) 해주자.
- PIL패키지를 사용한다면 Image의 blend를 활용할 수 있다.
- 세그멘테이션이 성능을 정량적으로 측정하기 위한 방법으로 IoU(Intersection over Union)를 계산하게 된다.
- IoU를 계산하는 방법은 지난 시간에 소개한 바 있으므로 해당 내용을 활용하여 구현했다.
- IoU를 계산하려면 모델이 도로 영역이라고 판단한 부분이 1로, 나머지 부분이 0으로 표시된 행렬, 그리고 라벨 데이터에서 도로 영역이 1, 나머지 부분이 0으로 표시된 행렬이 필요하다.
- 각각을 prediction, target이라고 불렀을 때 이를 계산하는 함수를 구현했다.
- 방금 코드로 구현했던 get_output을 좀 더 확장해서 output, prediction, target을 함께 리턴하도록 구현했다.
- 코드 실습을 통해 시각화했다.
5. 프로젝트 : 개선된 U-Net 모델 만들기
- U-Net을 통한 시맨틱 세그멘테이션 결과가 괜찮았다.
- 어느정도 동작하는 것 같긴 하지만 좀 더 개선할 여지도 보인다.
- 2018년에 U-Net++이라는 논문이 나왔다.
- 이 논문은 기존에 아주 단순하면서도 세그멘테이션에서 효과를 발휘했던 U-Net의 네트워크 구조에 DenseNet의 아이디어를 가미하여 성능을 개선한 모델이다.
- 그래서 모델의 구조 자체는 아래 그림에서 보는 것처럼 별다른 설명이 없이도 직관적으로 이해 가능한 수준이다.
- 오늘 소개했던 U-Net의 모델 코드를 조금 수정 확장하면 충분히 구현이 가능하다고 한다.
- 그래서 오늘의 과제가 U-Net++모델을 스스로 구현해보고, U-Net을 활용했던 도로 세그멘테이션 태스크에 적용하여 U-Net을 썼을 때보다 성능이 향상되었음을 확인해 보는 것이다.
- 정성적으로는 두 모델의 세그멘테이션 결과를 시각화해서 비교해 볼 수 있고, 정량적으로는 동일 이미지에 대한 IoU값을 비교해보면 될 것이다.
'공부 > AIFFEL' 카테고리의 다른 글
Going Deeper(CV)_DJ 10 : 나를 찾아줘 - Class Activation Map 만들기 (0) | 2021.04.20 |
---|---|
Going Deeper(CV)_DJ 9 : 너의 속이 궁금해 - Class Activation Map 살펴보기 (1) | 2021.04.19 |
Going Deeper(CV)_DJ 7 : 물체를 분리하자! - 세그멘테이션 살펴보기 (0) | 2021.04.15 |
Going Deeper(CV)_DJ 6 : GO/STOP! - Object Detection 시스템 만들기 (0) | 2021.04.13 |
Going Deeper(CV)_DJ 4 : 이미지 어디까지 우려볼까? (0) | 2021.04.13 |