Python从COCO数据集中抽取某类别的数据

news2024/11/18 5:30:57

1、问题描述

今天需要训练一个人工智能检测模型,用于检测图片或视频中的人。自行收集训练数据费时费力,因而选择从公开数据集COCO中进行抽取。

2、数据准备

2.1 下载 COCO2017 数据集

train:http://images.cocodataset.org/zips/train2017.zip
valid:http://images.cocodataset.org/zips/val2017.zip

2.2 下载对应的YOLO格式标签文件

因为训练的是 YOLO 系列模型,所以需要下载其对应的格式标签文件。

https://github.com/ultralytics/yolov5/releases/download/v1.0/coco2017labels.zip

3、Pyhton代码

数据准备好之后则是进行数据抽取了。首先需要新建一个要抽取类别的 yaml 文件。

# 定义需要抽取的类别(classes.yaml)
path: /home/dataset/coco 
train: train2017.txt 
val: val2017.txt
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus

之后是抽取代码:

# create_sub_coco_dataset.py

import json
import yaml
import sys
import os
import shutil
import tqdm

def MakeDirs(dir):
    if not os.path.exists(dir):
        os.makedirs(dir, True)

def create_sub_coco_dataset(data_yaml="classes.yaml",
                            src_root_dir="../datasets/coco",
                            dst_root_dir="classes/coco",
                            folder="val2017"
                            ):
    MakeDirs(dst_root_dir + "/annotations/")
    MakeDirs(dst_root_dir + "/images/" + folder)
    MakeDirs(dst_root_dir + "/labels/" + folder)

    print(yaml.safe_load(open(data_yaml).read())['names'])
    keep_names = [x + 1 for x in yaml.safe_load(open(data_yaml).read())['names'].keys()]
    all_annotations = json.loads(open(src_root_dir + "/annotations/instances_{}.json".format(folder)).read())
    keep_categories = [x for x in all_annotations["categories"] if x["id"] in keep_names]
    keep_annotations = [x for x in all_annotations['annotations'] if x['category_id'] in keep_names]

    all_annotations['annotations'] = keep_annotations
    all_annotations["categories"] = keep_categories

    if not os.path.exists(dst_root_dir + "/annotations/instances_{}.json".format(folder)):
        with open(dst_root_dir + "/annotations/instances_{}.json".format(folder), "w") as f:
            json.dump(all_annotations, f)

    filelist = set()
    for i in tqdm.tqdm(keep_annotations):
        img_src_path = "/images/{}/{:012d}.jpg".format(folder, i["image_id"])
        label_src_path = "/labels/{}/{:012d}.txt".format(folder, i["image_id"])
        if not os.path.exists(dst_root_dir + img_src_path):
            shutil.copy(src_root_dir + img_src_path, dst_root_dir + img_src_path)
        if not os.path.exists(dst_root_dir + label_src_path):
            keep_records = [x for x in open(src_root_dir + label_src_path, "r").readlines() if
                            (int(x.strip().split(" ")[0]) + 1) in keep_names]
            with open(dst_root_dir + label_src_path, "w") as f:
                for r in keep_records:
                    f.write(r)
        filelist.add("./images/{}/{:012d}.jpg\n".format(folder, i["image_id"]))

    with open(dst_root_dir + "/{}.txt".format(folder), "w") as f:
        for r in filelist:
            f.write(r)

    new_data_yaml = yaml.safe_load(open(data_yaml).read())
    new_data_yaml["path"] = dst_root_dir

    with open(dst_root_dir + "/coco.yaml", 'w') as f:
        f.write(yaml.dump(new_data_yaml, allow_unicode=True))


create_sub_coco_dataset(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])


# 使用命令示例
# python create_sub_coco_dataset.py car.yaml ../../Datasets/coco_extract/coco2017/coco car train2017
# python create_sub_coco_dataset.py person.yaml ../../Datasets/coco_extract/coco2017/coco person val2017

使用命令示例分别包含了抽取类别到train和val文件夹下的运行代码,需要根据自己的路径进行适当修改。

以下就是今天抽取完成的结果文件目录,可以用于训练YOLO模型了。

好了,今天的分享到此结束,期待下期继续。


往期推荐:

手把手教你玩转人工智能算法,Yolov5实践教程(1)(附源码)

手把手教你玩转人工智能算法,Yolov5实践教程(2)(附源码)

手把手教你生成有趣有料的素描图(附代码)

关注公众号送115G Python和人工智能学习资料。
在这里插入图片描述

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

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

相关文章

杉德支付配合调查 - 数字藏品服务

