前言
机器学习常用的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--------------------------------------------------