8: (batch index, grid y index, grid x index, x, y, w, h, class index)
target에 포함된 오브젝트별로 배치의 몇번째 이미지의 어느 그리드에 위치하는지를 (batch index, grid y index, grid x index)로 표현했고, 이를 인덱스로 삼아 prediction에서 오브젝트가 위치한 그리드의 예측을 가져와 loss를 계산합니다.
좌우 반전할때 loss 값이 차이가 있나 싶어 타겟과 prediction을 좌우반전하여 계산하여도 좌우반전하지 않은 샘플과 loss 값이 같았습니다.
계속 코드를 점검해보는데 문제점을 발견하지 못하고 있습니다.
여유가 있으시다면 조언 부탁드립니다.
긴 글 읽어주셔서 감사합니다.
앗, @bongmo 님께서 바쁘신가 보네요 ㅎㅎ
먼저, 저는 CV 분야를 잘 알지는 못해서 틀릴 수 있음을 양해 부탁드립니다
추측하기로는 @bongmo 님께서 예시로 드신 xywh가 [0.1, 0.1, 0.1, 0.1]을 고려해보면, (x_0, y_0) 의 좌표가 (0.1, 0.1)로 box가 이미지의 끝에 붙어있지 않고, 0.1 (= x_0)만큼 떨어져있습니다.
하지만 @canlion 님께서 하셨던 것처럼 x'_0 = 1.0 - x_0 로 hflip을 하는 경우에는 (x'_0, \ y'_0) 의 좌표가 (0.9, 0.1)로 해당 box는 이미지 끝에 딱 붙게 됩니다.
(box의 오른쪽 끝 좌표 x'_1 = x'_0 + w = 0.9 + 0.1 = 1.0)
즉, 좌표 변환 과정에서 박스의 넓이(w)를 고려하지 않아서 생긴 이슈로 이해했고,
아마도 그런 이유에서 그려서 확인이 필요하다고 하신 것으로 이해하였습니다.
hflip의 경우 중심 선(0.5)을 기준으로 x_1 \ -> \ x'_0 이 되고, x_0 \ -> \ x'_1 이 되어야 할 것 같습다.
한 번 x'_0 = 1 - x_1 = 1 - (x_0 + w) 와 같은 방식으로 hflip을 해보시면 어떠실까요?
추가 설명을 붙여주셔서 두 분께서 말씀하신 내용을 이해할 수 있었습니다.
xy를 박스의 좌상단 좌표로 사용하신 내용으로 이해했습니다.
그런데 yolo에서 xy좌표는 박스의 좌상단 좌표 대신 박스의 중심을 의미합니다.
yolo에서만 사용되는 형식인데 제가 설명을 자세히 드리지 않아 오해가 생긴 듯 합니다.
다음부터는 좀 더 디테일하게 글을 작성토록 하겠습니다.
데이터셋에서 오브젝트마다 (오브젝트가 속한 배치(이미지) 인덱스, 그리드 인덱스 y, 그리드 인덱스 x, …)를 받아
True/False 마스크를 생성해 prediction에서 오브젝트가 위치한 그리드의 값을 인덱싱하는데
마스크에서는 오브젝트의 순서를 반영하지 못해 prediction과 target의 페어가 어긋났습니다.