def train(epoch,
          model,
          criterion,
          optimizer,
          trainloader,
          use_gpu,
          fixbase=False):
    losses = AverageMeter()
    accs = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()

    model.train()

    if fixbase or args.always_fixbase:
        open_specified_layers(model, args.open_layers)
    else:
        open_all_layers(model)

    end = time.time()
    for batch_idx, (imgs, pids, _, _) in enumerate(trainloader):
        data_time.update(time.time() - end)

        if use_gpu:
            imgs, pids = imgs.cuda(), pids.cuda()

        outputs = model(imgs)
        if isinstance(outputs, (tuple, list)):
            loss = DeepSupervision(criterion, outputs, pids)
        else:
            loss = criterion(outputs, pids)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end)

        losses.update(loss.item(), pids.size(0))
        accs.update(accuracy(outputs, pids)[0])

        if (batch_idx + 1) % args.print_freq == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.4f} ({data_time.avg:.4f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'Acc {acc.val:.2f} ({acc.avg:.2f})\t'.format(
                      epoch + 1,
                      batch_idx + 1,
                      len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses,
                      acc=accs))

        end = time.time()
Exemple #2
0
def train(epoch, model, criterion_xent, criterion_htri, optimizer, trainloader,
          use_gpu):
    losses = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()

    model.train()

    end = time.time()
    for batch_idx, (imgs, pids, _) in enumerate(trainloader):
        data_time.update(time.time() - end)

        if use_gpu:
            imgs, pids = imgs.cuda(), pids.cuda()

        outputs, features = model(imgs)
        if args.htri_only:
            if isinstance(features, tuple):
                loss = DeepSupervision(criterion_htri, features, pids)
            else:
                loss = criterion_htri(features, pids)
        else:
            if isinstance(outputs, tuple):
                xent_loss = DeepSupervision(criterion_xent, outputs, pids)
            else:
                xent_loss = criterion_xent(outputs, pids)

            if isinstance(features, tuple):
                htri_loss = DeepSupervision(criterion_htri, features, pids)
            else:
                htri_loss = criterion_htri(features, pids)

            loss = args.lambda_xent * xent_loss + args.lambda_htri * htri_loss
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end)

        losses.update(loss.item(), pids.size(0))

        if (batch_idx + 1) % args.print_freq == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.4f} ({data_time.avg:.4f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'.format(
                      epoch + 1,
                      batch_idx + 1,
                      len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses))

        end = time.time()
Exemple #3
0
def train(epoch,
          model,
          criterion,
          optimizer,
          trainloader,
          use_gpu,
          freeze_bn=False):
    losses = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()

    model.train()

    if freeze_bn or args.freeze_bn:
        model.apply(set_bn_to_eval)

    end = time.time()
    for batch_idx, (imgs, pids, _) in enumerate(trainloader):
        data_time.update(time.time() - end)

        if use_gpu:
            imgs, pids = imgs.cuda(), pids.cuda()

        outputs = model(imgs)
        if isinstance(outputs, tuple):
            loss = DeepSupervision(criterion, outputs, pids)
        else:
            loss = criterion(outputs, pids)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end)

        losses.update(loss.item(), pids.size(0))

        if (batch_idx + 1) % args.print_freq == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.4f} ({data_time.avg:.4f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'.format(
                      epoch + 1,
                      batch_idx + 1,
                      len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses))

        end = time.time()
