示例#1
0
def get_loaders(opt):
    """ Make dataloaders for train and validation sets
	"""
    # train loader
    norm_method = Normalize(mean=[0.485, 0.456, 0.406],
                            std=[0.229, 0.224, 0.225])
    spatial_transform = Compose([
        Scale((opt.sample_size, opt.sample_size)),
        Resize(256),
        CenterCrop(224),
        ToTensor(), norm_method
    ])
    temporal_transform = TemporalRandomCrop(25)
    target_transform = ClassLabel()
    training_data = get_training_set(opt, spatial_transform,
                                     temporal_transform, target_transform)
    train_loader = torch.utils.data.DataLoader(training_data,
                                               batch_size=opt.batch_size,
                                               shuffle=True,
                                               num_workers=opt.num_workers,
                                               pin_memory=True)

    # validation loader
    target_transform = ClassLabel()
    temporal_transform = LoopPadding(25)
    validation_data = get_validation_set(opt, spatial_transform,
                                         temporal_transform, target_transform)
    val_loader = torch.utils.data.DataLoader(validation_data,
                                             batch_size=opt.batch_size,
                                             shuffle=False,
                                             num_workers=opt.num_workers,
                                             pin_memory=True)
    return train_loader, val_loader
示例#2
0
def main():
    opt = parse_opts()

    if opt.root_path != '':
        opt.video_path = os.path.join(opt.root_path, opt.video_path)
        opt.annotation_path = os.path.join(opt.root_path, opt.annotation_path)
        opt.result_path = os.path.join(opt.root_path, opt.result_path)
        if opt.resume_path:
            opt.resume_path = os.path.join(opt.root_path, opt.resume_path)
        if opt.pretrain_path:
            opt.pretrain_path = os.path.join(opt.root_path, opt.pretrain_path)
    opt.scales = [opt.initial_scale]
    for i in range(1, opt.n_scales):
        opt.scales.append(opt.scales[-1] * opt.scale_step)
    opt.arch = '{}-{}'.format(opt.model, opt.model_depth)
    opt.mean = get_mean(opt.norm_value, dataset=opt.mean_dataset)
    opt.std = get_std(opt.norm_value)
    print(opt)
    with open(os.path.join(opt.result_path, 'opts.json'), 'w') as opt_file:
        json.dump(vars(opt), opt_file)

    torch.manual_seed(opt.manual_seed)

    model, _ = generate_model(opt)

    if opt.no_mean_norm and not opt.std_norm:
        norm_method = Normalize([0, 0, 0], [1, 1, 1])
    elif not opt.std_norm:
        norm_method = Normalize(opt.mean, [1, 1, 1])
    else:
        norm_method = Normalize(opt.mean, opt.std)

    spatial_transform = Compose([
        Scale(int(opt.sample_size / opt.scale_in_test)),
        CornerCrop(opt.sample_size, opt.crop_position_in_test),
        ToTensor(opt.norm_value), norm_method
    ])
    temporal_transform = LoopPadding(opt.sample_duration)
    target_transform = VideoID()

    validation_data = get_validation_set(opt, spatial_transform,
                                         temporal_transform, target_transform)
    val_loader = torch.utils.data.DataLoader(validation_data,
                                             batch_size=opt.batch_size,
                                             shuffle=False,
                                             num_workers=opt.n_threads,
                                             pin_memory=True)
    dump(val_loader, model, opt, validation_data.class_names)
示例#3
0
def get_loaders(opt):
	""" Make dataloaders for train and validation sets
	"""
	# train loader
	opt.mean = get_mean(opt.norm_value, dataset=opt.mean_dataset)
	if opt.no_mean_norm and not opt.std_norm:
		norm_method = Normalize([0, 0, 0], [1, 1, 1])
	elif not opt.std_norm:
		norm_method = Normalize(opt.mean, [1, 1, 1])
	else:
		norm_method = Normalize(opt.mean, opt.std)
	spatial_transform = Compose([
		# crop_method,
		Scale((opt.sample_size, opt.sample_size)),
		# RandomHorizontalFlip(),
		ToTensor(opt.norm_value), norm_method
	])
	temporal_transform = TemporalRandomCrop(16)
	target_transform = ClassLabel()
	training_data = get_training_set(opt, spatial_transform,
									 temporal_transform, target_transform)
	train_loader = torch.utils.data.DataLoader(
		training_data,
		batch_size=opt.batch_size,
		shuffle=True,
		num_workers=opt.num_workers,
		pin_memory=True)

	# validation loader
	spatial_transform = Compose([
		Scale((opt.sample_size, opt.sample_size)),
		# CenterCrop(opt.sample_size),
		ToTensor(opt.norm_value), norm_method
	])
	target_transform = ClassLabel()
	temporal_transform = LoopPadding(16)
	validation_data = get_validation_set(
		opt, spatial_transform, temporal_transform, target_transform)
	val_loader = torch.utils.data.DataLoader(
		validation_data,
		batch_size=opt.batch_size,
		shuffle=False,
		num_workers=opt.num_workers,
		pin_memory=True)
	return train_loader, val_loader
def get_valinfo(opt, norm_method):
    spatial_transform = Compose([
        Scale(opt.sample_size),
        CenterCrop(opt.sample_size),
        ToTensor(opt.norm_value), norm_method
    ])
    temporal_transform = TemporalCenterCrop(opt.sample_duration)

    target_transform = ClassLabel()
    validation_data = get_validation_set(opt, spatial_transform,
                                         temporal_transform, target_transform)
    val_loader = torch.utils.data.DataLoader(validation_data,
                                             batch_size=opt.batch_size,
                                             shuffle=False,
                                             num_workers=opt.n_threads,
                                             pin_memory=True)
    val_logger = Logger(os.path.join(opt.result_path, 'val.log'),
                        ['epoch', 'loss', 'prec1', 'prec5'])
    return validation_data, val_loader, val_logger
示例#5
0
def main():
    opt = parse_opts()
    print(opt)

    seed = 0
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    # torch.backends.cudnn.deterministic = True
    # torch.backends.cudnn.benchmark = False

    # CUDA for PyTorch
    use_cuda = torch.cuda.is_available()
    device = torch.device(f"cuda:{opt.gpu}" if use_cuda else "cpu")

    train_transform = transforms.Compose([
        #transforms.RandomCrop(32, padding=3),
        transforms.Resize((224, 224)),
        transforms.RandomHorizontalFlip(),
        transforms.ColorJitter(brightness=[0.5, 1]),
        # transforms.RandomRotation(180),
        GaussianNoise(0.5),
        # transforms.RandomRotation(10),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406],
                             std=[0.229, 0.224, 0.225])
    ])
    test_transform = transforms.Compose([
        #transforms.RandomCrop(32, padding=3),
        transforms.Resize((224, 224)),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406],
                             std=[0.229, 0.224, 0.225])
    ])

    training_data = get_training_set(opt, train_transform)
    training_data = ConcatDataset(training_data)
    validation_data = get_validation_set(opt, test_transform)
    validation_data = ConcatDataset(validation_data)

    train_loader = torch.utils.data.DataLoader(training_data,
                                               batch_size=opt.batch_size,
                                               shuffle=True,
                                               num_workers=0)
    val_loader = torch.utils.data.DataLoader(validation_data,
                                             batch_size=opt.batch_size,
                                             shuffle=True,
                                             num_workers=0)
    print(f'Number of training examples: {len(train_loader.dataset)}')
    print(f'Number of validation examples: {len(val_loader.dataset)}')

    # tensorboard
    summary_writer = tensorboardX.SummaryWriter(log_dir='tf_logs')
    # define model
    model = ResidualNet("ImageNet", opt.depth, opt.num_classes, "CBAM")
    if opt.resume_path:
        checkpoint = torch.load(opt.resume_path)
        model.load_state_dict(checkpoint['model_state_dict'])
        epoch = checkpoint['epoch']
        print("Model Restored from Epoch {}".format(epoch))
        opt.start_epoch = epoch + 1
    model.to(device)

    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(model.parameters(), weight_decay=opt.wt_decay)
    scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
                                               'min',
                                               patience=opt.lr_patience)
    if opt.resume_path:
        checkpoint = torch.load(opt.resume_path)
        optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
        scheduler.load_state_dict(checkpoint['scheduler_state_dict'])

    th = 100000
    # start training
    for epoch in range(opt.start_epoch, opt.epochs + 1):
        # train, test model
        train_loss, train_acc = train_epoch(model, train_loader, criterion,
                                            optimizer, device, opt)
        val_loss, val_acc = val_epoch(model, val_loader, criterion, device)
        scheduler.step(val_loss)

        lr = optimizer.param_groups[0]['lr']

        # saving weights to checkpoint
        if (epoch) % opt.save_interval == 0:
            # write summary
            summary_writer.add_scalar('losses/train_loss',
                                      train_loss,
                                      global_step=epoch)
            summary_writer.add_scalar('losses/val_loss',
                                      val_loss,
                                      global_step=epoch)
            summary_writer.add_scalar('acc/train_acc',
                                      train_acc,
                                      global_step=epoch)
            summary_writer.add_scalar('acc/val_acc',
                                      val_acc,
                                      global_step=epoch)
            summary_writer.add_scalar('lr_rate', lr, global_step=epoch)

            state = {
                'epoch': epoch,
                'model_state_dict': model.state_dict(),
                'optimizer_state_dict': optimizer.state_dict(),
                'scheduler_state_dict': scheduler.state_dict()
            }
            if val_loss < th:
                torch.save(
                    state,
                    os.path.join('./snapshots', f'{opt.dataset}_model.pth'))
                print("Epoch {} model saved!\n".format(epoch))
                th = val_loss
