Image Segmentation(이미지 분할)
- 이미지 분할을 위해 이미지를 픽셀 단위의 마스크를 정보를 출력하도록 신경망을 훈련시킬 것이다.
- 이미지 분할은 의료 영상, 자율 주행차, 보안, 위성, 항공사진 등의 분야에서 응용되고 있다.
- 가장 전통적인 방식의 이미지 분할을 FCN이라고 하여 고양이 그림이 있는 형태로 구성되며, 비교적 최근에 개발된 Unet 이후에는 대부분 Unet이 이미지 분할에서 사용된다.
- 튜토리얼 사용 데이터셋: Oxford-IIIT Pet Dataset
- class 1 : 애완동물이 속한 픽셀
- class 2 : 애완동물과 인접한 픽셀
- class 3 : 위에 속하지 않는 경우/주변 픽셀
1 |
|
Download Dataset
1 |
|
모델 정의
- 사용하는 모델은 수정된 Unet이다.
- Unet은 인코더(Down Sampler)와 디코더(Up Sampler)를 포함한다.
- 강력한 기능을 학습하고 훈련 가능한 매개변수의 수를 줄이기 위해 미리 훈련된 모델을 인코더로 사용할 수 있다.
- 이번 튜토리얼의 인코더는 미리 훈룐된 MobileNetV2 모델이 될 것이며 이 모델의 중간 출력이 사용될 것이다.
- 디코더는 Pix2pix 튜토리얼의 TF 예제에서 이미 구현한 업샘플 블록이 될 것이다.
- 3개의 채널을 출력하는 이유는 픽셀당 3개의 가능한 라벨이 있기 때문이다.
- 이것을 각 화소가 세 개의 class로 분류되는 다중 분류로 생각하면 된다.
1 |
|
- 인코더는 모델의 중간층에서 나오는 특정 출력으로 구성된다.
- 인코더는 교육 과정 중에 학습되지 않는다.
1 |
|
모델 훈련
- 여기서 사용되고 있는 손실 함수는 loss.sparse_categorical_crossentropy이다.
- 이 손실 함수를 사용하는 이유는 네트워크가 멀티 클래스 예측과 마찬가지로 픽셀마다 레이블을 할당하려고 하기 때문이다.
- 실제 분할 마스크에서 각 픽셀은 0, 1, 2를 갖고 있다.
- 이 곳의 네트워크는 세 개의 채널을 출력하고 있다.
- 기본적으로 각 채널은 클래스를 예측하는 방법을 배우려고 하고 있으며, 위 손실 함수는 그러한 시나리오에 권장되는 손실이다.
- 네트워크의 출력을 사용하여 픽셀에 할당된 레이블은 가장 높은 값을 가진 채널이다.
- 이 것이 create_mask 함수가 하는 일이다.
1 |
|
1 |
|
1 |
|
1 |
|
예측
- 시간을 절약하기 위해 에포크 수를 작게 유지했지만, 보다 정확한 결과를 얻기 위해 에포크를 더 높게 설정할 수 있다.
1 |
|
Reference
Data Augmentation(데이터 증강)
- 이 튜토리얼에서는 이미지 회전과 같은 무작위 변환을 적용하여 훈련 세트의 다양성을 증가시키는 기술인 데이터 증강의 예를 보여준다.
- 두가지 방법으로 데이터 증강을 적용한다.
- 먼저, Keras 전처리 레이어를 사용하고, 그 다음으로 tf.image를 사용한다.
1 |
|
Download Dataset
- 이 튜토리얼에서는 tf_flowers 데이터셋을 사용한다.
- 편의를 위해 TensorFlow Datasets를 사용하여 데이터셋을 다운로드한다.
- 데이터를 가져오는 다른 방법: 이미지 로드
1 |
|
Keras 전처리 레이어 사용
- Keras 전처리 레이어는 현재 실험적 단계이다.
크기 및 배율 조정
1 |
|
- 위의 배율 조정 레이어는 픽셀 값을
[0,1]
로 표준화한다. - 그렇지 않고
[-1,1]
을 원할 경우,Rescaling(1./127.5, offset=-1)
을 작성하면 된다.
1 |
|
1 |
|
데이터 증강
- 데이터 증강에도 전처리 레이어를 사용할 수 있다.
- 몇 개의 전처리 레이어를 만들어 동일한 이미지에 반복적으로 적용한다.
1 |
|
layers.RandomContrast
,layers.RandomCrop
,layers.RandomZoom
등 데이터 증강에 사용할 수 있는 다양한 전처리 레이어가 있다.
전처리 레이어 두 가지 옵션
1. 전처리 레이어를 모델의 일부로 만들기
1 |
|
- 유의해야 할 두가지 중요한 사항
- 데이터 증강은 나머지 레이어와 동기적으로 기기에서 실행되며 GPU 가속을 이용한다.
model.save
를 사용하여 모델을 내보낼 때 전처리 레이어가 모델의 나머지 부분과 함께 저장된다. 나중에 이 모델을 배포하면 레이어 구성에 따라 이미지가 자동으로 표준화된다. 이를 통해 서버측 논리를 다시 구현해야 하는 노력을 덜 수 있다.
- 데이터 증강은 테스트할 때 비활성화 되므로 입력 이미지는
model.fit
호출 중에만 증강된다.
2. 데이터 세트에 전처리 레이어 적용
1 |
|
- 이 접근 방식에서는
Dataset.map
을 사용하여 증강 이미지 배치를 생성하는 데이터셋을 만든다.- 데이터 증강은 CPU에서 비동기적으로 이루어지며 차단되지 않는다.
Dataset.prefech
를 사용하여 GPU에서 모델 훈련을 데이터 전처리와 중첩할 수 있다.- 이 경우, 전처리 레이어는
model.save
를 호출할 때 모델과 함께 내보내지지 않는다. - 저장하기 전에 이 레이어를 모델에 연결하거나 서버측에서 다시 구현해야 한다.
전처리 레이어 적용
- 위에서 생성한 전처리 레이어로 훈련, 검증 및 테스트 데이터셋을 구성한다.
- 병렬 읽기 및 버퍼링된 프리패치를 사용하여 I/O 차단 없이 디스크에서 배치를 생성하여 성능을 높이도록 데이터셋을 구성한다.
- 데이터 증강은 훈련 세트에만 적용해야 한다.
1 |
|
모델 훈련
1 |
|
사용자 정의 데이터 증강
1 |
|
1 |
|
tf.image 사용
- 위
layers.preprocessing
유틸리티는 편리하다. - 보다 세밀한 제어를 위해
tf.data
및tf.image
를 사용하여 고유한 데이터 증강 파이프라인 또는 레이어를 작성할 수 있다. - TensorFlow 애드온 이미지: 작업, TensorFlow I/O: 색 공간 변환
1 |
|
1 |
|
데이터 증강
이미지 뒤집기
1 |
|
이미지 회색조
1 |
|
이미지 포화
1 |
|
이미지 밝게 변경
1 |
|
이미지 중앙 자르기
1 |
|
이미지 회전
1 |
|
데이터셋에 증강 적용
1 |
|
Object Recognition(객채 인식)
- 사전 학습된 이미지 분류 신경망을 사용하여 다중 객체를 검출한다.
- CNN의 가운데 레이어 출력 결과인 피쳐 맵 위에 슬라이딩 윈도우를 올린다.
- 사전 학습된 신경망은 해당 이미지의 클래스를 반환한다.
- 만약 이미지에서 서로 다른 객체가 검출되면 확률값을 둘로 쪼개서 반환한다.
- 하나의 객체만 나오더라도 충분한 확률값이 아니면 분할하여 반환한다.
- 다중객체를 찾는 방법의 하나는 이미지 위에 슬라이딩 윈도우를 올리고 윈도우 내에서 단일 객체 검출을 시도하는 것이다.
- 이미지를 224 * 224로 다운 샘플링하는 대신에 원본을 두배로 올려 448 * 448로 샘플링한다.
- 그 다음 crop된 이미지를 만들어 분류기에 넣는다.
1 |
|
1 |
|
1 |
|
1 |
|
- 여러 이미지에서 개나 고양이가 검출됐다.
- 그러나 여러개의 품종으로 검출된 것을 볼 수 있다.
- 여러개의 레이블 중 가장 높은 확률의 이미지를 찾는 것을 실행해보자.
1 |
|
1 |
|
1 |
|
- bottom_model을 이용한 output을 crop하여 입력으로 사용한다.
- 이렇게 하면 수행횟수가 64번에서 4번으로 크게 줄어든다.
- 먼저 bottom_model에 이미지를 입력하여 그 결과를 bottom_out에 저장한다.
1 |
|
1 |
|
Review
Semantic Segmentation
컴퓨터 비전에서 가장 많이 다뤄지는 문제들
Classification (분류)
- 인풋에 대해서 하나의 레이블을 예측하는 작업이다.
- AlexNet, ResNet, Xception 등의 모델이 있다.
Localization/Detection (발견)
- 물체의 레이블을 예측하면서 그 물체가 어디에 있는지 정보를 제공한다.
- 물체가 있는 곳에 네모를 그린다.
- YOLO, R-CNN 등의 모델이 있다.
Segmentation (분할)
- 모든 픽셀의 레이블을 예측한다.
- FCN, SegNet, DeepLab 등의 모델이 있다.
Semantic Segmentation 이란?
- 컴퓨터 비젼 분야에서 가장 핵심적인 분야 중 하나다.
- 단순히 사진을 보고 분류하는 것에 그치지 않고 그 장면을 완벽하게 이해해야 하는 높은 수준의 문제이다.
- 사진에 있는 모든 픽셀을 해당하는 class로 분류하는 것이다.
- 이미지으 모든 픽셀에 대한 예측을 하는 것이기 때문에 dense prediction이라고도 불린다.
- 같은 class의 instance를 구별하지 않는다.
Semantic Segmentation Task
Input
RGB color 이미지 (height X width X 3) 또는 흑백 (height X width X 1) 이미지
Output
각 필셀별 어느 class 에 속하는지 나타내는 레이블을 나타낸 Segmentation Map
다운샘플링(Down-sampling)과 업샘플링(Up-sampling)
- AlexNet, VGG 등 분류에 자주 쓰이는 깊은 신경망은 Semantic Segmentation을 하는데 적합하지 않다.
- 이런 모델은 parameter의 개수와 차원을 줄이는 layer를 가지고 있어서 자세한 위치 정보를 잃게 된다.
- 만약 공간에 대한 정보를 잃지 않기 위해 pooling과 fully conn layer를 없애고 striderk 1이고 padding도 일정한 convolution을 진행할 수도 있을 것이다.
- 인풋의 차원은 보존하겠지만 parameter의 개수가 많아져서 메모리 문제나 계산 비용이 너무 많이 들어서 현실적으로 불가능할 것이다.
- 이 문제의 중간점을 찾기 위해 보통 Semantic Segmentation 모델은 보통 Downsampling & Upsampling의 형태를 갖고 있다.
- Downsampling 하는 부분을 인코더, Upsampling 하는 과정을 디코더이라고 부른다.
Downsampling
- 주 목적은 차원을 줄여서 적은 메모리로 깊은 Convolution 을 할 수 있게 하는 것이다.
- 보통 stride 를 2 이상으로 하는 Convolution 을 사용하거나, pooling을 사용한다.
- 이 과정을 진행하면 어쩔 수 없이 feature 의 정보를 잃게된다.
- 마지막에 Fully-Connected Layer를 넣지 않고, Fully Connected Network 를 주로 사용한다.
- FCN 모델에서 위와같은 방법을 제시한 후 이후에 나온 대부분의 모델들에서 사용하는 방법이다.
Upsampling
- Downsampling 을 통해서 받은 결과의 차원을 늘려서 인풋과 같은 차원으로 만들어 주는 과정이다.
- 주로 Strided Transpose Convolution 을 사용한다.
Semantic Segmentation 과 Instance Segmentation 의 차이
- Segmentation은 크게 Semantic segmentation과 Instance segmentation로 나눌 수 있다.
- Semantic segmenation은 이미지 내에서 객체가 속한 Class가 무엇인지에 대해서만 판단한다는 특징이 있다.
- 반면 Instance segmentation은 객체의 Class와 더불어 그 안의 Instance들 간의 구분이 가능하게 해준다.
- 기술적 측면에서는 Instance 방식이 한 단계 더 고차원적이라고 볼 수 있지만, Semantic 방식에 비해 더 많은 계산 비용이 들어간다는 단점이 있다.
- 따라서 class 안의 Instance 분류가 중요하지 않은 실질적인 상황들을 고려해 볼 때 Semantic 방식이 더 효율적인 경우가 많다.
이미지 데이터 증강(Image Data Augmentation)
데이터 증강의 효과
- 이것은 원본 이미지에 인위적인 변화를 주는 것이다.
- 그리고 인위적으로 변화를 준 이미지는 충분히 학습에 활용될 수 있는 데이터가 된다.
이미지 데이터를 증강하는 방법
Pixel-Level Transforms
- Pixel 단위로 변환을 시키는 Pixel-Level Transform은 대표적으로 Blur, Jitter, Noise 등을 이미지에 적용하는 기법이다.
- Gaussian Blur, Motion Blur, Brightness Jitter, Contrast Jitter, Saturation Jitter, ISO Noise, JPEG Compression 등 다양한 기법이 사용된다.
Spatial-Level Transforms
- Image 자체를 변화시키는 Spatial-Level Transform이다.
- 대표적으로 Flip과 Rotation이 있으며, Image의 일부 영역을 잘라내는 Crop도 많이 사용된다.
- 이 Augmentation을 사용할 때 주의해야할 점은 Detection (Bounding Box), Segmentation (Mask) Task의 경우 Image에 적용한 Transform을 GT에도 동일하게 적용을 해줘야 하고, Classification의 경우 적용하였을 때 Class 가 바뀔 수 있음을 고려하여 적용해야 한다.
객체 인식(Object Detection, Object Recognition)
- Object Detection(객체 감지)란 컴퓨터 비전의 하위 분야 중 하나로 전체 디지털 이미지 및 비디오 내에서 유의미한 특정 객체를 감지하는 작업을 한다.
- 이러한 object detection은 Image retrieval(이미지 검색), Image annotation(이미지 주석), Face detection(얼굴 인식), Video Tracking(비디오 추적) 등 다양한 분야의 문제를 해결하기 위해 사용된다.
- 자율 주행 자동차에서, 차량 주변에 있는 비디오를 인식하여 자동으로 비디오 이미지 내에 차량이 있는지 혹은 사람이 있는지 등을 분석하여 주변 객체들에 대한 위치, 이동 정보를 주는 것(video tracking)
- 휴대폰 보정 카메라 어플에서 얼굴을 감지하여 해당 부분의 이미지 보정을 적용하는 것(face detection)
- 포털 사이트의 이미지 검색을 이용할 때, 사진을 업로드하면 해당 사진 내에 존재하는 객체들을 자동으로 인식하여 이와 비슷한 유형의 이미지를 찾아주는 것(image annotation & retrieval) 등이 object detection을 통해 이루어지는 작업이다.