25constexpr float kFloatEpsilon = std::numeric_limits<float>::epsilon();
42 static const double min_p = 1e-6;
43 static const double max_p = 1 - 1e-6;
44 double x_std_dev = 0.4;
45 double y_std_dev = 0.5;
46 size_t check_augmented_iou_minimum_pts_num = 20;
47 float augmented_buffer = 25.0f;
48 if (object->
Empty()) {
49 ADEBUG <<
"cache object is empty!";
52 Eigen::Vector2d mean_pixel_dist(0.0, 0.0);
54 const size_t start_ind =
object->GetStartInd();
55 const size_t end_ind =
object->GetEndInd();
56 if (end_ind - start_ind >= check_augmented_iou_minimum_pts_num) {
61 ADEBUG <<
"augmented iou is empty!";
65 for (
size_t i = start_ind; i < end_ind; ++i) {
67 if (velo_pt2d ==
nullptr) {
68 AERROR <<
"query pt from projection cache failed!";
71 if (velo_pt2d->x() >= camera_bbox.
xmin &&
72 velo_pt2d->x() < camera_bbox.
xmax &&
73 velo_pt2d->y() >= camera_bbox.
ymin &&
74 velo_pt2d->y() < camera_bbox.
ymax) {
78 diff.x() = std::max(0.0, camera_bbox.
xmin - velo_pt2d->x());
79 diff.x() = std::max(diff.x(), velo_pt2d->x() - camera_bbox.
xmax);
80 diff.y() = std::max(0.0, camera_bbox.
ymin - velo_pt2d->y());
81 diff.y() = std::max(diff.y(), velo_pt2d->y() - camera_bbox.
ymax);
82 mean_pixel_dist += diff;
84 mean_pixel_dist /=
static_cast<double>(
object->Size());
85 ADEBUG <<
"mean_pixel_dist is: " << mean_pixel_dist;
87 Eigen::Vector2d box_size = Eigen::Vector2d(
89 mean_pixel_dist.array() /= box_size.array();
91 double square_norm_mean_pixel_dist =
92 mean_pixel_dist.x() * mean_pixel_dist.x() / x_std_dev / x_std_dev +
93 mean_pixel_dist.y() * mean_pixel_dist.y() / y_std_dev / y_std_dev;
95 double location_similarity =
98 location_similarity = std::max(min_p, std::min(max_p, location_similarity));
99 return location_similarity;
111 static const double min_p = 1e-3;
112 static const double max_p = 1 - 1e-3;
113 double x_std_dev = 0.3;
114 double y_std_dev = 0.4;
115 if (object->
Empty()) {
119 Eigen::Vector2d camera_box_size = Eigen::Vector2d(
123 Eigen::Vector2d velo_box_size = camera_box_size / 10;
125 std::max(
static_cast<float>(velo_box_size.x()),
126 velo_projection_bbox.
xmax - velo_projection_bbox.
xmin);
128 std::max(
static_cast<float>(velo_box_size.y()),
129 velo_projection_bbox.
ymax - velo_projection_bbox.
ymin);
131 Eigen::Vector2d mean_box_size = (camera_box_size + velo_box_size) / 2;
132 Eigen::Vector2d box_size_diff =
133 (velo_box_size - camera_box_size).array() / mean_box_size.array();
135 double square_norm_box_size_diff =
136 box_size_diff.x() * box_size_diff.x() / x_std_dev / x_std_dev +
137 box_size_diff.y() * box_size_diff.y() / y_std_dev / y_std_dev;
138 ADEBUG <<
"camera_box_size@(" << camera_box_size(0) <<
","
139 << camera_box_size(1) <<
"); "
140 <<
"velo_box_size@(" << velo_box_size.x() <<
"," << velo_box_size.y()
142 <<
"box_size_diff@(" << box_size_diff.x() <<
"," << box_size_diff.y()
144 <<
"square_norm_box_size_diff@" << square_norm_box_size_diff;
146 double shape_similarity =
149 shape_similarity = std::max(min_p, std::min(max_p, shape_similarity));
150 return shape_similarity;
161 double location_similarity =
163 double shape_similarity =
165 double fused_similarity =
167 ADEBUG <<
"fused_similarity@" << fused_similarity <<
", location_similarity@"
168 << location_similarity <<
", shape_similarity@" << shape_similarity;
169 return fused_similarity;
178 const double camera_ct_x,
181 double x_diff = std::abs(velo_ct_x - camera_ct_x) / size_x;
189 const double camera_ct_y,
196 double y_diff = std::max(std::abs(velo_ct_y - camera_ct_y) -
201 double normalized_y_diff =
212 const EigenVector<Eigen::Vector2d>& radar_box2d_vertices,
214 const double camera_height = camera->GetBaseObject()->size(2);
217 double min_height_diff = std::numeric_limits<double>::max();
218 for (
size_t i = 0; i < 4; ++i) {
219 double img_car_height = std::abs(radar_box2d_vertices[i + 4].y() -
220 radar_box2d_vertices[i].y());
222 std::min(std::abs(img_car_height - size_y), min_height_diff);
224 min_height_diff /= size_y;
225 double normalized_min_height_diff = min_height_diff * min_height_diff /
233 return height_similarity;
237 const EigenVector<Eigen::Vector2d>& radar_box2d_vertices,
239 std::vector<double> radar_box2d_xs = {
240 radar_box2d_vertices[0].x(), radar_box2d_vertices[1].x(),
241 radar_box2d_vertices[2].x(), radar_box2d_vertices[3].x()};
242 for (
double& x : radar_box2d_xs) {
243 x =
Bound(x, width, 0.0);
246 std::minmax_element(radar_box2d_xs.begin(), radar_box2d_xs.end());
247 double radar_box2d_width = *min_max_xs.second - *min_max_xs.first;
248 double width_diff = std::abs(radar_box2d_width - size_x) / size_x;
249 double normalized_width_diff =
255 return width_similarity;
259 const Eigen::Matrix4d& world2camera_pose,
261 Eigen::Vector3d camera_ct = camera->GetBaseObject()->center;
262 Eigen::Vector3d camera_ct_c =
263 (world2camera_pose * camera_ct.homogeneous()).head(3);
264 double ct_diff = (radar_ct - camera_ct).norm();
265 ct_diff = ct_diff / camera_ct_c.z();
270 return ct_similarity;
275 Eigen::Vector3f radar_velocity = radar->GetBaseObject()->velocity;
276 Eigen::Vector3f camera_velocity = camera->GetBaseObject()->velocity;
278 float scalar_radar_velocity = radar_velocity.norm();
279 float scalar_camera_velocity = camera_velocity.norm();
280 if (std::max(scalar_radar_velocity, scalar_camera_velocity) > 2) {
281 float diff_velocity = (radar_velocity - camera_velocity).norm() / 2;
282 float diff_velocity_ratio =
283 diff_velocity / std::max(scalar_camera_velocity, scalar_radar_velocity);
284 const float velocity_std = 0.15f;
285 const float max_velocity_p = 0.9f;
286 const float th_velocity_p = 0.5f;
287 float velocity_score =
static_cast<float>(
289 velocity_std / velocity_std));
291 velocity_score, max_velocity_p, th_velocity_p));
292 return velocity_score;
Eigen::Vector2d * GetPoint2d(size_t ind)
T Bound(const T &value, const T &max_value, const T &min_value)
std::shared_ptr< const SensorObject > SensorObjectConstPtr
double BoundedScalePositiveProbability(double p, double max_p, double min_p)
double ScalePositiveProbability(double p, double max_p, double th_p)
double ChiSquaredCdf2TableFun(double dist)
double ComputePtsBoxSimilarity(const ProjectionCachePtr &cache, const ProjectionCacheObject *object, const base::BBox2DF &camera_bbox)
double ComputePtsBoxShapeSimilarity(const ProjectionCachePtr &cache, const ProjectionCacheObject *object, const base::BBox2DF &camera_bbox)
double ComputeRadarCameraWSimilarity(const SensorObjectConstPtr &radar, const double width, const double size_x, const EigenVector< Eigen::Vector2d > &radar_box2d_vertices, const WSimilarityParams ¶ms)
calculate the w similarity between radar and camera
double ComputeRadarCameraYSimilarity(const double velo_ct_y, const double camera_ct_y, const double size_y, const YSimilarityParams ¶ms)
calculate the y similarity between radar and camera
Type CalculateAugmentedIOUBBox(const base::BBox2D< Type > &box1, const base::BBox2D< Type > &box2, const Type &augmented_buffer)
Calculate augmented IOU BBox
double WelshVarLossFun(double dist, double th, double scale)
double ComputeRadarCameraXSimilarity(const double velo_ct_x, const double camera_ct_x, const double size_x, const XSimilarityParams ¶ms)
double ChiSquaredCdf1TableFun(double dist)
double ComputeRadarCameraVelocitySimilarity(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera)
calculate the velocity similarity between radar and camera
double FuseTwoProbabilities(double prob1, double prob2)
double ComputeRadarCameraLocSimilarity(const Eigen::Vector3d &radar_ct, const SensorObjectConstPtr &camera, const Eigen::Matrix4d &world2camera_pose, const LocSimilarityParams ¶ms)
calculate the loc similarity between radar and camera
double ComputePtsBoxLocationSimilarity(const ProjectionCachePtr &cache, const ProjectionCacheObject *object, const base::BBox2DF &camera_bbox)
double ComputeRadarCameraHSimilarity(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera, const double size_y, const EigenVector< Eigen::Vector2d > &radar_box2d_vertices, const HSimilarityParams ¶ms)
calculate the h similarity between radar and camera
constexpr float kFloatEpsilon
float scale_positive_th_p_
float scale_positive_max_p_
float initial_similarity_
float scale_positive_th_p_
float scale_positive_max_p_
float bounded_scale_positive_max_p_
float bounded_scale_positive_min_p_
float scale_positive_th_p_
float scale_positive_max_p_
float bounded_scale_positive_min_p_
float bounded_scale_positive_max_p_