이번 글은 Detection에 대한 이론적인 부분을 재정립하기 위하여 Coursera의 Deep Learning강의를 들으며 정리하고 있습니다. 더 다양한 분야에 관심이 있으신 분들은 Deeplearning.ai의 강의를 여기에서 들어보시는 것을 추천드립니다.
이미지를 인식하기 위한 방법인 Detection Algorithm의 분야는 세 가지로 정리할 수 있습니다.
이번 글에서 이러한 Detection Algorithm에 대하여 어떻게 다른 지 살펴보고 이해하려 합니다.
1. Classification
이미지를 보고, 그 이미지 안에 어떠한 물체가 있는지 판별해내는 Algorithm입니다.
이미지를 N개의 Class로 분류한다고 하면 아래와 같은 루트로 이미지를 분류하게 됩니다.
1. Train image를 N개의 요소를 가진 목표 라벨 Y로 라벨링 (Y = {0, 1, 0, 0, 0}) 후 학습
2. 라벨링이 되지 않은 image를 학습된 ConvNet을 통해 연산
3. Softmax의 결과 중 가장 높은 값을 가지는 class를 결과로 제시
Training 간의 Loss함수도 다양한 Algorithm 간의 차이점이라고 볼 수 있을 것 같습니다.
제곱 오차를 사용한다고 가정하면 아래와 같은 Loss를 가지게 됩니다.
2. Classification with Localization
위의 Classification의 분류를 포함하고, 이 image에서 어디에 Object가 존재하는지 위치 정보까지 찾아주는 Algorithm입니다.
주로 Bounding Box를 사용하는데, 이를 위해서 이미지의 중간 값 좌표 X, Y와 Box의 크기 H, W를 추가적인 Unit으로 가지게 됩니다.
Object에 대한 위치 값을 포함하게 된 만큼 Loss함수에도 변화가 있습니다.
image에 object가 있을 때는 상관이 없는데, image에 object가 없는 경우 결과 값이 '물체가 없다'라는 unit 이외의 값들은 학습에 의미가 없는 더미 데이터이기 때문입니다.
그래서 처음 접근한 Loss함수는 위의 Classification과 동일합니다.
하지만 이 경우는 Y1이 물체의 유무를 결정짓는 Parameter라고 가정하면 Y1이 1일 때, 이 Loss함수가 의미가 있으리라 생각이 됩니다.
그렇다면 Y1이 0, 즉 물체가 없는 경우는 Y1이하의 값이 무의미하므로 Y1 만 반영해줍니다.
유사한 방법으로 4개의 Parameter보다 더 많은 Parameter를 사용하여 특정 위치의 Landmark Point를 주고 이를 이용하여 형태나 동작을 구분하는 Landmark Detection도 있습니다.
3. Object Detection
위에서 서술한 Classification과 Localization을 포함하고, image 내에 있는 여러 개의 모든 object들을 판별하는 알고리즘입니다.
하나의 object를 찾는 것이 아닌, 주어진 image에서 몇 개의 object가 존재하는지 알 수 없기 때문에 지금까지의 방법으로는 해결하기 난해할 수 있습니다.
그래서 Object Detection을 위해서는 Sliding Windows Detection Algorithm을 사용합니다.
이 Sliding Windows Detection Algorithm은 지정된 크기의 Window를 만들고, 전진하면서 image의 모든 부분을 탐색합니다. 작은 window의 진행마다 위에서 서술한 것처럼 Convolution연산을 진행합니다.
전체를 탐색 완료하였다면, 위의 그림과 같이 image의 크기를 줄이거나 window의 크기를 증가시켜서 다른 크기의 object를 찾는 것을 시도합니다.
이러한 방법으로 하면 모든 object를 탐색해 낼 수 있지만, 이는 stride를 미세하게 가져갔을 경우에 한합니다.
예를 들어서 계산비용의 문제로 stride를 증가시킨다면 정확도가 떨어질 수밖에 없습니다. 그렇다고 stride를 미세하게 가져가면 image의 한번 순회 간에 굉장히 많은 연산이 필요합니다.
이러한 문제를 해결하기 위하여 알고리즘 자체를 Convolutional하게 연산하는 방법이 제시되었습니다.
이 방법은 window를 하나의 filter라고 생각하고 Convolution연산을 한다고 이해를 하는 것이 편리했습니다.
기존의 연산은 아래와 같습니다.
연산한 후 classification을 통해서 이 window에 object가 있는지 확인하는 방식이라고 할 수 있습니다.
하지만 비용을 줄이기 위하여 간단한 변화를 줘보겠습니다. Fully Connect를 1x1 Conv로 변경하는 것입니다.
위의 그림과 같이 변형시켜서 Convolutional하게 연산할 수 있게 됩니다.
제시된 그림에서는 4번의 window를 통한 연산을 한 번에 처리할 수 있게 되었습니다.
이렇게 성능 문제를 해결하기 위한 아이디어가 제시되었지만, 아직 Object Detection의 Sliding Windows Detection Algorithm은 정확한 Bounding Box를 찾지 못하는 문제를 가지고 있습니다.
이러한 문제를 해결하기 위하여 다양한 방법이 제시되었는데, 다음 글에 자세히 다루어 보겠습니다.
'기타' 카테고리의 다른 글
$0.005 per Elastic IP address not attached to a running instance per hour (2) | 2021.08.04 |
---|---|
Grafana '/var/lib/grafana/plugins': Permission denied 오류 해결 (1) | 2021.02.06 |
Learning both Weights and Connections for EfficientNeural Networks (0) | 2020.11.28 |
Docker Hub 무제한 종료?? (0) | 2020.11.04 |
Happy Halloween! / 호박밭? 시든 잔디밭? (0) | 2020.10.31 |
댓글