From d9d61ce3a769b912c4092d7ca3a17028e52755e5 Mon Sep 17 00:00:00 2001 From: Yoshi Ri Date: Fri, 18 Nov 2022 16:19:57 +0900 Subject: [PATCH] feat(perception_utils): enable tracker to track smaller object by adapting min_union_area (#2303) * update get2dIoU to recv min_union_area Signed-off-by: Yoshi Ri * declare the use of min_union_iou_area in tracker Signed-off-by: Yoshi Ri Signed-off-by: Yoshi Ri Signed-off-by: yoshiri --- .../perception_utils/include/perception_utils/matching.hpp | 5 +++-- .../src/data_association/data_association.cpp | 4 +++- .../multi_object_tracker/src/multi_object_tracker_core.cpp | 3 ++- .../data_association/data_association.cpp | 3 ++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/common/perception_utils/include/perception_utils/matching.hpp b/common/perception_utils/include/perception_utils/matching.hpp index 1b8d51a6fcf8c..c6607ba5c77bc 100644 --- a/common/perception_utils/include/perception_utils/matching.hpp +++ b/common/perception_utils/include/perception_utils/matching.hpp @@ -63,7 +63,7 @@ inline double getUnionArea(const Polygon2d & source_polygon, const Polygon2d & t } template -double get2dIoU(const T1 source_object, const T2 target_object) +double get2dIoU(const T1 source_object, const T2 target_object, const double min_union_area = 0.01) { const auto source_polygon = tier4_autoware_utils::toPolygon2d(source_object); const auto target_polygon = tier4_autoware_utils::toPolygon2d(target_object); @@ -72,7 +72,8 @@ double get2dIoU(const T1 source_object, const T2 target_object) if (intersection_area == 0.0) return 0.0; const double union_area = getUnionArea(source_polygon, target_polygon); - const double iou = union_area < 0.01 ? 0.0 : std::min(1.0, intersection_area / union_area); + const double iou = + union_area < min_union_area ? 0.0 : std::min(1.0, intersection_area / union_area); return iou; } diff --git a/perception/multi_object_tracker/src/data_association/data_association.cpp b/perception/multi_object_tracker/src/data_association/data_association.cpp index 4955a104c7adc..5bb9d135d2917 100644 --- a/perception/multi_object_tracker/src/data_association/data_association.cpp +++ b/perception/multi_object_tracker/src/data_association/data_association.cpp @@ -206,7 +206,9 @@ Eigen::MatrixXd DataAssociation::calcScoreMatrix( // 2d iou gate if (passed_gate) { const double min_iou = min_iou_matrix_(tracker_label, measurement_label); - const double iou = perception_utils::get2dIoU(measurement_object, tracked_object); + const double min_union_iou_area = 1e-2; + const double iou = + perception_utils::get2dIoU(measurement_object, tracked_object, min_union_iou_area); if (iou < min_iou) passed_gate = false; } diff --git a/perception/multi_object_tracker/src/multi_object_tracker_core.cpp b/perception/multi_object_tracker/src/multi_object_tracker_core.cpp index 2874d64963b20..f20a34de20c4b 100644 --- a/perception/multi_object_tracker/src/multi_object_tracker_core.cpp +++ b/perception/multi_object_tracker/src/multi_object_tracker_core.cpp @@ -262,7 +262,8 @@ void MultiObjectTracker::sanitizeTracker( continue; } - const auto iou = perception_utils::get2dIoU(object1, object2); + const double min_union_iou_area = 1e-2; + const auto iou = perception_utils::get2dIoU(object1, object2, min_union_iou_area); const auto & label1 = (*itr1)->getHighestProbLabel(); const auto & label2 = (*itr2)->getHighestProbLabel(); bool should_delete_tracker1 = false; diff --git a/perception/object_merger/src/object_association_merger/data_association/data_association.cpp b/perception/object_merger/src/object_association_merger/data_association/data_association.cpp index 87498f9c55e04..906e48f4eeda9 100644 --- a/perception/object_merger/src/object_association_merger/data_association/data_association.cpp +++ b/perception/object_merger/src/object_association_merger/data_association/data_association.cpp @@ -154,7 +154,8 @@ Eigen::MatrixXd DataAssociation::calcScoreMatrix( // 2d iou gate if (passed_gate) { const double min_iou = min_iou_matrix_(object1_label, object0_label); - const double iou = perception_utils::get2dIoU(object0, object1); + const double min_union_iou_area = 1e-2; + const double iou = perception_utils::get2dIoU(object0, object1, min_union_iou_area); if (iou < min_iou) passed_gate = false; }