python实现提取COCO,VOC数据集中特定的类

yizhihongxing

一、前言

在深度学习中,数据集是非常重要的资源之一,但是我们有时需要从一个大的数据集中提取出特定的类别,这样可以让我们在模型训练、测试或者其他操作上更加方便。本文将介绍如何使用Python代码从COCO、VOC数据集中提取特定的类。

二、准备工作

在进行以下操作前,需要下载并解压相应的数据集,以COCO2017数据集为例,可以在官方网站(http://cocodataset.org/#download)下载并解压到合适的目录中。

安装必要的Python库:

# 安装必要的Python库
!pip install numpy matplotlib scipy scikit-image pillow

三、COCO数据集

  1. 导入必要的库
import json
import os
import shutil
from pycocotools.coco import COCO
  1. 要求输入的参数
# 要求输入的参数
dataDir = './coco2017'
dataType = 'train2017'
annFile = os.path.join(dataDir, 'annotations', 'instances_{}.json'.format(dataType))
catIds = [1, 2, 3, 4, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90]
catNms = ['person', 'bicycle', 'car', 'motorcycle', 'bus',
          'train', 'truck', 'traffic light', 'stop sign', 'fire hydrant',
          'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
          'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase',
          'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat',
          'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass',
          'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
          'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
          'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'mirror',
          'dining table', 'window', 'desk', 'toilet', 'door', 'tv', 'laptop',
          'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven',
          'toaster', 'sink', 'refrigerator', 'blender', 'book', 'clock', 'vase',
          'scissors', 'teddy bear', 'hair drier', 'toothbrush']
  1. 定义函数提取COCO数据集中特定的类
def get_coco_category(category_list):
    """
    :param category_list: 需要提取的类别列表
    :return: None
    """
    # 初始化COCO API
    coco = COCO(annFile)

    # 获取包含需要提取类别的image ID
    catIds = coco.getCatIds(catNms=category_list)
    imgIds = coco.getImgIds(catIds=catIds)

    for imgId in imgIds:
        imgInfo = coco.loadImgs(imgId)[0]
        imgName = imgInfo['file_name']
        srcImgPath = os.path.join(dataDir, dataType, imgName)
        dstImgPath = os.path.join(outputPath, imgName)
        shutil.copy(srcImgPath, dstImgPath)

        annIds = coco.getAnnIds(imgIds=imgId, catIds=catIds, iscrowd=None)
        anns = coco.loadAnns(annIds)
        dstAnnPath = os.path.join(annOutputPath, imgName.replace('.jpg', '.json'))
        with open(dstAnnPath, 'w') as wf:
            json.dump(anns, wf)
  1. 示例
# 需要提取的类别列表
categories = ['person', 'dog', 'cat']

# 输出路径
outputPath = './coco_person_cat_dog'
os.makedirs(outputPath, exist_ok=True)

# 注释输出路径
annOutputPath = os.path.join(outputPath, 'annotations')
os.makedirs(annOutputPath, exist_ok=True)

get_coco_category(categories)

五、VOC数据集

  1. 导入必要的库
import os
import shutil
from lxml import etree
from lxml.etree import Element, SubElement
  1. 要求输入的参数
# 要求输入的参数
dataDir = './VOCdevkit'
dataType = 'VOC2012'
categories = ['person', 'dog', 'cat']
  1. 定义相关函数
def get_voc_category(category_list):
    """
    :param category_list: 需要提取的类别列表
    :return: None
    """
    # 原始标注文件夹路径
    annDir = os.path.join(dataDir, dataType, 'Annotations')
    imgDir = os.path.join(dataDir, dataType, 'JPEGImages')

    # 新标注文件夹路径
    newAnnDir = os.path.join(outputPath, 'Annotations')
    newImgDir = os.path.join(outputPath, 'JPEGImages')

    os.makedirs(newAnnDir, exist_ok=True)
    os.makedirs(newImgDir, exist_ok=True)

    for fileName in os.listdir(annDir):
        annFilePath = os.path.join(annDir, fileName)
        xmlTree = etree.parse(annFilePath)
        xmlRoot = xmlTree.getroot()
        objects = xmlRoot.findall('object')
        findFlag = False
        for object in objects:
            name = object.find('name').text.lower().strip()
            # 筛选需要的类别
            if name in category_list:
                findFlag = True
                break
        if findFlag:
            imageName = fileName.replace('.xml', '.jpg')
            shutil.copy(os.path.join(imgDir, imageName), os.path.join(newImgDir, imageName))
            shutil.copy(annFilePath, os.path.join(newAnnDir, fileName))


def create_new_voc_annotations():
    """
    :return: None
    """
    # 原始标注文件夹路径
    annDir = os.path.join(dataDir, dataType, 'Annotations')
    imgDir = os.path.join(dataDir, dataType, 'JPEGImages')

    # 新标注文件夹路径
    newAnnDir = os.path.join(outputPath, 'Annotations')
    os.makedirs(newAnnDir, exist_ok=True)

    for fileName in os.listdir(annDir):
        annFilePath = os.path.join(annDir, fileName)
        xmlTree = etree.parse(annFilePath)
        xmlRoot = xmlTree.getroot()
        objects = xmlRoot.findall('object')
        newObjects = []
        for object in objects:
            name = object.find('name').text.lower().strip()
            # 筛选需要的类别
            if name in categories:
                bndBox = object.find('bndbox')
                newObject = Element('object')
                newName = SubElement(newObject, 'name')
                newName.text = name
                newBndBox = SubElement(newObject, 'bndbox')

                newBndBoxXmin = SubElement(newBndBox, 'xmin')
                newBndBoxYmin = SubElement(newBndBox, 'ymin')
                newBndBoxXmax = SubElement(newBndBox, 'xmax')
                newBndBoxYmax = SubElement(newBndBox, 'ymax')

                newBndBoxXmin.text = bndBox.find('xmin').text
                newBndBoxYmin.text = bndBox.find('ymin').text
                newBndBoxXmax.text = bndBox.find('xmax').text
                newBndBoxYmax.text = bndBox.find('ymax').text

                newObjects.append(newObject)

        if len(newObjects) > 0:
            newXmlRoot = Element('annotation')
            newObjects = [SubElement(newXmlRoot, obj) for obj in newObjects]
            newTree = etree.ElementTree(newXmlRoot)
            newTree.write(os.path.join(newAnnDir, fileName), pretty_print=True)
  1. 示例
# 输出路径
outputPath = './VOC_person_cat_dog'
os.makedirs(outputPath, exist_ok=True)

get_voc_category(categories)
create_new_voc_annotations()

以上是提取COCO、VOC数据集中特定的类的完整攻略,示例代码已经给出,可以根据实际需要进行修改。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现提取COCO,VOC数据集中特定的类 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python 图片验证码代码

    下面是“python图片验证码代码”的完整攻略: 1. 简介 图形验证码是一种广泛应用于网络安全认证中的技术,目的是通过对用户输入的图形码进行验证,从而识别人机交互行为是否真实或正常。在Python中,我们可以使用第三方库Pillow(即PIL)和StringIO来实现图片验证码的生成。 2. 环境搭建 在开始之前,需要确保已经配置好了Python的运行环境…

    python 2023年5月14日
    00
  • Python基本数据类型之字符串str

    Python基本数据类型之字符串str 字符串是Python编程中使用频率非常高的一种数据类型,可以存储字符、数字、符号等各种类型的数据。 字符串的定义 字符串可以使用单引号或双引号来定义,且两种方式是等效的。 str1 = ‘hello’ str2 = "world" print(str1, str2) 输出结果为: hello wor…

    python 2023年6月5日
    00
  • Python中的np.vstack()和np.hstack()详解

    Python中的np.vstack()和np.hstack()详解 在Python的科学计算库NumPy中,我们有两个非常重要的函数:np.vstack()和np.hstack(),它们可以用来合并数组。下面我们详细阐述这两个函数的用法。 np.vstack() np.vstack()是一个用于垂直堆叠(vertically stack)数组的函数。具体来说…

    python 2023年5月13日
    00
  • python使用tcp实现局域网内文件传输

    下面是“python使用tcp实现局域网内文件传输”的攻略: 准备工作 确保你的电脑和接收文件的电脑在同一局域网内,可以相互通信; 安装Python 3.x版本; 确保你的防火墙或安全软件没有对文件传输进行限制。 实现步骤 编写服务端代码 服务端代码主要用来监听客户端发送的请求和获取客户端发送的文件数据。在监听到客户端发送文件请求后,服务端会创建一个新的线程…

    python 2023年6月5日
    00
  • 分析如何在Python中解析和修改XML

    XML是一种常用的数据交换格式,Python提供了多种解析和修改XML数据的方法,包括ElementTree、lxml和xml.etree.ElementTree等。以下是详细讲解如何在Python中解析和修改XML的攻略,包含两个示例。 示例1:使用ElementTree解析XML 以下是一个示例,可以使用ElementTree解析XML: import …

    python 2023年5月15日
    00
  • Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法

    要实现Python MongoDB插入数据时已存在则不执行,不存在则插入的功能,可以使用MongoDB的upsert操作符和update_one()方法,该方法可以对满足指定查询条件的记录执行update操作,并且如果不存在满足条件的记录,则会插入一条新纪录。 具体步骤如下: 确定需要插入的集合和文档数据,例如: collection = db["…

    python 2023年6月5日
    00
  • Python3.6 之后字典是有序的?

    在Python 3.6版本中,字典是有序的。这一改变是通过PEP 468提出,由Raymond Hettinger和其他Python核心开发人员实现的,并在Python 3.6中发布。 在此之前,字典一直被认为是无序的。 下面是一些具体信息和示例,以帮助理解这一改变: 字典是有序的,但仍然具有与以前版本相同的语法和行为,仅是后台实现的改变。 当使用Pytho…

    python 2023年6月3日
    00
  • Python selenium 自动化脚本打包成一个exe文件(推荐)

    Python selenium 是一个强大的自动化测试工具,可以帮助开发人员快速构建高效的脚本,提高项目的质量和效率。但是在实际应用中,需要将脚本打包成一个exe文件,以便在其他机器上运行,本文主要介绍如何实现 Python selenium 自动化脚本打包成一个 exe 文件的操作方法。 环境准备 安装 Python2.7 或 Python3.6 安装 P…

    python 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部