def train_social_model(out_dir: str, config: ModelConfig) -> None:
    # load data
    train_data, test_data = provide_train_test(config)

    # prepare train data
    obs_len_train, pred_len_train = obs_pred_split(config.obs_len,
                                                   config.pred_len,
                                                   *train_data)
    x_obs_len_train, _, grid_obs_len_train, zeros_obs_len_train = obs_len_train
    _, y_pred_len_train, _, _ = pred_len_train

    # prepare test data
    obs_len_test, pred_len_test = obs_pred_split(config.obs_len,
                                                 config.pred_len, *test_data)
    x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test
    _, y_pred_len_test, _, _ = pred_len_test

    os.makedirs(out_dir, exist_ok=True)

    # training
    my_model = MySocialModel(config)
    print(config.steps_per_epoch)
    # history = my_model.train_model.fit_generator(
    #     train_generator([x_obs_len_train, grid_obs_len_train, zeros_obs_len_train, y_pred_len_train], config.batch_size),
    #     # batch_size=config.batch_size,
    #     epochs=config.n_epochs,
    #     verbose=1,
    #     steps_per_epoch=config.steps_per_epoch,
    #     validation_data=(
    #         [x_obs_len_test, grid_obs_len_test, zeros_obs_len_test],
    #         y_pred_len_test
    #     )
    # )
    history = my_model.train_model.fit(
        [x_obs_len_train, grid_obs_len_train, zeros_obs_len_train],
        y_pred_len_train,
        batch_size=config.batch_size,
        epochs=config.n_epochs,
        verbose=1,
        # steps_per_epoch=config.steps_per_epoch,
        validation_data=([
            x_obs_len_test, grid_obs_len_test, zeros_obs_len_test
        ], y_pred_len_test))

    # save the trained model weights
    weights_file = os.path.join(out_dir,
                                _make_weights_file_name(config.n_epochs))
    my_model.train_model.save_weights(weights_file)

    history_file = os.path.join(out_dir, "history.json")
    dump_json_file(history.history, history_file)

    # save loss plot
    plt_save_loss(config, out_dir, history.history)
Example #2
0
def train_social_model(out_dir: str, config: ModelConfig) -> None:
    # load data
    train_data, test_data = provide_train_test(config)

    # prepare train data
    obs_len_train, pred_len_train = obs_pred_split(config.obs_len,
                                                   config.pred_len,
                                                   *train_data)
    x_obs_len_train, _, grid_obs_len_train, zeros_obs_len_train = obs_len_train
    _, y_pred_len_train, _, _ = pred_len_train

    # prepare test data
    obs_len_test, pred_len_test = obs_pred_split(config.obs_len,
                                                 config.pred_len, *test_data)
    x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test
    _, y_pred_len_test, _, _ = pred_len_test

    os.makedirs(out_dir, exist_ok=True)

    # training
    my_model = MySocialModel(config)
    history = my_model.train_model.fit(
        [x_obs_len_train, grid_obs_len_train, zeros_obs_len_train],
        y_pred_len_train,
        batch_size=config.batch_size,
        epochs=config.n_epochs,
        verbose=1,
        validation_data=([
            x_obs_len_test, grid_obs_len_test, zeros_obs_len_test
        ], y_pred_len_test))

    # save loss plot
    plt.plot(history.history["loss"])
    plt.plot(history.history["val_loss"])
    plt.title("social model loss")
    plt.ylabel("loss")
    plt.xlabel("epoch")
    plt.legend(["train", "test"], loc="upper right")
    plt.savefig(
        os.path.join(out_dir,
                     "test={}_loss.png".format(config.test_dataset_kind)))

    history_file = os.path.join(out_dir, "history.json")
    dump_json_file(history.history, history_file)

    # save the trained model weights
    weights_file = os.path.join(out_dir,
                                _make_weights_file_name(config.n_epochs))
    my_model.train_model.save_weights(weights_file)
Example #3
0
def main() -> None:
    args = _load_eval_args()
    config = load_model_config(args.trained_model_config)
    out_dir = os.path.join(os.path.dirname(args.trained_model_file), "eval")
    os.makedirs(out_dir, exist_ok=True)

    # load data
    _, test_data = provide_train_test(config)

    obs_len_test, pred_len_test = obs_pred_split(config.obs_len,
                                                 config.pred_len, *test_data)

    # load trained model weights
    my_model = MySocialModel(config)
    my_model.train_model.load_weights(args.trained_model_file)

    # first, predict `pred_len` sequences following observation sequence
    x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test
    x_pred_len_test, *_ = pred_len_test

    x_pred_len_model = my_model.sample_model.predict(
        [x_obs_len_test, grid_obs_len_test, zeros_obs_len_test],
        batch_size=config.batch_size,
        verbose=1)

    # --------------------------------------------------------------------------
    # visualization
    # --------------------------------------------------------------------------

    x_concat_test = np.concatenate([x_obs_len_test, x_pred_len_test], axis=1)
    x_concat_model = np.concatenate([x_obs_len_test, x_pred_len_model], axis=1)

    # visualize true and predicted trajectories, and save as png files
    out_fig_dir = os.path.join(out_dir, "figs")
    os.makedirs(out_fig_dir, exist_ok=True)
    for s in range(len(x_concat_test)):
        fig = visualize_trajectories(x_concat_test[s], x_concat_model[s],
                                     config.obs_len, config.pred_len)
        fig_file = os.path.join(out_fig_dir, "{0:04d}.png".format(s))
        fig.savefig(fig_file)
        plt.close(fig)

    # --------------------------------------------------------------------------
    # evaluation
    # --------------------------------------------------------------------------

    # evaluation
    ade = compute_abe(x_pred_len_test, x_pred_len_model)
    fde = compute_fde(x_pred_len_test, x_pred_len_model)
    report = {"ade": float(ade), "fde": float(fde)}

    # write to a json file
    report_file = os.path.join(out_dir, "report.json")
    with open(report_file, "w") as f:
        json.dump(report, f)

    print("Average displacement error: {}".format(ade))
    print("Final displacement error: {}".format(fde))
