본문 바로가기

Computer Vision Study

Object Detection (YOLO v3)

현재 듣고 있는 Coursera 의 Deep Learning specialization 과정에서 Convolutional Neural Networks 과정 중 Week3 Object Detection 부분을 다뤄볼 예정이다. 어설픈 이해지만, 차후 다시 볼 일을 대비하며...

 

배워야 할 것 들

Object Localization, Object Detection, Landmark Detection

Implementation Non-max-Suppression

Intersection over union

Components used for object detection (landmark, anchor, bounding box, grid ~ )

 

1. Localization

객체 탐지를 위해서 가장 먼저 필요한 것은 객체를 특정 지역(Local)에 국한 시켜 확인하는 것이다.

현재 내게 가장 잘 알고 있는 것은 Image classification 인데, Classification with localization 을 생각해보면 단순하다.

특정 object 가 어떤 것인지 뿐만이 아니라, 그 대상에 bounding box 를 표기하는 것을 의미한다.

예로는 총 4개의 클래스가 있다 [(1)보행자 (2)차 (3)오토바이 (4)배경]

그렇다면 결과적으로 softmax unit 은 4개가 될 것이다. 여기서 자동차의 위치를 탐지하려고 하면 bounding box 의 위치를 포함하는 ouput 을 갖는 network 로 수정하면 간단하다.

bx, by, bh, bw 를 추가하면 전체적으로 bounding box 의 중심정 (bx, by) 와 폭 (bw), 높이(bh) 에 의하여 위치를 탐지한다.

 

결과적으로 우리는 target value y 를 아래와 같이 정의한다.

pc 는 대상이 존재하는지에 대한 여부이고 c1, c2, c3 는 각 클래스의 존재 확률이다.

예를 들어 차가 존재하는 이미지가 들어온다면 [1, bx, by, bh, bw, 0, 1, 0] 이 되는 것 (background x) 

차가 존재하지 않을 수도 있겠지? [0, ? ? ? ? ? ? ?] don't care 신경 안써도 된다는...

 

물론, 이 또한 신경망이기에 loss 를 최적화 하기위한 loss function 이 필요할 것 이다.

Lossfunction MSE 를 해당 강의 과정에서 보여주셨지만, class : log-likelihood loss softmax loss, bounding box : MSE, pc : Regression loss 등을 이용할 수 있다고 한다.

2. LandMark Detection

어쩌면 약간의 트릭처럼 보일 수 있다고 생각했던 부분이다.

탐지할 object 에 bounding box 를 위치하기 위해서는 bx, by, bh, bw 를 output 에 추가하는 것을 보았다.

예를 들어 face recognition 을 가정해보면 이미지의 객체 (얼굴)의 주요 포인트를 x, y 좌표와 같이 미리 표기할 수 있지 않을까?

예를들어 l1x, l1y 는 눈의 왼쪽부분의 왼쪽 가장자리에 찍힐 좌표, l64x, l64y 는 오른쪽눈의 오른쪽 가장자리에 찍힐좌표 라고 하면

output 에 전체적으로 129개에 대한 좌표값을 넣어주면 된다.

 

## 여기서 중요한 점은 항상 눈의 왼쪽의 가장자리가 landmark1 이라면 계속된 이미지 모두에서 동일하게 그 곳을 가르키는 좌표로 사용할 점 이라는 것.

 

 

3. Sliding Window

 

간단하게 어떤 방향일지 생각해보면

1. Training ( Car classification )  에 대하여 학습을 진행한다. (Conv Net)

2. Sliding window 방법을 사용할 것인데 적절한 사각형 틀의 사이즈를 정하고 그 window 가 마치 슬라이딩 하는 것 처럼 이미지 전체를 stride 의 값에 맞게 움직이며 target class 를 찾아가는 과정이다. 그 윈도우의 크기를 좀 더 크게도 혹은 작게도 변경하며 탐지한다.

3. 객체가 탐지된 window 를 저장하고 중복된 탐지를 한 window 가 존재하면 가장 높은 확률값을 갖는 window 를 선택한다는 설정이랄까?

 

# cache 에 계속된 window 정보를 축적한다면, computation cost는 정말 말도 안되게 커질 것. 이 문제를 해결하기 위해서 Convolutional approach 가 적용된다.

Convolutional approach

굉장히 단순한 논리이다 Fully connected Layer 의 부분을 정확하게 convolutional layer 처리를 해준다고 생각하면 좋을 것.

저렇게 전게하게되면 sliding window 를 적용한다고 하여도 입력 이미지를 (16x16x3) 을 주었다고 가정하면

