Tiered ImageNet(few-shot learning最近很常用)的详细介绍及python处理方法

最近在读few-shot Learning 的论文,这个Tiered ImageNet可以说是很多期刊论文的few-shot learning文章都喜欢用来做实验对比了,所以我也很好奇这个Tiered ImageNet到底是个什么样子的。通过这篇博客和大家一起探索一下Tiered ImageNet。

Tiered ImageNet是在2018年的论文 META-LEARNING FOR SEMI-SUPERVISED FEW-SHOT CLASSIFICATION 中提出来的一个数据集,根据作者的介绍,这个数据集是数据集 ILSVRC-12 (ImageNet 2012)的一个子集。熟悉few-shot learning的朋友都知道,mini-ImageNet作为另一个few-shot learning的热门数据集,它也是 ILSVRC-12 的一个子集。不同的是,mini-ImageNet只有100个类,划分成64个training categories,16个val categories和20个test categories。而Tiered ImageNet类似于Omniglot(手写符号数据集),它的分类有层次概念。数据集分成34个大类(比如乐器,工具,载具之类的),这34个大类中每个类包含10~30个更细致的小类(比如乐器这个大类包含吉他,钢琴等)。34个大类分成20个training categories,6个val categories和8个test categories。根据作者的说法,这样做的好处是让大类相同的小类不要分别出现在training和test categories中。比如mini-ImageNet中将管风琴作为训练集,电吉他作为测试集,即便这两种都是乐器。

OK。上面这些差不多就是论文里对Tiered ImageNet的全部描述了,如果有兴趣的读者可以自己去读读原文。可是对于我这种想要使用Tiered ImageNet做训练的人来说,这些信息太粗糙了,我需要知道这个数据集怎么加载,怎么划分,标签是什么样的。

首先,找到原始数据集。
https://github.com/renmengye/few-shot-ssl-public
这是META-LEARNING FOR SEMI-SUPERVISED FEW-SHOT CLASSIFICATION 的github链接。往下翻可以发现
Tiered ImageNet(few-shot learning最近很常用)的详细介绍及python处理方法_第1张图片
Nice!作者给出了Tiered ImageNet的链接。不过有一点问题,他们给的是谷歌的网盘链接,这就要看本事了,把它下载下来。

在这里插入图片描述
下载好之后是这样的,一个压缩包。
Tiered ImageNet(few-shot learning最近很常用)的详细介绍及python处理方法_第2张图片
解压之后的样子。好家伙,数据全部被保存成pkl了,我又不知道作者当初是怎么压缩的,所以怎么解压这个pkl文件是一个大问题。还是要去看源码,这是最恶心人的部分了。那么下面是我看完源码之后从里面抽取出来的一点关键代码,以training categories为例。

import numpy as np
import pandas as pd
import pickle as pkl

cache_path_labels = 'F:/数据库/tiered-imagenet/train_labels.pkl'

f = open(cache_path_labels, 'rb')
data = pkl.load(f, encoding='bytes')
label_specific = data["label_specific"]
label_general = data["label_general"]
label_specific_str = data["label_specific_str"]
label_general_str = data["label_general_str"]

print('label_specific: ')
print(len(label_specific))
print(label_specific)
print(label_specific_str)
print('\nlabel_general:')
print(len(label_general))
print(set(label_general))
print(label_general_str)

Tiered ImageNet(few-shot learning最近很常用)的详细介绍及python处理方法_第3张图片

可以看出来,training categories里面,精细划分的有351个类,粗糙划分的有20个类,总共有448695张图片。再分别测试一下val和test。
Tiered ImageNet(few-shot learning最近很常用)的详细介绍及python处理方法_第4张图片
这是val categories的运行结果,精细划分的有97个类,粗糙划分的有6个类,总共有124261张图片。
Tiered ImageNet(few-shot learning最近很常用)的详细介绍及python处理方法_第5张图片
这是test categories的运行结果,精细划分的有160个类,粗糙划分的有8个类,总共有206209张图片。

上面都是对于label的压缩文件的解压操作,下面会介绍图片的解压操作。
突然发现解压图片要用到cv2,我还没安装这个包,那就下次再说了,等我弄好了再继续写图片解压。

弄好了,继续说图片的解压缩。直接上代码:

import pickle as pkl
import cv2

f_txt = open('F:/数据库/tiered-imagenet/val_labels.txt', 'w')

save_path = 'F:/数据库/tiered-imagenet/val_images/'

cache_path_labels = 'F:/数据库/tiered-imagenet/val_labels.pkl'
png_pkl = 'F:/数据库/tiered-imagenet/val_images_png.pkl'

f_labels = open(cache_path_labels, 'rb')
data_labels = pkl.load(f_labels, encoding='bytes')
label_specific_str = data_labels["label_specific_str"]
label_specific = data_labels["label_specific"]

f_images = open(png_pkl, 'rb')
array = pkl.load(f_images)

image_no = 0
class_no = []
for ii, item in enumerate(array):
    im = cv2.imdecode(item, 1)
    cls = label_specific[ii]
    if not cls in class_no:
        class_no.append(cls)
        image_no = 0
        if len(class_no) > 1:
            print('class %d finished [ %d / %d ]' % (class_no[-2], ii + 1, len(array)))
    image_no += 1
    cv2.imencode('.jpg', im)[1].tofile(save_path + 'C%04dNo%04d.jpg' % (cls, image_no))
    f_txt.write('%04d val_images/C%04dNo%04d.jpg\n' % (cls, cls, image_no))

那么上面这一段代码就可以直接把图片解压缩,然后以 .jpg 的形式保存到本地,而且会给每个图片都附带一个标签。上面是以val_images为例进行操作。

Tiered ImageNet(few-shot learning最近很常用)的详细介绍及python处理方法_第6张图片
运行完代码之后就可以获取图片以及图片对应的类别标签了。

你可能感兴趣的:(python,深度学习)