본문 바로가기
딥러닝/CS182

CS182 - [Lecture 8] Computer Vision

by sb99 2022. 7. 24.

이번 강의에서는 computer vision이 사용되는 문제들에 대해 다룬다.

현재까지 우리는 이미지가 들어오면

해당 이미지의 label(class)를 분류하는 Object Classification 문제만 다루었다.

 

하지만 실제 computer vision이 사용되는(해결하고 있는) 문제들에는 

Object Localization, Object Detection, Semantic Segmentation 등이 있다.

 

Object Localization은 하나의 object에 대해 해당 object의 class와 좌표 및 크기를 구한다.

이때 object를 감싸고 있는 굵은 선으로 이루어진 네모 박스를 bounding box라 한다.

 

Object Detection은 여러 object에 대한 class와 bounding box를 구한다.

현실에서 object가 한 개뿐인 이미지보다는 object가 여러 개인 이미지가 많다는 것을 고려하면,

Object Localization 보다 조금 더 복잡하면서도 현실적인 problem이라 할 수 있다.

 

Semantic Segmentation은 픽셀 단위로 object를 분류한다.

Object Localization이나 Objection Detection의 경우에는 물체의 위치를 구할 수 있지만,

Bounding box를 활용하므로 해당 물체의 shape에 대한 정보가 손실될 수밖에 없었다.

Semantic Segmentation에서는 pixel 단위로 물체를 인식하므로 object shape가 보존된다.

 

 

Part 1

Object Localization

 

먼저 Object Localization에 대해 알아보자.

 

Object Classification에서 주어진 데이터의 성분을 \(x_{i}, y_{i}\)라 했을 때,

 \(x_{i}, y_{i}\)는 각각 이미지 데이터와 이미지의 class(label)를 의미했다.

 

하지만 Object Localization의 \(y_{i}\)에는 (label, x 좌표, y좌표, width, height)가 포함된다.

즉, 모델이 학습해야 할 요소는 이미지의 class뿐만 아니라 이미지의 위치와 크기가 된다.

 

 

그렇다면 모델이 이미지 class와 이미지의 위치 및 크기(이하 bounding box)를 학습한다고 했을 때,

우리는 해당 모델이 잘 학습되었는지를 어떻게 평가할 수 있을까?

 

Bouding box의 평가 요소로서 Intersection over Union(IoU)를 활용한다.

IoU는 Intersection area(I)와 Union area(U)를 나눈 값으로,

Intersection area는 실제 bounding box와 예측한 bounding box의 교집합 area를,

Union area는 두 개의 bounding box를 겹친 상태에서의 area를 의미한다.

 

물론 데이터셋의 종류에 따라 다른 benchmark를 가지겠지만,

일반적으로 IoU가 0.5보다 크면 예측에 성공했다고 평가한다.

하지만 우리는 bounding box 뿐만 아니라 class 또한 예측하기 때문에

'IoU > 0.5 and class is correct'인 상태일 때 예측에 성공했다고 말할 수 있다.

 

주의해야 할 점은 IoU는 '평가 지표'일뿐, loss function에 활용되지는 않는다는 것이다.

 

 

이어서 모델의 학습이 어떠한 방식으로 이루어지는지 알아보자.

 

가장 간단한 방법은 regression을 활용하는 것이다.

Class를 분류하는 것은 Object Classfication에서 사용했던 cross-entropy loss를 사용하고,

Bounding box를 구하는 것은 결국 \(x, y, w, h\)라는 변수 값을 찾는 것이기 때문에

Regression을 활용하여 학습할 수 있다.

 

하지만 일반적으로 이 방법을 사용하지는 않는다고 하며, 그 이유는 추후에 설명한다고 한다.

 

 

다른 방법으로는 sliding windows가 있다.

 

이미지를 여러 patch로 나누어 classification task를 실행한다고 해보자.

두 번째 이미지(빨간색 bounding box)의 경우 이미지를 분류했을 때

모델은 해당 이미지가 고양이일 확률을 21%라고 출력하고 있다.

세 번째 이미지(보라색 bounding box)의 경우 이미지를 분류했을 때

모델은 해당 이미지가 고양이일 확률이 85%라고 출력하고 있다.

 

따라서 보라색 bounding box가 빨간색 bounding box보다 고양이에 대해

더 높은 probability를 갖기 때문에, 빨간색 bounding box보다

보라색 bounding box가 모델의 최종 bounding box로서 결정될 가능성이 높다.

 

 

