【问题标题】:Implementing a YOLOv3 object detector for the SVHN dataset为 SVHN 数据集实现 YOLOv3 对象检测器
【发布时间】:2020-05-02 16:35:37
【问题描述】:

我正在尝试使用对象检测进行数字检测。 我找到了SVHN dataset。 速度在我的项目中很重要,所以我决定采用 YOLO 方法。

但是,所有关于使用 YOLOv3 的教程和说明都希望我使用由 Google Open Images API 制作的数据集,或者使用 labellimg.py 等工具手动标记图像。

然而,我有一个带有 PASCAL VOC 格式注释的预制数据集(可以在此处找到 https://github.com/penny4860/svhn-voc-annotation-format)。因此,我不创建标签.txt 或 classes.txt 文件,因为我不给自己贴标签。

我不知道从哪里开始。

任何帮助将不胜感激。

【问题讨论】:

    标签: python-3.x tensorflow object-detection yolo


    【解决方案1】:

    您可以按照以下代码将 PASCAL VOC 转换为 YOLO 支持的格式。

    import glob
    import os
    import pickle
    import xml.etree.ElementTree as ET
    from os import listdir, getcwd
    from os.path import join
    
    dirs = ['train', 'val']
    classes = ['person', 'car']
    
    def getImagesInDir(dir_path):
        image_list = []
        for filename in glob.glob(dir_path + '/*.jpg'):
            image_list.append(filename)
    
        return image_list
    
    def convert(size, box):
        dw = 1./(size[0])
        dh = 1./(size[1])
        x = (box[0] + box[1])/2.0 - 1
        y = (box[2] + box[3])/2.0 - 1
        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(dir_path, output_path, image_path):
        basename = os.path.basename(image_path)
        basename_no_ext = os.path.splitext(basename)[0]
    
        in_file = open(dir_path + '/' + basename_no_ext + '.xml')
        out_file = open(output_path + basename_no_ext + '.txt', '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
            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')
    
    cwd = getcwd()
    
    for dir_path in dirs:
        full_dir_path = cwd + '/' + dir_path
        output_path = full_dir_path +'/yolo/'
    
        if not os.path.exists(output_path):
            os.makedirs(output_path)
    
        image_paths = getImagesInDir(full_dir_path)
        list_file = open(full_dir_path + '.txt', 'w')
    
        for image_path in image_paths:
            list_file.write(image_path + '\n')
            convert_annotation(full_dir_path, output_path, image_path)
        list_file.close()
    
        print("Finished processing: " + dir_path)
    

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2021-02-25
      • 2019-01-25
      • 2019-04-10
      相关资源
      最近更新 更多