Exemple #4
0
def train(epoch, model, keyptaware, multitask, criterion_xent_vid,
          criterion_xent_vcolor, criterion_xent_vtype, criterion_htri,
          optimizer, trainloader, use_gpu):
    losses = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()

    model.train()

    end = time.time()
    for batch_idx, (imgs, vids, camids, vcolors, vtypes,
                    vkeypts) in enumerate(trainloader):
        data_time.update(time.time() - end)

        if use_gpu:
            if keyptaware and multitask:
                imgs, vids, vcolors, vtypes, vkeypts = imgs.cuda(), vids.cuda(
                ), vcolors.cuda(), vtypes.cuda(), vkeypts.cuda()
            elif keyptaware:
                imgs, vids, vkeypts = imgs.cuda(), vids.cuda(), vkeypts.cuda()
            elif multitask:
                imgs, vids, vcolors, vtypes = imgs.cuda(), vids.cuda(
                ), vcolors.cuda(), vtypes.cuda()
            else:
                imgs, vids = imgs.cuda(), vids.cuda()

        if keyptaware and multitask:
            output_vids, output_vcolors, output_vtypes, features = model(
                imgs, vkeypts)
        elif keyptaware:
            output_vids, features = model(imgs, vkeypts)
        elif multitask:
            output_vids, output_vcolors, output_vtypes, features = model(imgs)
        else:
            output_vids, features = model(imgs)

        if args.htri_only:
            if isinstance(features, tuple):
                loss = DeepSupervision(criterion_htri, features, vids)
            else:
                loss = criterion_htri(features, vids)
        else:
            if isinstance(output_vids, tuple):
                xent_loss = DeepSupervision(criterion_xent_vid, output_vids,
                                            vids)
            else:
                xent_loss = criterion_xent_vid(output_vids, vids)

            if isinstance(features, tuple):
                htri_loss = DeepSupervision(criterion_htri, features, vids)
            else:
                htri_loss = criterion_htri(features, vids)

            loss = args.lambda_xent * xent_loss + args.lambda_htri * htri_loss

        if multitask:
            if isinstance(output_vcolors, tuple):
                xent_loss_vcolor = DeepSupervision(criterion_xent_vcolor,
                                                   output_vcolors, vcolors)
            else:
                xent_loss_vcolor = criterion_xent_vcolor(
                    output_vcolors, vcolors)

            if isinstance(output_vtypes, tuple):
                xent_loss_vtype = DeepSupervision(criterion_xent_vtype,
                                                  output_vtypes, vtypes)
            else:
                xent_loss_vtype = criterion_xent_vtype(output_vtypes, vtypes)

            loss += args.lambda_vcolor * xent_loss_vcolor + args.lambda_vtype * xent_loss_vtype

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end)

        losses.update(loss.item(), vids.size(0))

        if (batch_idx + 1) % args.print_freq == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.4f} ({data_time.avg:.4f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'.format(
                      epoch + 1,
                      batch_idx + 1,
                      len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses))

        end = time.time()
