Propagate Yourself: Exploring Pixel-Level Consistency for Unsupervised Visual Representation Learning
By Zhenda Xie*, Yutong Lin*, Zheng Zhang, Yue Cao, Stephen Lin and Han Hu.
This repo is an official implementation of "Propagate Yourself: Exploring Pixel-Level Consistency for Unsupervised Visual Representation Learning" on PyTorch.
Introduction
PixPro
(pixel-to-propagation) is an unsupervised visual feature learning approach by leveraging pixel-level pretext tasks. The learnt feature can be well transferred to downstream dense prediction tasks such as object detection and semantic segmentation. PixPro
achieves the best transferring performance on Pascal VOC object detection (60.2 AP
using C4) and COCO object detection (41.4 / 40.5 mAP
using FPN / C4) with a ResNet-50 backbone.
Citation
@article{xie2020propagate,
title={Propagate Yourself: Exploring Pixel-Level Consistency for Unsupervised Visual Representation Learning},
author={Xie, Zhenda and Lin, Yutong and Zhang, Zheng and Cao, Yue and Lin, Stephen and Hu, Han},
conference={IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
year={2021}
}
Main Results
PixPro pre-trained models
Epochs | Arch | Instance Branch | Download |
---|---|---|---|
100 | ResNet-50 | script | model | |
400 | ResNet-50 | script | model | |
100 | ResNet-50 |
|
- |
400 | ResNet-50 |
|
- |
Pascal VOC object detection
Faster-RCNN with C4
Method | Epochs | Arch | AP | AP50 | AP75 | Download |
---|---|---|---|---|---|---|
Scratch | - | ResNet-50 | 33.8 | 60.2 | 33.1 | - |
Supervised | 100 | ResNet-50 | 53.5 | 81.3 | 58.8 | - |
MoCo | 200 | ResNet-50 | 55.9 | 81.5 | 62.6 | - |
SimCLR | 1000 | ResNet-50 | 56.3 | 81.9 | 62.5 | - |
MoCo v2 | 800 | ResNet-50 | 57.6 | 82.7 | 64.4 | - |
InfoMin | 200 | ResNet-50 | 57.6 | 82.7 | 64.6 | - |
InfoMin | 800 | ResNet-50 | 57.5 | 82.5 | 64.0 | - |
PixPro (ours) | 100 | ResNet-50 | 58.8 | 83.0 | 66.5 | config | model |
PixPro (ours) | 400 | ResNet-50 | 60.2 | 83.8 | 67.7 | config | model |
COCO object detection
Mask-RCNN with FPN
Method | Epochs | Arch | Schedule | bbox AP | mask AP | Download |
---|---|---|---|---|---|---|
Scratch | - | ResNet-50 | 1x | 32.8 | 29.9 | - |
Supervised | 100 | ResNet-50 | 1x | 39.7 | 35.9 | - |
MoCo | 200 | ResNet-50 | 1x | 39.4 | 35.6 | - |
SimCLR | 1000 | ResNet-50 | 1x | 39.8 | 35.9 | - |
MoCo v2 | 800 | ResNet-50 | 1x | 40.4 | 36.4 | - |
InfoMin | 200 | ResNet-50 | 1x | 40.6 | 36.7 | - |
InfoMin | 800 | ResNet-50 | 1x | 40.4 | 36.6 | - |
PixPro (ours) | 100 | ResNet-50 | 1x | 40.8 | 36.8 | config | model |
PixPro (ours) | 100* | ResNet-50 | 1x | 41.3 | 37.1 | - |
PixPro (ours) | 400* | ResNet-50 | 1x | 41.4 | 37.4 | - |
* Indicates methods with instance branch.
Mask-RCNN with C4
Method | Epochs | Arch | Schedule | bbox AP | mask AP | Download |
---|---|---|---|---|---|---|
Scratch | - | ResNet-50 | 1x | 26.4 | 29.3 | - |
Supervised | 100 | ResNet-50 | 1x | 38.2 | 33.3 | - |
MoCo | 200 | ResNet-50 | 1x | 38.5 | 33.6 | - |
SimCLR | 1000 | ResNet-50 | 1x | 38.4 | 33.6 | - |
MoCo v2 | 800 | ResNet-50 | 1x | 39.5 | 34.5 | - |
InfoMin | 200 | ResNet-50 | 1x | 39.0 | 34.1 | - |
InfoMin | 800 | ResNet-50 | 1x | 38.8 | 33.8 | - |
PixPro (ours) | 100 | ResNet-50 | 1x | 40.0 | 34.8 | config | model |
PixPro (ours) | 400 | ResNet-50 | 1x | 40.5 | 35.3 | config | model |
Getting started
Requirements
At present, we have not checked the compatibility of the code with other versions of the packages, so we only recommend the following configuration.
- Python 3.7
- PyTorch == 1.4.0
- Torchvision == 0.5.0
- CUDA == 10.1
- Other dependencies
Installation
We recommand using conda env to setup the experimental environments.
# Create environment
conda create -n PixPro python=3.7 -y
conda activate PixPro
# Install PyTorch & Torchvision
conda install pytorch=1.4.0 cudatoolkit=10.1 torchvision -c pytorch -y
# Install apex
git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
cd ..
# Clone repo
git clone https://github.com/zdaxie/PixPro ./PixPro
cd ./PixPro
# Create soft link for data
mkdir data
ln -s ${ImageNet-Path} ./data/imagenet
# Install other requirements
pip install -r requirements.txt
Pretrain with PixPro
# Train with PixPro base for 100 epochs.
./tools/pixpro_base_r50_100ep.sh
Transfer to Pascal VOC or COCO object detection
# Convert a pre-trained PixPro model to detectron2's format
cd transfer/detection
python convert_pretrain_to_d2.py ${Input-Checkpoint(.pth)} ./output.pkl
# Install Detectron2
python -m pip install detectron2==0.2.1 -f \
https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.4/index.html
# Create soft link for data
mkdir datasets
ln -s ${Pascal-VOC-Path}/VOC2007 ./datasets/VOC2007
ln -s ${Pascal-VOC-Path}/VOC2012 ./datasets/VOC2012
ln -s ${COCO-Path} ./datasets/coco
# Train detector with pre-trained PixPro model
# 1. Train Faster-RCNN with Pascal-VOC
python train_net.py --config-file configs/Pascal_VOC_R_50_C4_24k_PixPro.yaml --num-gpus 8 MODEL.WEIGHTS ./output.pkl
# 2. Train Mask-RCNN-FPN with COCO
python train_net.py --config-file configs/COCO_R_50_FPN_1x_PixPro.yaml --num-gpus 8 MODEL.WEIGHTS ./output.pkl
# 3. Train Mask-RCNN-C4 with COCO
python train_net.py --config-file configs/COCO_R_50_C4_1x_PixPro.yaml --num-gpus 8 MODEL.WEIGHTS ./output.pkl
# Test detector with provided fine-tuned model
python train_net.py --config-file configs/Pascal_VOC_R_50_C4_24k_PixPro.yaml --num-gpus 8 --eval-only \
MODEL.WEIGHTS ./pixpro_base_r50_100ep_voc_md5_ec2dfa63.pth
More models and logs will be released!
Acknowledgement
Our testbed builds upon several existing publicly available codes. Specifically, we have modified and integrated the following code into this project:
Contributing to the project
Any pull requests or issues are welcomed.