示例#6
0
        scheduler['fusion'] = lr_scheduler.MultiStepLR(
            optimizer['fusion'],
            [int(0.5 * opt.n_epochs) - 1,
             int(0.75 * opt.n_epochs) - 1])

    if not opt.no_val:
        spatial_transform = Compose([
            Scale([opt.sample_size, opt.sample_size]),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = TemporalCenterCrop(opt.sample_duration)
        target_transform = Label()

        opt.dataset = 'diem'
        validation_data_diem = get_validation_set(opt, spatial_transform,
                                                  temporal_transform,
                                                  target_transform)
        opt.dataset = 'coutrot1'
        validation_data_coutrot1 = get_validation_set(opt, spatial_transform,
                                                      temporal_transform,
                                                      target_transform)
        opt.dataset = 'coutrot2'
        validation_data_coutrot2 = get_validation_set(opt, spatial_transform,
                                                      temporal_transform,
                                                      target_transform)
        opt.dataset = 'summe'
        validation_data_summe = get_validation_set(opt, spatial_transform,
                                                   temporal_transform,
                                                   target_transform)
        opt.dataset = 'etmd'
        validation_data_etmd = get_validation_set(opt, spatial_transform,
示例#7
0
                    weight_decay=opt.weight_decay)
            
        scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[5,15], gamma=0.1)
    

    if not opt.no_val:
        spatial_transform = Compose([
            Scale_longerside(opt.sample_size), 
            CenterCrop(opt.sample_size),
            ToTensor(opt.norm_value), norm_method
        ])
        target_transform = ClassLabel()

        val_loader = {}
        for j in range(0, len(opt.val_dataset)):
            validation_data = get_validation_set(opt.val_dataset[j], spatial_transform, target_transform, opt)

            val_loader[j] = torch.utils.data.DataLoader(
                validation_data,
                batch_size=opt.val_batch_size,
                shuffle=False,
                num_workers=opt.n_threads,
                pin_memory=True)
        

        if opt.validate_policy == '2stream':
            val_logger = {}
            for j in range(0, len(val_loader)):
                val_logger[j] = Logger(
                    os.path.join(opt.result_path, 'val_'+opt.val_dataset[j]+'.log'), 
                    ['epoch', 'OBOA', 'MAE', 'MAE_std', 'MAEP', 'MAEN'])
示例#8
0
        if opt.nesterov:
            dampening = 0
        else:
            dampening = opt.dampening
        optimizer = optim.SGD(parameters,
                              lr=opt.learning_rate,
                              momentum=opt.momentum,
                              dampening=dampening,
                              weight_decay=opt.weight_decay,
                              nesterov=opt.nesterov)
        scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
                                                   'min',
                                                   patience=opt.lr_patience)
    if not opt.no_val:
        validation_data = get_validation_set(opt)
        val_loader = torch.utils.data.DataLoader(validation_data,
                                                 batch_size=opt.batch_size,
                                                 shuffle=False,
                                                 num_workers=opt.n_threads,
                                                 pin_memory=True)
        val_logger = Logger(os.path.join(opt.result_path, 'val.log'),
                            ['epoch', 'loss', 'acc'])

    if opt.resume_path:
        print('loading checkpoint {}'.format(opt.resume_path))
        checkpoint = torch.load(opt.resume_path)
        assert opt.arch == checkpoint['arch']

        opt.begin_epoch = checkpoint['epoch']
        model.load_state_dict(checkpoint['state_dict'])
示例#9
0
def train_and_evaluate(net_name="aein_net", epochs = 250, train_batch_size=64, learning_rate=1e-3, optimizer="adam"):
  train_set_size = 680
  val_test_set_size = 340

  input_width = input_height = 224
  channel = 3
  output_size = 17

  train_set_1 = dataset.get_train_set(1)
  train_set_1 = train_set_1.shuffle(buffer_size=10000)
  train_set_1 = train_set_1.batch(train_batch_size)

  validation_set_1 = dataset.get_validation_set(1)
  validation_set_1 = validation_set_1.batch(68)

  test_set_1 = dataset.get_test_set(1)
  test_set_1 = test_set_1.batch(68)

  X = tf.placeholder(tf.float32, [None, input_height, input_width, channel])
  if net_name == 'aein_net':
    y_pred = aein_net.aein_net(X)
  elif net_name == 'alex_net':
    y_pred = alex_net.alex_net(X)
  elif net_name == 'vgg_16':
    y_pred = vgg_16.vgg_16(X)
  else:
    y_pred = aein_net.aein_net(X)
  y_true = tf.placeholder(tf.float32, [None, output_size])

  loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y_pred, labels=y_true))

  if optimizer == 'adam':
    optimizer = tf.train.AdamOptimizer(learning_rate)
  elif optimizer == 'momentum':
    optimizer = tf.train.MomentumOptimizer(learning_rate, 0.9)
  elif optimizer == 'gradient_descent':
    optimizer = tf.train.GradientDescentOptimizer(learning_rate)
  elif optimizer == 'rmsprop':
    optimizer = tf.train.RMSPropOptimizer(learning_rate)
  else:
    optimizer = tf.train.AdamOptimizer(learning_rate)

  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
  with tf.control_dependencies(update_ops):
    train_op = optimizer.minimize(loss)

  itr_trn_1 = train_set_1.make_initializable_iterator()
  next_element_trn_1 = itr_trn_1.get_next()

  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    start_train_time = time.time()
    accuracies = []
    losses = []
    epochs_arr = []
    epochs_10_arr = []
    print("Start to train classifier, model: " + net_name)
    for epoch in range(epochs):
      print("------------------ Epoch %d starts ------------------" % (epoch + 1))
      sess.run(itr_trn_1.initializer)
      batch_idx = 1
      while True:
        try:
          X_batch, Y_batch = sess.run(next_element_trn_1)
          last_train_op_time = time.time()
          _, l = sess.run([train_op, loss], feed_dict={X: X_batch, y_true: Y_batch})
          losses.append(l)
          epochs_arr.append(epoch)
          print("epoch: %d, batch: %d, loss: %f, time cost: %f" % (
          epoch + 1, batch_idx, l, time.time() - last_train_op_time))
          batch_idx += 1
        except tf.errors.OutOfRangeError:  # this epoch ends
          break

      if (epoch + 1) % 10 == 0:
        print()
        print("------------------ evaluating accuracy on validation set ------------------")
        accuracy = utils.evaluate(validation_set_1, sess, X, y_true, y_pred)
        print("accuracy: %f" % accuracy)
        print()
        accuracies.append(accuracy)
        epochs_10_arr.append(epoch + 1)

    print("Classifier has been trained, total time: %f" % (time.time() - start_train_time))
    print()
    print("------------------ evaluating accuracy on test set ------------------")
    print("accuracy: %f" % utils.evaluate(test_set_1, sess, X, y_true, y_pred))
    print()

    utils.save_result(net_name, epochs_arr, losses, epochs_10_arr, accuracies)
