neuroailab / LocalAggregation

Tensorflow implementation for "Local Aggregation for Unsupervised Learning of Visual Embeddings"
58 stars 12 forks source link

Local Aggregation for Unsupervised Learning of Visual Embeddings

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".

Pretrained Model

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.

Instructions for training

Prerequisites

We have tested this repo under Ubuntu 16.04 with tensorflow version 1.9.0. Training LA model requires faiss==1.6.1.

Data preparation

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

Model training

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

Code reading

For your convenience, the most important function you want to look at is function build_targets in script model/instance_model.py.

Transfer learning to ImageNet

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

Transfer learning to Places205

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

Multi-GPU training

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.