コード例 #1
0
ファイル: test_reid.py プロジェクト: HongweiZhang97/CCSDA
def get_data(name, data_dir, num_bn_sample):
    dataset = None
    # Datasets
    if name == 'market1501':
        dataset_name = 'market1501'
        dataset = data_manager.init_imgreid_dataset(root=data_dir,
                                                    name=dataset_name)
        dataset.images_dir = ''
    elif name == 'market_sct' or name == 'market_sct_tran' or name == 'duke_sct' or name == 'duke_sct_tran':
        dataset_name = name
        dataset = data_manager.init_imgreid_dataset(
            root=data_dir, name=dataset_name, num_bn_sample=num_bn_sample)
        dataset.images_dir = ''
    assert dataset is not None, "dataset is none"
    return dataset
コード例 #2
0
ファイル: train_img_s1.py プロジェクト: xieqk/TASTR
def main():
    global args, best_rank1

    torch.set_num_threads(args.workers)

    torch.manual_seed(args.seed)
    if not args.use_avai_gpus:
        os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu_devices
    use_gpu = torch.cuda.is_available()
    if args.use_cpu: use_gpu = False

    if args.save_dir:
        save_dir = args.save_dir
    else:
        save_dir = osp.join('logs', 'dukemtmcreid_s1')

    writer = SummaryWriter(log_dir=save_dir)
    sys.stdout = Logger(osp.join(save_dir, 'log_train.txt'))
    print("==========\nArgs:{}\n==========".format(args))

    if use_gpu:
        print("Currently using GPU {}".format(args.gpu_devices))
        cudnn.benchmark = True
        torch.cuda.manual_seed_all(args.seed)
    else:
        print("Currently using CPU (GPU is highly recommended)")

    print("Initializing dataset {}".format(args.dataset))
    dataset = data_manager.init_imgreid_dataset(root=args.root,
                                                name=args.dataset)

    transform_train = T.Compose([
        T.Random2DTranslation(args.height, args.width),
        T.RandomHorizontalFlip(),
        T.ToTensor(),
        T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])

    transform_test = T.Compose([
        T.Resize((args.height, args.width)),
        T.ToTensor(),
        T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])

    pin_memory = True if use_gpu else False

    # decompose tracklets into images for image-based training
    train_data = dataset.get_train_tracklets()
    new_train = []
    for img_paths, pid, camid, _, _, _ in train_data:
        for img_path in img_paths:
            new_train.append((img_path, pid, camid))

    trainloader = DataLoader(
        ImageDataset(new_train, transform=transform_train),
        sampler=ClassIdentitySampler(new_train, args.train_batch,
                                     args.num_instances),
        batch_size=args.train_batch,
        num_workers=args.workers,
        pin_memory=pin_memory,
        drop_last=True,
    )

    queryloader = DataLoader(
        ImageDataset(dataset.query, transform=transform_test),
        batch_size=args.test_batch,
        shuffle=False,
        num_workers=args.workers,
        pin_memory=pin_memory,
        drop_last=False,
    )

    galleryloader = DataLoader(
        ImageDataset(dataset.gallery, transform=transform_test),
        batch_size=args.test_batch,
        shuffle=False,
        num_workers=args.workers,
        pin_memory=pin_memory,
        drop_last=False,
    )

    print("Initializing model: {}".format(args.arch))
    model = models.init_model(name=args.arch, loss={'htri'})
    print("Model size: {:.3f} M".format(count_num_param(model)))

    criterion_htri = TripletLoss(margin=args.margin)

    optimizer = init_optim(args.optim, model.parameters(), args.lr,
                           args.weight_decay)
    scheduler = lr_scheduler.MultiStepLR(optimizer,
                                         milestones=args.stepsize,
                                         gamma=args.gamma)

    if use_gpu:
        model = nn.DataParallel(model).cuda()

    start_time = time.time()
    train_time = 0
    best_epoch = args.start_epoch
    print("==> Start training")

    for epoch in range(args.start_epoch, args.max_epoch):
        start_train_time = time.time()
        # test before train
        if epoch == 0:
            mAP, rank1, rank5, rank10, rank20 = test(model, queryloader,
                                                     galleryloader, use_gpu)
            res_dict = {
                'mAP': mAP,
                'rank-1': rank1,
                'rank-5': rank5,
                'rank-10': rank10,
                'rank-20': rank20,
            }

            writer.add_scalars('scalar/precision', res_dict, epoch)

        train(epoch, model, criterion_htri, optimizer, trainloader, use_gpu,
              writer)
        train_time += round(time.time() - start_train_time)

        scheduler.step()

        if (epoch + 1) > args.start_eval and args.eval_step > 0 and (
                epoch + 1) % args.eval_step == 0 or (epoch +
                                                     1) == args.max_epoch:
            print("==> Test")
            mAP, rank1, rank5, rank10, rank20 = test(model, queryloader,
                                                     galleryloader, use_gpu)
            res_dict = {
                'mAP': mAP,
                'rank-1': rank1,
                'rank-5': rank5,
                'rank-10': rank10,
                'rank-20': rank20,
            }

            writer.add_scalars('scalar/precision', res_dict, epoch + 1)

            is_best = rank1 > best_rank1

            if is_best:
                best_rank1 = rank1
                best_epoch = epoch + 1

            if use_gpu:
                state_dict = model.module.state_dict()
            else:
                state_dict = model.state_dict()

            if is_best:
                save_checkpoint(
                    {
                        'state_dict': state_dict,
                        'rank1': rank1,
                        'epoch': epoch,
                    },
                    fpath=osp.join(save_dir, 's1_best_model' + '.pth.tar'))

        train_data = dataset.get_train_tracklets()
        new_train = []
        for img_paths, pid, camid, _, _, _ in train_data:
            for img_path in img_paths:
                new_train.append((img_path, pid, camid))

        trainloader = DataLoader(
            ImageDataset(new_train, transform=transform_train),
            sampler=ClassIdentitySampler(new_train, args.train_batch,
                                         args.num_instances),
            batch_size=args.train_batch,
            num_workers=args.workers,
            pin_memory=pin_memory,
            drop_last=True,
        )

    save_checkpoint(
        {
            'state_dict': state_dict,
            'rank1': rank1,
            'epoch': epoch,
        }, False, osp.join(save_dir, 's1_checkpoint_final' + '.pth.tar'))

    print("==> Best Rank-1 {:.1%}, achieved at epoch {}".format(
        best_rank1, best_epoch))

    elapsed = round(time.time() - start_time)
    elapsed = str(datetime.timedelta(seconds=elapsed))
    train_time = str(datetime.timedelta(seconds=train_time))
    print(
        "Finished. Total elapsed time (h:m:s): {}. Training time (h:m:s): {}.".
        format(elapsed, train_time))