Sliding windows에 대해 조금 더 자세히 알아보자.

 

이미지를 patch로 나누어 해당 patch에 대한 Object Classification task를 수행하고

이때 나온 probability를 바탕으로 bounding box를 결정한다고 했는데,

그렇다면 patch는 어떠한 방식으로 생성해야 할까?

 

가장 간단한 방법으로는 이미지를 늘리거나 줄여가며 마치 다양한 형태와 크기의 patch가

하나의 이미지를 훑으며 probability를 도출하는 것처럼 만드는 것이다.

 

위의 그림을 보면 patch가 이미지를 sliding 함으로써 이미지의 각 부분에 대한 분류 작업을 수행하는데,

이미지의 크기를 조절함에 따라 일정한 크기의 patch가 마치 다양한 형태와 크기를 가지며

동일한 크기의 이미지를 훑는 것과 같은 효과를 준다.

 

결과적으로 화살표가 가리키는 patch가 가장 높은 probability(of cat)를 가질 것이며

해당 이미지에 대한 최종 bounding box가 될 것이다.

 

이러한 방법을 더 일반적으로 표현하여 non-maximal suppression이라 한다.

 

 

하지만 위에서 언급한 방법에서는 한 가지 문제점이 발생할 수 있다.

만약 하나의 이미지에 대해서 여러 개의 patch를 활용하여 해당 patch에 대한 classification을 수행할 때

각 patch마다 convolutional classification을 그대로 적용한다면 patch의 수만큼 연산이 늘어날 것이다.

 

이 문제를 fully connected layers를 convolutional layers로 대체함으로써 해결할 수 있다.

Fully connecte layer를 1x1의 convolutional layer로 간주하여 

이전에 학습한 feature extractors(convolutional layers)를 재사용함과 동시에

Spatil information을 갖는 다양한 크기의 sliding windows의 결과를 도출할 수 있다.

 

다시 말해, 기존의 CNN 모델의 last layers를 이루는 fully connected layers를

1x1 크기의 convolutional layers로 대체함으로써 더욱 효율적인 sliding windows를 구현할 수 있다.

 

이를 처음 구현한 모델이 이후 설명할 OverFeat이다.

 

위에서 언급한 sliding windows를 효율적으로 구현한 것이 OverFeat이다.

2013년에 발표된 논문이며, 해당 포스팅에서는 간단하게만 언급할 예정이다.

(OverFeat 논문 리뷰)

 

OverFeat은 하나의 이미지를 여러 크기로 변환하여 모델에 입력하는 multi-scale image 학습을 진행한다.

Multi-scale image 학습은 다양한 크기의 bounding boxes에 대한 학습을 가능케 한다.

 

모델은 최종적으로 각 bounding box에서의 class에 대한 확률 값인 confidence score와 좌표 값을 출력한다.

 

 

 

Multi-scale image가 OverFeat에 입력됨에 따라 생성되는 bounding boxes는 다음과 같다.

 

초기에는 수 많은 bounding boxes가 생성되므로 이를 하나의 box로 압축해야 하며,

OverFeat의 특수한 알고리즘이 활용된다.

(자세한 내용은 위의 논문 리뷰 링크 참고)

 

 

OverFeat는 sliding window 방식을 매우 효율적으로 구현하였다.

 

기존의 sliding window 방식은 모든 계산 과정이 독립적이기 때문에 많은 계산 양이 요구되었으나,

Fully connected layer를 1x1 convolutional layer로 대체하여 구현한

OverFeat의 새로운 sliding window 방식은 공통된 영역의 계산 결과를 공유한다는 점에서

매우 효율적이라고 할 수 있다.

 

 

해당 파트의 내용을 요약하자면 다음과 같다.

 

Object Localization task에서는 bounding box를 생성하는데,

이를 표현하기 위해 모델은 해당 box에 대한 class와 box의 좌표값을 출력한다.

 

Bounding box에 대한 구현은 1x1 convolutional 연산을 통한 sliding window를 통해 구현된다.

이 방법은 각각의 bounding boxes에 대해 독립적인 연산을 수행하는 것보다 훨씬 효율적이다.

 

 

Part 2

Object Detection Architectures

 

다음으로 이미지 내의 여러 물체를 탐지하여

해당 물체의 클래스와 위치를 파악하는 Object Detection에 대해 알아보자.

 

Localization과 유사하게, Object Detection에서는 

