Logo elodees  elodees

Une IA bien-veillante pour un monde meilleur













Seuls les caractères alphabétiques accentués ou non ainsi que l'espace sont acceptés

Logo IA




Trajectoires socialement acceptables avec des réseaux antagonistes génératifs





Pas encore de compte ?

Inscrivez-vous pour accéder à tous les contenus




Modele SocialGAN



Tensorflow playground


evaluate_model.py



Testé sous Anaconda et 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



Le mouvement humain est interpersonnel, multimodal et suit les conventions sociales.

Dans cet article, ils abordent ce problème en combinant des outils de prédiction de séquence et des réseaux antagonistes génératifs dans lequel un modèle séquence à séquence récurrent observe les historiques de mouvement et prédit le comportement futur en utilisant un nouveau mécanisme de mise en commun pour agréger les informations entre les personnes.

Ci-dessous, ils montrent des exemples de prédictions socialement acceptables faites par le modèle dans des scénarios complexes.

Chaque personne est désignée par une couleur différente. On note la trajectoire observée par des points et la trajectoire prédite par des étoiles.



Tensorflow playground


Tensorflow playground












Bienvenu, je m’appelle Eric Soupet et je suis l'administrateur du site elodees.com. elodees.com est un état de l'art de l'Intelligence Artificielle et se veut collaboratif, vous pouvez dès à présent proposer du contenu tels que des articles, des événements, des tutoriels, ... alors n'hésitez pas !

Crédit des images de la plate-forme : Pixabay - Pixabay License | Pexels - Pexels License