提取VOCtrainval_11-May-2012数据集中特定样本

前言

机器学习常用的PascalVOC数据集,此不做介绍,下载连接中有描述。
下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html
具体位置

目的

由于下载完的原始数据集各个分类的图片和标签都放在同一个文件夹,面对近2万张图片,人工区分选择是不可能的。但是如果我们想要在其中选取出比如有关bottle分类的图片和标签文件,VOC2012/ImageSets/下四个目录下txt文件对样本的区分提供了帮助。
VOC2012
├──Annotations
├──ImageSets
 ├──Action
 ├──Layout
 ├──Main
 └──Segmentation
├──JPEGImage
├──SegmentationClass
└──SegmentationObject

以VOC2012/ImageSets/Main(个人常用)下的bottle_train.txt文件为例:
在这里插入图片描述
可以看到该文本中记录了VOC2012所有图片的编号,而后面的数字1或者-1代表的是该图片是否为该样本的分类,1表示是,-1表示为不是。因此提供样本选取思路:

  • 选择所需类别的txt文件——提取其中标记为1的图片名——根据图片名索引特定图片和标签——将索引到的文件复制到单独的目录中。

实现

个人使用Python脚本实现。在VOC2012目录下创建select_sample.py。
代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author :   ZhangXG
@File   :   select_sample.py
@Time   :   2019/10/30-10:41
"""
import os
import shutil

# 读取目标txt文件
def read_txt(path):
    file_name_set = set()
    with open(path, 'r') as f:
    	# 读取文本每一行
        txt_line_list = f.readlines()
        for l in txt_line_list:
        	# 判断标号图片是否为所需分类
            if not l.endswith('-1\n') and not l.endswith('0\n'):
                f_list = l.split()
                # 获取图片文件名
                file_name = f_list[0]
                # 将所需文件名放入集合中之后使用
                file_name_set.add(file_name)
    print(len(file_name_set), 'files.')

    img_set = set()
    label_set = set()
    for i in file_name_set:
    	# 将文件名组合成图片和标签名
        img_name = str(i) + '.jpg'
        label_name = str(i) + '.xml'
		
		# 放入相应集合中
        img_set.add(img_name)
        label_set.add(label_name)
    return img_set, label_set

# 用于对文件从原路径复制到目标路径
def copy_file(src_path, dst_path):
    if not os.path.exists(dst_path):
        print('Make the target dataset directory.')
        os.mkdir(dst_path)
    if os.path.exists(src_path):
    	# 复制使用函数
        shutil.copy(src_path, dst_path)
    else:
        print(src_path, 'is not exist!')

# 在这里定义你想要的目标路径
dst_sample_path = './dataset/bottle/'
# 在这里定义所需分类的txt路径
txt_path = './ImageSets/Main/bottle_trainval.txt'

if __name__ == '__main__':

    images_path = './JPEGImages'
    labels_path = './Annotations'
	# 获取图片和标签的名称集合
    images_set = read_txt(txt_path)[0]
    labels_set = read_txt(txt_path)[1]

    print('Start selecting samples...')
    for img in images_set:
        src_img_path = os.path.join(images_path, img)
        # 对每一张图片复制
        copy_file(src_img_path, dst_sample_path)

    for img in labels_set:
        src_label_path = os.path.join(labels_path, img)
         # 对每一个标签文件复制
        copy_file(src_label_path, dst_sample_path)

    print('Finished select!')

结果:所有与bottle相关的图片及标签文件已被选取出来。
在这里插入图片描述
-----------------------------------------------End--------------------------------------------------

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值