Ejemplo n.º 1
0
def main():
	global args, best_prec1, model, train_dataset, val_dataset
	args = parser.parse_args()


	logging.basicConfig(
		format="%(message)s",
		handlers=[
			logging.FileHandler("{0}/{1}.log".format(args.log, sys.argv[0].replace('.py','') + datetime.now().strftime('_%H_%M_%d_%m_%Y'))),
			logging.StreamHandler()
		],
		level=logging.INFO)

	# create model
	# if args.pretrained:
	# 	pass
	# 	# logging.info("=> using pre-trained model '{}'".format(args.arch))
	# 	# model = models.__dict__[args.arch](pretrained=True)
	# else:
	# logging.info("=> creating model '{}'".format(args.arch))

	model = SpatioTemporalSaliency(CONFIG)
	model._initialize_weights()
	model.eval()


	# define loss function (criterion) and optimizer
	criterion = nn.BCELoss().cuda()

	for param in model.parameters():
		param.requires_grad = False

	# optionally resume from a checkpoint
	cudnn.benchmark = True

	# Data loading code
	config = CONFIG.copy()

	epochs = args.epochs
	users = 15
	len_dataset = 700
	masks = np.zeros((epochs, users, len_dataset, 8, 75, 100), dtype=np.float16)

	bad_list = set([231,310,372,317,436,441,447,541,535,675,661])

	for epoch in range(1,epochs+1):
		print('starting forward pass for epoch {0}'.format(epoch))
		for user in CONFIG['test']:
			print('starting user {0}'.format(user+1))
			config['test'] = [user]
			test_dataset = SequnceDataset(config, 'train')

			# Let's resume weights.
			w_path = os.path.join(args.weights, '{0}_{1}.pth.tar'.format(user, epoch))
			if os.path.isfile(w_path):
				logging.info("=> loading checkpoint '{}'".format(args.resume))
				checkpoint = torch.load(w_path)
				args.start_epoch = checkpoint['epoch']
				model.load_state_dict(checkpoint['state_dict'])
				logging.info("=> loaded checkpoint '{}' (epoch {})"
					  .format(args.resume, checkpoint['epoch']))
			else:
				logging.info("=> no checkpoint found at '{}'".format(args.resume))

			start = time.time()
			for img_idx, (input, sal, target, img_path) in enumerate(test_dataset):
				img_idx = int(img_path.split('/')[-1].split('.jpg')[0]) - 1001
				print(epoch, user, img_idx, len(test_dataset))
				if img_idx in bad_list:
					continue
				# measure data loading time
				input_var = torch.autograd.Variable(input, volatile=True).cuda(0)
				output = model([input_var, sal, target, img_path])
				masks[epoch-1][user][img_idx] = output[0,0]

				img = Image.open(img_path)
				w, h = img.size

				len_out = output.shape[0]

				counter = 0
				path = os.path.join(args.visualize, str(user), str(epoch))
				if not os.path.exists(path):
					os.makedirs(path)

				for seq_idx, tar in enumerate(output):
					if seq_idx >= len_out:
						break
					mask = np.array(output[seq_idx][0] * 255, dtype=np.uint8)
					mask = Image.fromarray(mask).resize((w,h)).convert('RGB')
					saliency = np.array(tar * 255, dtype=np.uint8)
					saliency = Image.fromarray(saliency).resize((w,h)).convert('RGB')

					out = Image.new('RGB', (w, h*2))
					out.paste(Image.blend(img, mask, alpha=0.7).convert('RGB'), (0,0))
					out.paste(Image.blend(img, saliency, alpha=0.7).convert('RGB'),(0,h))

					out_path = os.path.join(path, '{0}-{1}.jpg'.format(img_idx, seq_idx))
					out.save(out_path)

			print(time.time()-start)