示例#10
0
                spatial_transforms[tokens[0]] = Compose([
                    CenterCrop(opt.sample_size),
                    ToTensor(opt.norm_value), norm_method
                ])

        annotateData = pd.read_csv(opt.annotation_file, sep=',', header=0)
        keys = annotateData[annotateData.Dataset == 'Test']['Location']
        values = annotateData[annotateData.Dataset == 'Test']['MeanID']

        annotationDictionary = dict(zip(keys, values))

        temporal_transform = TemporalCenterCrop(opt.sample_duration)
        #temporal_transform = LoopPadding(opt.sample_duration)
        target_transform = ClassLabel()
        validation_data = get_validation_set(opt, spatial_transforms,
                                             temporal_transform,
                                             target_transform,
                                             annotationDictionary)
        val_loader = torch.utils.data.DataLoader(validation_data,
                                                 batch_size=opt.batch_size,
                                                 shuffle=False,
                                                 num_workers=opt.n_threads,
                                                 pin_memory=True)
        val_logger = Logger(os.path.join(opt.result_path, 'val.log'),
                            ['epoch', 'loss', 'acc'])

    if opt.resume_path:
        print('loading checkpoint {}'.format(opt.resume_path))
        checkpoint = torch.load(opt.resume_path)
        assert opt.arch == checkpoint['arch']

        opt.begin_epoch = checkpoint['epoch']
def create_dataloader(args):
    if args.root_path != '':
        args.video_path = os.path.join(args.root_path, args.video_path)
        args.annotation_path = os.path.join(args.root_path,
                                            args.annotation_path)
        args.result_path = os.path.join(args.root_path, args.result_path)
        if args.resume_path:
            args.resume_path = os.path.join(args.root_path, args.resume_path)
        if args.pretrain_path:
            # args.pretrain_path = os.path.join(args.root_path, args.pretrain_path)
            args.pretrain_path = os.path.abspath(args.pretrain_path)
    args.scales = [args.initial_scale]
    for i in range(1, args.n_scales):
        args.scales.append(args.scales[-1] * args.scale_step)

    args.mean = get_mean(args.norm_value, dataset=args.mean_dataset)
    args.std = get_std(args.norm_value)

    if args.no_mean_norm and not args.std_norm:
        norm_method = Normalize([0, 0, 0], [1, 1, 1])
    elif not args.std_norm:
        norm_method = Normalize(args.mean, [1, 1, 1])
    else:
        norm_method = Normalize(args.mean, args.std)

    assert args.train_crop in ['random', 'corner', 'center']
    if args.train_crop == 'random':
        crop_method = MultiScaleRandomCrop(args.scales, args.sample_size)
    elif args.train_crop == 'corner':
        crop_method = MultiScaleCornerCrop(args.scales, args.sample_size)
    elif args.train_crop == 'center':
        crop_method = MultiScaleCornerCrop(args.scales,
                                           args.sample_size,
                                           crop_positions=['c'])

    spatial_transform = Compose([
        crop_method,
        RandomHorizontalFlip(),
        ToTensor(args.norm_value), norm_method
    ])
    temporal_transform = TemporalRandomCrop(args.sample_duration)
    target_transform = ClassLabel()
    training_data = get_training_set(args, spatial_transform,
                                     temporal_transform, target_transform)
    train_loader = torch.utils.data.DataLoader(training_data,
                                               batch_size=args.batch_size,
                                               shuffle=True,
                                               num_workers=args.n_threads,
                                               pin_memory=True)

    spatial_transform = Compose([
        # Scale(args.sample_size),
        Scale(int(args.sample_size / args.scale_in_test)),
        # CenterCrop(args.sample_size),
        CornerCrop(args.sample_size, args.crop_position_in_test),
        ToTensor(args.norm_value),
        norm_method
    ])
    temporal_transform = TemporalCenterCrop(args.sample_duration)
    target_transform = ClassLabel()
    validation_data = get_validation_set(args, spatial_transform,
                                         temporal_transform, target_transform)
    val_loader = torch.utils.data.DataLoader(validation_data,
                                             batch_size=1,
                                             shuffle=False,
                                             num_workers=args.n_threads,
                                             pin_memory=True)

    return train_loader, val_loader
示例#12
0
def main():

    # parameters
    # ???should we adjust the learning rate during the training process? ???
    learn_rate = 1e-4
    num_epochs = 600  # 最大迭代次数
    max_patience = 60  # 停止训练的参数
    result_rp = '../result/model/'
    exp_name = 'P3D_saliency'

    batch_size = 3
    n_threads = 16
    # 'Temporal duration of inputs'
    sample_duration = 16
    # the data for devison
    norm_value = 255
    # Height and width of inputs
    sample_size = 224
    # Number of validation samples for each activity
    n_val_samples = 3
    video_path = '/data1/guoxi/p3d_floder/resized_dataset/dataset/'
    reference_path = '/data1/guoxi/p3d_floder/resized_dataset/reference_dataset/'
    # video_path = '/data1/guoxi/p3d_floder/resized_dataset_for_test/dataset/'
    # reference_path = '/data1/guoxi/p3d_floder/resized_dataset_for_test/reference_dataset/'
    mean = [0.485, 0.456, 0.406]
    std = [0.229, 0.224, 0.225]

    norm_method = Normalize(mean, std)

    RandomCrop_transform = Compose([  # 图像预处理一般用Compose把多个步骤整合到一起
        joint_transforms.JointRandomCrop(
            224
        ),  # 在一个随机的位置进行裁剪  'JpegImageFile' object does not support indexing
    ])

    RandomHorizontalFlip_transform = Compose([  # 图像预处理一般用Compose把多个步骤整合到一起
        joint_transforms.JointRandomHorizontalFlip(),  # 以0.5的概率水平翻转给定的PIL图像
    ])

    RandomErase_transform = Compose(
        [joint_transforms.RandomErase(probability=0.5, sh=0.4, r1=0.3)])

    spatial_transform = Compose([ToTensor(norm_value=norm_value),
                                 norm_method])  # 空间变换

    target_transform = Compose([ToTensor(norm_value=norm_value)])

    opt = [video_path, sample_duration]

    train_data = dataset.get_training_set(opt, reference_path,
                                          spatial_transform, target_transform,
                                          RandomCrop_transform,
                                          RandomHorizontalFlip_transform,
                                          RandomErase_transform)
    train_loader = torch.utils.data.DataLoader(
        train_data,
        batch_size=batch_size,
        shuffle=True,
        num_workers=n_threads,
        pin_memory=True
    )  # 使用多进程加载的进程数 是否将数据保存在pin memory区,pin memory中的数据转到GPU会快一些
    validation_data = dataset.get_validation_set(opt, reference_path,
                                                 spatial_transform,
                                                 target_transform, None, None,
                                                 None)
    val_loader = torch.utils.data.DataLoader(validation_data,
                                             batch_size=batch_size,
                                             shuffle=False,
                                             num_workers=n_threads,
                                             pin_memory=True)

    inputs, targets = next(iter(train_loader))
    print('inputs.size(), inputs.min(), inputs.max()', inputs.size(),
          inputs.min(), inputs.max())
    print('targets.size(), targets.min(), targets.max():', targets.size(),
          targets.min(), targets.max())

    # every time we load weights, which may be slow
    model_cla = network_cla.P3D199(pretrained=True, num_classes=400)
    cla_dict = model_cla.state_dict()

    model = network_seg.P3D199()
    # model.apply(utils.weights_init)
    seg_dict = model.state_dict()

    pretrained_dict = {k: v for k, v in cla_dict.items() if k in seg_dict}
    seg_dict.update(pretrained_dict)
    model.load_state_dict(seg_dict)
    model.cuda()

    model = nn.DataParallel(model)

    commen_layers = [
        'conv1_custom', 'bn1', 'relu', 'maxpool', 'maxpool_2', 'layer1',
        'layer2', 'layer3'
    ]
    # seperate layers, to set different lr
    param_exist = []
    param_add = []
    for k, (name, module) in enumerate(model.named_children()):
        # existing layers
        if name in commen_layers:
            # print('existing layer: ', name)
            for param in module.parameters():
                param_exist.append(param)
        # adding layers
        else:
            # print('adding layer: ', name)
            for param in module.parameters():
                param_add.append(param)
    print('  + Number of params: {}'.format(
        sum([p.data.nelement() for p in model.parameters()])))

    optimizer = optim.Adam([{
        'params': param_exist,
        'lr': learn_rate * 0.1
    }, {
        'params': param_add
    }])
    criterion = nn.BCELoss().cuda()

    exp_dir = result_rp + exp_name
    ##!!! existing directory will be removed
    if os.path.exists(exp_dir):
        shutil.rmtree(exp_dir)

    exp = experiment.Experiment(exp_name, result_rp)
    exp.init()

    for epoch in range(num_epochs):

        since = time.time()

        ### Train ###
        trn_loss = utils.train(model, train_loader, optimizer, criterion)
        print('Epoch {:d}: Train - Loss: {:.4f}'.format(epoch, trn_loss))
        time_elapsed = time.time() - since
        print('Train Time {:.0f}m {:.0f}s'.format(time_elapsed // 60,
                                                  time_elapsed % 60))

        ### Test ###
        val_loss = utils.test(model, val_loader, criterion)
        print('Val - Loss: {:.4f}'.format(val_loss))
        time_elapsed = time.time() - since
        print('Total Time {:.0f}m {:.0f}s\n'.format(time_elapsed // 60,
                                                    time_elapsed % 60))

        ### Save Metrics ###
        exp.save_history('train', trn_loss)
        exp.save_history('val', val_loss)

        ### Checkpoint ###
        exp.save_weights(model, trn_loss, val_loss)
        exp.save_optimizer(optimizer, val_loss)

        ## Early Stopping ##
        if (epoch - exp.best_val_loss_epoch) > max_patience:
            print(("Early stopping at epoch %d since no " +
                   "better loss found since epoch %.3").format(
                       epoch, exp.best_val_loss))
            break

        exp.epoch += 1
