SSD中VOC数据的边界框标签

问题描述 投票:1回答:1

我使用SSD进行CNN培训,并使用VOC2007和VOC2012数据集进行了测试。我不太了解VOC2007数据集中的标准化边界框。当我们查看Annotations / 000002.xml文件时,请说明VOC2007数据集。它有一个边界框

<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> 

可以在下面显示的图像上绘制一个边界框。

但是当我查看labels / 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

deep-learning caffe
1个回答
0
投票

我过去遇到过类似的问题,我的解决方案是:

考虑一下(来自您的Pascal VOC XML文件 - Annotations / 000002.xml):

width = 335
height = 500

xmin = 139
xmax = 207
ymin = 200
ymax = 301

要标准化边界框坐标,您可以执行以下操作:

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)

与标签/ 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

希望这对你有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.