提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
最近在使用AutoDL算力云复现几个深度学习中知识蒸馏的代码,训练一个图像分类的模型时,用到了李飞飞教授的ImageNet1K数据集,所以想把这个数据集的介绍以及使用给刚入门深度学习图像分类的新手小白们分享一下,内容很简单,也算是做一个简单的笔记。
一、ImageNet数据集简介
1. 介绍
- ImageNet是一个大规模的图像数据库,由斯坦福大学的李飞飞教授团队创建。
- 数据集包含超过1400万张带有标注的图像,涵盖超过2万个类别。
- 这个数据集在计算机视觉领域中被广泛使用,特别是在图像分类、目标检测和语义分割等任务中。
2. 数据集组织
- 每个图像都有一个与之关联的标签,标签对应着图像所属的类别。
- 每个类别都有数千到数百万张不同角度和环境下的图像。
3. 数据集挑战
- ImageNet挑战(ImageNet Large Scale Visual Recognition Challenge,简称ILSVRC)是一个定期举办的竞赛,旨在评估算法对图像分类任务的性能。
- 参与者需要使用ImageNet的训练集进行模型训练,并在测试集上进行图像分类,评估模型的准确性。
4. 数据集用途
- ImageNet被广泛用于深度学习模型的训练和评估。
- 这个数据集对于训练深度神经网络如卷积神经网络(CNN)在大规模数据上表现出色。
二、使用步骤
1. ImageNet数据集的下载
由于其规模庞大,下载整个数据集可能需要大量时间和存储空间。在过去,ImageNet数据集可以通过官方网站http://www.image-net.org 进行下载。然而,由于数据集的巨大尺寸和资源需求,官方通常要求用户注册并遵守使用协议,同时可能需要支付一定的费用。
在AutoDL中有一个公开数据集模块,已经将ImageNet数据集的压缩包下载了下来,可以在/root/autodl-pub/ImageNet目录下找到,大家也可以自行下载,但是就拿2012年ILSVRC2012竞赛中ImageNet数据集的大小来说,训练数据集下载资源为137.7G,验证集大小为6.3个G。数据集下载好后,如下图:
2.压缩数据的解压
我们在训练一个新的深度分类神经网络时,用到的是train,val,test三个文件,对模型输入数据时首先需要解压缩这三个tar包,在windows系统中,直接解压缩文件即可,在linux系统中使用python提取ILSVRC2012文件夹中我们需要的训练集和验证集。
import os
import tarfile
TRAIN_SRC_DIR = '/root/autodl-pub/ImageNet/ILSVRC2012/ILSVRC2012_img_train.tar'
TRAIN_DEST_DIR = '/root/autodl-tmp/imagenet/train'
VAL_SRC_DIR = '/root/autodl-pub/ImageNet/ILSVRC2012/ILSVRC2012_img_val.tar'
VAL_DEST_DIR = '/root/autodl-tmp/imagenet/val'
def extract_train():
with open(TRAIN_SRC_DIR, 'rb') as f:
tar = tarfile.open(fileobj=f, mode='r:')
for i, item in enumerate(tar):
cls_name = item.name.strip(".tar")
a = tar.extractfile(item)
b = tarfile.open(fileobj=a, mode="r:")
e_path = "{}/{}/".format(TRAIN_DEST_DIR, cls_name)
if not os.path.isdir(e_path):
os.makedirs(e_path)
print("#", i, "extract train dateset to >>>", e_path)
names = b.getnames()
for name in names:
b.extract(name, e_path)
def extract_val():
with open(VAL_SRC_DIR, 'rb') as f:
tar = tarfile.open(fileobj=f, mode='r:')
if not os.path.isdir(VAL_DEST_DIR):
os.makedirs(VAL_DEST_DIR)
print("extract val dateset to >>>", VAL_DEST_DIR)
names = tar.getnames()
for name in names:
tar.extract(name, VAL_DEST_DIR)
if __name__ == '__main__':
extract_train()
extract_val()
解压缩完毕后,训练数据集是一个个一类别分类的文件夹,文件夹名是数字,如下所示:
而val文件夹下是随机的图像数据,因此在用val文件夹对模型进行验证时,需要整理val文件夹下的图像的标签,按照train文件目录下的样式,对val文件夹下的图像数据进行分类,并且以类别名作为文件夹名整理图像,val文件夹下的图像没有标签,但是我们下载下来的ILSVRC2012文件夹中包含验证集的标签压缩文件,如图所示:
我们需要将标签压缩文件首先解压缩到和val文件夹相同的目录下,然后通过下面的代码,将对应的图像分类到相应的文件夹中。
代码如下:
from scipy import io
import os
import shutil
def move_valimg(val_dir='./val', devkit_dir='./ILSVRC2012_devkit_t12'):
"""
move valimg to correspongding folders.
val_id(start from 1) -> ILSVRC_ID(start from 1) -> WIND
organize like:
/val
/n01440764
images
/n01443537
images
.....
"""
# load synset, val ground truth and val images list
synset = io.loadmat(os.path.join(devkit_dir, 'data', 'meta.mat'))
ground_truth = open(os.path.join(devkit_dir, 'data', 'ILSVRC2012_validation_ground_truth.txt'))
lines = ground_truth.readlines()
labels = [int(line[:-1]) for line in lines]
root, _, filenames = next(os.walk(val_dir))
for filename in filenames:
# val image name -> ILSVRC ID -> WIND
val_id = int(filename.split('.')[0].split('_')[-1])
ILSVRC_ID = labels[val_id-1]
WIND = synset['synsets'][ILSVRC_ID-1][0][1][0]
print("val_id:%d, ILSVRC_ID:%d, WIND:%s" % (val_id, ILSVRC_ID, WIND))
# move val images
output_dir = os.path.join(root, WIND)
if os.path.isdir(output_dir):
pass
else:
os.mkdir(output_dir)
shutil.move(os.path.join(root, filename), os.path.join(output_dir, filename))
if __name__ == '__main__':
move_valimg()
处理完毕后,就可以正常使用ImageNet数据集去训练模型啦。
三、附加说明
使用AutoDl算力云去做深度学习模型的训练还是很方便的,上面也有平台已经下载好的公开数据集,但是需要对系统的数据盘扩容,这个时候就需要收费了,按照扩容大小计量收费,并且收费是根据你存储数据的时间按天收费的,所以大家需要酌情考虑,一天大概几块钱,比如我扩容了200G,每天收费1.33元左右,当然你可以随时扩容或者缩容收费也会随之增大或减小。