JDAI-CV / fast-reid

SOTA Re-identification Methods and Toolbox
Apache License 2.0
3.39k stars 830 forks source link

circlesoftmax and triplet loss #392

Closed nanggn closed 3 years ago

nanggn commented 3 years ago
  当我利用circlesoftmax 和 triplet loss训练车辆重识别网络时,triplet loss收敛到margin(0.5)后不再下降,circlesoftmax的值也很大(50.60左右),测试map精度超小。
  请问这是什么原因呢?你们有遇到过这种问题吗?
L1aoXingyu commented 3 years ago

应该是超参设置有问题,batch size,pk 采样以及 gpu 数目设置的不对

nanggn commented 3 years ago

我的batchsize设为16(4 images / person),gpu也就一块,最后实验结果不如直接CE loss 和 triplet loss。这是什么情况?

L1aoXingyu commented 3 years ago

你可以把 config 发出来看看,我怀疑你设置错了

nanggn commented 3 years ago

我用的是其他代码 (简单的resnet50) 以下是我的参数设置:

import argparse def argument_parser(): parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# ************************************************************
# Datasets (general)
# ************************************************************
parser.add_argument('--root', type=str, default=r'F:\Code\ve-reid\vehicle-ReID-baseline-master\dataset',
                    help='root path to data directory')
# parser.add_argument('--root', type=str, default=r'F:\Code\ve-reid\vehicle-ReID-baseline-master\dataset\VRAI',
#                     help='root path to data directory')
# parser.add_argument('-s', '--source-names', type=str, required=False, nargs='+',
#                     help='source dataset for training(delimited by space)')
# parser.add_argument('-t', '--target-names', type=str, required=False, nargs='+',
#                     help='target dataset for testing(delimited by space)')
parser.add_argument('-s', '--source-names', type=str, default=['VRAI'],
                    help='source dataset for training(delimited by space)')
parser.add_argument('-t', '--target-names', type=str, default=['VRAI'],
                    help='target dataset for testing(delimited by space)')
parser.add_argument('-j', '--workers', default=0, type=int,
                    help='number of data loading workers (tips: 4 or 8 times number of gpus)')
# split-id not used
parser.add_argument('--split-id', type=int, default=0,             ###################################
                    help='split index (note: 0-based)')
parser.add_argument('--height', type=int, default=128,
                    help='height of an image')
parser.add_argument('--width', type=int, default=256,
                    help='width of an image')
parser.add_argument('--train-sampler', type=str, default='RandomIdentitySampler',
                    help='sampler for trainloader')

# ************************************************************
# Data augmentation
# ************************************************************
parser.add_argument('--random-erase', type=bool, default=True,                                         # action='store_true',       ##### 只要有传参,就将该变量设为True
                    help='use random erasing for data augmentation')
parser.add_argument('--color-jitter', type=bool, default=True,                                         ## action='store_true',
                    help='randomly change the brightness, contrast and saturation')    ## 亮度,对比度和饱和度
parser.add_argument('--color-aug', type=bool, default=True,                                         # action='store_true',
                    help='randomly alter the intensities of RGB channels')    ## 强度

# ************************************************************
# Optimization options
# ************************************************************
parser.add_argument('--optim', type=str, default='adam',
                    help='optimization algorithm (see optimizers.py)')
parser.add_argument('--lr', default=0.01, type=float,
                    help='initial learning rate')
parser.add_argument('--weight-decay', default=5e-04, type=float,
                    help='weight decay')
# sgd
parser.add_argument('--momentum', default=0.9, type=float,
                    help='momentum factor for sgd and rmsprop')
parser.add_argument('--sgd-dampening', default=0, type=float,
                    help='sgd\'s dampening for momentum')
parser.add_argument('--sgd-nesterov', action='store_true',
                    help='whether to enable sgd\'s Nesterov momentum')
# rmsprop
parser.add_argument('--rmsprop-alpha', default=0.99, type=float,
                    help='rmsprop\'s smoothing constant')
# adam/amsgrad
parser.add_argument('--adam-beta1', default=0.9, type=float,
                    help='exponential decay rate for adam\'s first moment')
