AB3DMOT代码阅读

简介

AB3DMOT是一个提出了准确、简单、实时的3D MOT框架。

创新

  • 它不是在2D图像空间或者鸟瞰图视角下进行3D MOT,而是将Kalman过滤器拓展到了3D领域,包括3D 位置、尺寸、速度和方向。
  • 此外本文作者还提出了将KITTI 2D MOT评估扩展到3D MOT评估工具(并非像之前一样,把3D轨迹投影到2D然后再进行评估,这样可能会丢失信息)。
  • 提出了新的评估矩阵可以更好地评估追踪结果(解决单一 trajectory confidence threshold的问题,此评价方法平均了多个threshold,更好的反应了MOTA与MOTP的特性)

框架

  • Kalman过滤器(预测+更新)、匈牙利算法,代价矩阵是IoU矩阵
  • 主要分为5部分
    • 3D目标识别模块:(x, y, z, l, w, h, θ, s),PointRCNN的识别结果,包括中心坐标(x,y,z)、长宽高(l,w,h)、转向角(θ)、置信度(s)
    • 3D卡尔曼滤波(预测):使用匀速运动模型
    • 数据关联:匈牙利算法,代价矩阵是根据3D IOU 计算得到的,多项式时间内解决(O(n3))
    • 3D卡尔曼滤波(更新):根据贝叶斯规则,将匹配成功的识别结果和轨迹加权平均,在这里涉及到了orientation修正的问题,如果detection和预测角度相差大于π,则将预测结果+π/2进行修正
    • Birth&Death轨迹:Birth轨迹可能受到false positive的影响、Death可能会受到missing detection的影响

评估指标sMOTA

  • 考虑轨迹置信度s,作者根据不同的recall设置了不同的置信度阈值,发现不同的置信度阈值对应的MOTA是不同的,因此可以看出置信度对最终结果有影响,所以评估矩阵应该保证筛选出在不同的置信度下表现最好的MOT框架,因此提出了不同置信度下的评估指标MOTA的计算方法,此外,作者还对结果进行缩放使其满足在0%-100%范围内变化

实验结果

  • 3D detector:影响最大的模块,对比3D 和2D识别器,结果是3D远优于2D,因此可以看出识别质量是追踪过程中最重要的,这里也许缺少不同3D detector之间的对比,可以更好的看出detector对tracking的影响
  • 2D&3D卡尔曼过滤器:3D优于2D,深度信息对追踪有帮助
  • 角速度:有角速度反而会降低性能,可能是因为车辆行驶过程中没有明显的角速度变化,因此加入这个维度的信息反而会带来噪声
  • 方向校正:加入后也会提高性能,如果考虑修改detection的角度会怎样?
  • IoU(min):越大性能降低越明显
  • 新轨迹判定参数Fmin:小一些会提高精度并且减少FN数量,但是会加大IDS;大一些会会减少遮挡带来的问题,但是精度和准确的都会下降
  • 旧轨迹删除参数Agemax :它对IDS是没有影响的,但是与遮挡是有直接联系的

源码阅读

  • main.py:程序入口
  • model.py:AB3DMOT模型,Kalman预测更新和匈牙利匹配过程
  • kalman_filter.py:Kalman模型,涉及到了方向校正预测和更新的具体操作,包括相关矩阵的参数的设置
  • trk_conf_threshold.py:删除置信度太小的tracking结果,提交KITTI进行2D MOT评估之前的步骤
  • visualization.py:用于可视化

在这里插入图片描述

数据读取和结果存储

# main.py
# 数据读取,数据存储在./data/KITTI文件夹下,包括car/cyclist/pedestrain的测试集合评估集的识别结果
# 提供的是PointRCNN的识别结果,每个序列是一个txt文档,第一列是帧序号
seq_file_list, num_seq = load_list_from_folder(os.path.join('data/KITTI', result_sha))
total_time, total_frames = 0.0, 0
# 追踪结果存储路径 
save_dir = os.path.join(save_root, result_sha); mkdir_if_missing(save_dir)
eval_dir = os.path.join(save_dir, 'data'); mkdir_if_missing(eval_dir)

    
# 以序列为单位的追踪结果存储路径,用于提交到KITTI上进行评估
eval_file = os.path.join(eval_dir, seq_name + '.txt'); eval_file = open(eval_file, 'w')
# 以帧为单位的追踪结果存储路径,用于可视化
save_trk_dir = os.path.join(save_dir, 'trk_withid', seq_name); mkdir_if_missing(save_trk_dir)

逐帧追踪

# loop over frame
# 逐帧追踪
min_frame, max_frame = int(seq_dets[:, 0].min()), int(seq_dets[:, 0].max())
for frame in range(min_frame, max_frame + 1):
	# logging
	print_str = 'processing %s: %d/%d, %d/%d   \r' % (seq_name, seq_count, num_seq, frame, max_frame)
	sys.stdout.write(print_str)
	sys.stdout.flush()

	save_trk_file = os.path.join(save_trk_dir, '%06d.txt' % frame); save_trk_file = open(save_trk_file, 'w')

	# get irrelevant information associated with an object, not used for associationg
	# 识别结果共15列,本文只使用 (x, y, z, l, w, h, θ, s)
	# additional_info是这8列之外的信息,存储在additional_info中,最后原样输出即可
	ori_array = seq_dets[seq_dets[:
  • 10
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值