Example #4
0
def train_social_model(out_dir: str, config: ModelConfig) -> None:
    # 加载数据
    train_data, test_data = provide_train_test(config)

    # 训练数据
    obs_len_train, pred_len_train = obs_pred_split(config.obs_len,
                                                   config.pred_len,
                                                   *train_data)
    x_obs_len_train, _, grid_obs_len_train, zeros_obs_len_train = obs_len_train
    _, y_pred_len_train, _, _ = pred_len_train

    # 测试数据
    obs_len_test, pred_len_test = obs_pred_split(config.obs_len,
                                                 config.pred_len, *test_data)
    x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test
    _, y_pred_len_test, _, _ = pred_len_test

    os.makedirs(out_dir, exist_ok=True)

    # 训练部分,加载历史运动轨迹,batch_size,训练批次
    my_model = MySocialModel(config)
    print(config.steps_per_epoch)

    history = my_model.train_model.fit(
        [x_obs_len_train, grid_obs_len_train, zeros_obs_len_train],
        y_pred_len_train,
        batch_size=config.batch_size,
        epochs=config.n_epochs,
        verbose=1,
        validation_data=([
            x_obs_len_test, grid_obs_len_test, zeros_obs_len_test
        ], y_pred_len_test))

    # 保存训练权重
    weights_file = os.path.join(out_dir,
                                _make_weights_file_name(config.n_epochs))
    my_model.train_model.save_weights(weights_file)

    history_file = os.path.join(out_dir, "history.json")
    dump_json_file(history.history, history_file)

    # 保存训练过程loss曲线图
    plt_save_loss(config, out_dir, history.history)
def main() -> None:
    # 'circle', 'rect
    grid_type = 'rect'
    is_test = True

    args = _load_eval_args()
    config = load_model_config(args.trained_model_config)
    config.grid_type = grid_type
    config.test_dataset_kind = 'students003'

    out_dir = os.path.join(os.path.dirname(args.trained_model_file), "eval")
    os.makedirs(out_dir, exist_ok=True)

    # 加载数据
	
    _, test_data = provide_train_test(config, is_test=is_test)

    obs_len_test, pred_len_test = obs_pred_split(
        config.obs_len, config.pred_len, *test_data)

    # 加载训练权重
	
    my_model = MySocialModel(config)
    my_model.train_model.load_weights(args.trained_model_file)

    # obs_len代表历史运动序列;`pred_len`代表预测序列
	
    x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test
    x_pred_len_test, *_ = pred_len_test

    x_pred_len_model = my_model.sample_model.predict(
        [x_obs_len_test, grid_obs_len_test, zeros_obs_len_test],
        batch_size=config.batch_size, verbose=1)

    # --------------------------------------------------------------------------

    # --------------------------------------------------------------------------

    x_concat_test = np.concatenate([x_obs_len_test, x_pred_len_test], axis=1)
    x_concat_model = np.concatenate([x_obs_len_test, x_pred_len_model], axis=1)

    # 将预测坐标保存至person_n.txt文件
    out_fig_dir = os.path.join(out_dir, "figs")
    os.makedirs(out_fig_dir, exist_ok=True)
    for s in range(len(x_concat_test)):
        fig = visualize_trajectories(x_concat_test[s], x_concat_model[s],
                                     config.obs_len, config.pred_len)
        fig_file = os.path.join(out_fig_dir, "{0:04d}.person_n.txt".format(s))
        fig.savefig(fig_file)
        plt.close(fig)

    # --------------------------------------------------------------------------
    # 评估指标
    # --------------------------------------------------------------------------

    ade = compute_abe(x_pred_len_test, x_pred_len_model)
    fde = compute_fde(x_pred_len_test, x_pred_len_model)
    report = {"ade": float(ade), "fde": float(fde)}

    # 将定性测试结果保存为一个json文件,包含平均位移误差和最终位移误差
    report_file = os.path.join(out_dir, "report.json")
    with open(report_file, "w") as f:
        json.dump(report, f)

    print("Average displacement error: {}".format(ade))
    print("Final displacement error: {}".format(fde))