【问题标题】:Split dataset of JPG and XML files into train and test set将 JPG 和 XML 文件的数据集拆分为训练集和测试集
【发布时间】:2021-10-20 15:01:59
【问题描述】:

我有一个对象检测算法的数据集,其中包含图片 (.jpg) 和包含边界框的相应 .xml 文件。

我想编写一个脚本,将数据集随机拆分为训练集和测试集,这意味着我必须确保将 jpg 及其对应的 XML 分配到同一目录。

我应该如何编辑以下代码来实现这一点?

此外,这是执行此操作的“最佳”方式,还是在 xml 到 csv 转换或生成 csv 到 tfrecords 转换之后拆分数据集更好?

import shutil, os, glob, random

# List all files in a directory using os.listdir
basepath = '/home/createview/Vegard/createview/lice_detection_v2/workspace/images/Synced_dataset'
filenames = []

for entry in os.listdir(basepath):
    if os.path.isfile(os.path.join(basepath, entry)):
        #print(entry)
        filenames.append(entry)

filenames.sort()  # make sure that the filenames have a fixed order before shuffling
random.seed(230)
random.shuffle(filenames) # shuffles the ordering of filenames (deterministic given the chosen seed)

split = int(0.8 * len(filenames))
train_filenames = filenames[:split]
test_filenames = filenames[split:]

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    对我来说最好的选择是以正确的顺序创建两个文件列表(filenames 用于jpgxmlnames 用于xml)和一个索引列表indices=[i for i in range(len(filenames))]

    然后你可以洗牌你的索引列表:

    random.seed(230)
    random.shuffle(indices)
    

    最后,为 jpgxml 文件创建训练集和测试集:

    split = int(0.8 * len(filenames))
    file_train = [filenames[idx] for idx in indices[:split]]
    file_test = [filenames[idx] for idx in indices[split:]]
    xml_train = [xmlnames[idx] for idx in indices[:split]]
    xml_test = [xmlnames[idx] for idx in indices[split:]]
    

    【讨论】:

      【解决方案2】:
      import shutil, os, glob, random
      
      # List all files in a directory using os.listdir
      basepath = 'images/'
      labelpath='label/'
      filenames = []
      xmlnames = []
      
      for entry in os.listdir(basepath):
          if os.path.isfile(os.path.join(basepath, entry)):
              print(entry)
              filenames.append(entry)
              
              
      for entry in os.listdir(labelpath):
          if os.path.isfile(os.path.join(labelpath, entry)):
              print(entry)
              xmlnames.append(entry)
      
      indices=[i for i in range(len(filenames))]        
      filenames.sort()
      xmlnames.sort() # make sure that the filenames have a fixed order before shuffling
      random.seed(230)
      random.shuffle(indices) # shuffles the ordering of filenames (deterministic given the chosen seed)
      
      split = int(0.8 * len(filenames))
      file_train = [filenames[idx] for idx in indices[:split]]
      file_test = [filenames[idx] for idx in indices[split:]]
      xml_train = [xmlnames[idx] for idx in indices[:split]]
      xml_test = [xmlnames[idx] for idx in indices[split:]]
      
      print(file_test)
      print(xml_test)
      

      所以我按照上述建议(由 Joseph 提出)添加索引,然后当我们制作测试和训练变量时,在变量中添加完全相同的图像和标签,希望这会有所帮助

      【讨论】:

      • 最好添加一些解释来描述您的意思以及这段代码如何回答问题
      • 添加了信息,基本上我们确保图像和注释的名称完全相同,然后采用两种格式的确切文件名并将它们嵌入到训练测试中
      猜你喜欢
      • 2017-11-01
      • 1970-01-01
      • 2019-05-01
      • 2017-06-11
      • 2017-07-17
      • 1970-01-01
      • 2018-07-21
      • 2018-10-13
      • 2019-12-11
      相关资源
      最近更新 更多