각 object의 class와 bounding box 좌표를 출력하게 된다.

 

 

그렇다면 Object Detection은 어떻게 여러 물체에 대한 탐지를 수행할까?

 

가장 먼저 이전에 언급한 sliding window 방식을 생각해볼 수 있다.

하지만 이번에는 하나의 이미지에 여러 object가 존재하기 때문에 

'가장 높은 probability를 가진 window에 대한 출력을 수행한다'라는 전략 대신

'일정 수준의 threshold를 상회하는 probability를 갖는 window를 모두 출력한다' 전략을 사용할 수 있다.

 

다만 sliding window의 특성상 실제 물체가 위치한 곳 주변의 windows는

모두 높은 probability를 갖기 때문에, 하나의 물체에 대해 여러 windows가 출력될 수 있다.

예를 들어 위 그림에서 좌측 하단에 있는 그림의 강아지의 경우 

강아지의 크기와 위치가 딱 맞는 window가 95%의 probability를 갖는다면,

이 window의 주변의 windows 또한 92%, 93%와 같이 꽤 높은 수준의 probability를 가질 것이다.

 

이를 해결하는 방법은 Non-maximal suppression이 있으며, 하나의 object에 따라

하나의 sliding window가 출력될 수 있도록 동일한 class에 대한 주변의 detection을 무시하는 방법이다.

즉, 강아지에 대한 95% probability를 갖는 window의 주변 windows에 대한 detection을 무시한다.

 

Sliding window와 다른 접근 방식으로는 bounding boxes list를 출력하는 방법이 있다.

이 방법은 bounding boxes의 개수를 선정해야 한다는 명백한 문제점이 존재하며,

Sliding window와 결합하여 사용했을 때 좋은 성능을 보인다.

 

 

이어서 Object Detection에서 매우 유명한 모델인 YOLO에 대해 알아보자.

YOLO의 자세한 내용은 하단의 링크를 통해 확인하길 바라며 해당 포스팅에서는 간단하게 다루겠다.

(YOLO 논문 리뷰) - 추후 업데이트 예정

 

YOLO는 이미지를 grid 형태의 cells로 나눈 후, class probability map을 생성한다.

이후 각 bounding boxes에 대한 confidence score(IoU)와 class label을 구한다.

 

YOLO는 이전에 언급한 OverFeat과 마찬가지로 동일한 계산에 대해 재사용하는 방식을 통해

계산량을 감소시키며, 빠른 Object Detection이 가능하다는 장점이 있다.

반면 성능은 다른 모델에 비해 떨어지는 모습을 보여준다.

 

 

YOLO보다 정확도가 더 뛰어난 모델로는 Fast R-CNN이 있다.

Fast R-CNN은 CNN과 region proposals를 결합하였으며 자세한 내용은 하단의 링크에서 확인하길 바란다.

(Fast R-CNN 논문 리뷰) - 추후 업데이트 예정

 

 

Fast R-CNN은 YOLO보다 느리다는 단점이 있었기에 

Fast R-CNN의 속도를 개선한 Faster R-CNN 모델이 등장하였다.

(Faster R-CNN 논문 리뷰) - 추후 업데이트 예정

 

 

Part 3

Segmentation Architectures

 

마지막으로 Segmentation에 대해 알아보자.

 

Object Detection은 여러 물체에 대한 class label과 bounding boxes를 탐지하였으나,

Segmentation은 여러 물체에 대해 'pixel 단위'로 class label을 탐지한다.

 

위의 그림에서 우측에 있는 그림이 그것이며, 각 pixel마다 class 값을 갖는다.

따라서 모델의 output은 input과 같은 resolution(해상도)를 가져야한다.

 

우리는 보통 모델을 구축할 때 stride, pooling 등을 활용하며 input image에 대한 

Downsampling을 수행하였다. (즉, image resolution을 축소하였다.)

만약 이러한 downsampling을 수행하지 않는다면 input과 output은 같은 resolution을

가질 것이므로 pixel 단위의 class label 탐지가 가능할 것이다.

 

하지만 이러한 방법은 매우 많은 computation을 필요로 한다.

Pixel 단위의 classification을 적은 computation으로 가능하게 할 방법이 요구된다.

 

 

적은 computation을 위해 downsampling을 수행하면서도 input image의 resolution을

유지할 수 있는 모델의 구조 중 하나로 위와 같은 구조가 있다.

 

일반적인 convolutional 연산에서는 stride와 pooling을 통해 input image의