def get_data(name,
             split_id,
             data_dir,
             height,
             width,
             batch_size,
             num_instances,
             workers,
             combine_trainval,
             eval_rerank=False):
    ## Datasets
    if name == 'cuhk03labeled':
        dataset_name = 'cuhk03'
        dataset = data_manager.init_imgreid_dataset(
            root=data_dir,
            name=dataset_name,
            split_id=split_id,
            cuhk03_labeled=True,
            cuhk03_classic_split=False,
        )
        dataset.images_dir = osp.join(data_dir, '/CUHK03_New/images_labeled/')
    elif name == 'cuhk03detected':
        dataset_name = 'cuhk03'
        dataset = data_manager.init_imgreid_dataset(
            root=data_dir,
            name=dataset_name,
            split_id=split_id,
            cuhk03_labeled=False,
            cuhk03_classic_split=False,
        )
        dataset.images_dir = osp.join(data_dir, '/CUHK03_New/images_detected/')
    ## Num. of training IDs
    num_classes = dataset.num_train_pids

    train_transformer = T.Compose([
        T.Random2DTranslation(height, width),
        T.RandomHorizontalFlip(),
        T.ToTensor(),
    ])

    test_transformer = T.Compose([
        T.RectScale(height, width),
        T.ToTensor(),
    ])

    train_loader = DataLoader(Preprocessor(dataset.train,
                                           root=dataset.images_dir,
                                           transform=train_transformer),
                              batch_size=batch_size,
                              num_workers=workers,
                              sampler=RandomIdentitySampler(
                                  dataset.train, num_instances),
                              pin_memory=True,
                              drop_last=True)

    query_loader = DataLoader(Preprocessor(dataset.query,
                                           root=dataset.images_dir,
                                           transform=test_transformer),
                              batch_size=batch_size,
                              num_workers=workers,
                              shuffle=False,
                              pin_memory=True)

    gallery_loader = DataLoader(Preprocessor(dataset.gallery,
                                             root=dataset.images_dir,
                                             transform=test_transformer),
                                batch_size=batch_size,
                                num_workers=workers,
                                shuffle=False,
                                pin_memory=True)

    return dataset, num_classes, train_loader, query_loader, gallery_loader
