티스토리 뷰

Deep-learning

YOLOv8 이해하기 (4) - Loss

Sims. 2024. 11. 11. 21:23
728x90

https://sims-solve.tistory.com/125

 

YOLOv8 이해하기 (3) - Detection output shape

https://sims-solve.tistory.com/123 YOLOv8 이해하기 (2) - Headhttps://sims-solve.tistory.com/122 YOLOv8 이해하기 (1) - Backbone디텍션 테스크를 하다보면 YOLO를 한번쯤은 들어본적이 있을 것이다.물론 YOLO가 너무 유명

sims-solve.tistory.com

지금까지 모델의 구조와 최종 output을 살펴보았다.

 

결국 Detection을 모두 진행하면 (batch, ClassNum + 4(xywh) , 8400(Gird cell 수 )) 가 나오는 것을 알 수 있었다.

해당 정보를 바탕으로 이제 학습을 위한 Loss을 어떻게 구하는지 알아보고자 한다.

 

조금 코드를 살펴보면서 구하는 방식을 살펴보자.

 

1. pred_distri , pred_scores

해당 코드를 통해 나오는 값들은 각각

pred_distri : 1, 64, 8400 --> Bbox 

pred_scores : 1, 80, 8400 --> Class

이전 글에서 1,144,8400이 두개로 Split 되는 과정을 볼 수 있는데, 해당 코드가 그 과정을 해주는 코드다.

그 후 Bbox에 해당하는 정보를 DFL을 통해 1,4,8400으로 바꾸는 과정이 나왔었다.

그래서 최종 출력에는 1,84,8400으로 구성되는 것이었다. 계속해서 코드를 살펴보자.

 

해당 코드를 통해서 1,64,8400 -> 1, 4, 8400으로 바꿔주게 된다. 한번 더 bbox_decode 함수로 들어가보자.

여기서 pred_dist는 1,8400,64여서 batch, anchors, channels가 된다.

 

1. 여기서 pred_dist.view(b,a,4,c//4)를 통해 1,8400,4,16으로 다시 차원을 나눠준다.

2. 그 후 softmax(3)를 해준 후 self.proj를 행렬곱 해준다. self.proj는 0~15까지의 숫자가 들어있다 ) 

3. 그럼 최종 shape은 1,8400,4가 된다.
4. 그 후 dist2bbox를 진행하게 된다.

 

1. lt ( left top ), rb(right bottom ) 값을 각각 나타내므로 둘을 나눠 anchor_point에 빼고 더하기를 각각 해준다. ( xyxy형태 )

2. 그럼 앵커기준으로 lt, rb가 각각 나오고 그걸 다시 return 해준다.

 

YOLO는 xywh 형태로 Bbox를 나타내지만, 내부적으로 Bbox를 학습할때는 xyxy형태로 바꿔서 학습을 하는 것을 볼 수 있다.

 

 

 

결국엔 총 3개의 Loss를 구해 더하여 최종 loss을 구하게 된다.

loss[0] -> box에 관련된 loss

loss[1] -> 분류 관련 loss

loss[2] -> dfl 관련 loss 

 

자세히 파면팔수록 알아야 할 내용이 많고, 아직 얕게만 어떻게 돌아가는지 파악이 가능하다.

생각보다 단순하지 않고, 코드적으로 복잡하게 되어있기때문에 추가적으로 Deep Dive를 할 필요가 있어보인다.

 

지금까지 YOLOv8 전반적인 내용을 살펴보았다. 모델부터 loss을 구하는 방식까지 살펴봤으니 얕게나마 yolo를 이해할 수 있었다.

좀더 Deep Dive를 하여 해당 shape이 어떤 의미를 가질지 생각해보는것도 좋을 것 같다. 필자도 추가적으로 업데이트를 진행할 예정이다. 

 

 

 

 

* 추가 내용

** stride_tensor 를 지정해서, 8, 16 ,32 로 해놓은게 있는데, 이게 나중에 anchor point와 곱해서 실제 이미지의 위치를 나태주는 역할을 한다. 

 

**_mask 관련된 변수는 객체가 있는 부분만 표시해주기 위해 필요한 것임. 

 

YOLO는 xywh형식이지만, 학습할때는 xyxy로 변경하여 진행한다. 위 코드에서 xyxy로 변경하는 것을 볼 수 있다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함