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

2023-11-06

WiderPerson介绍

WiderPerson论文引用格式:
Zhang S, Xie Y, Wan J, et al. Widerperson: A diverse dataset for dense pedestrian detection in the wild[J]. IEEE Transactions on Multimedia, 2019, 22(2): 380-393.

WiderPerson是比较拥挤场景的行人检测基准数据集,是针对户外行人检测的数据集。
数据集共13382张图像,并用各种遮挡标记约40万个注释。
WiderPerson数据集包含行人、骑自行车的人、部分可见人、人群和忽略区域5种标注
该数据集已经划分好train(8000张)、val(1000张)、test(4382张),其中test无标注文件
(注意:000041.jpg.txt文件乱码,训练时可删除)

原论文中数据信息

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

下载后的文件样式

这里我的路径是F:\WiderPerson (注意哦!)
如果大家和我的路径不一样,下面的代码中F:\WiderPerson替换成自己的路径,
注意和我是同一路径级别,F:\WiderPerson路径后面的不要改动,会自己生成
在这里插入图片描述

Annotations

Annotations中文件名类似:000041.jpg.txt,共9000条信息
除去乱码文件000040.jpg.txt,共7999条信息
在这里插入图片描述
第一行是该张图片中标注数量
第二行【所属类别 xmin ymin xmax ymax】

将标签可视化在图片上代码:
代码来源
注意:由于00040文件是问题文件,需要将annotations、images、train.txt中对应的删除掉再运行代码

import os
import cv2

if __name__ == '__main__':
    path = 'F:\\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:\\WiderPerson\\Images\\' + img_id + '.jpg'
        img = cv2.imread(img_path)

        im_h = img.shape[0]
        im_w = img.shape[1]
        print(img_path)
        label_path = img_path.replace('Images','Annotations') + '.txt'
        print(label_path)
        with open(label_path) as file:
            line = file.readline()
            count = int(line.split('\n')[0])  # 里面行人个数
            line = file.readline()
            while line:
                cls = int(line.split(' ')[0])
                print(cls)
                # < class_label =1: pedestrians > 行人
                # < class_label =2: riders >      骑车的
                # < class_label =3: partially-visible persons > 遮挡的部分行人
                # < class_label =4: ignore regions > 一些假人,比如图画上的人
                # < class_label =5: crowd > 拥挤人群,直接大框覆盖了
                if cls == 1  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])
                    img = cv2.rectangle(img, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (0, 255, 0), 2)
                line = file.readline()
        cv2.imshow('result', img)
        cv2.waitKey(0)

WiderPerson转YOLO

数据集下载地址

数据集下载地址

由于WiderPerson数据集内包含五种类别,可取自己所需类别进行转换
此处只留下第一种类别

转格式以及选取类别

import os
from PIL import Image
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__':

    outpath_txt = 'F:\\WiderPerson\\WiderPerson\\label\\val'   
    # 注意:这里F:\\WiderPerson是你存储文件侧地方,可以替换,后面的不要动
    outpath_jpg = 'F:\\WiderPerson\\WiderPerson\\images\\val'
    # 注意:这里F:\\WiderPerson是你存储文件侧地方,可以替换,后面的不要动
    os.makedirs(outpath_txt)
    os.makedirs(outpath_jpg)

    path = 'F:\\WiderPerson\\val.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:\\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 = outpath_txt + "\\" + 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:
                # if cls == 1  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)
        # 想保留原文件用copy
        # shutil.copy(img_path, outpath_o + '\\' + img_id + '.jpg')
        # 直接移动用这个
        shutil.move(img_path, outpath_jpg + '\\' + img_id + '.jpg')

运行完毕后:
在这里插入图片描述在这里插入图片描述
运行后将代码27行、29行、34行中val替换成train 再运行一遍!
此处时间较长,耐心等候下啦!

运行完毕后,打开F:\WiderPerson\images文件夹 里面剩余4382张图片
放在F:\WiderPerson\WiderPerson\images\test(自行创建)里面去(其实也可以不要)

关于txt文件的处理:(直接运行)


import os

# 路径
otxt_path = "F:\\WiderPerson\\WiderPerson\\label\\val"  
ntxt_path = "F:\\WiderPerson\\WiderPerson\\labels\\val"
os.makedirs(ntxt_path) 

