https://github.com/Shaoli-Huang/SnapMix
SnapMix: Semantically Proportional Mixing for Augmenting Fine-grained Data (AAAI 2021)
https://github.com/Shaoli-Huang/SnapMix
aaai2021 cutmix data-augmentation fine-grained-recognition mixup
Last synced: 15 days ago
JSON representation
SnapMix: Semantically Proportional Mixing for Augmenting Fine-grained Data (AAAI 2021)
- Host: GitHub
- URL: https://github.com/Shaoli-Huang/SnapMix
- Owner: Shaoli-Huang
- Created: 2020-12-07T04:04:04.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2020-12-26T05:12:44.000Z (over 4 years ago)
- Last Synced: 2024-11-05T16:45:27.554Z (6 months ago)
- Topics: aaai2021, cutmix, data-augmentation, fine-grained-recognition, mixup
- Language: Python
- Homepage:
- Size: 847 KB
- Stars: 129
- Watchers: 3
- Forks: 25
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- Awesome-Mixup - [Code
README
# SnapMix: Semantically Proportional Mixing for Augmenting Fine-grained Data (AAAI 2021)
PyTorch implementation of SnapMix | [paper](https://arxiv.org/abs/2012.04846)
## Method Overview

## Cite
```
@inproceedings{huang2021snapmix,
title={SnapMix: Semantically Proportional Mixing for Augmenting Fine-grained Data},
author={Shaoli Huang, Xinchao Wang, and Dacheng Tao},
year={2021},
booktitle={AAAI Conference on Artificial Intelligence},
}
```## Setup
### Install Package Dependencies
```
torch
torchvision
PyYAML
easydict
tqdm
scikit-learn
efficientnet_pytorch
pandas
opencv
```
### Datasets
***create a soft link to the dataset directory***CUB dataset
```
ln -s /your-path-to/CUB-dataset data/cub
```
Car dataset
```
ln -s /your-path-to/Car-dataset data/car
```
Aircraft dataset
```
ln -s /your-path-to/Aircraft-dataset data/aircraft
```## Training
### Training with Imagenet pre-trained weights
***1. Baseline and Baseline+***
To train a model on CUB dataset using the Resnet-50 backbone,
``` python main.py ``` # baseline
``` python main.py --midlevel``` # baseline+
To train model on other datasets using other network backbones, you can specify the following arguments:
``` --netname: name of network architectures (support 4 network families: ResNet,DenseNet,InceptionV3,EfficientNet) ```
``` --dataset: dataset name```
For example,
``` python main.py --netname resnet18 --dataset cub ``` # using the Resnet-18 backbone on CUB dataset
``` python main.py --netname efficientnet-b0 --dataset cub ``` # using the EfficientNet-b0 backbone on CUB dataset
``` python main.py --netname inceptoinV3 --dataset aircraft ``` # using the inceptionV3 backbone on Aircraft dataset
***2. Training with mixing augmentation***
Applying SnapMix in training ( we used the hyperparameter values (prob=1., beta=5) for SnapMix in most of the experiments.):
```python main.py --mixmethod snapmix --beta 5 --netname resnet50 --dataset cub ``` # baseline
```python main.py --mixmethod snapmix --beta 5 --netname resnet50 --dataset cub --midlevel ``` # baseline+
Applying other augmentation methods (currently support cutmix,cutout,and mixup) in training:
```python main.py --mixmethod cutmix --beta 3 --netname resnet50 --dataset cub ``` # training with CutMix
```python main.py --mixmethod mixup --prob 0.5 --netname resnet50 --dataset cub ``` # training with MixUp
***3. Results***
***ResNet architecture.***
| Backbone | Method | CUB | Car | Aircraft |
|:--------|:--------|--------:|------:|--------:|
|Resnet-18 | Baseline| 82.35% | 91.15% | 87.80% |
|Resnet-18 | Baseline + SnapMix| 84.29% | 93.12% | 90.17% |
|Resnet-34 | Baseline| 84.98% | 92.02% | 89.92% |
|Resnet-34 | Baseline + SnapMix| 87.06% | 93.95% | 92.36% |
|Resnet-50 | Baseline| 85.49% | 93.04% | 91.07% |
|Resnet-50 | Baseline + SnapMix| 87.75% | 94.30% | 92.08% |
|Resnet-101 | Baseline| 85.62% | 93.09% | 91.59% |
|Resnet-101 | Baseline + SnapMix| 88.45% | 94.44% | 93.74% |
|Resnet-50 | Baseline+| 87.13% | 93.80% | 91.68% |
|Resnet-50 | Baseline+ + SnapMix| 88.70% | 95.00% | 93.24% |
|Resnet-101 | Baseline+| 87.81% | 93.94% | 91.85% |
|Resnet-101 | Baseline+ + SnapMix| 89.32% | 94.84% | 94.05% |***InceptionV3 architecture.***
| Backbone | Method | CUB |
|:--------|:--------|--------:|
|InceptionV3 | Baseline| 82.22% |
|InceptionV3 | Baseline + SnapMix| 85.54%|***DenseNet architecture.***
| Backbone | Method | CUB |
|:--------|:--------|--------:|
|DenseNet121 | Baseline| 84.23% |
|DenseNet121| Baseline + SnapMix| 87.42%|### Training from scratch
To train a model without using ImageNet pretrained weights:
```python main.py --mixmethod snapmix --prob 0.5 --netname resnet18 --dataset cub --pretrained 0``` # resnet-18 backbone
```python main.py --mixmethod snapmix --prob 0.5 --netname resnet50 --dataset cub --pretrained 0 ``` # resnet-50 backbone
***2. Results***
| Backbone | Method | CUB |
|:--------|:--------|--------:|
|Resnet-18 | Baseline| 64.98% |
|Resnet-18 | Baseline + SnapMix| 70.31%|
|Resnet-50 | Baseline| 66.92% |
|Resnet-50| Baseline + SnapMix| 72.17%|