I want to train YOLO3 for a custom dataset that has raw labels in JSON format. Each bounding box in JSON is specified as
[x1, y1, x2, y2].
So far, I have converted
[x1, y1, x2, y2] to
[cx, cy, pw, ph], that is, center x, center y of the bounding box, scaled to image width and height;
pw, ph are the ratios of bounding box's width and height relative to the image's width and height. But I don't think that's complete (or even right).
As far as I understood, YOLO3 assigns N anchor boxes to each grid cell (image is divided into SxS grid cells) and thus, the prediction of a bounding box is relative to a given anchor box from a grid cell (that one anchor box that has the highest IOU with the ground truth). The formulas are below:
Therefore, how should I prepare ground truths so that YOLO3 can understand them? Do I have to, somehow, reverse those formulas? Also how to account for different number of scales and different number of anchor boxes?
For a concrete example: Suppose I have a
416 x 416 image and a configuration of
13 x 13 grid cells. The ground truth bounding box (from the dataset) is
[x1=100, y1=100, x2=200, y2=200], class = c. What will be the converted values for YOLO3?
L.E.: Say we have 2 classes
[car, person] and 2 anchors (1 wide, 1 tall).
Would the output be a tensor of shape
13 x 13 x (2*(5+2)) where most of the values (that vector of shape
2*(5+2)) for the grid cells are 0 except for one particular cell (the one in which the center of the ground truth bounding box falls)?
In this case, for that cell (say
c[i,j]), suppose the largest IOU is given for anchor 2 and that the ground truth class is
person. This means that
c[i,j,:7] (anchor 1 prediction) will be ignored and
c[i,j,7:] (anchor 2 prediction) will be
[bx, by, bw, bh, conf, 0, 1].
Therefore, how should the ground truth for the person's bounding box should be encoded? Should it be an offset from a particular anchor of a grid cell? This is what it's still unclear for me.