コード例 #4
0
def main():
    global args, best_rank1

    torch.manual_seed(args.seed)
    if not args.use_avai_gpus: os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu_devices
    use_gpu = torch.cuda.is_available()
    if args.use_cpu: use_gpu = False

    if args.save_dir:
        save_dir = args.save_dir
    else:
        save_dir = osp.join('logs', 'dukemtmcreid_s2')

    if not args.evaluate:
        writer = SummaryWriter(log_dir=save_dir)
        sys.stdout = Logger(osp.join(save_dir, 'log_train.txt'))
    else:
        sys.stdout = Logger(osp.join(save_dir, 'log_test.txt'))
    print("==========\nArgs:{}\n==========".format(args))

    if use_gpu:
        print("Currently using GPU {}".format(args.gpu_devices))
        cudnn.benchmark = True
        torch.cuda.manual_seed_all(args.seed)
    else:
        print("Currently using CPU (GPU is highly recommended)")

    print("Initializing dataset {}".format(args.dataset))
    dataset = data_manager.init_imgreid_dataset(root=args.root, name=args.dataset)

    transform_train = T.Compose([
        T.Random2DTranslation(args.height, args.width),
        T.RandomHorizontalFlip(),
        T.ToTensor(),
        T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])

    transform_test = T.Compose([
        T.Resize((args.height, args.width)),
        T.ToTensor(),
        T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])

    pin_memory = True if use_gpu else False

    print("Initializing model: {}".format(args.arch))
    model_s1 = models.init_model(name=args.arch, loss={'htri'})
    if args.scratch:
        model_0 = models.init_model(name=args.arch, loss={'htri'})
    print("Model size: {:.3f} M".format(count_num_param(model_s1)))

    if args.resume and check_isfile(args.resume):
        checkpoint = torch.load(args.resume)
        model_s1.load_state_dict(checkpoint['state_dict'])
        best_rank1 = checkpoint['rank1']
        print("Loaded checkpoint from '{}'".format(args.resume))
        print("- start_epoch: {}\n- rank1: {}".format(args.start_epoch, best_rank1))

    if args.load_weights and check_isfile(args.load_weights):
        # load pretrained weights but ignore layers that don't match in size
        checkpoint = torch.load(args.load_weights)
        pretrain_dict = checkpoint['state_dict']
        model_dict = model_s1.state_dict()
        pretrain_dict = {k: v for k, v in pretrain_dict.items() if k in model_dict and model_dict[k].size() == v.size()}
        model_dict.update(pretrain_dict)
        model_s1.load_state_dict(model_dict)
        print("Loaded pretrained weights from '{}'".format(args.load_weights))

    if use_gpu:
        model_s1 = nn.DataParallel(model_s1).cuda()
        if args.scratch:
            model_0 = nn.DataParallel(model_0).cuda()

    if args.scratch:
        optimizer = init_optim(args.optim, model_0.parameters(), args.lr, args.weight_decay)
    else:
        optimizer = init_optim(args.optim, model_s1.parameters(), args.lr, args.weight_decay)
    scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=args.stepsize, gamma=args.gamma)


    queryloader = DataLoader(
        ImageDataset(dataset.query, transform=transform_test),
        batch_size=args.test_batch, shuffle=False, num_workers=args.workers,
        pin_memory=pin_memory, drop_last=False,
    )

    galleryloader = DataLoader(
        ImageDataset(dataset.gallery, transform=transform_test),
        batch_size=args.test_batch, shuffle=False, num_workers=args.workers,
        pin_memory=pin_memory, drop_last=False,
    )

    criterion_htri = TripletLoss(margin=args.margin)

    if args.evaluate:
        print("Evaluate only")
        mAP, rank1, rank5, rank10, rank20 = test(model, queryloader, galleryloader, use_gpu)
        return

    start_time = time.time()
    train_time = 0
    best_epoch = args.start_epoch
    print("==> Start training")

    train_pair_cnt = []
    train_pair_cnt_true = []
    for epoch in range(args.start_epoch, args.max_epoch):
        if epoch == 0:
            if args.scratch:
                model = model_0
            else:
                model = model_s1
        # association
        if epoch%args.update_step == 0:
            print("extract tracklets features ...")
            feats_cams, tids_cams, camids_cams, tmins_cams, tmaxs_cams, otids_cams = \
                [], [], [], [], [], []
            for cam_tracklets in dataset.tracklets:
                # print(cam_tracklets[0])
                # break
                trackletsloader = DataLoader(
                    VideoDataset_time(cam_tracklets, seq_len=args.seq_len, sample='evenly', transform=transform_test),
                    batch_size=args.test_batch, shuffle=False, num_workers=args.workers,
                    pin_memory=pin_memory, drop_last=False,
                )

                if epoch == 0:
                    feats, tids, camids, tmins, tmaxs, otids = \
                        extract_feat(model_s1, trackletsloader, args.pool, use_gpu)
                else:
                    feats, tids, camids, tmins, tmaxs, otids = \
                        extract_feat(model, trackletsloader, args.pool, use_gpu)
                feats_cams.append(feats)
                tids_cams.append(tids)
                camids_cams.append(camids)
                tmins_cams.append(tmins)
                tmaxs_cams.append(tmaxs)
                otids_cams.append(otids)


            cnt, cnt_true = dataset.update_train(epoch, feats_cams, camids_cams, tmins_cams, tmaxs_cams, save_dir, k=args.kmeans, nosp=args.nosp, sigma=args.sigma)
            train_pair_cnt.append(cnt)
            train_pair_cnt_true.append(cnt_true)

        new_train = []
        train_data_s2 = dataset.get_train_tracklet_s2()
        for img_paths, pid, gid in train_data_s2:
            for img_path in img_paths:
                new_train.append((img_path, pid, gid))

        trainloader = DataLoader(
            ImageDataset(new_train, transform=transform_train),
            sampler=ClassIdentitySampler(new_train, args.train_batch, args.num_instances),
            batch_size=args.train_batch, num_workers=args.workers,
            pin_memory=pin_memory, drop_last=True,
        )

        start_train_time = time.time()
        # test before train
        if epoch == 0:
            mAP, rank1, rank5, rank10, rank20 = test(model, queryloader, galleryloader, use_gpu)
            res_dict = {
                'mAP': mAP,
                'rank-1': rank1,
                'rank-5': rank5,
                'rank-10': rank10,
                'rank-20': rank20,
            }

            writer.add_scalars('scalar/precision', res_dict, epoch)

        train(epoch, model, criterion_htri, optimizer, trainloader, use_gpu, writer)

        train_time += round(time.time() - start_train_time)

        scheduler.step()

        if (epoch + 1) > args.start_eval and args.eval_step > 0 and (epoch + 1) % args.eval_step == 0 or (epoch + 1) == args.max_epoch:
            print("==> Test")
            mAP, rank1, rank5, rank10, rank20 = test(model, queryloader, galleryloader, use_gpu)
            res_dict = {
                'mAP': mAP,
                'rank-1': rank1,
                'rank-5': rank5,
                'rank-10': rank10,
                'rank-20': rank20,
            }

            writer.add_scalars('scalar/precision', res_dict, epoch+1)

            is_best = rank1 > best_rank1

            if is_best:
                best_rank1 = rank1
                best_epoch = epoch + 1

            if use_gpu:
                state_dict = model.module.state_dict()
            else:
                state_dict = model.state_dict()

            if is_best:
                save_checkpoint({
                    'state_dict': state_dict,
                    'rank1': rank1,
                    'epoch': epoch,
                }, fpath=osp.join(save_dir, 's2_best_model' + '.pth.tar'))

    save_checkpoint({
        'state_dict': state_dict,
        'rank1': rank1,
        'epoch': epoch,
    }, False, osp.join(save_dir, 's2_checkpoint_final' + '.pth.tar'))

    print("==> Best Rank-1 {:.1%}, achieved at epoch {}".format(best_rank1, best_epoch))

    elapsed = round(time.time() - start_time)
    elapsed = str(datetime.timedelta(seconds=elapsed))
    train_time = str(datetime.timedelta(seconds=train_time))
    print("Finished. Total elapsed time (h:m:s): {}. Training time (h:m:s): {}.".format(elapsed, train_time))
    train_pair_cnt = np.array(train_pair_cnt)
    train_pair_cnt_true = np.array(train_pair_cnt_true)
    assert train_pair_cnt.shape == train_pair_cnt_true.shape
    for i in range(train_pair_cnt.shape[0]):
        print('iter %d'%(i))
        print(train_pair_cnt[i], train_pair_cnt[i].sum())
        print(train_pair_cnt_true[i], train_pair_cnt_true[i].sum(), train_pair_cnt_true[i].sum()/train_pair_cnt[i].sum())
