open-mmlab / OpenUnReID

PyTorch open-source toolbox for unsupervised or domain adaptive object re-ID.
Apache License 2.0
396 stars 67 forks source link

spcl 无监督域自适应 #23

Closed HWNHJJ closed 3 years ago

HWNHJJ commented 3 years ago

您好,当我在spcl的mian函数中将joint=False设置为joint=True时,显示以下错误: File "/home/amax/OpenUnReID/openunreid/models/losses/memory.py", line 112, in forward sim = torch.zeros(labels.max() + 1, B).float().cuda() TypeError: zeros() received an invalid combination of arguments - got (Tensor, int), but expected one of:

yxgeee commented 3 years ago

SpCL这边不要把main里面joint改成True,这样会影响数据的index的。这边joint=False不代表不能joint train,不用担心,这边意思只是没把多个数据集的index和label合在一起。算法还是跟论文中一样的。

HWNHJJ commented 3 years ago

SpCL这边不要把main里面joint改成True,这样会影响数据的index的。这边joint=False不代表不能joint train,不用担心,这边意思只是没把多个数据集的index和label合在一起。算法还是跟论文中一样的。

非常感谢您的详细解答。此外,我还遇到了一个新问题,当我使用market和duke数据集一同训练spcl时,运行了两次测出的结果均为79+%,请问这有可能是哪些原因造成的呢?更改的参数设置如下: TRAIN:
datasets: {'market1501': 'trainval','dukemtmcreid': 'trainval'} unsup_dataset_indexes: [1,] val_dataset: 'dukemtmcreid' TEST: datasets: ['dukemtmcreid',]

打印出来的所有参数设置如下:

cfg.LOCAL_RANK: 0 cfg.DATA_ROOT: ../datasets cfg.LOGS_ROOT: ../logs

cfg.MODEL = edict() cfg.MODEL.backbone: resnet50 cfg.MODEL.pooling: gem cfg.MODEL.embed_feat: 0 cfg.MODEL.dropout: 0.0 cfg.MODEL.dsbn: True cfg.MODEL.sync_bn: True cfg.MODEL.samples_per_bn: 16 cfg.MODEL.mean_net: False cfg.MODEL.alpha: 0.999 cfg.MODEL.imagenet_pretrained: True cfg.MODEL.source_pretrained: None

cfg.DATA = edict() cfg.DATA.height: 256 cfg.DATA.width: 128 cfg.DATA.norm_mean: [0.485, 0.456, 0.406] cfg.DATA.norm_std: [0.229, 0.224, 0.225]

cfg.DATA.TRAIN = edict() cfg.DATA.TRAIN.is_autoaug: False cfg.DATA.TRAIN.is_flip: True cfg.DATA.TRAIN.flip_prob: 0.5 cfg.DATA.TRAIN.is_pad: True cfg.DATA.TRAIN.pad_size: 10 cfg.DATA.TRAIN.is_blur: False cfg.DATA.TRAIN.blur_prob: 0.5 cfg.DATA.TRAIN.is_erase: True cfg.DATA.TRAIN.erase_prob: 0.5 cfg.DATA.TRAIN.is_mutual_transform: False cfg.DATA.TRAIN.mutual_times: 2

cfg.TRAIN = edict() cfg.TRAIN.seed: 1 cfg.TRAIN.deterministic: True cfg.TRAIN.amp: False

cfg.TRAIN.datasets = edict() cfg.TRAIN.datasets.market1501: trainval cfg.TRAIN.datasets.dukemtmcreid: trainval cfg.TRAIN.unsup_dataset_indexes: [1] cfg.TRAIN.epochs: 50 cfg.TRAIN.iters: 400

cfg.TRAIN.LOSS = edict()

cfg.TRAIN.LOSS.losses = edict() cfg.TRAIN.LOSS.losses.hybrid_memory: 1.0 cfg.TRAIN.LOSS.temp: 0.05 cfg.TRAIN.LOSS.momentum: 0.2 cfg.TRAIN.val_dataset: dukemtmcreid cfg.TRAIN.val_freq: 5

