Маркировка Bounding Box для данных VOC в SSD - PullRequest
0 голосов
/ 10 мая 2018

Я использовал SSD для обучения CNN, и я тестировал с набором данных VOC2007 и VOC2012. Я не совсем понимаю нормализованную Bounding Box в наборе данных VOC2007. Скажем, для набора данных VOC2007, когда мы смотрим на файл Annotations / 000002.xml. Имеет ограничивающую рамку

<size>
  <width>335</width>
  <height>500</height>
  <depth>3</depth>
</size>
<segmented>0</segmented>
<object><name>train</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
   <xmin>139</xmin>
   <ymin>200</ymin>
   <xmax>207</xmax>
   <ymax>301</ymax>
</bndbox></object> 

Это нормально, чтобы нарисовать ограничительную рамку на изображении, показанном ниже.

Но когда я смотрю на нормализованные данные в файле label / 000002.txt.

18 0.516417910448 0.501 0.202985074627 0.202

How these 0.516417910448 0.501 0.202985074627 0.202 are related to 139 200 207 301?

Я использовал 335 и 500 для нормализации, но не получил эти значения. enter image description here

1 Ответ

0 голосов
/ 02 августа 2018

У меня была похожая проблема в прошлом, мое решение было:

Рассмотрим, что у вас есть (из вашего 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

Надеюсь, это поможет вам

...