【精华】WiderPerson数据集介绍及标签转换(YOLO格式)

news2024/12/27 10:02:50

文章目录

          • (1)WiderPerson数据集详情
            • <1> 应用项目
            • <2> 数据集地址
            • <3> 归属单位
            • <4> 详细介绍
            • <5> 数据下载及格式介绍
          • (2)WiderPerson转YOLO格式
            • <1> 文件夹结构
            • <2> 数据可视化
            • <3> YOLO格式标签转化

(1)WiderPerson数据集详情
<1> 应用项目

人体检测

<2> 数据集地址

http://www.cbsr.ia.ac.cn/users/sfzhang/WiderPerson/

<3> 归属单位

生物测定和安全研究中心(CBSR)、国家模式识别实验室(NLPR)、中国科学院自动化研究所

<4> 详细介绍

WiderPerson数据集是一个在野外的行人检测基准数据集,其中的图像是从广泛的场景中选择的,不再局限于交通场景。选取13382幅图像,标注约400K个各种遮挡的标注。随机选取8000/1000/4382幅图像作为训练、验证和测试子集。与CityPersons和更宽的面数据集类似,我们不发布测试图像的边界框地面真相。用户需要提交最终预测文件,我们将继续进行评估。

在这里插入图片描述

<5> 数据下载及格式介绍

Download the WiderPerson dataset through Google Drive or Baidu Drive (uq3u), unzip the downloaded file, get the following files:

# (1)文件目录
• "./Images": 13,382 images of this dataset.
• "./Annotations": 9,000 annotation text files of training and valiadation subsets.
• "./Evaluation": evaluation codes.
• "./train.txt": file list of training subset.
• "./test.txt": file list of testing subset.
• "./val.txt": file list of validation subset.
• "./ReadMe.txt": file of instruction.
    
# (2)注释格式
“../Images”文件夹(例如000001.jpg)中的训练和有效性子集的每个图像在“../Annotations”文件夹(例如000001)中具有相应的注释文本文件。jpg.txt文件). 注释文件结构的格式如下:

... 
< number of annotations in this image = N > 
< anno 1 > 
< anno 2 > 
... 
< anno N > 
... 

其中每行一个对象实例为[class_label,x1,y1,x2,y2],类标签定义为:

... 
< class_label =1: pedestrians > 
< class_label =2: riders > 
< class_label =3: partially-visible persons > 
< class_label =4: ignore regions > 
< class_label =5: crowd > 
... 


# (3) 检测输出
每个图像的检测结果应该是一个与图像前缀相同但后缀为“.txt”的文本文件,例如:000001.jpg->000001.txt。所有检测文本文件都应放在文件夹中进行评估。检测输出文件预期如下格式

format: 
... 
< number of detections in this image = N > 
< det 1 > 
< det 2 > 
... 
< det N > 
... 

每个检测到的边界框的格式应为“[x1,y1,x2,y2,score]”。
(2)WiderPerson转YOLO格式
<1> 文件夹结构
WiderPerson
	├─ WiderPerson
       ├─ Annotations
          ├─ 000040.jpg.txt
          ├─ .......
       ├─ Evaluation
       ├─ Images
          ├─ 000040.jpg
          ├─ .......
       ├─ train.txt
       ├─ val.txt
       ├─ test.txt
	├─ widerperson_visual.py
	├─ widerperson2yolo.py
<2> 数据可视化

widerperson_visual.py

# -*- coding: utf-8 -*-

import os
import cv2

if __name__ == '__main__':
    path = './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 = './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)
<3> YOLO格式标签转化

widerperson2yolo.py

# -*- coding: utf-8 -*-

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)


def extract_labels_images(outpath_txt, outpath_jpg, ori_data_path, origin_txt_path):
    with open(origin_txt_path, 'r') as f:
        img_ids = [x for x in f.read().splitlines()]

    for img_id in img_ids:  # '000040'
        img_path = ori_data_path + '/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')