Exemple #5
0
def train(epoch,
          model,
          model_decoder,
          criterion_xent,
          criterion_htri,
          optimizer,
          optimizer_decoder,
          optimizer_encoder,
          trainloader,
          use_gpu,
          fixbase=False):
    losses = AverageMeter()
    losses_recon = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()

    model.train()
    model_decoder.train()

    if fixbase or args.fixbase:
        open_specified_layers(model, args.open_layers)
    else:
        open_all_layers(model)

    end = time.time()
    for batch_idx, (imgs, pids, _, img_paths,
                    imgs_texture) in enumerate(trainloader):
        data_time.update(time.time() - end)

        if use_gpu:
            imgs, pids, imgs_texture = imgs.cuda(), pids.cuda(
            ), imgs_texture.cuda()

        outputs, features, feat_texture, x_down1, x_down2, x_down3 = model(
            imgs)
        torch.cuda.empty_cache()

        if args.htri_only:
            if isinstance(features, (tuple, list)):
                loss = DeepSupervision(criterion_htri, features, pids)
            else:
                loss = criterion_htri(features, pids)
        else:
            if isinstance(outputs, (tuple, list)):
                xent_loss = DeepSupervision(criterion_xent, outputs, pids)
            else:
                xent_loss = criterion_xent(outputs, pids)

            if isinstance(features, (tuple, list)):
                htri_loss = DeepSupervision(criterion_htri, features, pids)
            else:
                htri_loss = criterion_htri(features, pids)

            loss = args.lambda_xent * xent_loss + args.lambda_htri * htri_loss

        optimizer.zero_grad()
        loss.backward(retain_graph=True)
        optimizer.step()

        del outputs, features

        # Second forward for training texture reconstruction
        close_specified_layers(model, ['fc', 'classifier'])

        recon_texture, x_sim1, x_sim2, x_sim3, x_sim4 = model_decoder(
            feat_texture, x_down1, x_down2, x_down3)
        torch.cuda.empty_cache()

        loss_rec = nn.L1Loss()
        loss_tri = nn.MSELoss()
        loss_recon = loss_rec(recon_texture, imgs_texture)  #*0.1

        # L1 loss to push same id's feat more similar:
        loss_triplet_id_sim1 = 0.0
        loss_triplet_id_sim2 = 0.0
        loss_triplet_id_sim3 = 0.0
        loss_triplet_id_sim4 = 0.0

        for i in range(0, ((args.train_batch_size // args.num_instances) - 1) *
                       args.num_instances, args.num_instances):
            loss_triplet_id_sim1 += max(
                loss_tri(x_sim1[i], x_sim1[i + 1]) -
                loss_tri(x_sim1[i], x_sim1[i + 4]) + 0.3, 0.0)
            loss_triplet_id_sim2 += max(
                loss_tri(x_sim2[i + 1], x_sim2[i + 2]) -
                loss_tri(x_sim2[i + 1], x_sim2[i + 5]) + 0.3,
                0.0)  #loss_tri(x_sim2[i+1], x_sim2[i+2])
            loss_triplet_id_sim3 += max(
                loss_tri(x_sim3[i + 2], x_sim3[i + 3]) -
                loss_tri(x_sim3[i + 2], x_sim3[i + 6]) + 0.3,
                0.0)  #loss_tri(x_sim3[i+2], x_sim3[i+3])
            loss_triplet_id_sim4 += max(
                loss_tri(x_sim4[i], x_sim4[i + 3]) -
                loss_tri(x_sim4[i + 3], x_sim4[i + 4]) + 0.3,
                0.0)  #loss_tri(x_sim4[i], x_sim4[i+3])
        loss_same_id = loss_triplet_id_sim1 + loss_triplet_id_sim2 + loss_triplet_id_sim3 + loss_triplet_id_sim4

        loss_recon += (loss_same_id)  # * 0.0001)

        optimizer_encoder.zero_grad()
        optimizer_decoder.zero_grad()
        loss_recon.backward()
        optimizer_encoder.step()
        optimizer_decoder.step()

        del feat_texture, x_down1, x_down2, x_down3, recon_texture

        batch_time.update(time.time() - end)

        losses.update(loss.item(), pids.size(0))
        losses_recon.update(loss_recon.item(), pids.size(0))

        if (batch_idx + 1) % args.print_freq == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.4f} ({data_time.avg:.4f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                  'Loss_recon {loss_recon.val:.4f} ({loss_recon.avg:.4f})\t'.
                  format(epoch + 1,
                         batch_idx + 1,
                         len(trainloader),
                         batch_time=batch_time,
                         data_time=data_time,
                         loss=losses,
                         loss_recon=losses_recon))

        end = time.time()
        open_all_layers(model)

        if (epoch + 1) % 50 == 0:
            print("==> Test reconstruction effect")
            model.eval()
            model_decoder.eval()
            features, feat_texture = model(imgs)
            recon_texture = model_decoder(feat_texture)
            out = recon_texture.data.cpu().numpy()[0].squeeze()
            out = out.transpose((1, 2, 0))
            out = (out / 2.0 + 0.5) * 255.
            out = out.astype(np.uint8)
            print(
                'finish: ',
                os.path.join(
                    args.save_dir, img_paths[0].split('bounding_box_train/')
                    [-1].split('.jpg')[0] + 'ep_' + str(epoch) + '.jpg'))
            cv2.imwrite(
                os.path.join(
                    args.save_dir, img_paths[0].split('bounding_box_train/')
                    [-1].split('.jpg')[0] + 'ep_' + str(epoch) + '.jpg'),
                out[:, :, ::-1])
            model.train()
            model_decoder.train()
Exemple #6
0
def train(epoch,
          model,
          criterion,
          center_loss1,
          center_loss2,
          center_loss3,
          center_loss4,
          optimizer,
          trainloader,
          use_gpu,
          fixbase=False):
    losses = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()

    model.train()

    if fixbase or args.always_fixbase:
        open_specified_layers(model, args.open_layers)
    else:
        open_all_layers(model)

    end = time.time()
    for batch_idx, (imgs, pids, _, _, dataset_id) in enumerate(trainloader):
        data_time.update(time.time() - end)

        if use_gpu:
            imgs, pids, dataset_id = imgs.cuda(), pids.cuda(), dataset_id.cuda(
            )

        outputs, features = model(imgs)
        if isinstance(outputs, (tuple, list)):
            loss = DeepSupervision(criterion, outputs, pids)
        else:
            loss = criterion(outputs, pids)

        alpha = 0.001
        loss = center_loss1(features[0], dataset_id) * alpha + loss
        loss = center_loss2(features[1], dataset_id) * alpha + loss

        # belta = 0.0001
        belta = 0.00001
        loss = center_loss3(features[0], pids) * belta + loss
        loss = center_loss4(features[1], pids) * belta + loss

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        batch_time.update(time.time() - end)

        losses.update(loss.item(), pids.size(0))

        if (batch_idx + 1) % args.print_freq == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.4f} ({data_time.avg:.4f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'.format(
                      epoch + 1,
                      batch_idx + 1,
                      len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses))

        end = time.time()
Exemple #7
0
def train(epoch,
          model,
          criterion,
          regularizer,
          optimizer,
          trainloader,
          use_gpu,
          fixbase=False,
          switch_loss=False):
    losses = AverageMeter()
    batch_time = AverageMeter()
    data_time = AverageMeter()

    model.train()

    if fixbase or args.fixbase:
        open_specified_layers(model, args.open_layers)
    else:
        open_all_layers(model)

    end = time.time()
    for batch_idx, (imgs, pids, _, _) in enumerate(trainloader):

        try:
            limited = float(os.environ.get('limited', None))
        except (ValueError, TypeError):
            limited = 1
        # print('################# limited', limited)

        if not fixbase and (batch_idx + 1) > limited * len(trainloader):
            break

        data_time.update(time.time() - end)

        if use_gpu:
            imgs, pids = imgs.cuda(), pids.cuda()

        outputs = model(imgs)
        if False and isinstance(outputs, (tuple, list)):
            loss = DeepSupervision(criterion, outputs, pids)
        else:
            loss = criterion(outputs, pids)
        print(loss)
        # if True or (fixbase and args.fix_custom_loss) or not fixbase and ((switch_loss and args.switch_loss < 0) or (not switch_loss and args.switch_loss > 0)):
        if not fixbase:
            reg = regularizer(model)
            # print('use reg', reg)
            # print('use reg', reg)
            loss += reg
        optimizer.zero_grad()
        loss.backward()

        if args.use_clip_grad and (args.switch_loss < 0 and switch_loss):
            print('Clip!')
            torch.nn.utils.clip_grad_norm_(model.parameters(), args.clip_grad)

        optimizer.step()

        batch_time.update(time.time() - end)

        losses.update(loss.item(), pids.size(0))

        del loss
        del outputs

        if (batch_idx + 1) % args.print_freq == 0:
            print('Epoch: [{0}][{1}/{2}]\t'
                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                  'Data {data_time.val:.4f} ({data_time.avg:.4f})\t'
                  'Loss {loss.val:.4f} ({loss.avg:.4f})\t'.format(
                      epoch + 1,
                      batch_idx + 1,
                      len(trainloader),
                      batch_time=batch_time,
                      data_time=data_time,
                      loss=losses))

        end = time.time()