首页 > 解决方案 > VOCBboxDataset 在应用于我的数据集时返回不正确的数据集大小

问题描述

我有一个 250 个图像数据集和 250 个带有两个类的注释文件:球和球员。该文件夹还包含三个文本文件 train.txt、val.txt、test.txt,分别包含训练、测试和验证图像列表。

bball_labels = ('ball','player')
class BBall_dataset(VOCBboxDataset):
  def _get_annotations(self, i):
    id_ = self.ids[i]
    anno = ET.parse(os.path.join(self.data_dir, 'Annotations', id_ + 
'.xml'))
    bbox = []
    label = []
    difficult = []
    for obj in anno.findall('object'):
      bndbox_anno = obj.find('bndbox')
      bbox.append([int(bndbox_anno.find(tag).text) - 1 for tag in ('ymin', 
'xmin', 'ymax', 'xmax')])
      name = obj.find('name').text.lower().strip()
      label.append(bball_labels.index(name))
    bbox = np.stack(bbox).astype(np.float32)
    label = np.stack(label).astype(np.int32)
    difficult = np.array(difficult, dtype=np.bool)
    return bbox, label, difficult

在 250 个中,我将 170 个作为训练,70 个作为验证,10 个作为测试图像。但是在打印 train、val 和 test 数据集的长度时,我总是得到 train+12, train+3 nad test。例如,在这种情况下,对于 train、val 和 test,它将显示为 182、73、10。测试值不变。每次 train 和 val 值都会增加 12 和 3。

valid_dataset = BBall_dataset('BasketballDataset', 'val')
test_dataset = BBall_dataset('BasketballDataset', 'test')
train_dataset = BBall_dataset('BasketballDataset', 'train') 

print('Number of images in "train" dataset:', len(train_dataset))
print('Number of images in "valid" dataset:', len(valid_dataset))
print('Number of images in "test" dataset:', len(test_dataset))

“训练”数据集中的图像数量:182 “有效”数据集中的图像数量:73 “测试”数据集中的图像数量:10

为什么会发生这种情况以及如何防止这种情况发生。而且它是否会以某种方式影响我的培训过程?

train.txt 链接 ( https://imgur.com/B1Gszfi ) val.txt 链接 ( https://imgur.com/kOcIZ5h )

标签: python-3.xcomputer-visiongoogle-colaboratorychainerchainercv

解决方案


这个问题是由于一个小的被忽视的情况,即文本文件在图像列表被剪切、复制和粘贴到同一个文件中时存在间隙。文本文件是在记事本中创建的。在记事本中索引不可见,但是一旦您在 github 中查看初始索引仍然存在并且索引仍然存在的文本文件,即使列表的大小被缩减,这些间隙也是可见的。例如,首先创建了 182 个图像的列表,但后来减少到 170 个。因此,当我们使用 Dataset Creation 对象时,代码会读取文本文件的所有行,即它将读取 182 而不是 170。我们需要确保索引的数量和图像的数量相同,以避免这个问题。


推荐阅读