This repo implements the Local Aggregation (LA) algorithm on ImageNet and related transfer learning pipelines for both ImageNet and Places205. Pytorch implementation of this algorithm is at LocalAggregation-Pytorch. This repo also includes a tensorflow implementation for the Instance Recognition (IR) task introduced in paper "Unsupervised Feature Learning via Non-Parametric Instance Discrimination".
A Local-Aggregation pretrained ResNet-18 model can be found at link, though this model may not be as good as a fully trained model by this repo, as it's a slightly earlier checkpoint than the final one.
We have tested this repo under Ubuntu 16.04 with tensorflow version 1.9.0.
Training LA model requires faiss==1.6.1
.
Prepare the ImageNet data as the raw JPEG format used in pytorch ImageNet training (see link). Then run the following command:
python dataset_miscs/build_tfrs.py --save_dir /path/to/imagenet/tfrs --img_folder /path/to/imagenet/raw/folder
We provide implementations for LA trained AlexNet, VggNet, ResNet-18, and ResNet-50.
We provide commands for ResNet-18 training, while commands for other networks can be acquired through slightly modifying these commands after inspecting for exp_configs/la_final.json
.
As LA algorithm requires training the model using IR algorithm for 10 epochs as a warm start, we first run the IR training using the following command:
python train.py --config exp_configs/la_final.json:res18_IR --image_dir /path/to/imagenet/tfrs --gpu [your gpu number] --cache_dir /path/to/model/save/folder
Then run the following command to do the LA training:
python train.py --config exp_configs/la_final.json:res18_LA --image_dir /path/to/imagenet/tfrs --gpu [your gpu number] --cache_dir /path/to/model/save/folder
For your convenience, the most important function you want to look at is function build_targets
in script model/instance_model.py
.
After finishing the LA training, run the following command to do the transfer learning to ImageNet:
python train_transfer.py --config exp_configs/la_trans_final.json:trans_res18_LA --image_dir /path/to/imagenet/tfrs --gpu [your gpu number] --cache_dir /path/to/model/save/folder
Generate the tfrecords for Places205 using the following command:
python dataset_miscs/build_tfrs_places.py --out_dir /path/to/places205/tfrs --csv_folder /path/to/places205/csvs --base_dir /path/to/places205/raw/folder --run
/path/to/places205/csvs
should include train_places205.csv
and val_places205.csv
for Places205.
/path/to/places205/raw/folder
should include the raw Places205 images such as /path/to/places205/raw/folder/data/vision/torralba/deeplearning/images256/a/abbey/gsun_0003586c3eedd97457b2d729ebfe18b5.jpg
Then, run this command for transfer learning:
python train_transfer.py --config exp_configs/la_plc_trans_final.json:plc_trans_res18_LA --image_dir /path/to/imagenet/tfrs --gpu [your gpu number] --cache_dir /path/to/model/save/folder
Unfortunately, this implementation does not support an efficient multi-gpu training, which is non-trivial in tensorflow.
Instead, we provide another implementation using TFUtils, which supports multi-gpu training but requires installing TFUtils.
After installing TFUtils, run the same training commands using train_tfutils.py
and train_transfer_tfutils.py
with multi-gpu argument such as --gpu a,b,c,d
, where a,b,c,d
are the gpu numbers used.