coco数据集过大,希望从里面挑选特定的类别,来构成测试集。
以下cocodeal.py文件能够保留coco中指定的类别数据,同时生成.xml文件。具体应用可以见代码注释。
#cocodeal.py#本文件处理coco数据集,删除指定类别数据。要处理的目录结构如下。最后生成Annotations和images备份文件。#并且在images_coco文件夹中是我们想要的。# 如下是必须需要的目录或文件,其中annotations存着.xml文件,images下的train2014和val2014存着.jpg文件,labels下的train2014和val2014存着.txt文件信息# ├── coco# │ ├── annotations # 里面是*.xml# │ ├── images# │ │ ├── train2014 # 里面是*.jpg# │ │ └── val2014 # 里面是*.jpg# │ └── labels # │ ├── train2014 # 里面是*.txt # │ └── val2014 # 里面是*.txt# |—— cocodeal.py # 本文件#生成annotations_filtered和images_filtered文件夹from pycocotools.coco import COCOimport osimport shutilfrom tqdm import tqdmimport skimage.io as ioimport matplotlib.pyplot as pltimport cv2from PIL import Image, ImageDraw, ImageFileImageFile.LOAD_TRUNCATED_IMAGES = True#if the dir is not exists,make it,else delete itdef mkr(path): if os.path.exists(path): shutil.rmtree(path) os.mkdir(path) else: os.mkdir(path)###########################修改以下参数适配路径#the path you want to save your results for coco to vocsavepath=""# 保存的路径img_dir = savepath+'images_filtered/'# 保存图片的文件夹路径mkr(img_dir)anno_dir = savepath+'annotations_filtered/'# 保存xml的文件夹路径mkr(anno_dir)datasets_list=['train2014', 'val2014'] # 与 coco/images里的两个文件夹名一致# datasets_list=['train2014']# datasets_list = ['val2017']# 你需要挑出的类的名称classes_names = ["elephant"] # 要保留的类别list#Store annotations and train2014/val2014/..、in this folderdataDir = 'coco'# coco数据集所在的位置。本文件与该文件夹在同一级目录下###############################headstr = """
通过上面代码能够筛选出想要的种类的数据集。如果觉得数据集过大,或者想要生成这些图片文件的名称(不含.jpg),可以通过以下代码来实现。
#getImageID.py#本文件将提前取出前selct_n张train图片和val图片,并且提取出对应的annotations里的.xml文件,同时把文件名称(不含.jpg)存于文本文件中#与cocodeal.py在同一目录,先运行cocodeal.py,再手动检查前selct_n张图片的内容,再运行本文件#生成的文件存于同目录下的myimages和myannotations文件夹。以及train2014imgid.txt,val2014imgid.txt。#有需要的话自己手动修改文件夹名称。可以先手动筛过images_filtered里前selct_n张图片再运行本文件。# .# ├── annotations_filtered 需要的文件夹# ├── coco# ├── cocodeal.py# ├── getImageID.py 本文件# ├── images_filtered 需要的文件夹# ├── myannotations 生成的文件夹# ├── myimages 生成的文件夹 # ├── train2014imgid.txt 生成的文件# ├── val2014imgid.txt 生成的文件import osimport shutilselct_n = 200 # 挑选出200张jpg图片#if the dir is not exists,make it,else delete itdef mkr(path): if os.path.exists(path): shutil.rmtree(path) os.mkdir(path) else: os.mkdir(path)img_src = "images_filtered/" # 从该路径下的train2014文件夹与val2014文件夹里面选出照片anno_src = "annotations_filtered/"img_path = "myimages/"anno_path = "myannotations/"mkr(img_path) # 挑出来的图片保存在该文件夹下mkr(anno_path) # 挑出来的.xml文件保存在该文件夹下sets = ['train2014', 'val2014'] # train的图片存放与myimages/train2014/文件夹下,val放在myimages/val2014/下for x in sets: cnt = 0 myfile = open(x+"imgid.txt", "w+") # 覆盖写。存储图片的名称(不含.jpg) mkr(img_path+x) # myimages/train2014/ 或 myimages/val2014/ for dirpath, dirnames, filenames in os.walk(img_src+x): # print(filenames) print(dirnames) print(dirpath) for filename in filenames: cnt+=1 if cnt > selct_n: break print(filename[:-4], file=myfile) shutil.copy(src=dirpath+"/"+filename, dst=img_path+x+"/"+filename) shutil.copy(src=anno_src+filename[:-4]+".xml", dst=anno_path+filename[:-4]+".xml") myfile.close()