VisDrone转VOC、YOLO格式

这段代码提供了两个功能,一是将VisDrone数据集的标注转换为YOLO格式,二是将VisDrone数据集转换为VOC格式。它使用了PIL库处理图像,tqdm进行进度条显示,并涉及到了坐标转换和XML文件的生成。转换过程包括读取VisDrone的标注文件,处理类别和边界框信息,然后写入新的YOLO或VOC格式的标签文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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('<annotation>'+'\n')
        
        fout.write('\t'+'<folder>VOC2007</folder>'+'\n')
        fout.write('\t'+'<filename>'+image_name+'.jpg'+'</filename>'+'\n')
        
        fout.write('\t'+'<source>'+'\n')
        fout.write('\t\t'+'<database>'+'VisDrone2018 Database'+'</database>'+'\n')
        fout.write('\t\t'+'<annotation>'+'VisDrone2018'+'</annotation>'+'\n')
        fout.write('\t\t'+'<image>'+'flickr'+'</image>'+'\n')
        fout.write('\t\t'+'<flickrid>'+'Unspecified'+'</flickrid>'+'\n')
        fout.write('\t'+'</source>'+'\n')
        
        fout.write('\t'+'<owner>'+'\n')
        fout.write('\t\t'+'<flickrid>'+'Haipeng Zhang'+'</flickrid>'+'\n')
        fout.write('\t\t'+'<name>'+'Haipeng Zhang'+'</name>'+'\n')
        fout.write('\t'+'</owner>'+'\n')
        
        fout.write('\t'+'<size>'+'\n')
        fout.write('\t\t'+'<width>'+str(img.size[0])+'</width>'+'\n')
        fout.write('\t\t'+'<height>'+str(img.size[1])+'</height>'+'\n')
        fout.write('\t\t'+'<depth>'+'3'+'</depth>'+'\n')
        fout.write('\t'+'</size>'+'\n')
        
        fout.write('\t'+'<segmented>'+'0'+'</segmented>'+'\n')

        for line in fin.readlines():
            line = line.split(',')
            fout.write('\t'+'<object>'+'\n')
            fout.write('\t\t'+'<name>'+class_name[int(line[5])]+'</name>'+'\n')
            fout.write('\t\t'+'<pose>'+'Unspecified'+'</pose>'+'\n')
            fout.write('\t\t'+'<truncated>'+line[6]+'</truncated>'+'\n')
            fout.write('\t\t'+'<difficult>'+str(int(line[7]))+'</difficult>'+'\n')
            fout.write('\t\t'+'<bndbox>'+'\n')
            fout.write('\t\t\t'+'<xmin>'+line[0]+'</xmin>'+'\n')
            fout.write('\t\t\t'+'<ymin>'+line[1]+'</ymin>'+'\n')
            # pay attention to this point!(0-based)
            fout.write('\t\t\t'+'<xmax>'+str(int(line[0])+int(line[2])-1)+'</xmax>'+'\n')
            fout.write('\t\t\t'+'<ymax>'+str(int(line[1])+int(line[3])-1)+'</ymax>'+'\n')
            fout.write('\t\t'+'</bndbox>'+'\n')
            fout.write('\t'+'</object>'+'\n')
             
        fin.close()
        fout.write('</annotation>')

注意要修改root_dir!

注意要新建Annotations_XML文件夹!

### 如何下载 VisDrone2019 数据集 VisDrone2019 是一个广泛用于无人机视角下的目标检测和跟踪的数据集。其官方下载地址为 [http://aiskyeye.com/download/](http://aiskyeye.com/download/) [^1]。然而需要注意的是,该链接可能由于网络原因或其他因素导致访问速度较慢。 如果希望更快获取数据集,可以尝试通过其他渠道寻找资源。许多研究者会在个人博客、GitHub 或论坛上分享已整理好的版本。不过,在使用这些第三方资源时,请务必确认文件的完整性和合法性。 完成下载后,需按照特定结构组织数据集。通常情况下,应在 `datasets` 文件夹下创建名为 `VisDrone2019` 的子目录,并将解压后的四个主要部分放置于此处 [^1]。 对于进一步处理成适合 YOLOVOC 或 COCO 格式的标注文件,可参考相关工具包文档或教程 [^2]。例如,利用 `VisDrone2018-DET-toolkit-master` 工具包能够实现自动化换流程 [^3]。 #### 示例代码:验证数据路径 以下是 Python 脚本片段,展示如何检查本地是否存在指定数据集: ```python import os def check_dataset_path(dataset_dir): required_folders = ['VisDrone2019-train', 'VisDrone2019-val', 'VisDrone2019-test-dev'] missing_folders = [] for folder in required_folders: if not os.path.exists(os.path.join(dataset_dir, folder)): missing_folders.append(folder) if missing_folders: print(f"The following folders are missing: {missing_folders}") else: print("All necessary dataset folders exist.") # 替换为你自己的 datasets/VisDrone2019 路径 check_dataset_path('/path/to/datasets/VisDrone2019') ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值