filer = []
for root, dirs, files in os.walk(otxt_path):
    for i in files:
        otxt = os.path.join(otxt_path, i)
        ntxt = os.path.join(ntxt_path, i)
        f = open(otxt, 'r', encoding='utf-8')
        for line in f.readlines():
            if line == '\n':
                continue
            cls = line.split(" ")
            # cls = '%s'%(int(cls[0])-1) + " " + cls[1]+ " " + cls[2]+ " " + cls[3]+ " " + cls[4]
            cls = '0' + " " + cls[1]+ " " + cls[2]+ " " + cls[3]+ " " + cls[4]
            filer.append(cls)
        with open(ntxt,"a") as f:
            for i in filer:
                f.write(i)
        filer = []

注意代码注释掉的第30行:

cls = '%s'%(int(cls[0])-1) + " " + cls[1]+ " " + cls[2]+ " " + cls[3]+ " " + cls[4]

如果你的类别留的是1、2、3,这种多类别,此行代码是将其变为 0、1、2
主要针对YOLO算法的标签要从0开始的这个规定

而如果你需要将1、2、3类别都当做是一类
那么不用解开注释,这段代码也相当于是归类处理了

最终得到:
在这里插入图片描述
将val换成train再来一遍!!

OK! 此时,文件夹label就可以删除了

生成yolo格式的train、val.txt 里面存储图片路径

我们还需要最后一步!

sets = ['train', 'val']

labels_path = "F:\\WiderPerson\\WiderPerson\\labels"
txt_path = "F:\\WiderPerson\\WiderPerson\\labels"

for image_set in sets:
    image_i = []
    
    for image_ids in os.listdir(labels_path + '\\%s' % (image_set)):
        _name = image_ids.split(".")[0]
        image_i.append(_name)
    list_file = open(txt_path + '\\%s.txt' % (image_set), 'a')
    for c_id in image_i:
        print(c_id)
        list_file.write('最终项目的位置' + '/%s/%s.jpg\n' % (image_set,c_id))
        # 举例:G:\\yolov5-main\\datasets\\images
    list_file.close()

在这里插入图片描述
将F:\WiderPerson\WiderPerson文件夹命名为datasets,放置在项目中。
在这里插入图片描述

