【WiderPerson数据集处理成yolov5数据集格式】

【WiderPerson数据集处理成yolov5数据集格式】

1.下载数据集

2.处理数据集

1)只保留有annotation的数据

2)只保留上述有1和3标签的

3)把坐标转化成yolov5格式

# -*- ecoding: utf-8 -*-
# @ModuleName: 
# @Author: 
# @Time: 
import os
import cv2
import shutil
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)

if __name__ == "__main__":
    img_dir = 'F:/e/data/human_detect/widerperson/Images/'
    anno_dir = 'F:/e/data/human_detect/widerperson/Annotations/'

    img_save_dir = 'F:/e/data/human_detect/widerperson/select/Images/'
    anno_save_dir = 'F:/e/data/human_detect/widerperson/select/Annotations/'

    if not os.path.exists(img_save_dir):
        os.makedirs(img_save_dir)
    if not os.path.exists(anno_save_dir):
        os.makedirs(anno_save_dir)

    img_list = os.listdir(img_dir)
    img_list.sort()

    label_num = [1, 3]
    for i, idx in enumerate(img_list):
        img_path = os.path.join(img_dir, idx)
        img_name = idx.split('.')[0]
        anno_path = os.path.join(anno_dir, img_name + '.jpg.txt')
        img = cv2.imread(img_path)
        h = img.shape[0]
        w = img.shape[1]

        if os.path.isfile(anno_path):
            anno_file = open(anno_path, 'r')
            anno_lines = anno_file.readlines()
            num = 0
            anno_save_path = os.path.join(anno_save_dir, img_name + '.txt')
            save_anno = open(anno_save_path, 'w')
            # widerperson官方txt第一行是标签数量
            for j, jdx in enumerate(anno_lines[1:]):
                label = int(jdx.split(' ')[0])
                if label in label_num:
                    if label == 1:
                        label = 0
                    elif label == 3:
                        label = 1
                    xmin = float(jdx.split(' ')[1])
                    ymin = float(jdx.split(' ')[2])
                    xmax = float(jdx.split(' ')[3])
                    ymax = float(jdx.split(' ')[4].split('\n')[0])

                    box = (xmin, xmax, ymin, ymax)
                    # 转换成yolov5格式
                    bb = convert((w, h), box)
                    save_anno.write(str(label) + " " + " ".join([str(a) for a in bb]) + '\n')

                    num += 1

            save_anno.close()
            img_save_path = os.path.join(img_save_dir, idx)
            shutil.copy(img_path, img_save_path)
            if num == 0:
                os.remove(img_save_path)
                os.remove(anno_save_path)

3.划分数据集

# -*- ecoding: utf-8 -*-
# @ModuleName: 
# @Author: 
# @Time: 
import os
import shutil
import random

if __name__ == "__main__":
    random.seed(0)

    img_dir = 'F:/e/data/human_detect/widerperson/select/Images/'
    anno_dir = 'F:/e/data/human_detect/widerperson/select/Annotations/'

    train_img_dir ='F:/e/data/human_detect/widerperson/dataset/images/train/'
    train_label_dir = 'F:/e/data/human_detect/widerperson/dataset/labels/train/'
    val_img_dir = 'F:/e/data/human_detect/widerperson/dataset/images/val/'
    val_label_dir = 'F:/e/data/human_detect/widerperson/dataset/labels/val/'
    test_img_dir = 'F:/e/data/human_detect/widerperson/dataset/images/test/'
    test_label_dir = 'F:/e/data/human_detect/widerperson/dataset/labels/test/'
    if not os.path.exists(train_img_dir):
        os.makedirs(train_img_dir)
    if not os.path.exists(train_label_dir):
        os.makedirs(train_label_dir)
    if not os.path.exists(val_img_dir):
        os.makedirs(val_img_dir)
    if not os.path.exists(val_label_dir):
        os.makedirs(val_label_dir)
    if not os.path.exists(test_img_dir):
        os.makedirs(test_img_dir)
    if not os.path.exists(test_label_dir):
        os.makedirs(test_label_dir)

    trainval_percent = 1
    train_percent = 0.9

    img_list = os.listdir(img_dir)
    img_list.sort()

    num = len(img_list)
    list = range(num)

    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)

    print("train and val size", tv)
    print("train size", tr)

    for i in list:
        name = img_list[i].split('.')[0]

        if i in trainval:
            if i in train:
                shutil.copy(os.path.join(img_dir, name + '.jpg'), os.path.join(train_img_dir, name + '.jpg'))
                shutil.copy(os.path.join(anno_dir, name + '.txt'), os.path.join(train_label_dir, name + '.txt'))
            else:
                shutil.copy(os.path.join(img_dir, name + '.jpg'), os.path.join(val_img_dir, name + '.jpg'))
                shutil.copy(os.path.join(anno_dir, name + '.txt'), os.path.join(val_label_dir, name + '.txt'))
        else:
            shutil.copy(os.path.join(img_dir, name + '.jpg'), os.path.join(test_img_dir, name + '.jpg'))
            shutil.copy(os.path.join(anno_dir, name + '.txt'), os.path.join(test_label_dir, name + '.txt'))

参考博客

1.【数据集处理】WiderPerson介绍以及转YOLO格式(图片教程及代码----超详细)

2.睿智的目标检测56——Pytorch搭建YoloV5目标检测平台

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
标注好的 WiderPerson 数据集是一个用于行人检测和目标识别的数据集,其中每个行人都经过标注以进行边界框和类别标签的指定。该数据集的主要特点是数量庞大、多样性丰富。数据集中包含了各种不同角度、遮挡程度、姿势变化等情况下的行人图像,能够在各种复杂背景和场景中进行行人检测。这些标注好的数据非常适用于训练行人检测算法模型。 WiderPerson 数据集的标注工作是由专业标注团队完的,确保了标注的准确性和一致性。标注包括了每个行人的位置信息,即行人边界框的坐标。同时,还标注了与行人相关的类别信息,例如行人的年龄、性别、衣着等。这些标注能够为行人检测算法提供更多的信息,帮助算法更好地理解不同行人的特征与属性。 标注好的 WiderPerson 数据集对于行人检测算法的研究和性能评估非常有帮助。利用这个数据集,研究人员可以训练和优化各种行人检测算法,提高算法的准确性和鲁棒性。同时,还可以通过在该数据集上评测算法的性能,比较不同算法的优劣,并推动行人检测技术的发展。 总而言之,标注好的 WiderPerson 数据集是一个丰富多样、准确可靠的行人检测数据集,对于行人检测算法的研究和性能评估具有重要价值。该数据集的发布将促进行人检测技术的发展,为实际应用提供更好的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值