该示例为参考算法,仅作为在J5上模型部署的设计参考,非量产算法
0 性能精度指标
model | minFDE6(float/int) | minADE6(float/int) | MR(float/int) | batch1 帧率(J5/双核) | batch30 帧率(J5/双核) | batch1 latency(ms) | batch30 latency(ms) |
|---|---|---|---|---|---|---|---|
Densetnt | 1.29/1.30 | 0.737/0.741 | 0.101/0.102 | 1826 | 83.56 | 1.73 | 27.28 |
dataset | input_shape | topk | nms_threshold |
|---|---|---|---|
argoverse1 | 见下方注释1 | 150 | 2m |
注1:
"traj_feat": (N, 9, 19, 32) #[batch,轨迹点特征,轨迹点,车辆数]
"lane_feat":(N, 11, 9, 64) #[batch,道路矢量特征,矢量点,道路信息]
"instance_mask":(N, 1, 1, 96)#轨迹和道路的mask
"goals_2d":(N, 2, 1, 2048)#goal点坐标
"goals_2d_mask": (N, 1, 1, 2048)#goal点mask
1 模型介绍
DenseTNT为goals-based的轨迹预测模型,通过密集的目标状态集预测目标未来的状态,根据目标生成轨迹,整体pipeline如下图:

- Context encoder:使用vectorNet 对高精地图和车辆信息进行编码,得到要预测的车辆的全局特征;
- Goal encoder&Select:对密集的目标做编码,生成goals目标得分,筛选topk个goals;
- Complete trajectory:经过MLP层和自注意力操作,得到整条预测轨迹的state,最后经过NMS得到6个目标以及对应轨迹。
1.1 模型改动点
subgraph中去除了subgraphLayer每一层中的maxpool计算,便于性能上提升
encoder部分取消LaneGCN
去除Lane scoring和dense goal的概率估计
后处理部分goal的筛选使用NMS
1.2 源码说明
Config文件
train_set=dict(
...
)
dataloader=dict(...)
val_data_loader=dict(...)
#callbacks 定义
stat_callback = dict(...)
ckpt_callback = dict(...)
val_callback = dict(...)
#训练策略配置
float_trainer=dict(...)
calibration_trainer=dict(...)
qat_trainer=dict(...)
int_infer_trainer=dict(...)
#编译设置
compile_cfg = dict(...)
# predictor
float_predictor = dict(...)
calibration_predictor= dict(...)
qat_predictor = dict(...)
int_infer_predictor= dict(...)
注: 如果需要复现精度,config中的训练策略最好不要修改。否则可能会有意外的训练情况出现。
Vectornet

Input vectors
polyline subgraphs
global interaction graph
Input vectors
对于graph中的轨迹或道路信息都可以通过不同的采样方式得到向量表示,如下图:

traj_feat(轨迹特征):[batch,轨迹点特征,轨迹点,车辆数]-->[1, 9, 19, 32]
Argoverse中的轨迹信息包括几种不同的类型:
1.Agent (需要预测的车辆)
2.AV (自车)
3.Others 其他车辆
Argoverse 1中每个轨迹是一共时长2秒,50个轨迹点。前20个点作为输入值,预测Agent的后30个轨迹点。轨迹信息的纬度目前是9维.
道路信息是从HD map里获得,需下载相应的map。道路信息目前有11维:
polyline subgraphs
polyline是全连接的,同一条折线(polyline)上的节点构成一张子图(subgraph),为了减少计算量,对traj和lane分别做subgraph提取,计算分为以下3个步骤:
step1: 对lane和traj做 encoder,encoder为MLP操作:
step2:将多层subgraph(layer num=3)做maxpool:

注:此处去除subgraphLayer每一层中的maxpool堆叠,仅最后做maxpooling,便于性能上提升
step3:将traj_feat和lane_feat做Cat
global interaction graph
为提取不同实例之间的交互特征,构建全局特征,将各个polyline node 经过一个GNN计算得到全局特征。
Densetnt
step1:构建Dense goals的SubGraph,融合graph_feat
获得得分的做法是self-attention,goals_feats为query,traj_feats为key和value。
step3: 经过一个linear后根据Score,选择topk个goals,k=150
在经过2个MLP层后做自注意力,然后经过2层MLP得到整条预测轨迹的state
模型输出为goals_preds, traj_preds, pred_goals:
Loss
Postprocess
使用NMS筛选goals,threshold=2,代码如下:
后处理输出为6个goals和6条轨迹traj(一条轨迹30个轨迹点)。
2 浮点模型训练
2.1 Before Start
2.1.1 环境部署
release_models获取路径见:scripts/configs/traj_pred/README.md
拉取docker环境
如需本地离线安装HAT,我们提供了训练环境的whl包,路径在ddk/package/host/ai_toolchain
2.1.2 数据下载
下载后,解压并按照如下方式组织文件夹结构:
2.1.3 数据打包
为了提升训练的速度,需要对数据信息文件做了一个打包,将其转换成lmdb格式的数据集。只需要运行下面的脚本,就可以成功实现格式转换:
--src-data-dir为解压后的argoverse数据集目录;
--target-data为打包后数据集的存储目录;
--num-worker为执行线程数
2.1.4 config配置
在进行模型训练和验证之前,需要对configs文件中的部分参数进行配置,一般情况下,我们需要配置以下参数:
device_ids、batch_size_per_gpu:根据实际硬件配置进行device_ids和每个gpu的batchsize的配置;
ckpt_dir:浮点、calib、量化训练的权重路径配置,权重下载链接在config文件夹下的README中;
data_rootdir:打包的lmdb数据集路径配置;
map_path :map_files文件夹的路径配置;
infer_cfg:指定模型输入,在infer脚本使用时需配置
2.2 浮点模型训练
2.3 浮点模型精度验证
验证完成后,会在终端输出float模型在验证集上的检测精度。
3 模型量化和编译
3.1 Calibration
3.2 Calibration 模型精度验证
calibration完成以后,可以使用以下命令验证经过calib后模型的精度:
验证完成后,会在终端输出calib模型在验证集上的检测精度。
3.3 量化模型训练
通过运行下面的脚本就可以开启模型的qat训练:
3.4 量化模型精度验证
量化模型的精度验证,只需要运行以下命令:
qat模型的精度验证对象为插入伪量化节点后的模型(float32);quantized模型的精度验证对象为定点模型(int8),验证的精度是最终的int8模型的真正精度,这两个精度应该是十分接近的。
3.5 仿真上板精度验证
除了上述模型验证之外,我们还提供和上板完全一致的精度验证方法,可以通过下面的方式完成:
3.6 量化模型编译
opt为优化等级,取值范围为0~3,数字越大优化等级越高,运行时间越长;
compile_perf脚本将生成.html文件和.hbm文件(compile文件目录下),.html文件为BPU上的运行性能,.hbm文件为上板实测文件。
4 其他工具
4.1 结果可视化
如果你希望可以看到训练出来的模型对于DenseTNT单帧的检测效果,我们的tools文件夹下提供了预测及可视化的脚本,你只需要运行以下脚本即可:
注:
需在infer_cfg中配置模型输入
由于开发机配置不同,plt.show可能不会正常显像,可以在/usr/local/lib/python3.8/dist-packages/hat/visualize/argoverse.py通过plt.savefig在保存的路径中查看
可视化示例:

brown:lane;blue:agent_history_traj;green:av_traj;yellow:other_trajs;purple:labels;red:preds


