Hello! ImageNet ILSVRC 2012!

Up主作爲CV窮人代表,這一次想要觸碰一下 papers 裏最爲活躍卻又以 “Huge” 令窮人望而生畏的超級數據集: ImageNet 中的 ILSVRC2012.


還記得依靠氪金 “霸道總裁式” 碾壓一切 “noise 2 image” 的 BigGAN 嗎?

來不及時間解釋了,快上車!
## 下載可憐窮人的 BigGAN-4~8 gpus version
>> git clone https://github.com/ajbrock/BigGAN-PyTorch.git
準備數據集及其預處理

資源

http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_devkit_t12.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_train_v2.tar

這一步是重點,講述了UP主如何下載整個數據集。

  • 首先是通過迅雷下載一些輔助信息(BBox等)和較小的測試集與驗證集數據(建議租一個一天會員)(直接複製上面的幾個鏈接);
  • 但是到了訓練集的 137 個 GB 的時候就不行了,因爲用的是內網,強行被限制了網速,所以只好找到一個熱心網友的網盤上分享的資源,每個類別對應一個壓縮包,共1000個,
## 原來的資源找不到了,這裏有個也是一樣的
https://pan.baidu.com/s/1hsDmdNI

下載完後就是解壓了,花了幾個小時,寫了個腳本(對1000個 .tar 壓縮包進行解壓縮),

import tarfile
import os
from tqdm import tqdm

if __name__ == '__main__':
    src_pth = 'xxxxxx/ILSVRC2012_img_train'
    des_pth = 'xxxxxx/SuperDatasets/Image-Net/ILSVRC2012_img_train'

    for i in tqdm(range(1000)):
        dir_name = '%04d' % (i+1)
        if os.path.exists(os.path.join(des_pth, dir_name)) is not True:
            os.mkdir(os.path.join(des_pth, dir_name))

        tar_file = os.path.join(src_pth, dir_name+'.tar')
        dir_file = os.path.join(des_pth, dir_name)

        tar_fh = tarfile.open(tar_file)

        for f_name in tar_fh.getnames():
            tar_fh.extract(f_name, path=dir_file)
            # 解壓到指定文件夾

最後得到
在這裏插入圖片描述
在這裏插入圖片描述
好吧確實有點感動♪(^∀^●)ノ


這裏的每個子文件夾下都是同一個類別的圖像,1000個類別的中英文信息參照這位老哥的博客:imagenet數據集類別標籤和對應的英文中文對照表
但實際上我們並不在意具體每一類別指的是什麼,只要用0,1,2,…去指代即可。


訓練階段我們只需要在工程目錄下新建 data 目錄,裏邊再新建 ImageNet 目錄,裏邊再新建 I128 目錄,即 data/ImageNet/I128 。這之後將 train 的1000個子目錄移動過去。


Anyway,收集完數據後,下面就是預處理了。

  • 執行python make_hdf5.py --dataset I128 --batch_size 128 --data_root data
    hdf5 是爲了將數據處理成更利於快速 I /O 的格式,類似於在上一篇博客 EDVR-lmdb ;但與 lmdb 不同的是,lmdb 純碎是存儲一個巨大的 dict,而 hdf5 還附帶了控制 batch 的功能,簡直就是專門爲 dataset 而設計的Σ( ° △ °|||)︴
  • 其中,batch_size_overall=num_gpu×batch_size_per_gpubatch\_size\_overall = num\_gpu \times batch\_size\_per\_gpu
    這裏的 batch_size 就是 overall 的;作者說,16GB 的單個 VRAM 支持 batch_size_per_gpu 可以是256,所以作者說原始的 BigGAN設置是:
    2048=256×82048=256\times 8
  • 本窮UP好不容易借到 4 張 1080ti,那就是假設是 8GB ✖ 4, 所以
    128×4=512128\times 4=512,想想還是算了,就按他給的 256 的一半 128 來吧。
    下面我們來看看這樣的設置下發生了什麼?
經由代碼文件
make_hdf5.py, utils.py, datasets.py
我們可以推斷出數據集應該這樣準備:
'''
/data/ImageNet
 ├I128   # ImageNet 128x128
 │ ├dog
 │ │ ├xxx.jpg
 │ │ ├xxy.jpg
 │ │ ...
 │ │ └zzz.jpg
 │ ├cat
 │ │ ├xxx.jpg
 │ │ ...
 │ │ ├xxy.jpg
 │ │ ...
 │ │ └zzz.jpg
 │ ...
 │ └class_n
 │   ├xxx.jpg
 │   ...
 │   ├xxy.jpg
 │   ...
 │   └zzz.jpg
 ├I256   # ImageNet 256x256
 ...
 └XXXX
'''

完了後我們應該會得到一個:data/ImageNet/ILSVRC128.hdf5

TIP

我們發現代碼裏並沒有一定要求1000個類別的圖像都參與訓練,所以我們可以只取其中的一部分類別。那就前 25 類吧,剛好到貓頭鷹先生那裏,一共也有 32500 張圖像。處理就很快了,一分鐘不到,生成文件大小是 1.4 GB。在這裏插入圖片描述


  • 執行python calculate_inception_moments.py --dataset I128_hdf5 --data_root data
    這裏是爲了使用 torchvision.models.inception 的預訓練模型去計算 IS 分數(μ\muσ\sigma
    在這裏插入圖片描述

開始訓練

python train.py \
--dataset I128_hdf5 \  # which Dataset to train on, out of I128, I256, C10, C100;
--parallel --shuffle  --num_workers 8 --batch_size 128 \ # for data loader settings
--num_G_accumulations 2 --num_D_accumulations 2 \
--num_D_steps 1 --G_lr 1e-4 --D_lr 4e-4 --D_B2 0.999 --G_B2 0.999 \
--G_attn 64 --D_attn 64 \
--G_nl relu --D_nl relu \
--SN_eps 1e-8 --BN_eps 1e-5 --adam_eps 1e-8 \
--G_ortho 0.0 \
--G_init xavier --D_init xavier \
--ema --use_ema --ema_start 2000 --G_eval_mode \
--test_every 2000 --save_every 1000 --num_best_copies 5 --num_save_copies 2 --seed 0 \
--name_suffix SAGAN_ema \
UP主的成功設置

UP主後來變成只有兩張卡,那就再試試咯,把 batch_size_overallbatch\_size\_overall 設置成32,最終暫且在兩張卡上跑了起來。

CUDA_VISIBLE_DEVICES=0,1 python train.py --dataset I128_hdf5 --parallel --shuffle  --num_workers 8 --batch_size 32 --num_G_accumulations 1 --num_D_accumulations 1 --num_D_steps 1 --G_lr 1e-4 --D_lr 4e-4 --D_B2 0.999 --G_B2 0.999 --G_attn 64 --D_attn 64 --G_nl relu --D_nl relu --SN_eps 1e-8 --BN_eps 1e-5 --adam_eps 1e-8 --G_ortho 0.0 --G_init xavier --D_init xavier --ema --use_ema --ema_start 2000 --G_eval_mode --test_every 2000 --save_every 1000 --num_best_copies 5 --num_save_copies 2 --seed 0 --name_suffix SAGAN_ema
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章