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()
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()
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()
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()
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()
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()
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()