widerperson数据集转化为YOLO格式

  1. 先按照train.txt和val.txt中的内容,将训练集图片和注释全部放在train文件夹下,验证集也是一样。
import os
from pathlib import Path
from PIL import Image
import csv
import shutil


# coding=utf-8
def check_charset(file_path):
    import chardet
    with open(file_path, "rb") as f:
        data = f.read(4)
        charset = chardet.detect(data)['encoding']
    return charset


def convert(size, box0, box1, box2, box3):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box0 + box2) / 2 * dw
    y = (box1 + box3) / 2 * dh
    w = (box2 - box0) * dw
    h = (box3 - box1) * dh
    return (x, y, w, h)


if __name__ == '__main__':
    path = 'F:\dataset\WiderPerson/train.txt'
    with open(path, 'r') as f:
        img_ids = [x for x in f.read().splitlines()]

    for img_id in img_ids:  # '000040'
        img_path = 'F:\dataset\WiderPerson\Images/' + img_id + '.jpg'

        with Image.open(img_path) as Img:
            img_size = Img.size

        ans = ''

        label_path = img_path.replace('Images', 'Annotations') + '.txt'
        outpath = 'train/' + img_id + '.txt'

        with open(label_path, encoding=check_charset(label_path)) as file:
            line = file.readline()
            count = int(line.split('\n')[0])  # 里面行人个数
            line = file.readline()
            while line:
                cls = int(line.split(' ')[0])
                if cls == 1 or cls == 2 or cls == 3:
                    xmin = float(line.split(' ')[1])
                    ymin = float(line.split(' ')[2])
                    xmax = float(line.split(' ')[3])
                    ymax = float(line.split(' ')[4].split('\n')[0])
                    print(img_size[0], img_size[1], xmin, ymin, xmax, ymax)
                    bb = convert(img_size, xmin, ymin, xmax, ymax)
                    ans = ans + '1' + ' ' + ' '.join(str(a) for a in bb) + '\n'
                line = file.readline()
        with open(outpath, 'w') as outfile:
            outfile.write(ans)
        shutil.copy(img_path, 'train/' + img_id + '.jpg')

  1. 将图片和注释分开,放在各自的文件夹中
import shutil
import os
if __name__ == '__main__':
    label_path=r"train/"
    imgids = os.listdir(label_path)
    print(len(imgids))
    n=0
    for i in imgids:
        n += 1
        img_ids_path = label_path.replace('labels', 'images')+ i[0:6] +'.txt'
        To_imgpath=r'train\anno/'
        print(img_ids_path,To_imgpath,n)
        shutil.copy(img_ids_path, To_imgpath)


OK!!!

参考博客:https://blog.csdn.net/qq_44224801/article/details/123480032
参考博客:https://blog.csdn.net/wukong168/article/details/122697243

你可能感兴趣的:(yolov5,python)