def main():

    resnet_in = generate_model(opt)
    resnet_in.module.fc = Identity()
    model = ReNet34(resnet_in, encode_length=encode_length)

    if opt.no_mean_norm and not opt.std_norm:
        norm_method = Normalize([0, 0, 0], [1, 1, 1])
    elif not opt.std_norm:
        norm_method = Normalize(opt.mean, [1, 1, 1])
    else:
        norm_method = Normalize(opt.mean, opt.std)

    if not opt.no_train:
        assert opt.train_crop in ['random', 'corner', 'center']
        if opt.train_crop == 'random':
            crop_method = MultiScaleRandomCrop(opt.scales, opt.sample_size)
        elif opt.train_crop == 'corner':
            crop_method = MultiScaleCornerCrop(opt.scales, opt.sample_size)
        elif opt.train_crop == 'center':
            crop_method = MultiScaleCornerCrop(opt.scales,
                                               opt.sample_size,
                                               crop_positions=['c'])

        ## train loader
        spatial_transform = Compose([
            crop_method,
            RandomHorizontalFlip(),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = TemporalRandomCrop(opt.sample_duration)
        target_transform = ClassLabel()
        training_data = get_training_set(opt, spatial_transform,
                                         temporal_transform, target_transform)
        train_loader = torch.utils.data.DataLoader(training_data,
                                                   batch_size=opt.batch_size,
                                                   shuffle=True,
                                                   num_workers=opt.n_threads,
                                                   pin_memory=True)

        ## test loader
        spatial_transform = Compose([
            Scale(int(opt.sample_size / opt.scale_in_test)),
            CornerCrop(opt.sample_size, opt.crop_position_in_test),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = LoopPadding(opt.sample_duration)

        target_transform = ClassLabel()
        test_data = get_test_set(opt, spatial_transform, temporal_transform,
                                 target_transform)
        test_loader = torch.utils.data.DataLoader(test_data,
                                                  batch_size=opt.batch_size,
                                                  shuffle=False,
                                                  num_workers=opt.n_threads,
                                                  pin_memory=True)

        ## Database loader
        spatial_transform = Compose([
            Scale(int(opt.sample_size / opt.scale_in_test)),
            CornerCrop(opt.sample_size, opt.crop_position_in_test),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = LoopPadding(opt.sample_duration)
        target_transform = ClassLabel()
        validation_data = get_validation_set(opt, spatial_transform,
                                             temporal_transform,
                                             target_transform)
        database_loader = torch.utils.data.DataLoader(
            validation_data,
            batch_size=opt.batch_size,
            shuffle=False,
            num_workers=opt.n_threads,
            pin_memory=True)

        if opt.nesterov:
            dampening = 0
        else:
            dampening = opt.dampening

        optimizer = optim.SGD(model.parameters(),
                              lr=opt.learning_rate,
                              momentum=opt.momentum,
                              dampening=dampening,
                              weight_decay=opt.weight_decay,
                              nesterov=opt.nesterov)
        scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
                                                   'min',
                                                   patience=opt.lr_patience)

    if opt.resume_path:
        print('loading checkpoint {}'.format(opt.resume_path))
        checkpoint = torch.load(opt.resume_path)
        assert opt.arch == checkpoint['arch']

        opt.begin_epoch = checkpoint['epoch']
        model.load_state_dict(checkpoint['state_dict'])
        if not opt.no_train:
            optimizer.load_state_dict(checkpoint['optimizer'])
            for state in optimizer.state.values():
                for k, v in state.items():
                    if torch.is_tensor(v):
                        state[k] = v.cuda()

    print('run')
    for epoch in range(opt.begin_epoch, opt.n_epochs + 1):
        model.cuda().train()
        for i, (images, labels) in enumerate(train_loader):

            images = Variable(images.cuda())
            labels = Variable(labels.cuda().long())

            # Forward + Backward + Optimize
            optimizer.zero_grad()
            x, _, b = model(images)

            target_b = F.cosine_similarity(b[:int(labels.size(0) / 2)],
                                           b[int(labels.size(0) / 2):])
            target_x = F.cosine_similarity(x[:int(labels.size(0) / 2)],
                                           x[int(labels.size(0) / 2):])
            loss = F.mse_loss(target_b, target_x)
            loss.backward()
            optimizer.step()
            scheduler.step()

        # Test the Model
        if (epoch + 1) % 10 == 0:
            model.eval()
            retrievalB, retrievalL, queryB, queryL = compress(
                database_loader, test_loader, model)
            result_map = calculate_top_map(qB=queryB,
                                           rB=retrievalB,
                                           queryL=queryL,
                                           retrievalL=retrievalL,
                                           topk=100)
            print('--------mAP@100: {}--------'.format(result_map))
示例#14
0
def objective(trial):
    opt = parse_opts()

    if trial:
        opt.weight_decay = trial.suggest_uniform('weight_decay', 0.01, 0.1)
        opt.learning_rate = trial.suggest_uniform('learning_rate', 1 - 5,
                                                  1 - 4)

    if opt.root_path != '':
        opt.video_path = os.path.join(opt.root_path, opt.video_path)
        opt.annotation_path = os.path.join(opt.root_path, opt.annotation_path)
        opt.result_path = os.path.join(opt.root_path, opt.result_path)
        if opt.resume_path:
            opt.resume_path = os.path.join(opt.root_path, opt.resume_path)
        if opt.pretrain_path:
            opt.pretrain_path = os.path.join(opt.root_path, opt.pretrain_path)
    opt.scales = [opt.initial_scale]
    for i in range(1, opt.n_scales):
        opt.scales.append(opt.scales[-1] * opt.scale_step)
    opt.arch = '{}-{}'.format(opt.model, opt.model_depth)
    opt.mean = get_mean(opt.norm_value, dataset=opt.mean_dataset)
    opt.std = get_std(opt.norm_value)
    print(opt)
    with open(os.path.join(opt.result_path, 'opts.json'), 'w') as opt_file:
        json.dump(vars(opt), opt_file)

    torch.manual_seed(opt.manual_seed)

    model, parameters = generate_model(opt)
    print(model)
    criterion = nn.CrossEntropyLoss()
    if not opt.no_cuda:
        criterion = criterion.cuda()

    if opt.no_mean_norm and not opt.std_norm:
        norm_method = Normalize([0, 0, 0], [1, 1, 1])
    elif not opt.std_norm:
        norm_method = Normalize(opt.mean, [1, 1, 1])
    else:
        norm_method = Normalize(opt.mean, opt.std)

    # norm_method = Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))

    if not opt.no_train:
        assert opt.train_crop in ['random', 'corner', 'center']
        if opt.train_crop == 'random':
            crop_method = MultiScaleRandomCrop(opt.scales, opt.sample_size)
        elif opt.train_crop == 'corner':
            crop_method = MultiScaleCornerCrop(opt.scales, opt.sample_size)
        elif opt.train_crop == 'center':
            crop_method = MultiScaleCornerCrop(opt.scales,
                                               opt.sample_size,
                                               crop_positions=['c'])
        spatial_transform = Compose([
            crop_method,
            RandomHorizontalFlip(),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = TemporalRandomCrop(opt.sample_duration)
        target_transform = ClassLabel()
        training_data = get_training_set(opt, spatial_transform,
                                         temporal_transform, target_transform)
        train_loader = torch.utils.data.DataLoader(
            training_data,
            batch_size=opt.batch_size,
            # sampler option is mutually exclusive with shuffle
            shuffle=False,
            sampler=ImbalancedDatasetSampler(training_data),
            num_workers=opt.n_threads,
            pin_memory=True)
        train_logger = Logger(os.path.join(opt.result_path, 'train.log'),
                              ['epoch', 'loss', 'acc', 'lr'])
        train_batch_logger = Logger(
            os.path.join(opt.result_path, 'train_batch.log'),
            ['epoch', 'batch', 'iter', 'loss', 'acc', 'lr'])

        optimizer = optim.Adam(parameters,
                               lr=opt.learning_rate,
                               weight_decay=opt.weight_decay)
        scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,
                                                               verbose=True,
                                                               factor=0.1**0.5)
    if not opt.no_val:
        spatial_transform = Compose([
            Scale(opt.sample_size),
            CenterCrop(opt.sample_size),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = LoopPadding(opt.sample_duration)
        target_transform = ClassLabel()
        validation_data = get_validation_set(opt, spatial_transform,
                                             temporal_transform,
                                             target_transform)
        val_loader = torch.utils.data.DataLoader(
            validation_data,
            batch_size=opt.batch_size,
            shuffle=False,
            sampler=ImbalancedDatasetSampler(validation_data),
            num_workers=opt.n_threads,
            pin_memory=True)
        val_logger = Logger(os.path.join(opt.result_path, 'val.log'),
                            ['epoch', 'loss', 'acc'])

    if opt.resume_path:
        print('loading checkpoint {}'.format(opt.resume_path))
        checkpoint = torch.load(opt.resume_path)
        assert opt.arch == checkpoint['arch']

        opt.begin_epoch = checkpoint['epoch']
        model.load_state_dict(checkpoint['state_dict'])
        if not opt.no_train:
            optimizer.load_state_dict(checkpoint['optimizer'])

    print('run')
    writer = SummaryWriter(
        comment=
        f"_wd{opt.weight_decay}_lr{opt.learning_rate}_ft_begin{opt.ft_begin_index}_pretrain{not opt.pretrain_path == ''}"
    )
    for i in range(opt.begin_epoch, opt.n_epochs + 1):
        if not opt.no_train:
            epoch, losses_avg, accuracies_avg = train_epoch(
                i, train_loader, model, criterion, optimizer, opt,
                train_logger, train_batch_logger)
            writer.add_scalar('loss/train', losses_avg, epoch)
            writer.add_scalar('acc/train', accuracies_avg, epoch)

        if not opt.no_val:
            epoch, val_losses_avg, val_accuracies_avg = val_epoch(
                i, val_loader, model, criterion, opt, val_logger)
            writer.add_scalar('loss/val', val_losses_avg, epoch)
            writer.add_scalar('acc/val', val_accuracies_avg, epoch)

        if not opt.no_train and not opt.no_val:
            scheduler.step(val_losses_avg)
        print('=' * 100)

    if opt.test:
        spatial_transform = Compose([
            Scale(int(opt.sample_size / opt.scale_in_test)),
            CornerCrop(opt.sample_size, opt.crop_position_in_test),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = LoopPadding(opt.sample_duration)
        target_transform = VideoID()

        test_data = get_test_set(opt, spatial_transform, temporal_transform,
                                 target_transform)
        test_loader = torch.utils.data.DataLoader(test_data,
                                                  batch_size=opt.batch_size,
                                                  shuffle=False,
                                                  num_workers=opt.n_threads,
                                                  pin_memory=True)
        test.test(test_loader, model, opt, test_data.class_names)

    writer.close()
    return val_losses_avg
示例#15
0
    label_length = combined_dataset.labeled_length
    unlabel_length = combined_dataset.unlabeled_length
    assert label_length + unlabel_length == len(
        combined_dataset), 'Fatal Error!'
    print('\nTotal: {} labeled samples and {} unlabeled samples'.format(
        label_length, unlabel_length))

    val_sp_transform = Compose([
        Scale(args.sample_size),
        CenterCrop(args.sample_size),
        ToTensor(args.norm_value),
        norm_method,
    ])
    val_tp_transform = TemporalCenterCrop(args.sample_duration,
                                          args.downsample)
    val_dataset = get_validation_set(args, val_sp_transform, val_tp_transform,
                                     target_transform[0])

    # generate loader
    label_indices = torch.from_numpy(np.arange(label_length))
    unlabel_indices = torch.from_numpy(
        np.arange(label_length, len(combined_dataset)))
    """A batchsampler yielding a batch of indices with 4 parts, 
    1&2 from primary indices(kinetics), 
    3&4 from secondary indices(ucf), 
    1 and 2 are same indices (they are same samples), but each is augmented differently (spatially and temporally)
    3 and 4 same as above
    batch_size should be 64 so the 1&3 will be fed to student model (with batchsize 128)
    2&4 will be fed to teacher model (with batchsize 128)
    """
    sampler = FourStreamSampler(unlabel_indices, label_indices,
                                args.batch_size, args.batch_size)
示例#16
0
def main_worker(gpu, ngpus_per_node, opt, test_results=None):
    opt.gpu = gpu

    # suppress printing if not master

    if opt.multiprocessing_distributed and opt.gpu != 0:

        def print_pass(*args):
            pass

        builtins.print = print_pass

    if opt.gpu is not None:
        print("Use GPU: {} for training".format(opt.gpu))

    if opt.distributed:
        if opt.dist_url == "env://" and opt.rank == -1:
            opt.rank = int(os.environ["RANK"])
        if opt.multiprocessing_distributed:
            # For multiprocessing distributed training, rank needs to be the
            # global rank among all the processes
            opt.rank = opt.rank * ngpus_per_node + gpu
        dist.init_process_group(backend=opt.dist_backend,
                                init_method=opt.dist_url,
                                world_size=opt.world_size,
                                rank=opt.rank)
        opt.batch_size = int(opt.batch_size / ngpus_per_node)
        opt.n_threads = int(
            (opt.n_threads + ngpus_per_node - 1) / ngpus_per_node)

    if opt.rank % ngpus_per_node == 0:
        if not os.path.exists(opt.result_path):
            os.makedirs(opt.result_path)
        opt.arch = '{}-{}'.format(opt.model, opt.model_depth)
        with open(os.path.join(opt.result_path, 'opts.json'), 'w') as opt_file:
            json.dump(vars(opt), opt_file)

    if not opt.no_train:
        training_data = get_training_set(opt)
        opt.N_data = len(training_data)

        if opt.distributed:
            train_sampler = torch.utils.data.distributed.DistributedSampler(
                training_data)
        else:
            train_sampler = None
        train_loader = torch.utils.data.DataLoader(
            training_data,
            batch_size=opt.batch_size,
            shuffle=(train_sampler is None),
            num_workers=opt.n_threads,
            pin_memory=True,
            drop_last=True,
            sampler=train_sampler)

        model, parameters = generate_model(opt)

        if opt.phase == 'finetuning':
            criterion = nn.CrossEntropyLoss().cuda(opt.gpu)
        elif opt.phase == 'pretraining':
            criterion = NCECriterion(len(training_data)).cuda(opt.gpu)
        else:
            raise NotImplementedError('not implement {} phase'.format(
                opt.phase))

        train_logger = Logger(
            os.path.join(opt.result_path, 'train.log.rank{}'.format(opt.rank)),
            ['epoch', 'loss', 'acc', 'lr'])
        train_batch_logger = Logger(
            os.path.join(opt.result_path,
                         'train_batch.log.{}'.format(opt.rank)),
            ['epoch', 'batch', 'iter', 'loss', 'acc', 'lr'])

        optimizer = optim.SGD(parameters,
                              lr=opt.learning_rate,
                              momentum=opt.momentum,
                              weight_decay=opt.weight_decay)

        if opt.phase == 'finetuning':
            scheduler = lr_scheduler.ReduceLROnPlateau(
                optimizer,
                'max',
                patience=opt.lr_patience,
                min_lr=1e-6,
                factor=opt.lr_factor)

    if not opt.no_val:
        validation_data = get_validation_set(opt)
        if opt.distributed:
            val_sampler = torch.utils.data.distributed.DistributedSampler(
                validation_data)
        else:
            val_sampler = None
        val_loader = torch.utils.data.DataLoader(validation_data,
                                                 batch_size=opt.batch_size,
                                                 shuffle=(val_sampler is None),
                                                 num_workers=opt.n_threads,
                                                 pin_memory=True,
                                                 drop_last=True,
                                                 sampler=val_sampler)
        val_logger = Logger(
            os.path.join(opt.result_path, 'val.log.rank{}'.format(opt.rank)),
            ['epoch', 'acc1', 'acc5'] if opt.phase == 'finetuning' else
            ['epoch', 'recall@1', 'recall@10'])

    if opt.test:
        model, parameters = generate_model(opt)

        test_data = get_test_set(opt)
        idx_to_labels = test_data.get_idx_to_label()
        if opt.distributed:
            test_sampler = torch.utils.data.distributed.DistributedSampler(
                test_data, shuffle=False)
        else:
            test_sampler = None
        test_loader = torch.utils.data.DataLoader(
            test_data,
            batch_size=opt.batch_size,
            shuffle=(test_sampler is None),
            num_workers=opt.n_threads,
            pin_memory=True,
            drop_last=False,
            sampler=test_sampler)

    if opt.resume_path:
        print('==>loading checkpoint {}'.format(opt.resume_path))
        if opt.gpu is None:
            checkpoint = torch.load(opt.resume_path)
        else:
            # Map model to be loaded to specified single gpu.
            loc = 'cuda:{}'.format(opt.gpu)
            checkpoint = torch.load(opt.resume_path, map_location=loc)

        opt.begin_epoch = checkpoint['epoch']
        model.load_state_dict(checkpoint['state_dict'])
        if not opt.no_train:
            optimizer.load_state_dict(checkpoint['optimizer'])
    else:
        opt.begin_epoch = 1

    torch.backends.cudnn.benchmark = True
    if opt.rank % ngpus_per_node == 0:
        summary_writer = SummaryWriter(log_dir=opt.result_path)
    else:
        summary_writer = None
    for i in range(opt.begin_epoch, opt.n_epochs + 1):
        if not opt.no_train:
            if opt.distributed:
                train_sampler.set_epoch(i)

            train_epoch(i, train_loader, model, criterion, optimizer, opt,
                        train_logger, train_batch_logger, summary_writer)

        if not opt.no_val:
            if opt.phase == 'finetuning':
                val_acc = val_finetune_epoch(i, val_loader, model, opt,
                                             val_logger, summary_writer)
            elif opt.phase == 'pretraining':
                val_acc = val_pretrain_epoch(i, val_loader, model, opt,
                                             val_logger, summary_writer)
        if not opt.no_train and not opt.no_val:
            if opt.phase == 'finetuning':
                scheduler.step(val_acc)
            elif opt.phase == 'pretraining':
                adjuest_learning_rate(optimizer, i, opt)

    if opt.test:
        test.test(test_loader, model, opt, idx_to_labels, test_results)
        if opt.multiprocessing_distributed and opt.gpu == 0:
            result_json = {}
            finish_procs = 0
            while (finish_procs < ngpus_per_node):
                rst = test_results.get()
                if rst == -1:
                    finish_procs += 1
                else:
                    result_json[rst[0]] = rst[1]
            with open(
                    os.path.join(opt.result_path,
                                 '{}.json'.format(opt.test_subset)), 'w') as f:
                json.dump({'results': result_json}, f)
示例#17
0
                                                   'min',
                                                   patience=opt.lr_patience)
    if not opt.no_val:
        spatial_transform = Compose([
            Scale(opt.sample_size),
            CenterCrop(opt.sample_size),
            ToTensor(opt.norm_value), norm_method
        ])
        #temporal_transform = LoopPadding(opt.sample_duration)
        temporal_transform = TemporalCenterCrop(opt.sample_duration,
                                                opt.downsample)
        target_transform = ClassLabel()

        validation_data1 = get_validation_set(opt, 'all', opt.view,
                                              opt.image_type,
                                              spatial_transform,
                                              temporal_transform,
                                              target_transform)
        #validation_data2 = get_validation_set(
        #    opt, 'N', spatial_transform, temporal_transform, target_transform)
        #print ("@@@@@@@@@@@@@@@@@@@2",validation_data1.__len__())
        val_loader1 = torch.utils.data.DataLoader(validation_data1,
                                                  batch_size=10,
                                                  shuffle=False,
                                                  num_workers=opt.n_threads,
                                                  pin_memory=True,
                                                  drop_last=True)
        #val_loader2 = torch.utils.data.DataLoader(
        #    validation_data2,
        #    batch_size=8,
        #    shuffle=True,
示例#18
0
def main():
	opt = parse_opts()
	print(opt)

	seed = 0
	random.seed(seed)
	np.random.seed(seed)
	torch.manual_seed(seed)
	torch.backends.cudnn.deterministic = True
	torch.backends.cudnn.benchmark = False

	# CUDA for PyTorch
	use_cuda = torch.cuda.is_available()
	device = torch.device(f"cuda:{opt.gpu}" if use_cuda else "cpu")

	train_transform = transforms.Compose([
		#transforms.RandomCrop(32, padding=3),
		transforms.Resize((opt.img_H, opt.img_W)),
		transforms.RandomHorizontalFlip(),
		transforms.RandomRotation(10),
		transforms.ToTensor(),
		transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[
			0.229, 0.224, 0.225])
	])
	test_transform = transforms.Compose([
		#transforms.RandomCrop(32, padding=3),
		transforms.Resize((opt.img_H, opt.img_W)),
		transforms.ToTensor(),
		transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[
			0.229, 0.224, 0.225])
	])

	training_data = get_training_set(opt, train_transform)
	validation_data = get_validation_set(opt, test_transform)
	
	n_train_examples = int(len(training_data)*0.8)
	n_valid_examples = len(training_data) - n_train_examples
	# split data
	training_data, validation_data = torch.utils.data.random_split(training_data, [n_train_examples, n_valid_examples])

	train_loader = torch.utils.data.DataLoader(training_data,
											   batch_size=opt.batch_size,
											   shuffle=True,
											   num_workers=1)
	val_loader = torch.utils.data.DataLoader(validation_data,
											 batch_size=opt.batch_size,
											 shuffle=True,
											 num_workers=1)
	print(f'Number of training examples: {len(train_loader.dataset)}')
	print(f'Number of validation examples: {len(val_loader.dataset)}')

	# tensorboard
	summary_writer = tensorboardX.SummaryWriter(log_dir='tf_logs')
	# define model
	model = resnet18(num_classes=opt.num_classes)

	# if torch.cuda.device_count() > 1:
	#   	print("Let's use", torch.cuda.device_count(), "GPUs!")
  	# 	model = nn.DataParallel(model)
	model = model.to(device)

	if opt.nesterov:
		dampening = 0
	else:
		dampening = opt.dampening
	#define optimizer and criterion
	# optimizer = optim.Adam(model.parameters())
	# optimizer = optim.SGD(
	# 		model.parameters(),
	# 		lr=opt.learning_rate,
	# 		momentum=opt.momentum,
	# 		dampening=dampening,
	# 		weight_decay=opt.weight_decay,
	# 		nesterov=opt.nesterov)
	# scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=opt.lr_patience)
	# criterion = nn.CrossEntropyLoss()
	# define optimizer and criterion
	optimizer = optim.Adam(model.parameters())
	# loss function
	criterion = BCEWithLogitsLoss()

	# resume model, optimizer if already exists
	if opt.resume_path:
		checkpoint = torch.load(opt.resume_path)
		model.load_state_dict(checkpoint['model_state_dict'])
		optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
		epoch = checkpoint['epoch']
		print("Model Restored from Epoch {}".format(epoch))
		start_epoch = epoch + 1
	else:
		start_epoch = 1

	# start training
	#th = 10000
	for epoch in range(start_epoch, opt.epochs+1):
		val_loss, val_mAP = val_epoch(model, val_loader, criterion, device, opt)
示例#19
0
            ToTensor(opt.norm_value)  #, norm_method
        ])
    else:
        normalize = Normalize(mean=input_config['mean'],
                              std=input_config['std'])
        spatial_transform = Compose([
            Scale((256, 256)),
            CenterCrop(opt.sample_size),
            ToTensor(),
            #     normalize,
        ])

    temporal_transform = LoopPadding(opt.sample_duration)
    opt.compressed = 1
    opt.residual_only = 1
    residual_data = get_validation_set(opt, spatial_transform,
                                       temporal_transform)
    opt.residual_only = 0
    compressed_data = get_validation_set(opt, spatial_transform,
                                         temporal_transform)
    opt.compressed = 0  ###super important this will take data from normal rgb frames
    standard_data = get_validation_set(opt, spatial_transform,
                                       temporal_transform)

    residual_data_loader = torch.utils.data.DataLoader(
        compressed_data,
        batch_size=opt.batch_size,
        shuffle=False,
        num_workers=opt.n_threads,
        pin_memory=True)
    compressed_data_loader = torch.utils.data.DataLoader(
        compressed_data,
示例#20
0
                              weight_decay=opt.weight_decay,
                              nesterov=opt.nesterov)
        scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
                                                   'min',
                                                   patience=opt.lr_patience)
    if not opt.no_val:
        spatial_transform = Compose([
            Scale(opt.sample_size),
            CenterCrop(opt.sample_size),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = LoopPadding(opt.sample_duration)
        target_transform = ClassLabel()
        validation_data = get_validation_set(opt,
                                             spatial_transform,
                                             temporal_transform,
                                             target_transform,
                                             image_type=opt.image_type)
        val_loader = torch.utils.data.DataLoader(validation_data,
                                                 batch_size=opt.batch_size,
                                                 shuffle=False,
                                                 num_workers=opt.n_threads,
                                                 pin_memory=True)
        val_logger = Logger(os.path.join(opt.result_path, 'val.log'),
                            ['epoch', 'loss', 'acc'])

    if opt.resume_path:
        print('loading checkpoint {}'.format(opt.resume_path))
        checkpoint = torch.load(opt.resume_path)
        assert opt.arch == checkpoint['arch']
                                                 [15, 25, 40, 45, 50, 55, 60],
                                                 gamma=0.1)

    if not opt.no_val:

        ##--------------------------------------------------------------------------------------------
        if opt.model == 'I3D':
            spatial_transform = Compose([
                Scale((256, 256)),
                CenterCrop(224),
                ToTensor(opt.norm_value), norm_method
            ])
            temporal_transform = LoopPadding(0)
            target_transform = ClassLabel()
            validation_data = get_validation_set(opt, spatial_transform,
                                                 temporal_transform,
                                                 target_transform)
            val_loader = torch.utils.data.DataLoader(validation_data,
                                                     batch_size=1,
                                                     shuffle=False,
                                                     num_workers=opt.n_threads,
                                                     pin_memory=True)
        elif opt.model == 'resnet_50':
            spatial_transform = Compose([
                Scale(256),
                CenterCrop(256),
                ToTensor(opt.norm_value), norm_method
            ])
            temporal_transform = TemporalCenterCrop(opt.sample_duration, 1)
            target_transform = ClassLabel()
            validation_data = get_validation_set(opt, spatial_transform,
示例#22
0
def main():
    opt = parse_opts()

    ecd_name, cls_name = opt.model_name.split('-')
    ecd_model = get_encoder_net(ecd_name)
    cls_model = get_end_net(cls_name)

    cfg.encoder_model = ecd_name
    cfg.classification_model = cls_name

    if opt.debug:
        cfg.debug = opt.debug
    else:
        if opt.tensorboard == 'TEST':
            cfg.tensorboard = opt.model_name
        else:
            cfg.tensorboard = opt.tensorboard
            cfg.flag = opt.flag
    model = cls_model(cfg,
                      encoder=CNNencoder(
                          cfg,
                          ecd_model(pretrained=True, path=opt.encoder_model)))
    cfg.video_path = os.path.join(cfg.root_path, cfg.video_path)
    cfg.annotation_path = os.path.join(cfg.root_path, cfg.annotation_path)

    cfg.list_all_member()

    torch.manual_seed(cfg.manual_seed)
    print('##########################################')
    print('####### model 仅支持单GPU')
    print('##########################################')
    model = model.cuda()
    print(model)
    criterion = nn.CrossEntropyLoss()
    if cfg.cuda:
        criterion = criterion.cuda()

    norm_method = Normalize([0, 0, 0], [1, 1, 1])

    print('##########################################')
    print('####### train')
    print('##########################################')
    assert cfg.train_crop in ['random', 'corner', 'center']
    if cfg.train_crop == 'random':
        crop_method = (cfg.scales, cfg.sample_size)
    elif cfg.train_crop == 'corner':
        crop_method = MultiScaleCornerCrop(cfg.scales, cfg.sample_size)
    elif cfg.train_crop == 'center':
        crop_method = MultiScaleCornerCrop(cfg.scales,
                                           cfg.sample_size,
                                           crop_positions=['c'])
    spatial_transform = Compose([
        crop_method,
        RandomHorizontalFlip(),
        ToTensor(cfg.norm_value), norm_method
    ])
    temporal_transform = TemporalRandomCrop(cfg.sample_duration)
    target_transform = ClassLabel()
    training_data = get_training_set(cfg, spatial_transform,
                                     temporal_transform, target_transform)
    train_loader = torch.utils.data.DataLoader(training_data,
                                               batch_size=cfg.batch_size,
                                               shuffle=True,
                                               num_workers=cfg.n_threads,
                                               drop_last=False,
                                               pin_memory=True)
    optimizer = model.get_optimizer(lr1=cfg.lr, lr2=cfg.lr2)
    scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
                                               'min',
                                               patience=cfg.lr_patience)
    print('##########################################')
    print('####### val')
    print('##########################################')
    spatial_transform = Compose([
        Scale(cfg.sample_size),
        CenterCrop(cfg.sample_size),
        ToTensor(cfg.norm_value), norm_method
    ])
    temporal_transform = LoopPadding(cfg.sample_duration)
    target_transform = ClassLabel()
    validation_data = get_validation_set(cfg, spatial_transform,
                                         temporal_transform, target_transform)
    val_loader = torch.utils.data.DataLoader(validation_data,
                                             batch_size=cfg.batch_size,
                                             shuffle=False,
                                             num_workers=cfg.n_threads,
                                             drop_last=False,
                                             pin_memory=True)
    print('##########################################')
    print('####### run')
    print('##########################################')
    if cfg.debug:
        logger = None
    else:
        path = get_log_dir(cfg.logdir, name=cfg.tensorboard, flag=cfg.flag)
        logger = Logger(logdir=path)
        cfg.save_config(path)

    for i in range(cfg.begin_epoch, cfg.n_epochs + 1):
        train_epoch(i, train_loader, model, criterion, optimizer, cfg, logger)
        validation_loss = val_epoch(i, val_loader, model, criterion, cfg,
                                    logger)

        scheduler.step(validation_loss)
示例#23
0
文件: main.py 项目: hangxu124/3DAE
        scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
                                                   'min',
                                                   patience=opt.lr_patience)
    if not opt.no_val:
        spatial_transform = Compose([
            Scale(opt.sample_size),
            CenterCrop(opt.sample_size),
            ToTensor(opt.norm_value), norm_method
        ])
        #temporal_transform = LoopPadding(opt.sample_duration)
        temporal_transform = TemporalCenterCrop(opt.sample_duration,
                                                opt.downsample)
        target_transform = ClassLabel()

        validation_data1 = get_validation_set(opt, 'all', 'top',
                                              spatial_transform,
                                              temporal_transform,
                                              target_transform)
        #validation_data2 = get_validation_set(
        #    opt, 'N', spatial_transform, temporal_transform, target_transform)
        #print ("@@@@@@@@@@@@@@@@@@@2",validation_data1.__len__())
        val_loader1 = torch.utils.data.DataLoader(validation_data1,
                                                  batch_size=8,
                                                  shuffle=False,
                                                  num_workers=opt.n_threads,
                                                  pin_memory=True,
                                                  drop_last=True)
        #val_loader2 = torch.utils.data.DataLoader(
        #    validation_data2,
        #    batch_size=8,
        #    shuffle=True,
        #    num_workers=opt.n_threads,
示例#24
0
            lr=opt.learning_rate,
            momentum=opt.momentum,
            dampening=dampening,
            weight_decay=opt.weight_decay,
            nesterov=opt.nesterov)
        scheduler = lr_scheduler.ReduceLROnPlateau(
            optimizer, 'min', patience=opt.lr_patience)
    if not opt.no_val:
        spatial_transform = Compose([
            Scale(opt.sample_size),
            CenterCrop(opt.sample_size),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = LoopPadding(opt.sample_duration)
        target_transform = ClassLabel()
        validation_data = get_validation_set(
            opt, spatial_transform, temporal_transform, target_transform)
        val_loader = torch.utils.data.DataLoader(
            validation_data,
            batch_size=opt.batch_size,
            shuffle=False,
            num_workers=opt.n_threads,
            pin_memory=True)
        val_logger = Logger(
            os.path.join(opt.result_path, 'val.log'), ['epoch', 'loss', 'acc'])

    if opt.resume_path:
        print('loading checkpoint {}'.format(opt.resume_path))
        checkpoint = torch.load(opt.resume_path)
        assert opt.arch == checkpoint['arch']

        opt.begin_epoch = checkpoint['epoch']
示例#25
0
                              dampening=dampening,
                              weight_decay=opt.weight_decay,
                              nesterov=opt.nesterov)
        scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
                                                   'min',
                                                   patience=opt.lr_patience)
    if not opt.no_val:
        spatial_transform = Compose([
            Scale(opt.sample_size),
            CenterCrop(opt.sample_size),
            ToTensor(opt.norm_value), norm_method
        ])
        temporal_transform = LoopPadding(opt.sample_duration)
        target_transform = ClassLabel()
        validation_data = get_validation_set(opt, spatial_transform,
                                             temporal_transform,
                                             target_transform)
        val_loader = torch.utils.data.DataLoader(validation_data,
                                                 batch_size=opt.batch_size,
                                                 shuffle=False,
                                                 num_workers=opt.n_threads,
                                                 pin_memory=True)
        val_logger = Logger(os.path.join(opt.result_path, 'val.log'),
                            ['epoch', 'loss', 'acc'])

    if opt.resume_path:
        print('loading checkpoint {}')  # .format(opt.resume_path))
        checkpoint = torch.load(opt.resume_path)
        assert opt.arch == checkpoint['arch']

        opt.begin_epoch = checkpoint['epoch']
示例#26
0
def main():
    opt = parse_opts()
    # Path configurations
    opt.annotation_path = os.path.join(opt.annotation_directory,
                                       opt.annotation_path)
    save_result_dir_name = \
        os.path.join(opt.result_path,
                     get_prefix() + '_{}{}_{}_epochs'.format(opt.model, opt.model_depth, opt.n_epochs))
    if not os.path.exists(save_result_dir_name):
        os.mkdir(save_result_dir_name)
    opt.result_path = os.path.join(opt.result_path, save_result_dir_name)

    # For data generator
    opt.scales = [opt.initial_scale]
    for epoch in range(1, opt.n_scales):
        opt.scales.append(opt.scales[-1] * opt.scale_step)
    opt.arch = '{}-{}'.format(opt.model, opt.model_depth)

    # Model
    model, parameters = generate_model(opt)
    # print(model)

    # Loss function
    criterion = nn.CrossEntropyLoss()
    if not opt.no_cuda:
        criterion = criterion.cuda()

    # Normalizing
    if not opt.no_mean_norm:
        opt.mean = get_mean(opt.norm_value, dataset=opt.mean_dataset)
        opt.std = get_std(opt.norm_value, dataset=opt.std_dataset)
        norm_method = Normalize(opt.mean, opt.std)
    else:
        norm_method = Normalize([0, 0, 0], [1, 1, 1])

    print(opt)
    with open(os.path.join(opt.result_path, 'opts.json'), 'w') as opt_file:
        json.dump(vars(opt), opt_file)

    # **************************** TRAINING CONFIGURATIONS ************************************
    assert opt.train_crop in ['corner', 'center']
    if opt.train_crop == 'corner':
        crop_method = MultiScaleCornerCrop(opt.scales, opt.sample_size)
    elif opt.train_crop == 'center':
        crop_method = MultiScaleCornerCrop(opt.scales,
                                           opt.sample_size,
                                           crop_positions=['c'])

    # Пространственное преобразование
    spatial_transform = Compose([
        crop_method,
        #RandomHorizontalFlip(),
        ToTensor(opt.norm_value),
        norm_method
    ])
    # Временное преобразование
    temporal_transform = TemporalRandomCrop(opt.sample_duration)
    # Целевое преобразование
    target_transform = ClassLabel()

    train_loader_list = []
    if not opt.no_cross_validation:
        annotation_list = os.listdir(opt.annotation_directory)
        for annotation in annotation_list:
            opt.annotation_path = os.path.join(opt.annotation_directory,
                                               annotation)
            training_data = get_training_set(opt, spatial_transform,
                                             temporal_transform,
                                             target_transform)
            train_loader = torch.utils.data.DataLoader(
                training_data,
                batch_size=opt.batch_size,
                shuffle=True,
                num_workers=opt.n_threads,
                pin_memory=True)
            train_loader_list.append(train_loader)
    else:
        training_data = get_training_set(opt, spatial_transform,
                                         temporal_transform, target_transform)
        train_loader = torch.utils.data.DataLoader(training_data,
                                                   batch_size=opt.batch_size,
                                                   shuffle=True,
                                                   num_workers=opt.n_threads,
                                                   pin_memory=True)
        train_loader_list.append(train_loader)

    train_logger = Logger(os.path.join(opt.result_path, 'train.log'),
                          ['epoch', 'loss', 'acc', 'lr'])
    train_batch_logger = Logger(
        os.path.join(opt.result_path, 'train_batch.log'),
        ['epoch', 'batch', 'iter', 'loss', 'acc', 'lr'])

    optimizer = optim.SGD(parameters,
                          lr=opt.learning_rate,
                          momentum=opt.momentum,
                          dampening=opt.dampening,
                          weight_decay=opt.weight_decay)

    scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
                                               'min',
                                               patience=opt.lr_patience)

    # ***************************** VALIDATION CONFIGURATIONS *********************************
    spatial_transform = Compose([
        Scale(opt.sample_size),
        CenterCrop(opt.sample_size),
        ToTensor(opt.norm_value), norm_method
    ])
    temporal_transform = LoopPadding(opt.sample_duration)
    target_transform = ClassLabel()

    val_loader_list = []
    if not opt.no_cross_validation:
        annotation_list = os.listdir(opt.annotation_directory)
        for annotation in annotation_list:
            opt.annotation_path = os.path.join(opt.annotation_directory,
                                               annotation)
            validation_data = get_validation_set(opt, spatial_transform,
                                                 temporal_transform,
                                                 target_transform)
            val_loader = torch.utils.data.DataLoader(validation_data,
                                                     batch_size=opt.batch_size,
                                                     shuffle=False,
                                                     num_workers=opt.n_threads,
                                                     pin_memory=True)
            val_loader_list.append(val_loader)
    else:
        validation_data = get_validation_set(opt, spatial_transform,
                                             temporal_transform,
                                             target_transform)
        val_loader = torch.utils.data.DataLoader(validation_data,
                                                 batch_size=opt.batch_size,
                                                 shuffle=False,
                                                 num_workers=opt.n_threads,
                                                 pin_memory=True)
        val_loader_list.append(val_loader)

    val_logger = Logger(os.path.join(opt.result_path, 'val.log'),
                        ['epoch', 'loss', 'acc'])

    # **************************************** TRAINING ****************************************
    epoch_avg_time = AverageMeter()
    train_loss_list = []
    train_acc_list = []
    valid_acc_list = []
    best_accuracy = 0
    current_train_data = 0
    current_valid_data = 0
    opt.frequence_cross_validation = round(opt.n_epochs /
                                           opt.n_cross_validation_sets + 0.5)

    for epoch in range(opt.begin_epoch, opt.n_epochs + 1):
        epoch_start_time = time.time()
        print('Epoch #' + str(epoch))

        # optimizer = regulate_learning_rate(optimizer, epoch, opt.frequence_regulate_lr)

        train_loader = train_loader_list[current_train_data]
        if not opt.no_cross_validation and epoch % opt.frequence_cross_validation == 0:
            print('\t##### Cross-validation: switch training data #####')
            current_train_data = (current_train_data +
                                  1) % len(train_loader_list)
            train_loader = train_loader_list[current_train_data]
        train_loss, train_acc = train_epoch(epoch, train_loader, model,
                                            criterion, optimizer, opt,
                                            train_logger, train_batch_logger)

        val_loader = val_loader_list[current_valid_data]
        if not opt.no_cross_validation and epoch % opt.frequence_cross_validation == 0:
            print('\t##### Cross-validation: switch validation data #####')
            current_valid_data = (current_valid_data +
                                  1) % len(val_loader_list)
            val_loader = val_loader_list[current_valid_data]
        validation_acc = val_epoch(epoch, val_loader, model, criterion, opt,
                                   val_logger)

        train_loss_list.append(train_loss)
        train_acc_list.append(train_acc)
        valid_acc_list.append(validation_acc)

        # Save model with best accuracy
        if validation_acc > best_accuracy:
            best_accuracy = validation_acc
            save_file_path = os.path.join(opt.result_path, 'best_model.pth')
            states = {
                'epoch': epoch + 1,
                'arch': opt.arch,
                'state_dict': model.state_dict(),
                'optimizer': optimizer.state_dict()
            }
            torch.save(states, save_file_path)

        epoch_end_time = time.time() - epoch_start_time
        epoch_avg_time.update(epoch_end_time)
        print('\tTime left: ' +
              str(round(epoch_avg_time.avg *
                        (opt.n_epochs - epoch) / 60, 1)) + ' minutes')

    # ******************************* SAVING RESULTS OF TRAINING ******************************
    save_pictures(np.linspace(1, opt.n_epochs, opt.n_epochs),
                  train_loss_list, 'red', 'Loss',
                  os.path.join(opt.result_path, 'train_loss.png'))
    save_pictures(np.linspace(1, opt.n_epochs, opt.n_epochs), train_acc_list,
                  'blue', 'Accuracy',
                  os.path.join(opt.result_path, 'train_accuracy.png'))
    save_pictures(np.linspace(1, opt.n_epochs, opt.n_epochs), valid_acc_list,
                  'blue', 'Accuracy',
                  os.path.join(opt.result_path, 'validation_accuracy.png'))