lars76/kmeans-anchor-boxes

在coco数据集上无法得到anchors

zqdeepbluesky opened this issue · 5 comments

hi,@lars76
你好,好久不见,我最近想在coco数据集上进行训练和测试。我把coco的annotations格式制作成xml的格式,xml的格式如下:

-<annotation>
   <folder>1</folder>
   <filename>COCO_train2014_000000000036.jpg</filename>
  -<source>
     <database>CKdemo</database>
     <annotation>VOC</annotation>
     <image>CK</image>
   </source>
  -<size>
     <width>481</width>
     <height>640</height>
     <depth>3</depth>
   </size>
   <segmented>0</segmented>
  -<object>
     <name>person</name>
     <pose/>
     <truncated>0</truncated>
     <difficult>0</difficult>
    -<bndbox>
       <xmin>167</xmin>
       <ymin>162</ymin>
       <xmax>478</xmax>
       <ymax>628</ymax>
     </bndbox>
   </object>
 </annotation>

然后我使用你提供的k-means代码进行聚类,但是我得到了如下的错误:

dxt@dxt-System-Product-Name:~/kmeans-anchor-boxes-master$ python example.py
Traceback (most recent call last):
File "example.py", line 32, in
out = kmeans(data, k=CLUSTERS)
File "/home/dxt/kmeans-anchor-boxes-master/kmeans.py", line 68, in kmeans
distances[row] = 1 - iou(boxes[row], clusters)
File "/home/dxt/kmeans-anchor-boxes-master/kmeans.py", line 14, in iou
raise ValueError("Box has no area")
ValueError: Box has no area

然而我不清楚我的xml格式是哪地方出现的错误,我对比了一下我和voc的xml文件,不过还是没能找到问题,你能帮帮我吗?万分感谢,祝你生活愉快。

对了还有下面这一句话是什么意思,你能告诉我吗,谢谢啦。

    x = np.minimum(clusters[:, 0], box[0])
    y = np.minimum(clusters[:, 1], box[1])
    if np.count_nonzero(x == 0) > 0 or np.count_nonzero(y == 0) > 0:
        raise ValueError("Box has no area")

非常抱歉打扰你,我发现问题了,原因是我没有在python3下运行这个代码,而是在python2中运行的,所以出现了错误,再次谢谢你的代码,真的写的非常棒,祝你身体健康。

hi,我发现就是换成了python3还是出现了这个问题,我感觉可能是我的数据集制作的有问题,所以还是想请问下这句话是什么意思:
x = np.minimum(clusters[:, 0], box[0])
y = np.minimum(clusters[:, 1], box[1])
if np.count_nonzero(x == 0) > 0 or np.count_nonzero(y == 0) > 0:
raise ValueError("Box has no area")

可不可以当遇到不符合上述语句的xml文件时,把那个文件跳过去。或者指出是哪个xml文件出问题了?因为coco数据集太大了,无法一张一张的找出来是哪个xml文件出问题了。你能指点我一下吗?谢谢啦。

Hi, to calculate the IoU I'm using the formula min(width_box_1, width_box_2) * min(height_box_1, height_box_2). This means when either of the terms is zero, then the area of the box will be 0. Thus, np.count_nonzero(x == 0) > 0 will check if the amount of zeros is > 0.

So indeed there is a problem with some xml file. You can find the wrong xml file by adding in example.py the line: if xmax - xmin <= 0 or ymax - ymin <= 0: print(xml_file). Alternatively, just remove the raise ValueError line. If there are so many xml files, a few invalid xml files won't make a difference.

hi,非常感谢你的帮助,我现在可以在coco数据集上进行聚类了,我使用的是你提供的第二种方法,也就是提高valueerror,我修改了以下代码:

    if np.count_nonzero(x == 0) > 100 or np.count_nonzero(y == 0) > 100:
raise ValueError("Box has no area")

然后就可以聚类了。
真的非常感谢你,谢谢啦。

能问一下,你在COCO上聚类出来的最后的mean - IoU是多少