ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
Metrics.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include <vector>
9 
12 namespace cloudViewer {
13 namespace t {
14 namespace geometry {
15 
17  core::Tensor distance21,
18  std::vector<Metric> metrics,
20  int n_metrics = metrics.size();
21  if (std::find(metrics.begin(), metrics.end(), Metric::FScore) !=
22  metrics.end()) {
23  n_metrics += params.fscore_radius.size() - 1;
24  }
25  core::Tensor metric_values({n_metrics}, core::Float32,
26  distance12.GetDevice());
27  float metric_val;
28 
29  int idx = 0;
30  for (Metric metric : metrics) {
31  switch (metric) {
33  metric_val = distance21.Reshape({-1}).Mean({-1}).Item<float>() +
34  distance12.Reshape({-1}).Mean({-1}).Item<float>();
35  metric_values[idx++] = metric_val;
36  break;
38  metric_val = std::max(
39  distance12.Reshape({-1}).Max({-1}).Item<float>(),
40  distance21.Reshape({-1}).Max({-1}).Item<float>());
41  metric_values[idx++] = metric_val;
42  break;
43  case Metric::FScore:
44  float *p_distance12 = distance12.GetDataPtr<float>(),
45  *p_distance21 = distance21.GetDataPtr<float>();
46  for (float radius : params.fscore_radius) {
47  // Workaround since we don't have Tensor::CountNonZeros
48  float precision = 0., recall = 0.;
49  for (size_t i = 0;
50  i < static_cast<size_t>(distance12.NumElements()); ++i)
51  precision += p_distance12[i] < radius;
52  precision *= 100. / distance12.NumElements();
53  for (size_t i = 0;
54  i < static_cast<size_t>(distance21.NumElements()); ++i)
55  recall += p_distance21[i] < radius;
56  recall *= 100. / distance21.NumElements();
57  float fscore = 0.0;
58  if (precision + recall > 0) {
59  fscore = 2 * precision * recall / (precision + recall);
60  }
61  metric_values[idx++] = fscore;
62  }
63  break;
64  }
65  }
66  return metric_values;
67 }
68 } // namespace geometry
69 } // namespace t
70 } // namespace cloudViewer
cmdLineReadable * params[]
Tensor Max(const SizeVector &dims, bool keepdim=false) const
Definition: Tensor.cpp:1275
int64_t NumElements() const
Definition: Tensor.h:1170
Device GetDevice() const override
Definition: Tensor.cpp:1435
Tensor Reshape(const SizeVector &dst_shape) const
Definition: Tensor.cpp:671
int max(int a, int b)
Definition: cutil_math.h:48
const Dtype Float32
Definition: Dtype.cpp:42
core::Tensor ComputeMetricsCommon(core::Tensor distance12, core::Tensor distance21, std::vector< Metric > metrics, MetricParameters params)
Definition: Metrics.cpp:16
Metric
Metrics for comparing point clouds and triangle meshes.
Definition: Geometry.h:96
@ ChamferDistance
Chamfer Distance.
@ HausdorffDistance
Hausdorff Distance.
Generic file read and write utility for python interface.
Holder for various parameters required by metrics.
Definition: Geometry.h:103