sliding window 가 14x14 의 크기라면 stride 가 2라는 가정에서 2칸씩 움직이며 전체적으로 총 네번의 ConvNet 연산을 수행하게 된다.

 

하지만, convolutional approch 를 적용하게 되면 결과적으로 2x2x4 의 output 이 나오게되면 1x1x4 output 이 총 네개가 나오게 되는 것이다. 따라서 듀닝을 통하여 독릭적인 input 의 계산이 아니라, 4개의 input 을 하나의 연산으로 결합하여 overlapping 되는 부분을 공유하게 되는 것이다.

input 28x28x3 이미지에서 sliding window (14x14 size)를 총 8x8 의 target value 값을 입체적 구조로 갖게된다.

4. Bounding Box Predictions

sliding window algorithm 의 적용에 대하여 Convolutional approach 의 도입으로 계산비용의 문제를 덜었지만, bounding box 를 정확히 찾을 수 없는 점이 가장 큰 문제였다.

window 가 shift 하며 탐색하면 정확한 위치에 object 가 탐색되지 않고 걸치는 문제가 생길 수 있다는 것이다.

정확한 bounding box 에 이미지 단일 대상을 가져오는 방법이 YOLO(You Only Look Once) algorithm 이다.

input image 가 100x100 인 경우를 예로보면, 아래와 같이 3x3 의 grid 로 나누어준다. (사실 대체적으로 19x19 grid 를 사용하여 더욱 디테일하게 체크한다.)

Concept : Image classification 과 Image localization 을 9개의 grid 에 모두 각각 적용하는 것이다.

이렇게 3x3 grid 로 구역을 나누고 각 grid 셀에 8차원의 vector y 를 갖고 있기 떄문에 output 의 실제 사이즈는 3x3x8의 형태가 될 것이다.

따라서 앞서 배웠던대로 학습을 하면 된다.

YOLO : Object Classification/Localization and Sliding Window Conv Implementation 을 모두 적용.

 

Specify the bounding boxes

bounding box 에서 mid point 는 (0,0) 과 (1,1) 사이의 좌표를 갖기 떄문에 항상 0과 1 사이에 존재한다. 하지만 bw, bh 즉 너비와 높이는 각 cell 의 크기를 벗어날 수 있기 때문에 1보다 커질 수 있음을 유의해야한다.

 

Intersection over union (IoU)

IoU 는 object detection 이 잘 동작하는지 확인하는 용도의 함수이다. (평가지표?)

두개의 bounding box 에서 동일한 object 를 감지했다면, 이 두개의 전체 면적에서 관찰하고자 하는 bounding box 의 중첩 면적을 나누어보면 값이 산출되는데 이것이 특정 값 threshold (0.5 임의 지정 값) 의 이상이 되면 올바르다고 추정하는 방법이다.

 

Non-max Suppression

object detection 의 yolo algorithm 의 약점은 알고리즘이 동일한 object 를 여러번 탐지하는 것이다.

19x19 grid 를 사용하면, object 의 mid point 가 다양한 grid cell 에 포함될 수 있다. 이 경우 사용될 방법인데,

이와 같이 여러개의 바운딩 박스가 동일한 객체를 탐지했다면 IoU(Apply 0.5 threshold) 가 높은 bounding box 를 제외하고 나머지는 제거하는 과정이다.

 

Anchor Box

 

Object detection 의 문제점 중 하나는 각 grid cell 은 하나의 object 만을 감지하는 것이다. 여기서 우리는 anchor box 라는 아이디어를 가지고 이 문제를 해결할 것이다.

 

만약 해당되는 부분의 이미지에서 객체 탐지를 적용하려면 두 종류의 객체가 대상이 될 것이다.

차량은 가로로 긴, 사람은 세로로 긴 모양의 박스인데 이것을 우리는 Anchor box 라고 지칭한다.

이 경우 중첩되는 object 가 존재하기 떄문에 anchor box 는 2개이고, 따라서 추정하는 y value 를 수정할 필요가 있다.

수정된 y value

적용해보면 해당 이미지에 대하여, 위와 같은 output y 를 갖게되고 shape 은 3x3x2x8 --> grid size x grid size x # anchors x (5 + #classes) 로 계산될 수 있다.

 

YOLO Algorithm

객체 검출을 위한 모든 anchor box 를 표현한다.
낮은 확률로 예측된 anchor box 들은 제거한다.
IoU function 을 적용한다. (NMS 적용)

 

해당 YOLO Algorithm 을 구현하기 위혀 여러 깃을 돌아다닌 결과물로 해당 git 저자에게 감사를 표하며 차후 탐색해야할 과제를 받은 기분이다.

https://github.com/allanzelener/YAD2K

강릉 응용수학학회 참석 당시의 사진을 사용한 결과.