本文處理對象為 ILSVRC2012 分類數據集。
一、下載:
首先進入ImageNet 官網:
用學生郵箱注冊并登錄后才能免費下載,因此如果沒有注冊的話,需要首先用學生郵箱注冊賬戶。
這里需要注意的是:
- 不翻墻的話會導致注冊失敗!!!
PS:可能有人因為想找迅雷下載鏈接而點進了這篇帖子,為了避免你們空手離開,我就貼一個下載鏈接吧,如果有用的話就麻煩點個贊和關注吧~
訓練集迅雷種子文件:提取碼:46aw
驗證集百度云:提取碼:7bt4
標簽映射文件百度云:提取碼:axte
下載以下3個文件即可:
ILSVRC2012_img_train.tar
ILSVRC2012_img_val.tar
ILSVRC2012_devkit_t12.tar.gz
二、解壓:
假設3個文件所在目錄為:
/home/data/imagenet
1.解壓訓練集:
執行命令:
cd /home/data/imagenet
進入該文件目錄下。執行命令:
mkdir train && tar -xvf ILSVRC2012_img_train.tar -C train && for x in `ls train/*tar`; do fn=train/`basename $x .tar`; mkdir $fn; tar -xvf $x -C $fn; rm -f $fn.tar; done
將訓練集解壓到文件夾 train 目錄下。執行命令:
cd train
進入 train 目錄下。執行命令:
ls -lR|grep "^d"|wc -l
查看該目錄下的文件夾數量,若解壓成功,則返回1000。執行命令:
ls -lR|grep "^-"|wc -l
查看 train 目錄下所有文件(圖片)的數量,若解壓成功,則返回1281167。
2.解壓驗證集:
執行命令:
cd /home/data/imagenet
進入3個文件所在的根目錄。執行命令:
mkdir val
創建解壓驗證集的文件夾。執行命令:
tar xvf ILSVRC2012_img_val.tar -C ./val
將驗證集圖像解壓到 val 目錄下。此時 val 目錄下是50000張圖像,并沒有被分類到1000個文件夾下。因此需要將驗證集中的圖像進行分類存放。
執行命令:
tar -xzf ILSVRC2012_devkit_t12.tar.gz
解壓下載的第3個文件,該文件中記錄著驗證集中的圖像名及其類別標簽之間的映射關系。
在 '/home/data/imagenet' 目錄下創建 Python 腳本,假設命名為“unzip.py”,其內容如下:
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()
運行該腳本后,驗證集就處理成功了。