9장 컴퓨터 비전을 위한 고급 딥러닝 1부

감사말: 프랑소와 숄레의 Deep Learning with Python, Second Edition 9장에 사용된 코드에 대한 설명을 담고 있으며 텐서플로우 2.6 버전에서 작성되었습니다. 소스코드를 공개한 저자에게 감사드립니다.

tensorflow 버전과 GPU 확인

주요 내용

9.1 컴퓨터 비전 분야 세 가지 주요 과제

컴퓨터 비전 분야에서 가장 주요한 연구 주제는 다음 세 가지이다.

그림 출처: Deep Learning with Python(Manning MEAP)

언급된 3 분야 이외에 아래 컴퓨터 비전 분야에서도 딥러닝이 중요하게 활용된다.

하지만 객체 탐지를 포함해서 언급된 분야 모두 기초 수준을 넘어서기에 여기서는 다루지 않는다. 다만 객체 탐지 관련해서 다음 논문을 참고할 것을 권유한다.

아래에서는 이미지 분할을 예제를 활용하여 좀 더 상세하게 설명한다.

9.2 이미지 분할 예제

이미지 분할 방식

이미지 분할은 크게 두 종류 방식을 사용한다.

그림 출처: Deep Learning with Python(Manning MEAP)

여기서는 고양이와 강아지 사진을 이용하여 시맨틱 분할을 상세히 살펴본다.

Oxford-IIIT 애완동물 데이터셋

Oxford-IIIT 애완동물 데이터셋은 강아지와 고양이를 비롯해서 37종의 애완동물의 다양한 크기와 다양한 자세를 담은 7,390장의 사진으로 구성된다.

트라이맵 분할 마스크는 원본 사진과 동일한 크기의 흑백 사진이며 각각의 픽셀은 1, 2, 3 셋 중에 하나의 값을 갖는다.

그림 출처: Oxford-IIIT 애완동물 데이터셋

데이터셋 다운로드

wget을 이용하여 사진과 레이블(annotation) 데이터셋을 다운로드한 후에 압축을 푼다.

그러면 images와 annotations 디렉토리가 생성된다.

annotations/
...trimaps/             # 트라이맵 분할 마스크(png 파일)
...xmls/
...README/
...list.txt/
...test.txt/
...trainval.txt/
images/                 # 훈련 이미지 데이터셋(jpg 파일)

전처리

데이터 변환

아래 코드는 입력 데이터로 사용될 이미지와 레이블을 넘파이 어레이로 변환하기 위해 파일들의 경로를 지정한다.

10번째 이미지(9번 인덱스)를 확인해보자.

10번째 이미지에 대한 트라이맵 분할 마스크를 3차원 어레이로 불러오면 다음과 같다.

이미지의 모양은 (333, 500, 1)이다.

201번째 행의 트라이맵 값을 확인하면 다음과 같이 리스트 양 끝은 2로, 중앙 부분은 1로, 고양이 외곽 부분은 3으로 채워져 있다.

10번째 이미지의 트라이맵 분할 마스크를 사진으로 확인하면 다음과 같다. display_target() 함수는 1, 2, 3으로만 구성된 이미지를 흑백사진으로 적합한 값으로 변환한다.

여기서는 트라이맵 분할 마스크를 시각화하기 위해 사용할 뿐이며 모델 훈련에는 활용하지 않는다.

아래 코드에 정의되는 두 함수는 각각의 이미지 파일과 레이블을 지정된 크기의 3차원 어레이로 변환시킨다. 단, 훈련을 위해 이미지와 레이블을 무작위로 섞는다. 물론 동일한 시드(seed)를 이용해야 훈련 이미지와 레이블이 동일한 순서대로 섞이게 된다.

데이터셋이 매우 작기에 모든 이미지와 레이블을 변환하여 하나의 4차원 어레이로 구현된 이미지 데이터셋과 타깃셋을 생성할 수 있다.

훈련셋과 검증셋 지정

1,000개의 검증셋과 나머지로 구성된 훈련셋으로 분리한다.

이미지 분할 모델 훈련

모델 구성

이미지 분할 모델의 구성은 기본적으로 Conv2D 층으로 구성된 다운샘플링 블록(downsampling block)과 Conv2DTranspose 층으로 구성된 업샘플링 블록(upsampling block)으로 이루어진다.

참고: 이미지 분류의 경우와는 달리 맥스풀링을 사용하는 대신 Conv2D 층에서 보폭을 2로 설정하는 이유는 픽셀에 담긴 값(정보) 뿐만 아니라 각 픽셀의 위치도 중요하기 때문이다. 맥스풀링은 이와는 달리 위치와 독립적인 패턴을 알아내는 것이 중요할 때 사용한다.

모델 컴파일과 훈련은 특별한 게 없다.

훈련 결과를 그래프로 시각화해서 보면 과대적합이 25 에퍼크 정도에서 발생함을 확인할 수 있다.

훈련중 저장된 최고 성능의 모델을 불러와서 이미지 분할을 어떻게 진행했는지 하나의 이미지에 대해 테스트해보면 원본 이미지에 포함된 다른 요소들 때문에 약간의 잡음이 있지만 대략적으로 이미지 분할을 잘 적용함을 알 수 있다.

테스트 이미지에 대한 이미지 트라이맵 분할 마스크를 이미지로 재현하면 다음과 같다.