VisDrone转VOC、YOLO格式

1.转YOLO,将下面代码文件放在YOLOv5文件夹下!

from utils.general import download, os, Path


def visdrone2yolo(dir):
    from PIL import Image
    from tqdm import tqdm

    def convert_box(size, box):
        # Convert VisDrone box to YOLO xywh box
        dw = 1. / size[0]
        dh = 1. / size[1]
        return (box[0] + box[2] / 2) * dw, (box[1] + box[3] / 2) * dh, box[2] * dw, box[3] * dh

    (dir / 'labels').mkdir(parents=True, exist_ok=True)  # make labels directory
    pbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')
    for f in pbar:
        img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).size
        lines = []
        with open(f, 'r') as file:  # read annotation.txt
            for row in [x.split(',') for x in file.read().strip().splitlines()]:
                if row[4] == '0':  # VisDrone 'ignored regions' class 0
                    continue
                cls = int(row[5]) - 1  # 类别号-1
                box = convert_box(img_size, tuple(map(int, row[:4])))
                lines.append(f"{cls} {' '.join(f'{x:.6f}' for x in box)}\n")
                with open(str(f).replace(os.sep + 'annotations' + os.sep, os.sep + 'labels' + os.sep), 'w') as fl:
                    fl.writelines(lines)  # write label.txt


dir = Path(r'C:\Users\....\datasets\VisDrone')  # datasets文件夹下Visdrone2019文件夹目录
# Convert
for d in 'VisDrone2019-DET-test-dev', 'VisDrone2019-DET-train', 'VisDrone2019-DET-val':
    visdrone2yolo(dir / d)  # convert VisDrone annotations to YOLO labels

修改Visdrone2019文件夹目录路径即可!

2.转VOC

import os
from PIL import Image

root_dir = "VisDrone2019-DET-test/"
annotations_dir = root_dir+"annotations/"
image_dir = root_dir + "images/"
xml_dir = root_dir+"Annotations_XML/"
class_name = ['ignored regions','pedestrian','people','bicycle','car','van','truck','tricycle','awning-tricycle','bus','motor','others']

for filename in os.listdir(annotations_dir):
    fin = open(annotations_dir+filename, 'r')
    image_name = filename.split('.')[0]
    img = Image.open(image_dir+image_name+".jpg")
    xml_name = xml_dir+image_name+'.xml'
    with open(xml_name, 'w') as fout:
        fout.write(''+'\n')
        
        fout.write('\t'+'VOC2007'+'\n')
        fout.write('\t'+''+image_name+'.jpg'+''+'\n')
        
        fout.write('\t'+''+'\n')
        fout.write('\t\t'+''+'VisDrone2018 Database'+''+'\n')
        fout.write('\t\t'+''+'VisDrone2018'+''+'\n')
        fout.write('\t\t'+''+'flickr'+''+'\n')
        fout.write('\t\t'+''+'Unspecified'+''+'\n')
        fout.write('\t'+''+'\n')
        
        fout.write('\t'+''+'\n')
        fout.write('\t\t'+''+'Haipeng Zhang'+''+'\n')
        fout.write('\t\t'+''+'Haipeng Zhang'+''+'\n')
        fout.write('\t'+''+'\n')
        
        fout.write('\t'+''+'\n')
        fout.write('\t\t'+''+str(img.size[0])+''+'\n')
        fout.write('\t\t'+''+str(img.size[1])+''+'\n')
        fout.write('\t\t'+''+'3'+''+'\n')
        fout.write('\t'+''+'\n')
        
        fout.write('\t'+''+'0'+''+'\n')

        for line in fin.readlines():
            line = line.split(',')
            fout.write('\t'+''+'\n')
            fout.write('\t\t'+''+class_name[int(line[5])]+''+'\n')
            fout.write('\t\t'+''+'Unspecified'+''+'\n')
            fout.write('\t\t'+''+line[6]+''+'\n')
            fout.write('\t\t'+''+str(int(line[7]))+''+'\n')
            fout.write('\t\t'+''+'\n')
            fout.write('\t\t\t'+''+line[0]+''+'\n')
            fout.write('\t\t\t'+''+line[1]+''+'\n')
            # pay attention to this point!(0-based)
            fout.write('\t\t\t'+''+str(int(line[0])+int(line[2])-1)+''+'\n')
            fout.write('\t\t\t'+''+str(int(line[1])+int(line[3])-1)+''+'\n')
            fout.write('\t\t'+''+'\n')
            fout.write('\t'+''+'\n')
             
        fin.close()
        fout.write('')

注意要修改root_dir!

注意要新建Annotations_XML文件夹!

你可能感兴趣的:(深度学习,人工智能,目标检测)