Giter VIP home page Giter VIP logo

pmg-progressive-multi-granularity-training's Introduction

Progressive Multi-Granularity Training

Code release for Fine-Grained Visual Classification via Progressive Multi-Granularity Training of Jigsaw Patches (ECCV2020)

Requirement

python 3.6

PyTorch >= 1.3.1

torchvision >= 0.4.2

Training

  1. Download datatsets for FGVC (e.g. CUB-200-2011, Standford Cars, FGVC-Aircraft, etc) and organize the structure as follows:
dataset
├── train
│   ├── class_001
|   |      ├── 1.jpg
|   |      ├── 2.jpg
|   |      └── ...
│   ├── class_002
|   |      ├── 1.jpg
|   |      ├── 2.jpg
|   |      └── ...
│   └── ...
└── test
    ├── class_001
    |      ├── 1.jpg
    |      ├── 2.jpg
    |      └── ...
    ├── class_002
    |      ├── 1.jpg
    |      ├── 2.jpg
    |      └── ...
    └── ...
  1. Train from scratch with train.py.

Citation

Please cite our paper if you use PMG in your work.

@InProceedings{du2020fine,
  title={Fine-Grained Visual Classification via Progressive Multi-Granularity Training of Jigsaw Patches},
  author={Du, Ruoyi and Chang, Dongliang and Bhunia, Ayan Kumar and Xie, Jiyang and Song, Yi-Zhe and Ma, Zhanyu and Guo, Jun},
  booktitle = {European Conference on Computer Vision},
  year={2020}
}

Contact

Thanks for your attention! If you have any suggestion or question, you can leave a message here or contact us directly:

pmg-progressive-multi-granularity-training's People

Contributors

ameenali avatar dongliangchang avatar ruoyidu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

pmg-progressive-multi-granularity-training's Issues

Why should the size of patch be smaller than that of receptive field?

Hi,

Thanks for the impressive research.

I am a little bit confused about the content related to the choice of n in Sec 3.3: "the size of the patches should be smaller than the receptive field of the corresponding stage, otherwise, the performance of the jigsaw puzzle generator will be reduced". Could you please do a detailed explaination why this condition is required? Thanks a lot.

如何使用训练好的模型去分类数据集?这里测试我遇到了一些问题。

`# -- coding:utf-8 --

@time :2019.03.15

@ide : pycharm

@author :lxztju

@github : https://github.com/lxztju

from utils import test
import torch
import os
from PIL import Image
import pandas as pd
from tqdm import tqdm
import numpy as np
from collections import Counter
from torchvision import transforms, models

def predict(model):
# 读入模型
model = torch.load(trained_model)
model.eval()
print('..... Finished loading model! ......')
##将模型放置在gpu上运行
if torch.cuda.is_available():
model.cuda()
pred_list, _id = [], []
transform_test = transforms.Compose([
transforms.Scale((550, 550)),
transforms.CenterCrop(448),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
images = os.listdir(test_image_path)
for image in tqdm(images):
img_path = os.path.join(test_image_path, image)
img = Image.open(img_path).convert('RGB')
if torch.cuda.is_available():
img = transform_test(img).unsqueeze(0).cuda()
with torch.no_grad():
_, _, _, output_concat = model(img)
_, predicted = torch.max(output_concat.data, 1)
print(img_path + predicted)

if name == "main":
trained_model = "./weight/model.pth"
test_image_path = "/data/server77_data_b/fangzheng_crop"
predict(trained_model)
`

RuntimeError: running_mean should contain 16384 elements not 1024

help me

excuse me,how to test????

Convergence time

Hello!
How many epoches does the training set iterate before it converges? In stanford cars dataset.

Question about accuracy


Thanks for your code. I have some questions about your experiments
#########################

In train.py:

optimizer = optim.SGD([
{'params': net.classifier_concat.parameters(), 'lr': 0.002},
{'params': net.conv_block1.parameters(), 'lr': 0.002},
{'params': net.classifier1.parameters(), 'lr': 0.002},
{'params': net.conv_block2.parameters(), 'lr': 0.002},
{'params': net.classifier2.parameters(), 'lr': 0.002},
{'params': net.conv_block3.parameters(), 'lr': 0.002},
{'params': net.classifier3.parameters(), 'lr': 0.002},
# {'params': net.features.parameters(), 'lr': 0.0002}

],
    momentum=0.9, weight_decay=5e-4)