parser.add_argument('--adam-beta2', default=0.999, type=float,
                    help='exponential decay rate for adam\'s second moment')

# ************************************************************
# Training hyperparameters
# ************************************************************
parser.add_argument('--max-epoch', default=100, type=int,
                    help='maximum epochs to run')
parser.add_argument('--start-epoch', default=0, type=int,
                    help='manual epoch number (useful when restart)')

parser.add_argument('--train-batch-size', default=32, type=int,
                    help='training batch size')
parser.add_argument('--test-batch-size', default=100, type=int,
                    help='test batch size')

# ************************************************************
# Learning rate scheduler options
# ************************************************************
parser.add_argument('--lr-scheduler', type=str, default='multi_step',
                    help='learning rate scheduler (see lr_schedulers.py)')
parser.add_argument('--stepsize', default=[20, 40, 60], nargs='+', type=int,
                    help='stepsize to decay learning rate')
parser.add_argument('--gamma', default=0.1, type=float,
                    help='learning rate decay')

# ************************************************************
# Cross entropy loss-specific setting
# ************************************************************
parser.add_argument('--label-smooth', type=bool, default=True,
                    help='use label smoothing regularizer in cross entropy loss')

# ************************************************************
# Hard triplet loss-specific setting
# ************************************************************
parser.add_argument('--margin', type=float, `default=0.5,`
                    help='margin for triplet loss')
parser.add_argument('--num-instances', type=int, default=4,         #####################
                    help='number of instances per identity')
parser.add_argument('--lambda-xent', type=float, default=1,
                    help='weight to balance cross entropy loss')
parser.add_argument('--lambda-htri', type=float, default=1,             ###############
                    help='weight to balance hard triplet loss')

# ************************************************************
# Architecture
# ************************************************************
parser.add_argument('-a', '--arch', type=str, default='resnet50')
parser.add_argument('--no-pretrained', action='store_true',
                    help='do not load pretrained weights')

# ************************************************************
# Test settings
# ************************************************************
parser.add_argument('--load-weights', type=str, default=r'H:\models\resnet50-19c8e357.pth',
                    help='load pretrained weights but ignore layers that don\'t match in size')
# parser.add_argument('--evaluate', action='store_true',
#                     help='evaluate only')
parser.add_argument('--evaluate', action='store_true',
                    help='evaluate only')
parser.add_argument('--eval-freq', type=int, default=5,
                    help='evaluation frequency (set to -1 to test only in the end)')
parser.add_argument('--start-eval', type=int, default=0,
                    help='start to evaluate after a specific epoch')
parser.add_argument('--test_size', type=int, default=800,
                    help='test-size for vehicleID dataset, choices=[800,1600,2400]')
parser.add_argument('--query-remove', type=bool, default=False)                          ##########################
# ************************************************************
# Miscs
# ************************************************************
parser.add_argument('--print-freq', type=int, default=10,
                    help='print frequency')
parser.add_argument('--seed', type=int, default=1,
                    help='manual seed')
parser.add_argument('--resume', type=str, default='', metavar='PATH',
                    help='resume from a checkpoint')
parser.add_argument('--save-dir', type=str, default='log/VRAI_weight',
                    help='path to save log and model weights')
parser.add_argument('--use-cpu', action='store_true',
                    help='use cpu')
parser.add_argument('--gpu-devices', default='0', type=str,
                    help='gpu device ids for CUDA_VISIBLE_DEVICES')

# parser.add_argument('--visualize-ranks', action='store_true',
#                     help='visualize ranked results, only available in evaluation mode')
parser.add_argument('--visualize-ranks', type=bool, default=False,
                    help='visualize ranked results, only available in evaluation mode')
parser.add_argument('--use-avai-gpus', action='store_true',
                    help='use available gpus instead of specified devices (useful when using managed clusters)')
return parser
L1aoXingyu commented 3 years ago

如果不是用的 fastreid,我们就不管了

nanggn commented 3 years ago

好的 感谢您的回复

L1aoXingyu commented 3 years ago

推荐你试一下 fastreid,应该会有不错的效果