У меня была похожая проблема в прошлом, мое решение было:
Рассмотрим, что у вас есть (из вашего XML-файла VOC Pascal - Annotations / 000002.xml):
width = 335
height = 500
xmin = 139
xmax = 207
ymin = 200
ymax = 301
ToНормализовать координаты ограничивающего прямоугольника вы можете:
def norm_box(width, height, xmin, xmax, ymin, ymax):
x = (xmin + xmax)/2. * 1./width
w = (xmax - xmin) * 1./width
y = (ymin + ymax)/2. * 1./height
h = (ymax - ymin) * 1./height
return (x,y,w,h)
box_norm = norm_box(width, height, xmin, xmax, ymin, ymax)
print(box_norm)
Вывод:
(0.5164179104477612, 0.501, 0.20298507462686566, 0.202)
, который соответствует нормализованным данным в файле label / 000002.txt.
18 0.516417910448 0.501 0.202985074627 0.202
Чтобы денормализовать его, вы можете сделать:
def denorm_box(width, height, x, y, w, h):
xmax = int((x*width) + (w * width)/2.0)
xmin = int((x*width) - (w * width)/2.0)
ymax = int((y*height) + (h * height)/2.0)
ymin = int((y*height) - (h * height)/2.0)
return (xmin, xmax, ymin, ymax)
(x,y,w,h) = box_norm
box = denorm_box(width, height, x, y, w, h)
print(box)
Вывод:
(139, 207, 200, 301)
Вы можете увидеть демо здесь: https://notebooks.azure.com/andrewssobral/libraries/utils/html/bbnorm.ipynb
Надеюсь, это поможет вам