Logo elodees  elodees

A caring AI for a better world













Only alphabetic characters accented or not as well as the space are accepted

Logo IA




Socially Acceptable Trajectories with Generative Adversarial Networks (SocialGAN)





No account yet ?

Sign up to access all content




SocialGAN Model



Tensorflow playground


evaluate_model.py



Tested in Anaconda and Python 3.7

import argparse
import os
import torch
 
from attrdict import AttrDict
 
from sgan.data.loader import data_loader
from sgan.models import TrajectoryGenerator
from sgan.losses import displacement_error, final_displacement_error
from sgan.utils import relative_to_abs, get_dset_path
 
parser = argparse.ArgumentParser()
parser.add_argument('--model_path', type=str)
parser.add_argument('--num_samples', default=20, type=int)
parser.add_argument('--dset_type', default='test', type=str)
 
 
def get_generator(checkpoint):
    args = AttrDict(checkpoint['args'])
    generator = TrajectoryGenerator(
        obs_len=args.obs_len,
        pred_len=args.pred_len,
        embedding_dim=args.embedding_dim,
        encoder_h_dim=args.encoder_h_dim_g,
        decoder_h_dim=args.decoder_h_dim_g,
        mlp_dim=args.mlp_dim,
        num_layers=args.num_layers,
        noise_dim=args.noise_dim,
        noise_type=args.noise_type,
        noise_mix_type=args.noise_mix_type,
        pooling_type=args.pooling_type,
        pool_every_timestep=args.pool_every_timestep,
        dropout=args.dropout,
        bottleneck_dim=args.bottleneck_dim,
        neighborhood_size=args.neighborhood_size,
        grid_size=args.grid_size,
        batch_norm=args.batch_norm)
    generator.load_state_dict(checkpoint['g_state'])
    generator.cuda()
    generator.train()
    return generator
 
 
def evaluate_helper(error, seq_start_end):
    sum_ = 0
    error = torch.stack(error, dim=1)
 
    for (start, end) in seq_start_end:
        start = start.item()
        end = end.item()
        _error = error[start:end]
        _error = torch.sum(_error, dim=0)
        _error = torch.min(_error)
        sum_ += _error
    return sum_
 
 
def evaluate(args, loader, generator, num_samples):
    ade_outer, fde_outer = [], []
    total_traj = 0
    with torch.no_grad():
        for batch in loader:
            batch = [tensor.cuda() for tensor in batch]
            (obs_traj, pred_traj_gt, obs_traj_rel, pred_traj_gt_rel,
             non_linear_ped, loss_mask, seq_start_end) = batch
 
            ade, fde = [], []
            total_traj += pred_traj_gt.size(1)
 
            for _ in range(num_samples):
                pred_traj_fake_rel = generator(
                    obs_traj, obs_traj_rel, seq_start_end
                )
                pred_traj_fake = relative_to_abs(
                    pred_traj_fake_rel, obs_traj[-1]
                )
                ade.append(displacement_error(
                    pred_traj_fake, pred_traj_gt, mode='raw'
                ))
                fde.append(final_displacement_error(
                    pred_traj_fake[-1], pred_traj_gt[-1], mode='raw'
                ))
 
            ade_sum = evaluate_helper(ade, seq_start_end)
            fde_sum = evaluate_helper(fde, seq_start_end)
 
            ade_outer.append(ade_sum)
            fde_outer.append(fde_sum)
        ade = sum(ade_outer) / (total_traj * args.pred_len)
        fde = sum(fde_outer) / (total_traj)
        return ade, fde
 
 
def main(args):
    if os.path.isdir(args.model_path):
        filenames = os.listdir(args.model_path)
        filenames.sort()
        paths = [
            os.path.join(args.model_path, file_) for file_ in filenames
        ]
    else:
        paths = [args.model_path]
 
    for path in paths:
        checkpoint = torch.load(path)
        generator = get_generator(checkpoint)
        _args = AttrDict(checkpoint['args'])
        path = get_dset_path(_args.dataset_name, args.dset_type)
        _, loader = data_loader(_args, path)
        ade, fde = evaluate(_args, loader, generator, args.num_samples)
        print('Dataset: {}, Pred Len: {}, ADE: {:.2f}, FDE: {:.2f}'.format(
            _args.dataset_name, _args.pred_len, ade, fde))
 
 
if __name__ == '__main__':
    args = parser.parse_args()
    main(args)
 


sgan

License: MITLicenseMIT  Copyright (c) 2018 Agrim Gupta, Justin Johnson


GitHub



python scripts/evaluate_model.py --model_path models/sgan-models

Dataset: eth, Pred Len: 12, ADE: 0.70, FDE: 1.26
Dataset: eth, Pred Len: 8, ADE: 0.58, FDE: 1.15
Dataset: hotel, Pred Len: 12, ADE: 0.48, FDE: 1.03
Dataset: hotel, Pred Len: 8, ADE: 0.36, FDE: 0.71
Dataset: univ, Pred Len: 12, ADE: 0.56, FDE: 1.18
Dataset: univ, Pred Len: 8, ADE: 0.33, FDE: 0.70
Dataset: zara1, Pred Len: 12, ADE: 0.33, FDE: 0.68
Dataset: zara1, Pred Len: 8, ADE: 0.21, FDE: 0.42
Dataset: zara2, Pred Len: 12, ADE: 0.31, FDE: 0.65
Dataset: zara2, Pred Len: 8, ADE: 0.21, FDE: 0.42



Human movement is interpersonal, multimodal and follows social conventions.

In this paper, they address this problem by combining sequence prediction tools and generative adversarial networks in which a recurrent sequence-to-sequence model observes movement histories and predicts future behavior using a novel pooling mechanism to aggregate information between people.

Below they show examples of socially acceptable predictions made by the model in complex scenarios.

Each person is designated by a different color. We denote the observed trajectory by points and the predicted trajectory by stars.



Tensorflow playground


Tensorflow playground












Welcome, my name is Eric Soupet and I am the administrator of the site elodees.com. elodees.com is a state of the art of Artificial Intelligence and aims to be collaborative, you can now offer content such as articles, events, tutorials, ... so don't hesitate !

Platform images credit : Pixabay - Pixabay License | Pexels - Pexels License