if I do not commented out {'params': net.features.parameters(), 'lr': 0.0002}, loss has always been 5.3, unable to drop.

if I commented it, I can not obtain your accuracy in your paper. it only 88.17742

#################################################################
True
==> Preparing data..
/home/wjz/anaconda3/lib/python3.7/site-packages/torchvision/transforms/transforms.py:208: UserWarning: The use of the transforms.Scale transform is deprecated, please use transforms.Resize instead.
warnings.warn("The use of the transforms.Scale transform is deprecated, " +
==> Building model..

Epoch: 0
Step: 0 | Loss1: 5.377 | Loss2: 5.23951 | Loss3: 5.25872 | Loss_concat: 10.77344 | Loss: 26.648 | Acc: 0.000% (0/16)
Step: 100 | Loss1: 5.210 | Loss2: 5.24563 | Loss3: 5.01386 | Loss_concat: 9.87350 | Loss: 25.343 | Acc: 5.384% (87/1616)
Step: 200 | Loss1: 5.092 | Loss2: 5.11479 | Loss3: 4.72915 | Loss_concat: 9.01229 | Loss: 23.948 | Acc: 12.687% (408/3216)
Step: 300 | Loss1: 4.982 | Loss2: 4.95620 | Loss3: 4.48933 | Loss_concat: 8.25784 | Loss: 22.685 | Acc: 19.788% (953/4816)
/home/wjz/code-lee/PMG-Progressive-Multi-Granularity-Training-master/utils.py:89: UserWarning: volatile was removed and now has no effect. Use with torch.no_grad(): instead.
inputs, targets = Variable(inputs, volatile=True), Variable(targets)
Step: 1931 | Loss: 2.399 | Acc: 54.815% (3176/5794) |Combined Acc: 50.932% (2951/5794)
best acc is = 50.93200

Epoch: 1
Step: 0 | Loss1: 4.278 | Loss2: 3.97236 | Loss3: 3.05924 | Loss_concat: 4.15896 | Loss: 15.468 | Acc: 68.750% (11/16)
Step: 100 | Loss1: 4.303 | Loss2: 3.97899 | Loss3: 3.27661 | Loss_concat: 4.43286 | Loss: 15.992 | Acc: 62.933% (1017/1616)
Step: 200 | Loss1: 4.248 | Loss2: 3.86615 | Loss3: 3.17743 | Loss_concat: 4.16216 | Loss: 15.454 | Acc: 64.272% (2067/3216)
Step: 300 | Loss1: 4.163 | Loss2: 3.73736 | Loss3: 3.05000 | Loss_concat: 3.86442 | Loss: 14.815 | Acc: 66.549% (3205/4816)
Step: 1931 | Loss: 1.305 | Acc: 72.541% (4203/5794) |Combined Acc: 70.849% (4105/5794)
best acc is = 70.84915

Epoch: 2
Step: 0 | Loss1: 4.154 | Loss2: 3.51961 | Loss3: 2.77444 | Loss_concat: 2.85724 | Loss: 13.305 | Acc: 81.250% (13/16)
Step: 100 | Loss1: 3.637 | Loss2: 2.99386 | Loss3: 2.37375 | Loss_concat: 2.24752 | Loss: 11.252 | Acc: 81.869% (1323/1616)
Step: 200 | Loss1: 3.597 | Loss2: 2.90487 | Loss3: 2.29093 | Loss_concat: 2.14175 | Loss: 10.935 | Acc: 82.027% (2638/3216)
Step: 300 | Loss1: 3.556 | Loss2: 2.83164 | Loss3: 2.22867 | Loss_concat: 2.09540 | Loss: 10.712 | Acc: 81.561% (3928/4816)
Step: 1931 | Loss: 0.941 | Acc: 78.719% (4561/5794) |Combined Acc: 77.977% (4518/5794)
best acc is = 77.97722

Epoch: 3
Step: 0 | Loss1: 3.134 | Loss2: 2.36535 | Loss3: 1.68741 | Loss_concat: 1.25920 | Loss: 8.446 | Acc: 87.500% (14/16)
Step: 100 | Loss1: 3.093 | Loss2: 2.23144 | Loss3: 1.74485 | Loss_concat: 1.31555 | Loss: 8.385 | Acc: 89.975% (1454/1616)
Step: 200 | Loss1: 3.063 | Loss2: 2.18541 | Loss3: 1.72284 | Loss_concat: 1.31887 | Loss: 8.290 | Acc: 88.806% (2856/3216)
Step: 300 | Loss1: 3.015 | Loss2: 2.13142 | Loss3: 1.69159 | Loss_concat: 1.31001 | Loss: 8.148 | Acc: 88.538% (4264/4816)
Step: 1931 | Loss: 0.830 | Acc: 80.238% (4649/5794) |Combined Acc: 80.014% (4636/5794)
best acc is = 80.01381

Epoch: 4
Step: 0 | Loss1: 2.775 | Loss2: 1.91765 | Loss3: 1.20096 | Loss_concat: 0.71040 | Loss: 6.604 | Acc: 100.000% (16/16)
Step: 100 | Loss1: 2.620 | Loss2: 1.68805 | Loss3: 1.32646 | Loss_concat: 0.83745 | Loss: 6.472 | Acc: 93.255% (1507/1616)
Step: 200 | Loss1: 2.601 | Loss2: 1.68000 | Loss3: 1.36257 | Loss_concat: 0.88198 | Loss: 6.525 | Acc: 92.382% (2971/3216)
Step: 300 | Loss1: 2.585 | Loss2: 1.66417 | Loss3: 1.35662 | Loss_concat: 0.88429 | Loss: 6.490 | Acc: 92.587% (4459/4816)
Step: 1931 | Loss: 0.772 | Acc: 80.980% (4692/5794) |Combined Acc: 82.361% (4772/5794)
best acc is = 82.36106

Epoch: 5
Step: 0 | Loss1: 2.307 | Loss2: 1.32481 | Loss3: 1.04585 | Loss_concat: 0.54067 | Loss: 5.219 | Acc: 93.750% (15/16)
Step: 100 | Loss1: 2.272 | Loss2: 1.38220 | Loss3: 1.13268 | Loss_concat: 0.57141 | Loss: 5.358 | Acc: 96.782% (1564/1616)
Step: 200 | Loss1: 2.240 | Loss2: 1.36626 | Loss3: 1.13537 | Loss_concat: 0.58879 | Loss: 5.331 | Acc: 95.771% (3080/3216)
Step: 300 | Loss1: 2.196 | Loss2: 1.33614 | Loss3: 1.10822 | Loss_concat: 0.58265 | Loss: 5.223 | Acc: 95.909% (4619/4816)
Step: 1931 | Loss: 0.710 | Acc: 82.741% (4794/5794) |Combined Acc: 83.155% (4818/5794)
best acc is = 83.15499

Epoch: 6
Step: 0 | Loss1: 1.868 | Loss2: 1.36466 | Loss3: 1.12972 | Loss_concat: 0.45856 | Loss: 4.821 | Acc: 100.000% (16/16)
Step: 100 | Loss1: 1.914 | Loss2: 1.08908 | Loss3: 0.92351 | Loss_concat: 0.38538 | Loss: 4.312 | Acc: 98.391% (1590/1616)
Step: 200 | Loss1: 1.866 | Loss2: 1.08991 | Loss3: 0.93069 | Loss_concat: 0.39588 | Loss: 4.283 | Acc: 98.290% (3161/3216)
Step: 300 | Loss1: 1.858 | Loss2: 1.07807 | Loss3: 0.93373 | Loss_concat: 0.40798 | Loss: 4.278 | Acc: 98.131% (4726/4816)
Step: 1931 | Loss: 0.673 | Acc: 83.051% (4812/5794) |Combined Acc: 84.225% (4880/5794)
best acc is = 84.22506

Epoch: 7
Step: 0 | Loss1: 1.646 | Loss2: 0.73913 | Loss3: 0.72481 | Loss_concat: 0.13935 | Loss: 3.249 | Acc: 100.000% (16/16)
Step: 100 | Loss1: 1.667 | Loss2: 0.96090 | Loss3: 0.82415 | Loss_concat: 0.29849 | Loss: 3.751 | Acc: 98.886% (1598/1616)
Step: 200 | Loss1: 1.647 | Loss2: 0.94296 | Loss3: 0.82795 | Loss_concat: 0.30366 | Loss: 3.721 | Acc: 98.974% (3183/3216)
Step: 300 | Loss1: 1.647 | Loss2: 0.93813 | Loss3: 0.82634 | Loss_concat: 0.31724 | Loss: 3.728 | Acc: 98.816% (4759/4816)
Step: 1931 | Loss: 0.686 | Acc: 82.775% (4796/5794) |Combined Acc: 84.605% (4902/5794)
best acc is = 84.60476

Epoch: 8
Step: 0 | Loss1: 1.551 | Loss2: 0.71522 | Loss3: 0.66501 | Loss_concat: 0.37301 | Loss: 3.304 | Acc: 93.750% (15/16)
Step: 100 | Loss1: 1.434 | Loss2: 0.82763 | Loss3: 0.73410 | Loss_concat: 0.23517 | Loss: 3.231 | Acc: 99.134% (1602/1616)
Step: 200 | Loss1: 1.449 | Loss2: 0.82253 | Loss3: 0.75179 | Loss_concat: 0.23583 | Loss: 3.259 | Acc: 99.223% (3191/3216)
Step: 300 | Loss1: 1.455 | Loss2: 0.82359 | Loss3: 0.75617 | Loss_concat: 0.24143 | Loss: 3.276 | Acc: 99.232% (4779/4816)
Step: 1931 | Loss: 0.641 | Acc: 83.621% (4845/5794) |Combined Acc: 85.261% (4940/5794)
best acc is = 85.26061

Epoch: 9
Step: 0 | Loss1: 1.078 | Loss2: 0.53219 | Loss3: 0.55669 | Loss_concat: 0.15284 | Loss: 2.319 | Acc: 100.000% (16/16)
Step: 100 | Loss1: 1.267 | Loss2: 0.68631 | Loss3: 0.62334 | Loss_concat: 0.16206 | Loss: 2.739 | Acc: 99.505% (1608/1616)
Step: 200 | Loss1: 1.259 | Loss2: 0.68253 | Loss3: 0.63172 | Loss_concat: 0.17208 | Loss: 2.745 | Acc: 99.440% (3198/3216)
Step: 300 | Loss1: 1.269 | Loss2: 0.69679 | Loss3: 0.64298 | Loss_concat: 0.17706 | Loss: 2.786 | Acc: 99.522% (4793/4816)
Step: 1931 | Loss: 0.654 | Acc: 83.707% (4850/5794) |Combined Acc: 84.484% (4895/5794)
best acc is = 85.26061

Epoch: 10
Step: 0 | Loss1: 0.786 | Loss2: 0.55738 | Loss3: 0.49358 | Loss_concat: 0.12876 | Loss: 1.966 | Acc: 100.000% (16/16)
Step: 100 | Loss1: 1.149 | Loss2: 0.64301 | Loss3: 0.59554 | Loss_concat: 0.15040 | Loss: 2.538 | Acc: 99.691% (1611/1616)
Step: 200 | Loss1: 1.144 | Loss2: 0.63301 | Loss3: 0.59002 | Loss_concat: 0.15469 | Loss: 2.522 | Acc: 99.720% (3207/3216)
Step: 300 | Loss1: 1.146 | Loss2: 0.63196 | Loss3: 0.59039 | Loss_concat: 0.15597 | Loss: 2.524 | Acc: 99.751% (4804/4816)
Step: 1931 | Loss: 0.625 | Acc: 84.225% (4880/5794) |Combined Acc: 85.727% (4967/5794)
best acc is = 85.72661
........................
Epoch: 198
Step: 0 | Loss1: 0.088 | Loss2: 0.05407 | Loss3: 0.09423 | Loss_concat: 0.05326 | Loss: 0.289 | Acc: 100.000% (16/16)
Step: 100 | Loss1: 0.060 | Loss2: 0.05452 | Loss3: 0.05455 | Loss_concat: 0.04034 | Loss: 0.209 | Acc: 100.000% (1616/1616)
Step: 200 | Loss1: 0.060 | Loss2: 0.05510 | Loss3: 0.05459 | Loss_concat: 0.04000 | Loss: 0.210 | Acc: 100.000% (3216/3216)
Step: 300 | Loss1: 0.059 | Loss2: 0.05373 | Loss3: 0.05290 | Loss_concat: 0.03933 | Loss: 0.205 | Acc: 100.000% (4816/4816)
Step: 1931 | Loss: 0.707 | Acc: 87.677% (5080/5794) |Combined Acc: 88.091% (5104/5794)
best acc is = 88.17742

Epoch: 199
Step: 0 | Loss1: 0.056 | Loss2: 0.04339 | Loss3: 0.04779 | Loss_concat: 0.03247 | Loss: 0.180 | Acc: 100.000% (16/16)
Step: 100 | Loss1: 0.059 | Loss2: 0.05347 | Loss3: 0.05479 | Loss_concat: 0.04027 | Loss: 0.207 | Acc: 100.000% (1616/1616)
Step: 200 | Loss1: 0.059 | Loss2: 0.05428 | Loss3: 0.05340 | Loss_concat: 0.04029 | Loss: 0.207 | Acc: 100.000% (3216/3216)
Step: 300 | Loss1: 0.058 | Loss2: 0.05420 | Loss3: 0.05406 | Loss_concat: 0.04013 | Loss: 0.207 | Acc: 100.000% (4816/4816)
Step: 1931 | Loss: 0.709 | Acc: 87.780% (5086/5794) |Combined Acc: 87.936% (5095/5794)
best acc is = 88.17742

About"./bird/train"

the original dataset "CUB200-2011" without /bird/train, how do u split train and test

worse scores

dear author:
I got worse scores in my machine with backbone of pretrained resnet50 on CUB(84.06), 20 epoch, another is even worse(81.42), on the final stage, training loss is near to zero and training acc is 100.

can you solve my problem? thanks

About Visualization

Thanks for your meaningful work! I got into some trouble when I try to visualize the last stages’ convolution layer by Grad-CAM (like below). If possible could you share with me a copy of the visualization code?
1

email: [email protected]

about "progressively add new stages"

(model.py line:60)

def forward(self, x):
xf1, xf2, xf3, xf4, xf5 = self.features(x)

    xl1 = self.conv_block1(xf3)
    xl2 = self.conv_block2(xf4)
    xl3 = self.conv_block3(xf5)
  。。。

In the code, model loads and trains all stages of the baseline model simultaneously, not as the paper says"train the low stage first and then progressively add new stages for training".
Did I get it wrong? Please help me understand better.

关于t-sne可视化

感谢您优秀的工作!
拜读了您的论文之后,有一些困惑想向您请教。
您论文中关于CUB鸟类的t-sne可视化图像
image

1.我也尝试t-sne可视化cub最后一个卷积层输出的特征分布,但是tsne中每个点对应一个测试样本embedding的话,点显得比较稀疏,请问您的可视化结果中的每个点也是对应一个测试样本输入主干网络提取的最后一层卷积层的特征吗?
2.期待您分享t-sne可视化代码部分!能否分享一些t-sne绘图的技巧,比如类似您论文中t-sne聚类团分布。

非常感谢!祝: 研究工作顺利!

识别结果predict

请问如何将识别的结果显示出来?类似于目标检测那样框起来并写上label

transforms.Normalize

why use x-0.5 / 0.5 instead of ‘[0.485, 0.456, 0.406], [0.229, 0.224, 0.225]‘?

advisory

Hello, author, have you tried other networks such as inceptionv3 as a backbone network?

关于gpu的问题

GPU

device = torch.device("cuda:0,1")
net.to(device)

cudnn.benchmark = True

这里确定是net,而不是netp吗?还有为什么在python1.7中,“cuda:0,1"这样的写法不行?

accuracy

hello:
In the process of reproduction, I did not achieve the results in your paper, is there any training skills?

net setting

How can i get same scores in your paper , can you provide hyperparameters and net settings? thanks

About back propagation

I found it is very time-consuming to train the model, why not add together all the losses then only do gradient descent once in an epoch? Is there any difference? Thank you

Result of inference convidence

Thank you for awesome repo.
I want to get the convenience value of output,
so i print the ('output_concat.data',output_concat.data)
output_concat.data tensor([[ 0.6667, 2.4874, -0.2616, -0.8905, -1.0161, -1.3324, 0.9716, -3.1546,
2.6772],
[-1.0338, -2.5260, 0.4580, 0.6618, 1.2473, 1.4716, -0.4507, 2.6250,
-2.7728]], device='cuda:0')
some of the confidence value is negative, and their sum is not 1.
wish ur reply

about paramters

How many parameters does this trained model have? In megabytes.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.