def write_label(otxt_path, 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(" ")
                """
                若类别留的是1、2、3,这种多类别,此行代码是将其变为 0、1、2(主要针对YOLO算法的标签要从0开始的这个规定)
                而若需要将1、2、3类别都当做是一类, 那么不用解开注释,这段代码也相当于是归类处理了
                """
                # 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 = []


def write_train_val_txt(labels_path, txt_path, image_set):
    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('./images' + '/%s/%s.jpg\n' % (image_set, c_id))
    list_file.close()


if __name__ == '__main__':
    print('WiderPerson数据集yolo格式文件抽取程序启动:')
    # 原始数据集路径
    ori_data_path = './WiderPerson'
    # 输出数据子集路径
    out_data_path = './WiderPerson/WiderPerson_yolo'

    sets = ['train', 'val']
    for data_set in sets:
        # 第一步:类别抽取
        # 抽取类别label存储路径
        print('(1)' + data_set + '数据类别抽取中......')
        outpath_txt = out_data_path + '/label/' + data_set
        # 抽取类别images存储路径
        outpath_jpg = out_data_path + '/images/' + data_set
        os.makedirs(outpath_txt)
        os.makedirs(outpath_jpg)
        # 原数据集标签文件路径
        origin_txt_path = ori_data_path + '/' + data_set + '.txt'
        extract_labels_images(outpath_txt, outpath_jpg, ori_data_path, origin_txt_path)

        # 第二步:写label
        print('(2)' + data_set + '_label文件写入中......')
        otxt_path = out_data_path + "/label/" + data_set
        ntxt_path = out_data_path + "/labels/" + data_set
        os.makedirs(ntxt_path)
        write_label(otxt_path, ntxt_path)

        # 第三步:写trian.txt和val.txt
        print('(3)' + data_set + '.txt写入中......')
        labels_path = out_data_path + "/labels"
        txt_path = out_data_path + "/labels"
        write_train_val_txt(labels_path, txt_path, data_set)
    print('(4)' + '删除多余文件中......')
    shutil.rmtree(out_data_path + "/label")
    print('数据集抽取完成!!!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全国计算机等级三级网络技术试卷详解(三)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1.下列关于RPR技术的描述中&#xff0c;错误的是&#xff08;&#xff09;。 A) RPR与FDDI一样使用双环结构 B) 在RPR环中&#xff0c;源节点向目的节点成功发出…

JVM(Java虚拟机)

目录 1.JVM 简介 2. JVM 运行时数据区 2.1程序计数器 2.栈 3.堆 4.方法区 3.类加载 1.loading 2.linking 1.验证 2.准备 3.解析 3.Initializing 4.双亲委派模型 5.JVM垃圾回收机制 1.劣势 2.回收什么 3.垃圾回收具体怎么回收 1.找垃圾 方法: 问题: 2.释放…

4月JAVA面试太难,吃透这份JAVA架构面试笔记后,成功涨到30K

昨天跟一位高级架构师的前辈聊天时&#xff0c;聊到今年的面试。有两个感受&#xff0c;一个是今年面邀的次数比往年要低不少&#xff0c;再一个就是很多面试者准备明显不足。不少候选人能力其实不差&#xff0c;进入团队干活后达到期望不难&#xff0c;但由于没准备或不会表达…

快速响应 智慧应急|大势智慧亮相第三届武汉国际安全应急博览会

4月26日至4月28日&#xff0c;第三届武汉国际安全应急博览会&#xff08;后简称“应博会”&#xff09;在湖北武汉顺利举办。本次展会&#xff0c;大势智慧以实时三维重建能力为核心&#xff0c;提供各类应急场景的技术支撑&#xff0c;助力应急处置和救援等方面的应用。 展会…

基于AI技术的智能考试系统设计与实现(论文+源码)_kaic

摘 要 随着当今世界互联网信息技术的飞速发展&#xff0c;互联网在人们生活中的应用越来越广泛&#xff0c;在线考试成为选拔人才的重要方法。实现一个基于AI技术的智能考试系统&#xff0c;该系统采用Java编程语言实现。通过使用自然语言处理技术和机器学习算法&#xff0c;该…

【C++】入门

目录 1. 什么是C2. 命名空间2.1 命名空间的定义2.2 命名空间的使用 3. 输入和输出4. 缺省参数4.1 概念4.2 分类 5. 函数重载5.1 函数重载概念5.2 为什么支持函数重载 6. 引用6.1 概念6.2 特性6.3 常引用6.4 指针与引用的区别 7. 内联函数7.1 特性 1. 什么是C C语言是结构化和模…

【c语言】五大内存区域 | 堆区详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

Paimon: Streaming data lake 数据湖项目的后起之秀

什么是Paimon? Paimon的官网介绍是&#xff1a;Streaming data lake platform with high-speed data ingestion, changelog tracking and efficient real-time analytics. Paimon 是流数据湖平台&#xff0c;具有高速数据摄取、变更日志跟踪和高效的实时分析能力 数据湖是大…

unity什么是曲线动画?

介绍 unity什么是曲线动画&#xff1f; 在Unity中&#xff0c;曲线动画&#xff08;Curve Animation&#xff09;是一种基于曲线的动画系统&#xff0c;它允许你通过在时间轴上编辑曲线来控制游戏对象的某个属性在时间上的变化。曲线动画可以用于很多方面&#xff0c;比如控制…

Linux套接字编程-2

在上一篇博客中&#xff0c;我们先对套接字编程的内容进行了一个简单涵盖&#xff0c;并详细陈述了UDP协议内容。本篇我们承接上文&#xff0c;讲述完UDP后&#xff0c;我们来讲解TCP。 目录 1.TCP协议 1.1通信两端流程 1.1.1服务端流程 1.1.2客户端流程 1.2套接字相关操…

LeCun、田渊栋参与撰写,70页「自监督学习」大全

来源 | 机器之心 微信号&#xff1a;almosthuman2014 「关于自监督学习&#xff0c;你想知道但又不敢问的一切都在这里了。」图灵奖得主、Meta 人工智能首席科学家 Yann LeCun 刚刚发了这样一则推文。 在推文中&#xff0c;LeCun 介绍了他和 Meta 人工智能研究院研究员、研究经…

数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)

目录 题意理解 问题 描述 输入样例 输出样例 求解思路 建两棵二叉树 不建树 建一棵树 搜索树表示 程序框架搭建 如何建搜索树 如何判别 方法 查找函数 判断函数 其他函数 题意理解 给定一个插入序列就可以唯一确定一颗二叉搜索树。 但是&#xff0c;一颗给定…

libigl添加Viewer Menu时出现imgui相关的错误:无法打开包括文件: “imgui.h”: No such file or directory

libigl添加如下图所示的Viewer Menu时&#xff0c;出现了“无法打开包括文件: “imgui.h”: No such file or directory”的错误 很显然是libigl内嵌的imgui出了问题 从项目路径libigl-example-project-main\out\build\x64-Release\_deps\libigl-src\include\igl\opengl\glfw\…

【谷粒商城之CompletableFuture异步编排】

本笔记内容为尚硅谷谷粒商城CompletableFuture异步编排部分 目录 一、线程回顾 1 、初始化线程的 4 种方式 2.、线程池的七大参数 运行流程&#xff1a; 3、常见的4种线程池 4、开发中为什么使用线程池 二、CompletableFuture 异步编排 业务场景 1、创建异步对象 …

无线化超轻薄,香港城市大学体感反馈贴片WeTac

此前&#xff0c;青亭网曾报道香港城市大学与腾讯Robotics X Lab合作研发的低电压体感方案&#xff0c;原理是通过微电流刺激来模拟触觉&#xff0c;可模拟微小物体的体感。近期&#xff0c;香港城市大学的一组科研人员也公布了一项类似的方案&#xff1a;WeTac&#xff0c;该方…

轻松上手:使用VSCode调试Python模块级代码的完整教程

安装VSCode&#xff1a;请确保已经安装了Visual Studio Code。安装Python插件&#xff1a;在VSCode中&#xff0c;转到Extensions视图 (View -> Extensions) 并搜索"Python"。找到由Microsoft提供的插件并点击安装。重启VSCode以确保插件安装正确。准备项目&#…

边听歌边充电LDR6028+LDR9201既能充电又能OTG方案

随着type-c接口的普及&#xff0c;市面上的手机&#xff0c;平板&#xff0c;笔电逐渐都采用了type-c接口&#xff0c;设备为了不断的追求更轻薄的机身和防水要求慢慢的取消了一些影响手机外观完整性的接口&#xff0c;比如3.5mm耳机孔。 有线耳机用户一般会选择使用C口转3.5m…

资深架构师解读零代码开发平台—如何不写代码实现流程审批

审批节点 “审批节点&#xff1a;” 流程中涉及审批时&#xff0c;需要用到审批节点。审批可通过或者驳回&#xff0c;也可以发送通知。可以多人会签/或签审批。 1. 审批节点 1.1 审批设置 ① 审批方式 审批方式默认为或签方式&#xff0c;只一个人审批即可 当选择会签时&#…

【英语】大学英语CET考试,口语考试介绍与备考1(讲义笔记)

文章目录 1、考试基本信息2、考试题型介绍3.1 短文朗读与回答问题&#xff08;语音篇&#xff09;3.1.1 语音篇真题3.1.2 语音篇6项基础知识3.1.3 语音语调练习&#xff08;名言名句&#xff09;3.1.4 短文朗读练习材料&#xff08;真题&#xff09; 3.2 自我介绍与看图说话&am…

IC面试,你一定要准备好这些(内附大厂面试题目)

大家都知道&#xff0c;面试的表现会对于个人职业发展的重要性&#xff0c;不仅能决定是否录用&#xff0c;还会影响到后期的谈薪&#xff0c;所以面试前一定要做好充分的准备。 怎么准备面试&#xff1f; 这里就建议简历上的表述尽量客观化、专业化&#xff0c;多使用数字和…