기존에 사용하던 Object Detection의 Bounding Box 좌표와는 다른 Oriented Bounding Box의 좌표를 구해야 앞서 본 Yolov5-obb를 사용할 수 있습니다.

라벨링을 처음부터 객체에 맞게 사용하면 손쉽게 훈련 후 모델의 사용까지 나아갈 수 있습니다. 하지만 라벨링을 처음부터 다시 하려면 인력낭비가 심하기에 저는 Segmentaiton Polygon 형태를 OBB 형태로 변환할 수 있는지에 대해 연구하였습니다

아래는 제가 제작자에게 직접 데이터 셋의 형태를 변환하는 방법이 있는지 물어보았는데 알려주는 것은 새로 라벨링하여 처음부터 OBB 형태로 모으는 방법 이외에는 알려주지 않았습니다.

https://github.com/hukaixuan19970627/yolov5_obb/issues/320

어떤 중국인은 니가 알아서 하라길래 빡쳐서 만듭니다.. ( 첫 답글 )

1. 문제파악

회사가 가진 데이터는 Bbox 또는 Segm polygon 형태인 것으로 알고 있습니다. BBox는 기존에 사용되는 Yolo와 같이 원하지 않은 객체의 정보를 불필요하게 많이 포함한다는 단점이 있습니다.

Polygon 형태는 객체의 정보만 딱 가지고 있으나, BBOX의 형태로 인식하기 어렵고, 훈련을 할 수 있는 모델이 정해져있으며, 객체 인식이 Bbox 보다는 떨어집니다.

→ 하지만 회사에서 모두 Detectron2를 사용해서 객체를 인식하는 것을 보았고, 객체 인식의 성능을 높이기 위해 이 모델을 더 파악해보려고 하였습니다.

하지만 새롭게 데이터를 모을 수는 없었고, 가지고 있는 좌표의 값으로 최대한 활용하여 문제를 해결하려고 합니다.

segm = [[51.928646, 186.450359, 112.978734, 211.914583, 110.538559, 218.891083, 105.65821, 227.960532, 100.777861, 241.564706, 90.668566, 261.447731, 113.32733, 269.470706, 
             112.281541, 279.237805, 118.20768, 289.004905, 123.785222, 295.283755, 131.802938, 302.260255, 147.838372, 313.771479, 169.451347, 322.840928, 193.573079, 327.375653,
             223.900965, 360.862852, 227.038332, 316.213254, 246.908326, 316.213254, 258.412006, 306.097329, 266.429723, 277.493681, 282.185142, 282.726055, 316.347587, 299.818479,
             337.611965, 295.981405, 344.93249, 290.05138, 368.98564, 234.937032, 370.728622, 218.193432, 362.013712, 203.193958, 296.409011, 176.334434, 296.409011, 169.70676,
             284.90533, 152.96316, 263.640951, 134.824261, 237.844819, 124.010687, 250.742885, 84.244639, 257.366216, 82.500513, 262.943759, 75.872838, 259.109199, 68.547514, 250.394289,
             67.152214, 244.816747, 70.640464, 244.468151, 77.965789, 248.302711, 83.198164, 231.501502, 120.522437, 225.226768, 118.778312, 208.842738, 114.243587, 182.69801, 114.592412,
             169.451347, 116.685362, 163.873805, 122.964211, 97.291897, 95.407038, 83.696638, 97.848813, 75.955197, 102.320674, 48.220037, 169.642102, 48.442682, 170.753234, 49.139875, 175.287959, 51.928646, 186.450359]]

Obb = [[397.7931585355291, 249.98800709357198, 198.38277118834594, 402.38352714729336, 8.472510585936107, 153.89322672273258, 207.8673843042452, 1.50683881274531]]

Normal BBox =[ class x_center y_center width height ]

이 세가지의 annotation 좌표 값에서 어떻게 하면 OBB 값을 얻을 수 있을가 생각해보았습니다.

Segm2Bbox 처럼 수학 방법으로는 절대 구할 수 없었습니다. 이유는 Segm이 순서가 없는 Point 형태이기도 하고, 그냥 좌표에 흩뿌리기 전까지는 상대적인 기준도 알 수 없었습니다.

그래서 도저히 안되나 싶어서 고민하던중에 Roboflow에서는 Segm annotation만 진행해도 OBB 값을 지원해주는 것을 보고 가능하구나 싶어서 더 파보았습니다.

2. 해결 아이디어