cfg.TRAIN.SAMPLER = edict() cfg.TRAIN.SAMPLER.num_instances: 4 cfg.TRAIN.SAMPLER.is_shuffle: True

cfg.TRAIN.LOADER = edict() cfg.TRAIN.LOADER.samples_per_gpu: 16 cfg.TRAIN.LOADER.workers_per_gpu: 2

cfg.TRAIN.PSEUDO_LABELS = edict() cfg.TRAIN.PSEUDO_LABELS.freq: 1 cfg.TRAIN.PSEUDO_LABELS.use_outliers: True cfg.TRAIN.PSEUDO_LABELS.norm_feat: True cfg.TRAIN.PSEUDO_LABELS.norm_center: True cfg.TRAIN.PSEUDO_LABELS.cluster: dbscan cfg.TRAIN.PSEUDO_LABELS.eps: [0.58, 0.6, 0.62] cfg.TRAIN.PSEUDO_LABELS.min_samples: 4 cfg.TRAIN.PSEUDO_LABELS.dist_metric: jaccard cfg.TRAIN.PSEUDO_LABELS.k1: 30 cfg.TRAIN.PSEUDO_LABELS.k2: 6 cfg.TRAIN.PSEUDO_LABELS.search_type: 0 cfg.TRAIN.PSEUDO_LABELS.cluster_num: None

cfg.TRAIN.OPTIM = edict() cfg.TRAIN.OPTIM.optim: adam cfg.TRAIN.OPTIM.lr: 0.00035 cfg.TRAIN.OPTIM.weight_decay: 0.0005

cfg.TRAIN.SCHEDULER = edict() cfg.TRAIN.SCHEDULER.lr_scheduler: single_step cfg.TRAIN.SCHEDULER.stepsize: 20 cfg.TRAIN.SCHEDULER.gamma: 0.1

cfg.TEST = edict() cfg.TEST.datasets: ['dukemtmcreid']

cfg.TEST.LOADER = edict() cfg.TEST.LOADER.samples_per_gpu: 32 cfg.TEST.LOADER.workers_per_gpu: 2 cfg.TEST.dist_metric: euclidean cfg.TEST.norm_feat: True cfg.TEST.dist_cuda: True cfg.TEST.rerank: False cfg.TEST.search_type: 0 cfg.TEST.k1: 20 cfg.TEST.k2: 6 cfg.TEST.lambda_value: 0.3 cfg.launcher: none cfg.tcp_port: 5017 cfg.work_dir: ../logs/config cfg.total_gpus: 2 The training is in a un/semi-supervised manner with 2 dataset(s) (['market1501', 'dukemtmcreid']), where ['dukemtmcreid'] have no labels.

yxgeee commented 3 years ago

top-1 79%?跟GPU数量有关吧,你这边是2张卡?

HWNHJJ commented 3 years ago

top-1 79%?跟GPU数量有关吧,你这边是2张卡?

感谢葛博士,我用的是两张显卡。经您提醒后,我将samples_per_gpu改为默认参数的两倍后获得了 LEADERBOARD.md中给出的性能。

HWNHJJ commented 3 years ago

尊敬的葛博士: 您好,我在使用spcl+时仍然有一个问题。之前我按使用的显卡数将samples_per_gpu改为默认参数的两倍后,测得的结果top1为83.0%,和LEADERBOARD.md中的结果应该在随机误差范围内,因此我当时回复达到了LEADERBOARD.md中的性能。但当我第二次测试时,得到的结果top1只有82.4%,和LEADERBOARD.md的结果有了较大的差异。请问在双卡运行时还有哪些需要注意的地方吗?

yxgeee commented 3 years ago

我一直用四卡训练的,ReID对batchsize比较敏感,如果只有两张卡的话,试一下把batchsize改成32,每张卡还是维持16