码农-小林 2025-09-11 17:10 采纳率: 54.8%
浏览 3

验证集图片列表和训练集列表理解

在main下创建train训练集以存放所有文件名和验证集合val这里也是我存放了所有文件名不知道这样可对,如下

img

img


这里通过vol_label.py生成对应的2025_train.txt训练集文件列表和2025_val文件列表,但好像生成是一样,一样原因是因为我初始train.txt和val.txt都写一样都是写文件名列表,具体val.txt 和train.txt需要怎么写才是对的

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[('2025', 'train'), ('2025', 'val')]

classes = ["Shu"]


def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):
    in_file = open('D:/YOLO/darknet-master/scripts/VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('D:/YOLO/darknet-master/scripts/VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
   
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
  
        if cls not in classes or int(difficult) == 1:
            continue
            break
        cls_id = classes.index(cls)   
        xmlbox = obj.find('bndbox')     
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)     
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
        
wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('D:/YOLO/darknet-master/scripts/VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('D:/YOLO/darknet-master/scripts/VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('D:/YOLO/darknet-master/scripts/VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
   # list_file = open('%s_%s.txt'%(year, image_set), 'w')
    list_file = open('D:/YOLO/darknet-master/scripts/VOCdevkit/VOC2025/ImageSets/Main/%s_%s.txt'%(year, image_set), 'w')

    for image_id in image_ids:
        print(image_id)
        #list_file.write('%sD:/YOLO/darknet-master/scripts/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        list_file.write('D:/YOLO/darknet-master/scripts/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

  • 写回答

4条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-09-11 17:12
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 从描述来看,关键在于确认创建存放训练集和验证集文件名列表的方式是否正确。需要明确vol_label.py这个脚本生成文件列表的具体逻辑以及这些列表后续的使用场景等。
    2. 解决方案
      - 首先,关于在main下创建存放训练集文件名列表和验证集文件名列表的方式,从描述不太能直接判断对错。
      - 假设vol_label.py是一个用于生成文件列表的脚本,它生成的2025_train.txt文件列表应该是符合特定格式要求的。例如,如果是用于图像分类任务,文件列表中的每一行可能是图像文件名及其对应的标签(如果有标签的话),格式可能如下:
      image1.jpg label1 image2.jpg label2
      - 要验证其正确性,可以通过读取这个文件列表来检查文件名是否与实际存放的训练集图像文件名一致。以下是一个简单的Python代码示例来读取文件列表并检查其中的文件名:
      ```python
      def check_file_list(file_list_path):
      with open(file_list_path, ‘r’) as f:
      lines = f.readlines()
      for line in lines:
      parts = line.strip().split()
      filename = parts[0]
      # 这里可以添加代码来检查文件是否实际存在
      import os
      if not os.path.exists(filename):
      print(f”File {filename} in list does not exist.”)

      file_list_path = ‘2025_train.txt’
      check_file_list(file_list_path)
      `` 3. **不同方案的优缺点**: - **方案一:简单文本文件读取检查** - **优点**:实现简单,能够快速检查文件列表中的文件名是否存在。 - **缺点**:只能检查文件名是否存在,无法检查文件列表中的其他信息(如标签是否正确等),对于复杂的数据集结构可能不够全面。 4. **总结**: - 要验证vol_label.py`生成的训练集文件列表是否正确,可以通过读取文件列表并检查其中的文件名是否与实际训练集图像文件名一致来初步判断。后续还可以根据具体任务需求进一步检查文件列表中的其他信息,如标签等是否准确无误。

    需要注意的是,上述解答是基于有限的问题描述进行的推测和建议,实际情况可能因具体的项目需求和数据集结构而有所不同。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月11日