# Bags of Tricks and A Strong ReID Baseline Paper: "Bags of Tricks and A Strong Baseline for Deep Person Re-identification"[[pdf]](https://arxiv.org/abs/1903.07071) The codes are expanded on a [ReID-baseline](https://github.com/L1aoXingyu/reid_baseline) , which is open sourced by our co-first author [Xingyu Liao](https://github.com/L1aoXingyu). ## Authors - [Hao Luo](https://github.com/michuanhaohao) - [Youzhi Gu](https://github.com/shaoniangu) - [Xingyu Liao](https://github.com/L1aoXingyu) - [Shenqi Lai](https://github.com/xiaolai-sqlai) We support - [x] easy dataset preparation - [x] end-to-end training and evaluation - [x] high modular management Bag of tricks - Warm up learning rate - Random erasing augmentation - Label smoothing - Last stride - BNNeck - Center loss ## TODO list In the future, we will - [] support more datasets - [] support more models - [] speed up inference - [] support multi-gpus training - [] explore more tricks ## Pipeline
## Results (rank1/mAP) | Model | Market1501 | DukeMTMC-reID | | --- | -- | -- | | Standard baseline | 87.7 (74.0) | 79.7 (63.8) | | +Warmup | 88.7 (75.2) | 80.6(65.1) | | +Random erasing augmentation | 91.3 (79.3) | 81.5 (68.3) | | +Label smoothing | 91.4 (80.3) | 82.4 (69.3) | | +Last stride=1 | 92.0 (81.7) | 82.6 (70.6) | | +BNNeck | 94.1 (85.7) | 86.2 (75.9) | | +Center loss | 94.5 (85.9) | 86.4 (76.4) | | +Reranking | 95.4 (94.2) | 90.3 (89.1) | [model(Market1501)](https://drive.google.com/open?id=1hn0sXLZ5yJcxtmuY-ItQfYD7hBtHwt7A) [model(DukeMTMC-reID)](https://drive.google.com/open?id=1LARvQe-gUbflbanidUM0keKmHoKTpLUj) ## Get Started The designed architecture follows this guide [PyTorch-Project-Template](https://github.com/L1aoXingyu/PyTorch-Project-Template), you can check each folder's purpose by yourself. 1. `cd` to folder where you want to download this repo 2. Run `git clone https://github.com/michuanhaohao/reid-strong-baseline.git` 3. Install dependencies: - [pytorch>=0.4](https://pytorch.org/) - torchvision - [ignite](https://github.com/pytorch/ignite) - [yacs](https://github.com/rbgirshick/yacs) 4. Prepare dataset Create a directory to store reid datasets under this repo via ```bash cd reid-strong-baseline mkdir data ``` (1)Market1501 * Download dataset to `data/` from http://www.liangzheng.org/Project/project_reid.html * Extract dataset and rename to `market1501`. The data structure would like: ```bash data market1501 # this folder contains 6 files. bounding_box_test/ bounding_box_train/ ...... ``` (2)DukeMTMC-reID * Download dataset to `data/` from https://github.com/layumi/DukeMTMC-reID_evaluation#download-dataset * Extract dataset and rename to `dukemtmc-reid`. The data structure would like: ```bash data dukemtmc-reid DukeMTMC-reID # this folder contains 8 files. bounding_box_test/ bounding_box_train/ ...... ``` 5. Prepare pretrained model if you don't have ```python from torchvision import models models.resnet50(pretrained=True) ``` Then it will automatically download model in `~/.torch/models/`, you should set this path in `config/defaults.py` for all training or set in every single training config file in `configs/`. 6. If you want to know the detained configurations and their meaning, please refer to `config/defaults.py`. If you want to set your own parameters, you can follow our method: create a new yml file, then set your own parameters. Add `--config_file='configs/your yml file'` int the commands described below, then our code will merge your configuration. automatically. ## Train You can run these commands in `.sh ` files for training different datasets of differernt loss. You can also directly run code `sh *.sh` to run our demo. 1. Market1501, cross entropy loss + triplet loss ```bash python3 tools/train.py --config_file='configs/softmax_triplet.yml' MODEL.DEVICE_ID "('your device id')" DATASETS.NAMES "('market1501')" OUTPUT_DIR "('your path to save checkpoints and logs')" ``` 2. DukeMTMC-reID, cross entropy loss + triplet loss + center loss ```bash python3 tools/train.py --config_file='configs/softmax_triplet_with_center.yml' MODEL.DEVICE_ID "('your device id')" DATASETS.NAMES "('dukemtmc')" OUTPUT_DIR "('your path to save checkpoints and logs')" ``` ## Test You can test your model's performance directly by running these commands in `.sh ` files. You can also change the configuration to determine which feature of BNNeck and whether the feature is normalized (equivalent to use Cosine distance or Euclidean distance) for testing. Please replace the data path of the model. 1. Test with Euclidean distance using feature before BN without re-ranking,. ```bash python3 tools/test.py --config_file='configs/softmax_triplet_with_center.yml' MODEL.DEVICE_ID "('your device id')" DATASETS.NAMES "('market1501')" TEST.NECK_FEAT "('before')" TEST.FEAT_NORM "('no')" TEST.WEIGHT "('your path to trained checkpoints')" ``` 2. Test with Cosine distance using feature after BN without re-ranking,. ```bash python3 tools/test.py --config_file='configs/softmax_triplet_with_center.yml' MODEL.DEVICE_ID "('your device id')" DATASETS.NAMES "('market1501')" TEST.NECK_FEAT "('after')" TEST.FEAT_NORM "('yes')" TEST.WEIGHT "('your path to trained checkpoints')" ``` 3. Test with Cosine distance using feature after BN with re-ranking ```bash python3 tools/test.py --config_file='configs/softmax_triplet_with_center.yml' MODEL.DEVICE_ID "('your device id')" DATASETS.NAMES "('dukemtmc')" TEST.NECK_FEAT "('after')" TEST.FEAT_NORM "('yes')" TEST.RE_RANKING "('yes')" TEST.WEIGHT "('your path to trained checkpoints')" ```