Resolution이 줄어드는 downsampling이 발생하는데,

Downsampling이 된 이후의 data에 대한 up-sampling을 통해

Output image의 resolution을 Input image의 resolution과 동일하게 맞춰줄 수 있다.

 

 

Up-sampling의 과정을 살펴보자.

 

상단의 그림은 normal convolutional operation에 따른 resolution reducing을,

하단의 그림은 transpose convolutional operation에 따른 resolution increasing을 나타낸다.

 

3x3 kernal에 대해 stride가 2인 normal convolutional operation로 인해

5x5 data는 2x2 크기로 줄어들게 된다.

 

반면 fractional stride를 가진 transpose convolution에서는

각각의 1x1 pixel이 convolution을 거치며 3x3 pixel을 생성하게 된다.

즉, 1x1 pixel이 3x3 kernal과 곱해지며, 그 값은 대응되는 자리에 위치하게 된다.

위의 파란색으로 표시된 타원은 각각의 결괏값이 대응되는 자리에 위치함에 따라 

겹쳐지는 영역을 표시한 것인데, 해당 영역은 two sets of values를 가지므로

이 값을 하나로 합쳐주기 위해 평균값을 구하여 넣어준다.

 

결론적으로 우리는 up-sampling을 통해 normal convolutional operation으로 인해

downsampling 되었던 데이터의 resolution을 원래 resolution으로 복구시킬 수 있다.

 

 

Donwsampling 된 data의 resolution을 다시 증가시키는 다른 방법으로 un-pooling이 있다.

 

만약 우리가 convolutional layers에서 max pooling을 사용한다면,

Kernal에 해당되는 부분에서 가장 큰 부분(pixel)을 추출하여 ouput을 구성한다.

 

이때 추출된 부분의 위치를 기억한 후, un-pooling을 수행할 때 이전에 기억해 둔 위치를

활용하여 해당 위치에 값을 배치함으로써 resolution을 확장할 수 있다.

 

 

Downsampiling과 up-sampling을 통해

Input data의 resolution을 축소했다가 확대하는 구조를 Bottleneck architecture라고 한다.

 

위 그림에서 확인할 수 있는 bottleneck은

하단에 표시된 논문에서 제시된 모델의 구조와 동일하며,

Classification task에서 유명한 모델인 ResNet에서도 bottleneck을 활용하였다.

 

(여담으로, ResNet의 경우 빠른 학습 속도를 위해 bottleneck을 사용하였다.

1x1 convolution을 통해 channel을 줄인 뒤, feature extract를 위한 3x3 convolution을 수행한다.

Channel의 수가 줄어듦에 따라 연산량이 줄어들기 때문에 계산이 적게 필요하며,

Feature extract를 거친 data에 대해 up-sampling을 수행해준다.

참고: https://coding-yoon.tistory.com/116)

 

 

하지만 downsampling을 통해 채널의 수를 늘리고 resolution을 축소해 나가는 과정에서

Image object에 대한 자세한 위치 정보(pixel의 class label 정보)를 잃게 되고,

Up-sampling을 통해 채널의 수를 줄이고 resolution을 확대해 나가는 과정에서는

적은 resolution을 가진 data를 이용해 정보를 복원하는 것이기 때문에

초기의 input image가 가진 object의 위치 정보를 정확하게 복원하지 못하게 된다.

 

U-Net은 이러한 문제점을 저차원(resolution이 작은, 즉, downsampling 된)

뿐만 아니라 고차원(downsampling 되기 이전) 정보도 이용하여 

Up-sampling 과정에서의 object 위치 정보의 복원을 정확하게 하도록 만든다.

 

Normal convolution 연산을 통해 resolution 축소가 발생하는 부분을 인코딩 단계,

Up-sampling을 통해 resolution을 복구하는 부분을 디코딩 단계라고 부르며,

인코딩 단계에서 얻은 feature을 디코딩 단계의 각 레이어에 concatenation 하게 된다.

이러한 인코더와 디코더의 직접 연결을 skip connection이라 한다.

(위의 그림에서 회색 화살표에 해당한다.)

 

위의 그림에서 볼 수 있듯 인코더와 디코더는 대칭 구조로 이루어져 있으며

각각의 layer들은 대칭되는 layer와 U 모양으로 연결되어 있음을 확인할 수 있다.

(참고: https://pasus.tistory.com/204)

 


References

 
 

 

댓글