Ejemplo n.º 2
0
def main():
    global args, best_prec1, model, train_dataset, val_dataset

    args = parser.parse_args()

    #
    #	# Data loading code
    config = CONFIG.copy()

    mode = args.mode

    for model_name in MODELS:
        # setting up the logger.
        log = logging.getLogger()
        for hdlr in log.handlers[:]:
            if isinstance(hdlr, logging.FileHandler):
                log.removeHandler(hdlr)

        logging.basicConfig(
            format="%(message)s",
            handlers=[
                logging.FileHandler("{0}/{1}-{2}.log".format(
                    args.log, model_name, sys.argv[0].replace('.py', '') +
                    datetime.now().strftime('_%H_%M_%d_%m_%Y'))),
                logging.StreamHandler()
            ],
            level=logging.INFO)

        for user in CONFIG[mode]['users']:
            config[mode]['users'] = [user]
            config['model']['name'] = model_name

            train_dataset = SequnceDataset(config, mode)

            #logging.info("=> creating model'{}'".format(args.arch))
            if config['model']['type'] == 'RNN':
                model = RNNSaliency(config)
            else:
                pass

            model._initialize_weights(pretrained=True)
            # model = model.cuda()

            for param in model.encoder.parameters():
                param.requires_grad = False

            criterion = nn.BCELoss().cuda()
            # criterion = nn.MSELoss().cuda()

            optimizer = torch.optim.Adam(
                # list(model.readout.parameters()) +\
                model.decoder.parameters(),
                config['train']['lr'],
                betas=(0.9, 0.999),
                eps=1e-08,
                weight_decay=config['train']['weight_decay'])

            # optimizer = torch.optim.SGD(
            # 							# list(model.readout.parameters()) +\
            # 							list(model.decoder.parameters()),
            # 							config['train']['lr'],
            # 							momentum=args.momentum,
            # 							weight_decay=config['train']['weight_decay'])

            # if args.resume:
            # 	if os.path.isfile(args.resume):
            # 		logging.info("=> loading checkpoint '{}'".format(args.resume))
            # 		checkpoint = torch.load(args.resume)
            # 		args.start_epoch = checkpoint['epoch']
            # 		# best_prec1 = checkpoint['best_prec1']
            # 		model.load_state_dict(checkpoint['state_dict'])
            # 		optimizer.load_state_dict(checkpoint['optimizer'])
            # 		logging.info("=> loaded checkpoint '{}' (epoch {})"
            # 			  .format(args.resume, checkpoint['epoch']))
            # 	else:
            # 		logging.info("=> no checkpoint found at '{}'".format(args.resume))

            # train_loader = train_dataset
            # train_loader = torch.utils.data.DataLoader(
            # 	train_dataset, batch_size=args.batch_size, shuffle=False,
            # 	num_workers=args.workers, pin_memory=True, sampler=None)

            # val_loader = torch.utils.data.DataLoader(
            # 	Saliency( CONFIG, 'test'),
            # 	batch_size=args.batch_size, shuffle=False,
            # 	num_workers=args.workers, pin_memory=True)

            # if args.evaluate:
            # 	validate(val_loader, model, criterion)
            # 	return

            # if args.visualize:
            # 	visualize(train_loader, model, user, epoch)
            # 	return

            for epoch in range(args.start_epoch, args.epochs):

                adjust_learning_rate(optimizer, epoch)

                # train for one epoch
                train(train_dataset, model, criterion, optimizer, epoch,
                      config)

                # evaluate on validation set
                #if epoch%10 == 0:
                validate(train_dataset, model, criterion, user, epoch, config)

                # visualize(train_loader, model, str(user), str(epoch))

                # remember best prec@1 and save checkpoint
                # is_best = prec1 > best_prec1

                # best_prec1 = max(prec1, best_prec1)

                save_checkpoint({
                    'epoch': epoch + 1,
                    'user': user,
                    'arch': config['model']['name'],
                    'state_dict': model.state_dict(),
                    # 'best_prec1': best_prec1,
                    # 'optimizer' : optimizer.state_dict(),
                })