티스토리 뷰
[Course4 - Week3] Object Detection (feat. YOLO)
제이gnoej 2020. 10. 25. 18:41
"해당 포스팅은 Coursera 에서 수강한 Andew Ng 의 deep learning specialization 코스를 요약한 것입니다."
1. Object Detection 의 Y 라벨
우선 object localization &Classification 을 할 때 주어지는 Y label 을 살펴보면 다음의 3가지이다.
-
해당 box 에 object 가 있을 확률 (background 제외)
-
bounding box 좌표
-
Class probability
예를 들면 이렇다.
$$Y = \begin{bmatrix}
P_c\\
b_x\\
b_y\\
b_w\\
b_h\\
c_1\\
c_2\\
c_3\\
\end{bmatrix}$$
여기서 $P_c$ 가 object 가 있을 확률
$b$ 로 시작하는 것들이 bounding box 좌표와, width 랑 height 이고
$c$ 로 시작하는 것들이 각 class 에 대한 probability
+ 저 3가지 종류의 Label 의 cost 를 구하기 위해서는 각기 다른 cost 함수를 쓴다.
예를 들어서 $P_c$ 는 logistic regressions error, 좌표의 경우는 squared error, 그리고 class probability (classification) 의 경우는 log likelihood error 를 사용해서 cost 를 구한다.
2. Landmark Detection 과 Y 라벨
Object detection 의 하위 분야로는 Landmark detection 이라는 게 있는데, 말그대로 주어진 이미지에서 여러개의 Landmark 를 detect 하는 것을 의미한다. 이게 어디서 쓰이냐면, 예를 들어서 face swapping 할 때, 눈 / 코/ 입을 감지해서 그 부분만 감지해서 스와핑을 하고 이런식임. 마찬가지로 pose detection (자세 감지)를 할 때도 머리/ 팔/ 손/ 다리 / 발을 detect 에서 자세를 classify 하는 거임.
이런 Landmark 의 Y Label 은 무엇으로 이루어져 있을까? 우선 bounding box 가 아니라 콕콕 점을 찍어서 (예. 왼쪽 눈의 왼쪽 모서리, 왼쪽 눈의 오른쪽 모서리) 나타내는 거기 때문에 x,y 좌표만 있으면 된다.
위와 같이 여러개의 주어진 좌표가 있고, $l_1x$ $l_1y$ 부터 $l_64x$, $l_64y$ 가 있다. 이 때 각 좌표가 감지하는 부위는 고정이다. 즉, $l_1x$, $l_1y$ 는 항상 왼쪽 눈의 왼쪽 모서리, $l_2x$, $l_2y$ 는 항상 왼쪽 눈의 오른쪽 모서리를 나타내는 좌표여야 한다는 거임.
그리고 여기에 하나 더해서 해당 이미지에 원하는 object 가 있을 확률 $P_c$ 도 있어야 한다. 즉, 총 Y label 은 아래와 같음.
$$Y = \begin{bmatrix}
P_c\\
l_{x1}\\
l_{y1}\\
l_{x2}\\
l_{y2}\\
...\\
l_{64x}\\
l_{64y}\\
\end{bmatrix}$$
3. Sliding window 의 한계와 대안 - Convolution Implementation of sliding windows
복습을 해보자면, Sliding window 는 말 그대로 이미지의 모든 부분을 작은 window 로 훑어가면서 crop 된 부분이 원하는 object 인지 아닌지 (car 인지 아닌지) 를 classify 하는 문제였다 (binary classification).
이 때 사용된 conv net classifier 는 해당 objecct 에 꼭 맞게 crop 된 이미지만을 가지고 훈련된 모델임.
이 때, 각기 다른 사이즈의 window 로 stride 크기를 달리하면서 이미지 전체를 훑고 난 후, 각 이미지 crop 을 classifier 로 패스한다. 이 때, 때, 꼼꼼하게 이미지를 훑기 위해서는 window size 와 stride 크기가 작아야 하는데 그 의미를 crop 이미지가 많다는 의미이고, 이 이미지가 많을 수록 heavy computation 이 된다. (각 이미지를 conv net 에 pass 해야 하므로)
그렇기 때문에 이것을 보안하기 위해서 그냥 이미지 전체를 conv net 에 통과시키면 이미지 전체에 대한 representation을 output 으로 얻게 된다. 이 representation 의 각 부분을 한꺼번에 softmax classifier 로 통과시키는 거다.
즉, 이전에는 sliding window 를 통해서 4개의 crop 이미지 (맨 왼쪽 이미지에서 빨강, 초록, 노랑, 보라 부분) 를 뽑아서 그걸 각각 conv net 으로 통과시켰는데, 이제 전체 이미지를 한번만 conv net 에 통과시킨 후 얻은 결과를 softmax classifier 로 통과시켜서 한번에 모든 위치를 classify 하는 거임.
좀 더 큰 이미지를 가지고 하면 다음과 같다. 맨 왼쪽 이미지의 첫번째 사각형이, 맨 오른쪽 이미지의 작은 사각형 한칸으로 represent 됨.
4. Bounding box prediction (feat. YOLO)
이미지 전체를 한번만 conv net 에 pass 함으로써 sliding window 가 가진 heavy computation 의 문제는 해결했다. 그런데 아직도 한가지 문제점이 있음. sliding window 는 크기가 정해져 있기 때문에, 정확한 boudning box 를 그리는 것이 어렵다. window 사이즈가 너무 크면, 여러 개의 object 가 포함될 수도 있고, 너무 작으면 비효율적이다.
결론 => YOLO to the rescue
YOLO 의 장점
-
Bounding box 의 좌표 (x, y, w, h) 를 output 하기 때문에, 각 object 마다 각각 다른 크기, 정확한 좌표 가능.
-
Input Image 를 한번만 conv net 에 통과 시키기 때문에 스피드도 빠름
원리를 짧게 이미지로 설명하면 다음과 같다.
최종 output : 각각의 grid 마다, 8개의 y output ($P_c$, 좌표, class probability)
예를 들어, 다음과 같은 Y label 이 가능.
$$Y = \begin{bmatrix}
1\\
0.4\\
0.3\\
0.9\\
0.5\\
0\\
1\\
0\\
\end{bmatrix}$$
이 때, $b_x$ 와 $b_y$ 는 항상 0~1 사이의 값이다. 이 좌표는 bounding box 의 가운데 점 (mid point) 를 가리킨다. 그리드의 upper left 를 (0,0) 그리고 lower right 을 (1, 1) 로 보기 때문에 이 좌표는 항상 0~1 사이의 값을 갖는 거임. 반대로 $b_w$ 와 $b_y$ 를 1보다 클 수도 있다. 이건 grid cell 에 상대적인 값이기 때문에, grid cell (= size 1) 보다 크다면 당연히 1보다 큰 값을 갖는다.
5. Bounding box evaluation
Bounding box 는 어떻게 evaluate 할까? IoU 를 가지고! 아래 슬라이드 한장이면 설명 끝. 간단하게 설명하면 output 과 ground truth 의 겹치는 부분을 평가한다.
6. Bounding box 필터링하기 : Non-max suppression
앞서 각각의 grid 마다, bounding box 의 mid point 좌표와, width 와 height 를 output 한다고 배웠다. 그런데 여기서 문제점은 하나의 object 에 대해서 여러 개의 bounding box 가 생길 수 있다는 것! 그렇기 때문에 비슷한 곳에 위치한 bounding box 는 heighest score 를 가진 것들 빼고는 모두 filter 해줘야 한다. 그런데 어떻게 filtering 하냐고?
위와 같은 이미지가 있다고 가정할 때, 각 grid $ \begin{bmatrix}
P_c\\
b_x\\
b_y\\
b_w\\
b_h\\
\end{bmatrix}$ 의 output 이 있을 거임. 여기서 $P_c$ 가 0.6 이하인 것을 모두 filter 한다.
그 다음, highest score 를 가진 bounding box 를 prediction 으로 output 하고, stack 에서 제거한다. 그리고 이 box 와 IoU 가 0.5 이상인 박스를 모두 지운다. 이 과정을 remaining box 가 있을 대까지 반복한다.
아래의 이미지가 Non-max suppression algorithm 를 설명한 것인데, 만약에 3 개의 object 를 detect 한다고 하면, 이 알고리즘을 3개의 class 에 대해서 3번 독립적으로 시행해줘야 한다.
7. 그리고 대망의 Anchor box
여태까지 배운 걸 토대로 하면, 하나의 grid 는 하나의 object image 에만 mapping 됐다. 즉, 하나의 grid 는 한 개의 output ($P_c$ + 좌표 + class probability) 를 return 했다. 한 개의 grid 는, 하나의 object 의 mid point 만을 포함한다고 가정한거다. 근데 만약에 한 개의 grid 에 두 개 이상의 object 의 mid point 가 있으면 어떻게 하지? 이 경우에는 한 개의 object 만 detect 하고 나머지는 다 무시했다.
이것을 보완하기 위해서 anchor box 가 등장했다! 뚜둥
아래 슬라이드에서 보이듯이 이전에는 y 하나에 8개의 값이 있었음 (이미지가 있을 확률 + 좌표 + 클래스 확률). 그런데 이제 이 값을 anchor box 하나당 mapping 시키는 거라, 총 y는 각 anchor box 의 output 을 쌓아올린 값이 됨. anchor box 가 2개면 총 16개의 값을 y 로 ouptut.
여기서 내가 헷갈렸던 부분! 각 anchor box 는 width 랑 height 가 고정값으로 가지고 있을텐데, 왜 $b_w$ 랑 $b_h$ 값을 여전히 반환하는거지? 하는 궁금증이 있었다. 그런데 각 anchor box 마다 width 랑 height 는 초기값이 고정값으로 주어지는 거고 training 을 통해서 update 되는 값이다. anchor box 는 starting baseline guess 라고 보면 됨. 이게 없을 경우 Arbitrary initiali guess 때문에 training 이 안정적이지 않다고 함 (forum 내용)
앞서서 하나의 grid 에 여러 개의 object 의 mid point 가 있는 것을 대비해 anchor box 를 도입했다고 했다. 하지만 실제로 anchor box 의 장점은 각 anchor box 가 각 객체에 specialized 된 특징을 갖게되는 것이라고 한다. 왜냐면 실제로 여러개의 이미지의 mid-point 가 하나의 grid 에서 겹치는 경우는 많이 없기 때문에...
8. 이 모든 것을 합친 YOLO 라는 강력한 놈 (bounding box + anchor box + non max suppression)
8.1 YOLO Training
YOLO 에서 쓰이는 ground truth Y 는 아래 슬라이드와 같다. 2개의 anchor box 가 있기 때문에, 총 16개 값. 슬라이드에 보면 총 3개의 output 예시가 있는데 가운데의 ground truth 는 해당 grid 에 object 가 아예 없을 경우 (모든 $P_c$ = 0). 마지막 ground truth 예시는 2번째 anchor box 가 object 를 포함한 경우 (1번째 anchor box 는 2번째 box 랑 같은 object 를 detect 하면서 IoU 가 크기 때문에 1번째 anchor box 의 $P_c$ = 0 으로 설정)
? 값은, 값이 없는게 아니라 중요하지 않은 값이라는 의미. ?에 어떤 값이 들어가든 cost 를 계산하는데 들어가지 않기 때문이겠지?
8.2 YOLO Prediction
위에서 말했듯이 YOLO 는 ? 라는 값을 output 하지 않기 때문에 ... 는 random 한 숫자이지만 cost 계산에는 영향을 미치지 않음.
8.3 YOLO non-max suppression
9. (Optional) Region Proposal
귀찮으니까 슬라이드로 대체
Key : sliding window 의 모든 부분을 classification 하는 것이 아니라, 이미지에서 interesting 한 region 만 propose 해서 그걸 classify 하는 방식. 그래서 Region proposal + classification 이라는 2가지 step 이 필요하지만 YOLO 는 한번에 다 처리하기 때문에 더 선호하는 방식.
'Deep learning (일반) > deeplearning.ai' 카테고리의 다른 글
Bias vs Variance (편향, 분산) (0) | 2020.10.29 |
---|---|
[Course4 - Week3] CODE LAB _YOLO (0) | 2020.10.26 |
[Course4 - Week2] State of computer vision (0) | 2020.08.10 |
[Course4 - Week1] Convolutional neural networks (0) | 2020.07.28 |
[Course3 Week2] - Structuring Machine Learning Projects (0) | 2020.07.13 |
- Total
- Today
- Yesterday
- language model
- 워터마킹
- Contextual Embedding
- GPTZero
- Neural Language Model
- Pre-trained LM
- neurone
- Bert
- word embedding
- neural network
- cs224n
- 뉴럴넷
- transformer
- Elmo
- 뉴런
- Attention Mechanism
- 벡터
- LM
- nlp
- weight vector
- Statistical Language Model
- 언어모델
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |