[2020] 📚 DSC 겨울방학 스터디

[Week4] 물체 로컬리제이션 + 특징점 탐지

락꿈사 2020. 2. 3. 20:37

https://www.youtube.com/watch?v=GSwYGkTfOKk

https://youtu.be/rRB9iymNy1w

 

컴퓨터가 물체를 인식하게 하기 위해서는 일단 물체 로컬리제이션이라는 걸 알아야 한다.

 

일단 Image classification이 뭘까? 쉽게 말해 '차'를 보고 '차다!'라고 말하는 것이다.

 

그렇다면 Object localization은? 차를 보고 '차다!' 라고 말하는 것 + '차는 여기 있음' 하고 차에 바운딩 박스를 표시해주는 것과 같은 것이다. 물체 분류에서 족금 더 나아갔다고 할 수 있다.

 

이런 Object localization에서 더 나아간 것이 Object detection이다. 간단하게 말하자면 사진 속의 모든 차를 보고 '차다!' +'차는 여기있음' 하는 것이다. 그리고 단순히 '차'만이 그 대상이 되는 것이 아니라 보행자나 오토바이와 같은 물체가 그 대상이 될 수도 있다. 즉, Object detection에서 대상은 더 이상 Image classification이나 Obejct detection처럼 한 개에 한 종류가 아니라는 뜻이다.

 


신경망이 물체의 위치를 찾아내기 위해서 bounding box를 출력하도록 4개의 추가적인 출력을 갖도록 신경망을 변형해야 한다. 경계상자의 중점 (b_x, b_y)와 경계상자의 높이와 너비 (b_h, b_w)이다.

 

 

예를 들어 위와 같은 이미지에서 Object localization을 한다고 할 때, 목표 레이블 y는 원하는 물체가 있는지 없는지를 의미(물체 분류에 대한 확률)하는 p_c, 원하는 물체가 있을 경우의 bounding box의 값 b_x, b_y, b_h, b_w, 그리고 물체에 대한 분류값인 c1, c2, c3(pedestrian, car, motorcycle)가 있다.

 

그리고 만약 훈련 세트를 만든다고 할 때, bounding box에 대한 레이블 작업이 필요하다. 아주 귀찮은 작업이다...ㅂㄷㅂㄷ

 

그래서 위 이미지와 같은 목표 레이블 행렬이 나오게 된다.

 

 

그리고 손실함수 값은 제곱 오차를 사용하여 y = 1인 경우, 즉 물체가 존재하는 경우에는 ( y^1 - y1)^2 + ( y^2 - y2)^2+ ... + ( y^8- y8)^2이 된다. 그리고 물체가 존재하지 않는 경우인  y = 0인 경우 손실 값은 (y^1 - y1)^2가 된다. 왜냐하면 y1을 제외한 모든 나머지 요소들은 무관하기 때문이다. 

 


 

일반적으로 신경망에서는 이미지의 특징점을 찾아 (x,y)의 값으로 나타낸다. 따라서 신경망은 마지막 층에서 (l_x, l_y)와 같은 2개의 값을 갖게 된다. 그렇다면 특징점 값을 2개 이상의 여러 개의 값으로 출력하고 싶다면 어떨까?

 

일단 그러기 위해서는 그 여러 개의 특징점 값을 포함하는 레이블 트레이닝 셋을 만들어야 한다... 아주 귀찮은 작업이란 뜻이다.

 

 예를 들어 위 이미지에서 64개의 얼굴의 특징점을 뽑는다고 한다면 저번 포스팅에서 했듯 결과 레이블 y는 이란 얼굴이 있는지 없는지를 나타내는 출력값 p_c, 그리고 p_c가 참값일때의 특징점 값 l_1x, l_1y ... l_64x, l_64y까지 총 129개의 출력값을 갖게 된다. 이것이 바로 감정 인식의 기본 설계가 된다. 만약 얼굴이 아니라 자세 감지를 한다고 해도 어려운 것은 없다. 가슴 중앙이나 어깨, 팔꿈치, 손목 등과 같은 몇 가지 중요한 특징점을 출력 값으로 받으면 된다.