欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

多目标数据集中提取单个目标

YOLO 迷途小书童 3年前 (2021-11-26) 2207次浏览 0个评论

环境

  • windows 10 64bit
  • voc dataset

简介

有些时候,针对大的一个数据集(比如 VOC2012),我们只需要去做某个目标(比如 person)的模型训练,这时候,就需要将特定目标的图片和对应的标注整理出来,形成一个新的数据集。本篇,我们就来实现这个目标。

操作步骤

这里以 VOC2012 数据集为例,来到 roboflow 官方的公开数据集,选择 Pascal VOC 2012 Dataset

VOC2012

下载时,选择 YOLO Darknet 格式

VOC2012

下载完成后,解压,目录结构是这样的

VOC2012

完整的 VOC2012 包含了20个目标,这个在文件 _darknet.labels 中有描述

VOC2012

这里假设要抽取出 person 这个 class,我们在数据集根目录新建脚本,输入如下代码

import os
import shutil

# 统计下最后图片的数量
counter = 0

# 创建2个目标文件夹,images放图片,labels放标注
if not os.path.exists('images'):
    os.makedirs('images')

if not os.path.exists('labels'):
    os.makedirs('labels')

for file in os.listdir('train'):
    flag = False
    if file.endswith('.txt'):
        f = open("train/{}".format(file), 'r')
        line = f.readline()

        # 原数据集中有部分txt,大小为0,内容为空,去除掉
        if line == "":
            continue

        while line:
            # 去除txt中的第一列的值,也就是class id
            tmp = line.split(' ')[0]

            # txt中的数据是字符串类型,人这个目标的id是14
            if tmp != "14":
                print('NOT person.')
                flag = True
                break

            line = f.readline()

        f.close()

        if not flag:
            counter += 1
            prefix = file[0: -3]

            # 拷贝符合条件的图片和对应的标注
            shutil.copy2('train/{}jpg'.format(prefix), 'images')
            shutil.copy2('train/{}'.format(file), 'labels')

print('total number image: {}'.format(counter))

执行上述脚本后,就会将符合条件的图片存放在 images 文件夹,而标注则是存放在 labels 文件夹

那接下来就要去修改标注中的 class id 了,在 VOC2012 中,人的 id 是14(从0开始),考虑到新的数据集只有人这一类,所以 id 就是0,那工作就变成要将 txt 文件中的第一列数据中的 14 改为 0

本质上这个就是查找替换的操作,实现的方法很多。这里给大家介绍个 windows 下的一个开源工具 grepWin,它拥有图形界面,操作非常简单,下载地址是

https://github.com/stefankueng/grepWin/releases/tag/2.0.8

安装后,右键点击文件夹 labels,选择 search with grepWin 打开

VOC2012

查找可以使用正则,也可以使用文本。

本例中使用完整文本匹配,需要将 14 替换成 0 ,注意后边带一个空格,这样能多过滤一些匹配,先不着急替换,可以先查找看看结果

VOC2012

有些 txt 文件,可能存在多个匹配,点击上方的 Matches 可以重新排序

VOC2012

打开其中的一个 txt 进行查看,发现,其它列也有可能匹配 14 ,因此针对这种情况,就需要手动去修改,幸好,这样的文件不算特别多。

都是单个匹配的话,就可以直接替换文本了。

至此,单个目标的数据集就已经处理完毕了,可以拿去训练了

喜欢 (3)

您必须 登录 才能发表评论!