代码位置: Apollo/modules/perception/camera/lib/obstacle
图像在GPU上做Resize -》推理 -》获取推理结果
具体inference使用简单工厂模式介绍详见: https://blog.csdn.net/Cxiazaiyu/article/details/106570190
因为目前主流的深度学习主要还是针对单帧图片进行推理,而非对视频进行处理,因此帧间信息的利用主要是依靠后处理。
目标追踪的主要目的是在多帧之间锁定相同的目标,并利用多帧的信息对锁定后的目标的位置、速度等信息进行优化。
目标追踪的入口类为OMTObstacleTracker,继承自接口类BaseObstacleTracker。路径:Apollo/modules/perception/camera/lib/obstacle/tracker/omt/omt_obstacle_tracker.h
主要的方法是bool OMTObstacleTracker::Associate2D(const ObstacleTrackerOptions &options,CameraFrame *frame),负责将当前帧检测到的目标与已经追踪到的所有目标std::vector
代码路径:Apollo/modules/perception/camera/lib/obstacle/tracker/common/similar.h
评估两个object的相似性:
a. 根据CNN抽取的feature相似性:float ScoreAppearance(const Target &target, TrackObjectPtr object);
对于检测到的每个物体,CNN输出一个object_feature。计算两帧之间检测到的目标的相似性的方法定义在Apollo/modules/perception/camera/lib/obstacle/tracker/common/similar.h文件中,并提供CPU和GPU两种实现方法。
b. 根据中心点距离评价相似性:float ScoreMotion(const Target &target, TrackObjectPtr object);
c. 根据box形状差异(长宽差异)评价相似性:float ScoreShape(const Target &target, TrackObjectPtr object);
d. 根据bbox的IOU计算:float ScoreOverlap(const Target &target, TrackObjectPtr track_obj);
最后,综合考虑Motion\Shape\Appearance\Overlap的评分后给出的综合评分,使用的方法void OMTObstacleTracker::GenerateHypothesis(const TrackObjectPtrs &objects),并根据评分排序给出关联最大的可能性。
针对跟踪到的目标融合多帧的信息,给出更准确的位置、航向等。
定义了Target结构体,存储多帧融合后的目标信息,包括航向direction、位置world_center、id等,以及TrackObjectPtrs tracked_objects成员变量,即该Target在每帧中对应的objects。
融合多帧信息时针对变量的特性使用了多种滤波方法,如使用FirstOrderRCLowPassFilter滤去direction中高频变化的量、使用KalmanFilterConstVelocity过滤世界坐标系下的空间位置、使用MeanFilter处理世界坐标系下的速度、使用MaxNMeanFilter处理世界坐标系下的目标的lenght-width-height。具体的滤波方法类存储在Apollo/modules/perception/camera/lib/obstacle/tracker/common/kalman_filter.h文件中。