コード例 #5
0
ファイル: train_reid.py プロジェクト: HongweiZhang97/CCSDA
def get_data(name, data_dir, height, width, batch_size, num_bn_sample,
             num_instances, workers):
    # Datasets
    if name == 'market1501':
        dataset_name = 'market1501'
        dataset = data_manager.init_imgreid_dataset(root=data_dir,
                                                    name=dataset_name)
        dataset.images_dir = ''
        train_transformer = T.Compose([
            T.Random2DTranslation(height, width),
            T.RandomHorizontalFlip(),
            T.ToTensor(),
        ])

        test_transformer = T.Compose([
            T.RectScale(height, width),
            T.ToTensor(),
        ])
        train_loader = DataLoader(Preprocessor(dataset.train,
                                               root=dataset.images_dir,
                                               transform=train_transformer),
                                  batch_size=batch_size,
                                  num_workers=workers,
                                  sampler=RandomIdentitySampler(
                                      dataset.train, num_instances),
                                  pin_memory=True,
                                  drop_last=True)

    elif name == 'market_sct' or name == 'market_sct_tran' or name == 'duke_sct' or name == 'duke_sct_tran':
        dataset_name = name
        dataset = data_manager.init_imgreid_dataset(
            root=data_dir, name=dataset_name, num_bn_sample=num_bn_sample)
        dataset.images_dir = ''
        # dataset_name = name
        pin_memory = True
        collateFn = NormalCollateFn()
        train_loader = DataLoader(
            data_manager.init_datafolder(
                dataset_name,
                dataset.train,
                TrainTransform(height, width),
            ),
            batch_sampler=RandomIdentityCameraSampler(dataset.train,
                                                      num_instances,
                                                      batch_size),
            num_workers=workers,
            pin_memory=pin_memory,
            collate_fn=collateFn,
        )
        # train_loader = DataLoader(
        #     data_manager.init_datafolder(dataset_name, dataset.train,
        #                                  TrainTransform(height, width),
        #                                  ),
        #     batch_sampler=RandomIdentityUniqueCameraSampler(dataset.train, num_instances, batch_size),
        #     num_workers=workers,
        #     pin_memory=pin_memory, collate_fn=collateFn,
        # )

    # Num. of training IDs
    num_classes = dataset.num_train_pids
    return dataset, num_classes, train_loader