Bounding Box Predictions
빨간색 - ground truth (심지어 정사각형도 아님)
파란색 - predicted bounding box (이게 최선)
더 정확한 bounding box를 구하는 방법은?
[YOLO algorithm - You Only Look Once]
100 x 100 이미지가 있을 때 그리드로 나눈다 (예시를 위해 3 x 3 그리드로 나누었지만 실제로는 19 x 19 등 좀더 세밀한 그리드 사용)
image classification + localization 알고리즘을 각 그리드셀에 적용한다
각 그리드셀에 대하여:
$$y = \begin{bmatrix}P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ c_{1} \\ c_{2} \\ c_{3}\end{bmatrix} $$
위 이미지에는 타겟 오브젝트가 두 개 있음
각 오브젝트의 중심점(midpoint)을 포함하고 있는 그리드셀에 그 오브젝트를 assign 함
가운데 그리드셀에도 bounding box 의 일부가 있긴 하지만, 없다고 침. 따라서 y 값은 $y = \begin{bmatrix}0 \\? \\? \\ ? \\? \\ ? \\ ? \\ ?\end{bmatrix} $
그리고 초록색으로 칠한 저 그리드셀과 노란색 그리드셀의 y값은(클래스2가 자동차라고 했을 때):
$$y = \begin{bmatrix}1 \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ 0\\ 1\\ 0\end{bmatrix} $$
전체 그리드에 대한 y값(target output)은 $3 \times 3 \times 8$ 모양이 될 것임 (각 그리드셀마다 8개 값을 가지므로)
입력 $X$는 100 x 100 x 3
conv, max pool ...
출력$Y$는 3 x 3 x 8
--> 신경망이 정확한 bounding box 값을 출력하게 된다는 장점
오브젝트의 bounding box가 여러 그리드셀에 걸쳐 있더라도 midpoint를 포함하고 있는 하나의 그리드셀에만 assign한다는 점
그리드가 세밀할수록 한 그리드셀에 여러 오브젝트가 걸쳐져 있을 확률은 훨씬 적어짐
(1) This is a lot like the image classification and localization algorithm - it outputs the bounding box coordinates explicitly, so this allows in your network to output bounding boxes of any aspect ratio, as well as output much more precise coordinates that aren't just dictated by the stride size of your sliding windows classifier.
(2) This is a convolutional implementation and you're not implementing this algorithm 9 times on the 3 x 3 grid - one single convolutional implementation where you use one conv net with a lot of shared computation between all the computations needed for all of the grid cells.
"constant popularity"
- YOLO 알고리즘은 매우 빨라서 실시간 object detection에도 사용될 수 있음
[Specify the bounding boxes]
오른쪽 노란 박스 그리드셀의 경우
$$y = \begin{bmatrix}1 \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ 0 \\ 1 \\ 0\end{bmatrix} $$
그리드셀에 상대적인 값으로 표시됨
*좌표: 좌측상단 (0, 0) - 우측하단 (1, 1)
midpoint의 위치 : $b_{x}$, $b_{y}$ 위 이미지에서 대충 $0.4$, $0.3$ 정도로 보임
가로세로폭은 그리드셀의 크기에 상대적인 값: $b_{h}$는 약 $0.5$, $b_{w}$는 약 $0.9$
$b_{x}$, $b_{y}$ 같은 경우는 그리드셀 안에 있어야 하므로 $0$과 $1$ 사이의 값
반면 $b_{h}$, $b_{w}$는 $1$보다 클 수 있다 (bounding box 가 한 그리드셀의 길이보다 클 경우가 존재)
Intersection Over Union
- 내 object detector가 잘 작동하고 있는지 어떻게 알 수 있을까?
[Evaluating object localization] - to map localization to accuracy
빨간색이 ground truth, 보라색이 예측값이라면 이건 제대로 된 결과일까 아닐까?
"Intersection over union(IoU)" function : computes the intersection over union of these two bounding boxes
*union = 합집합, intersection = 교집합
$$\frac{the\ size\ of\ the\ intersection}{the\ size\ of\ the\ union }$$
"correct" if IoU $\geq $ 0.5 - 0.5는 predicted bounding box가 맞는지 확인하는 데 자주 쓰이는 threshold
IoU is a measure of the overlap between two bounding boxes
Non-max Suppression
하나의 오브젝트를 여러번 detect하는 문제가 있음
midpoint가 속한 그리드셀은 저기 하나씩 있는데 그 주위의 다른 그리드셀들에서도 오브젝트를 detect했다고 할 수도 있음
이를 방지하기 위한 "Non-max supression"
모든 그리드셀에 대해서 image classification과 localization을 시행하고 있기 때문에 여러 그리드셀에서 $P_{c}$(오브젝트가 있을 확률)가 높게 나올 수 있음
*일단 $P_{c}$를 probablity of detection 이라고 보자
가장 confident한 bounding box를 고른다 (오른쪽의 경우 0.9 가 제일 높음)
The non-max suppression part then looks at all of the remaining rectangles and all the ones with a high overlap(with a high IoU) will get suppressed
확률 0.6, 0.7인 bounding box들은 이 confident한 box와 겹치는 부분이 많다 - 이들을 suppress한다
"non-max" : You're going to output your maximal probabilities classifications but suppress the close-by ones that are non-maximal
[Non-max suppression algorithm]
위 사진 입력 --> 19 x 19 x 8 볼륨 출력 (19 x 19개인 그리드셀마다 8개의 값이 있음)
----> car detection으로 한정한다고 치면 19 x 19 x 5 볼륨 (하나의 오브젝트만 detect 한다고 치면 $c_{1}$, $c_{2}$, $c_{3}$ 등 클래스 확률은 필요하지 않음
$$y = \begin{bmatrix}P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \end{bmatrix} $$
각 셀에서의 bounding box 위치/크기 정보와 그 bounding box가 오브젝트일 확률을 출력함
- $P_{c}\leq 0.6$인 box들을 모두 버린다
- $P_{c}$가 가장 큰 box들을 고르고 이들을 prediction으로 출력한다
- $IoU \leq 0.5$인 나머지 box들을 버린다
위 예시에서는 타겟 object가 하나였는데, 타겟 object가 여러개일 때는 - 예를 들어 세 개일 때는 non-max suppression을 세 번 독립적으로 시행한다
Anchor Boxes
What if a grid cell wants to detect multiple objects?
[overlapping objects]
각 그리드셀의 output은 $y = \begin{bmatrix}P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ c_{1} \\ c_{2} \\ c_{3}\end{bmatrix} $ 형식으로 되어 있는데, 두 개의 오브젝트를 모두 표시할 수는 없으므로 두 detection 중 하나를 선택해야 함
pre-defined anchor boxes를 준비
$$y = \begin{bmatrix}P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ c_{1} \\ c_{2} \\ c_{3} \\ P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ c_{1} \\ c_{2} \\ c_{3}\end{bmatrix} $$
첫 8개 값은 anchor box 1, 그 다음 8개 값은 anchor box 2에 상응함 (서 있는 사람이 anchor box 1 의 모양과 더 유사하므로)
- 정리하자면
anchor box를 사용하기 전:
각 오브젝트는, 오브젝트의 midpoint를 포함하고 있는 그리드셀에 assign
--> output $y$ 는 3 x 3 x 8 모양
anchor box를 사용한 후:
각 오브젝트는, 오브젝트의 midpoint를 포함하고 있는 그리드셀에 assign
+ 그 그리드셀과 가장 높은 IoU를 가진 anchor box에도 assign
--> 즉 (grid cell, anchor box) 쌍에 assign
--> output $y$ 는 3 x 3 x 2 x 8 (anchor box 두 개 x 8개 값)
두 오브젝트가 함께 있는 저 그리드셀의 output
$$y = \begin{bmatrix}P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ c_{1} \\ c_{2} \\ c_{3} \\ P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ c_{1} \\ c_{2} \\ c_{3}\end{bmatrix} = \begin{bmatrix}1 \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ 1 \\ 0 \\ 0 \\ 1 \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ 0 \\ 1 \\ 0\end{bmatrix} $$
만약 자동차만 있었다면?
$$ y = \begin{bmatrix} 0 \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ 1 \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ 0 \\ 1 \\ 0\end{bmatrix} $$
만약에 anchor box 는 두 개인데, 같은 그리드셀에 오브젝트가 세 개 있을 때는?
아니면 두 개 오브젝트가 같은 anchor box에 해당된다면?
- 이 알고리즘으로는 다루기 어려운 문제들
anchor box로 해결하고자 하는 문제는 사실 그렇게 자주 일어나지 않음 특히 19 x 19 그리드에서는
다만 anchor box 로써 detection을 specialize할 수 있음 가로폭이 넓은 오브젝트에 특화된다든가
anchor box를 고르는 방법은?
보통 직접 고르며, 5~10개 anchor box 선정함. K-means 활용해서 anchor box 를 고르기도
YOLO Algorithm
[training]
output $y$ 는 3 x 3 x 2 x 8 (혹은 3 x 3 x 16)
- 3 x 3 그리드
- 2개 anchor box
- 5($p_{c}랑 bounding box 좌표값 네 개$) + 클래스개수
$$y = \begin{bmatrix}P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ c_{1} \\ c_{2} \\ c_{3} \\ P_{c} \\b_{x} \\ b_{y} \\ b_{h} \\b_{w} \\ c_{1} \\ c_{2} \\ c_{3}\end{bmatrix} $$
그리드셀 단위로 보자면, 맨 왼쪽 상단 그리드는 아무것도 없으므로
$$y = \begin{bmatrix} 0 \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ 0 \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \end{bmatrix} $
한편 맨 아랫줄 가운데 그리드는 자동차 오브젝트가 있으므로
$$y = \begin{bmatrix} 0 \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ 1 \\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ 0 \\ 1 \\ 0 \end{bmatrix} $
[predictions]
물음표로 처리했던 부분은 노이즈값이라고 생각하면 됨
[Outputting the non-max suppressed outputs]
- 각 그리드 셀마다 두 개의 predicted bounding boxes 를 출력한다 (anchor가 두 개이므로)
- 낮은 확률 예측값들은 삭제한다
- 각 클래스별로 독립적으로 non-max suppression 을 적용한다
'인공지능 > DLS' 카테고리의 다른 글
[4.4.] Face Recognition (0) | 2022.08.02 |
---|---|
[4.3.] Detection Algorithms(3) (0) | 2022.08.02 |
[4.3.] Detection Algorithms(1) (0) | 2022.07.28 |
[4.2.] Practical Advice for Using ConvNets (0) | 2022.07.27 |
[4.2.] Case Studies(2) (0) | 2022.07.26 |