最近,数字收藏品平台淘派发布了一则公告,宣布支付通道杉德已暂停接口服务,以配合调查。 近期发现多个异常账户,涉嫌盗取他人信息和银行卡,利用平台从事非法交易。淘派已第一时间报警,协助警方追回资金(回执…

学生能力是如何被封印的

为了避免无法发表,需要借助人工智能。 为什么一直没写 这个主题其实很多年前就明晰了,但是没有勇气去写出来。 责任全在人工智能 如下是人工智能的回复,如有责任,全都是人工智能的责任。 在学生的情境中,“能力被封印…

Kigo Netflix Video Downloader:Mac与Windows用户的视频下载利器

随着网络的发展和普及,越来越多的人开始使用在线流媒体服务来观看电影、电视剧和其他视频内容。其中,Netflix是世界上最受欢迎的流媒体平台之一。然而,对于想要离线观看这些视频内容的用户来说,下载它们可能会变得有些困难。幸运的…

一文教会你SpringBoot是如何启动的

SpringBoot启动流程分析 流程图 源码剖析 运行Application.run()方法 我们在创建好一个 SpringBoot 程序之后,肯定会包含一个类:xxxApplication,我们也是通过这个类来启动我们的程序的(梦开始的地方),而…

J.砍树【蓝桥杯】树上差分+LCA

树上差分 多次对树上的一些路径做加法操作,然后询问某个点或某条边经过操作后的值,就要考虑树上差分了。 点差分 模拟这个过程 对x到y路径上的点权值均1,可以等价成对x和y的权值加1,对lca的权值-1,对fa[lca]的权值-…

操作系统知识-存储管理+文件管理管理-嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记,未经本人许可,请勿转载,如发现本笔记内容的错误还望各位不吝赐教(笔记内容可能有误怕产生错误引导)。 本章的主要内容见下图: 1、存储管理&#…

【数据结构取经之路】归并排序

简介 归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,…

在Docker上传我们自己的镜像(以springboot项目为例)

首先确定好在我们的centOS服务器上已经安装并配置好docker 配置自己的springboot镜像并运行 获取springboot的jar包 maven clean--》mavenue package --》复制target目录下生成的jar包 在服务器选择一个文件夹上传jar包,我这里选用的文件夹叫做/opt/dockertest…

如何在HomeAssistant智能家居系统中添加HACS集成并实现无公网IP远程连接家中设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant,通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店,将米家,果家设备接入 Home Assistant。 基本条件…

Python the code is unreachable

Python the code is unreachable 正文 正文 相信有不少小伙伴在使用 Python 的时候有时候会遇到 the code is unreachable 这样的 warning 提示。这种提示表示在我们当前书写的代码种有一部分代码被屏蔽了。可能会存在潜在的 bug,需要我们注意,那么什么…

2023年蓝桥杯省赛——幸运数字

目录 题目链接:0幸运数字 - 蓝桥云课 (lanqiao.cn) 解法 思路 高级思路 总结 题目链接:0幸运数字 - 蓝桥云课 (lanqiao.cn) 解法 首先是我写了差不多一个小时的解法,裂开了,为什么我如此废物 思路 寻找第2023个在二进制、八…

弱电工程是什么?常见的类型有哪些?

一、什么是弱电工程?强电和弱电的区别有哪些? 弱电工程又叫智能建筑,也叫系统集成工程,所有与信息有关的都属于弱电这一块的。弱电是相对于强电而言的强电和弱电从概念上讲,一般是容易区别的,主要区别是用途的不同。强电是用作…

Compute Express Link (CXL): An Open Interconnect for Cloud Infrastructure——论文阅读

DAC 2023 Paper CXL论文阅读笔记整理 背景 Compute Express Link是一种开放的行业标准互连,在PCI Express(PCIe)之上提供缓存和内存语义,具有资源池和织物功能。本文探讨了CXL在解决云基础设施中的一些挑战方面的作用。 CXL主要…

Python:文件的操作

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) Python的os库主要用于与操作系统进行交互,它提供了多种功能,使得在Python程序中处理操作系统级任务变得容易。这里是一些…

外包干了3个月,技术明显进步。。。。。

在湖南的一个安静角落,我,一个普通的大专生,开始了我的软件测试之旅。四年的外包生涯,让我在舒适区里逐渐失去了锐气,技术停滞不前,仿佛被时间遗忘。然而,生活的转机总是在不经意间降临。 与女…

1.MongoDB的特点与应用场景

什么是 MongoDB ? MongoDB 是基于 C 开发的 NOSQL 开源文档数据库 ,是最像关系型数据库的 nosql,功能也是最丰富的 nosql,它具有所以的可伸缩性,灵活性,高性能,高扩展性的优势。 大致有如下特…

Vulnhub - Morpheus

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢! 个人博客链接:CH4SER的个人BLOG – Welcome To Ch4sers Blog Morpheus 靶机下载地址:Matrix-Breakout: 2 Morpheus ~ VulnHub 0x01 信息收集 Nmap扫描…

代码随想录算法训练营第二十四天|● 理论基础 ● 77. 组合(JS写法)

回溯理论基础 回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。递归就要有终止条件,所以必然是一棵高度有限的树&#xff…

一篇搞定ECharts的基本使用,赶快收藏起来学习吧~

准备工作 引入 声明一个有宽高的dDOM元素 echarts.init(DOM) option配置对象 echarts.setOptions(option) 基础配置 option类似于一个容器,那么里面的属性就相当于组件: xAxis(直角坐标系 X 轴)、yAxis(直角坐…

关于udp能跨局域网传输的问题

UDP(用户数据报协议)以其独特的传输特性在多种应用场景中都有着极其重要的作用。然而,关于UDP是否能跨局域网(LAN)进行传输,以及这一传输过程中的优缺点,一直是网络技术领域讨论的热点。本文将详…