到此数据已经准备完了 开始你的训练吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • VS Code Remote Development

    在Windows下编辑Linux代码 并且有Linux下的系统接口 第三方dep库的语法解析 代码提示 自动补全 跳转 用起来真香 困扰了Linux后台开发人员多年的难题终极解决方案 要求VS Code版本在1 35 1以上 1 安装远程开
  • 基础学习JavaScript 之 Array

    笔记文 Array JavaScript内置对象之一 由索引值来排序的数据集合 下面就列出了array上的方法 会改变自身的方法 copyWithin 在数组内部 将一段元素序列拷贝到另一段元素序列上 覆盖原有的值 fill 将数组中指定区
  • dc-9 靶机渗透学习

    信息收集 用nmap扫描当前网段 nmap sP 192 168 202 0 24 对靶机进行端口扫描 nmap A p v 192 168 202 148 访问靶机的80端口 进行框架识别 无框架的页面 尝试web服务漏洞 用dirsea
  • java数据结构-栈

    栈 1 栈的定义 栈 Stack 是只允许在一端进行插入或删除的线性表 首先栈是一种线性表 但限定这种线性表只能在某一端进行插入和删除操作 栈顶 Top 线性表允许进行插入删除的那一端 栈底 Bottom 固定的 不允许进行插入和删除的另一
  • VMware+CentOS7搭建私有云桌面服务

    VMware CentOS7搭建私有云桌面服务 1 安装VMware虚拟机工作台 官网下载安装包 版本 14 1 3 Pro 地址 https my vmware com en web vmware info slug desktop en
  • 详解从0开始的嵌入式学习路线,学什么、怎么学?

    嵌入式是个大筐 什么都可以往里面装 电子 机械 计算机 自动化 测控 通信 物联网 很多很多专业都和嵌入式沾边 硬件 驱动 操作系统 网络 应用 算法 很多同学越学越迷糊 越学越感觉什么也不会 首先要记住一句话 嵌入式学习奥义 先观其广 再
  • osgEarth的Rex引擎原理分析(五十八)osgEarth::ShaderFactory osgEarth::ShaderLoader关系

    目标 五十四 中的问题130 osgEarth ShaderFactory osgEarth ShaderLoader关系 ShaderFactory主要用来产生各个着色器阶段的main函数 一般用户不需要直接使用它 除非有特殊的定制需要
  • [CTF]抓住那只猫(XCTF 4th-WHCTF-2017)

    原作者 darkless 题目描述 抓住那只猫 思路 打开页面 有个输入框输入域名 输入baidu com进行测试 发现无任何回显 输入127 0 0 1进行测试 发现已经执行成功 执行的是一个ping命令 一开始想的应该是命令拼接执行 但
  • React18的useEffect会执行两次

    React18的useEffect会执行两次 一 执行两次的useEffect 二 React18 useEffect 新特性 如何应对 1 首先先了解一下 React 中 useEffect 执行的时机 2 怎么样才能让 Effect 执
  • 0101日志-运维-mysql

    1 错误日志 错误日志 Error Log 错误日志记录了MySQL引擎在运行过程中出现的错误和异常情况 这些错误可能包括启动和关闭问题 数据库崩溃 权限问题等 错误日志对于排查和解决MySQL引擎问题非常有帮助 改日志默认开启 默认存放目
  • 知识科普:什么是AGI?

    原文链接 最近ChatGPT大火 火到原来卖酒卖保险的人也都开始直播聊ChatGPT了 其中大家或多或少会提到一个词 AGI 看清楚不是GAI也不是AIGC 今天就和大家聊聊AGI是什么 AGI最近经常被提到 主要是因为ChatGPT的开发
  • 网络编程——TCP

    网络编程 TCP TCP编程 TCP是一种可靠的 基于连接的网络协议 它是面向字节流的 即从一个进程到另一个进程的二进制序列 一条TCP连接需要两个端点 这两个端点需要分别建立各自的套接字 通常一方用于发送请求和数据 称为客户端 另一方用于
  • Pickle 详解

    那么为什么需要序列化和反序列化这一操作呢 1 便于存储 序列化过程将文本信息转变为二进制数据流 这样就信息就容易存储在硬盘之中 当需要读取文件的时候 从硬盘中读取数据 然后再将其反序列化便可以得到原始的数据 在Python程序运行中得到了一
  • STM32开发(十九)STM32F103 数据手册 —— 低功耗模式解析

    上一篇 主目录 下一篇 文章目录 低功耗介绍 stm32 供电框图 低功耗模式 睡眠模式 停止模式 待机模式 低功耗模式汇总 低功耗介绍 系统复位或上电复位后 微控制器进入运行模式 在运行模式下 CPU通过HCLK提供时钟 并执行程序代码
  • Apollo学习笔记(21)图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    首先奉上大神链接 https www cnblogs com qzhc p 10291430 html 由于最近在看轨迹规划的资料 图遍历是基础 故拜读了大神的一些文章 在此记录 深度优先遍历 深度优先遍历 Depth First Sear
  • Vim常用操作快捷键记录

    经常忘记vim的一些操作快捷键 现在将其记录起来 方便以后查阅 这里定义以文本右方向为前 文本左方向为后 上下左右方向键 k j h l 以 字 为步长向前跳动 到达字首 w 以 字 为步长向后跳动 到达字首 b 以 字 为步长向前跳动 到
  • 共享计算机的网络凭证,win10设置共享文件夹时显示要网络凭证

    一 共享文件夹所在电脑设置 1 右键我的电脑 管理 系统工具 本地用户和组 用户 中间空白区域右键 新用户 2 输入自设的用户名和密码 如图勾选 创建 3 右键需要共享的文件见 安全 编辑 4 点击添加 5 输入新建的用户名 test 检查
  • 失业的程序员(九):正文篇:创业就是一场戏

    http www shenyisyn org 2013 04 23 tjp 2 htm 一 正文 跨入电商 说到我家人 我父母都是小学教师 对我从小管教无比严厉 他们希望我将来也能子承父业或者母业 并且更希望将来我的子女也能如此继承着 用句
  • 【1002】写出这个数

    题目链接 写出这个数 算法 include
  • 【数据集处理】WiderPerson介绍以及转YOLO格式(图片教程及代码----超详细)

    WiderPerson转YOLO格式 WiderPerson介绍 原论文中数据信息 下载后的文件样式 Annotations WiderPerson转YOLO 数据集下载地址 转格式以及选取类别 关于txt文件的处理 直接运行 生成yolo