Apollo  6.0
Open source self driving car software
histogram_estimator.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2018 The Apollo Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *****************************************************************************/
16 #pragma once
17 
18 #include <algorithm>
19 #include <cassert>
20 #include <vector>
21 
22 #include "cyber/common/log.h"
23 
24 namespace apollo {
25 namespace perception {
26 namespace camera {
27 
28 // histogram related params
31  void Init();
32 
34  float data_sp = 0.0f; // start point
35  float data_ep = 0.0f; // end point => [data_sp, data_ep)
36  float step_bin = 0.0f;
37 
38  std::vector<uint32_t> smooth_kernel = {};
39  int smooth_kernel_width = 0; // only consider odd number
41 
42  float hat_min_allowed = 0.0f;
43  float hat_std_allowed = 0.0f;
44 
45  uint32_t histogram_mass_limit = 0;
46 
47  float decay_factor = 0.0f;
48 
49  void operator=(const HistogramEstimatorParams &params) {
50  nr_bins_in_histogram = params.nr_bins_in_histogram;
51 
52  data_sp = params.data_sp;
53  data_ep = params.data_ep;
54  assert(nr_bins_in_histogram > 0 && data_ep > data_sp);
55 
56  step_bin = (data_ep - data_sp) / static_cast<float>(nr_bins_in_histogram);
57 
58  int w = static_cast<int>(params.smooth_kernel.size());
59  assert(w >= 1);
60  smooth_kernel_width = w;
61  smooth_kernel.resize(smooth_kernel_width);
62  memcpy(smooth_kernel.data(), params.smooth_kernel.data(),
63  sizeof(uint32_t) * smooth_kernel_width);
64  smooth_kernel_radius = smooth_kernel_width >> 1;
65 
66  hat_min_allowed = params.hat_min_allowed;
67  hat_std_allowed = params.hat_std_allowed;
68 
69  histogram_mass_limit = params.histogram_mass_limit;
70  assert(histogram_mass_limit > 0);
71 
72  decay_factor = params.decay_factor;
73  assert(decay_factor > 0.0f);
74  }
75 };
76 
77 // histogram and its process
79  public:
80  static const int kMaxNrBins = 1000;
81 
83  hist_.resize(kMaxNrBins);
84  std::fill(hist_.begin(), hist_.end(), 0);
85 
86  hist_buffer_.resize(kMaxNrBins);
87  std::fill(hist_buffer_.begin(), hist_buffer_.end(), 0);
88 
89  hist_hat_.resize(kMaxNrBins);
90  std::fill(hist_hat_.begin(), hist_hat_.end(), 0.0f);
91 
92  Init();
93  }
94 
96 
97  void Init(const HistogramEstimatorParams *params = nullptr);
98 
99  bool Push(float val) {
100  if (val < params_.data_sp || val >= params_.data_ep) {
101  AERROR << "Input data to histogram: out-of-range";
102  AERROR << params_.data_sp;
103  AERROR << params_.data_ep;
104  AERROR << val;
105  return false;
106  }
107  int index = GetIndex(val);
108  if (index < 0 || index >= params_.nr_bins_in_histogram) {
109  return false;
110  }
111  ++hist_[index];
112  val_cur_ = val;
113  return true;
114  }
115 
116  void Clear() {
117  std::fill(hist_.begin(), hist_.end(), 0);
118  val_cur_ = val_estimation_ = 0.0f;
119  }
120 
121  const std::vector<uint32_t> &get_hist() const { return hist_; }
122 
123  float get_val_cur() const { return val_cur_; }
124 
125  float get_val_estimation() const { return val_estimation_; }
126 
127  uint32_t get_bin_value(int i) const {
128  assert(i >= 0 && i < params_.nr_bins_in_histogram);
129  return hist_[i];
130  }
131 
132  // main function:
133  // smooth -> shape analysis -> update value -> decay
134  bool Process();
135 
136  private:
137  int GetIndex(float val) const {
138  return static_cast<int>((val - params_.data_sp) * step_bin_reversed_);
139  }
140 
141  float GetValFromIndex(int index) const {
142  return (params_.data_sp +
143  (static_cast<float>(index) + 0.5f) * params_.step_bin);
144  }
145 
146  void Smooth(const uint32_t *hist_input, int nr_bins, uint32_t *hist_output);
147 
148  bool IsGoodShape(const uint32_t *hist, int nr_bins, int max_index);
149 
150  void GetPeakIndexAndMass(const uint32_t *hist, int nr_bins, int *index,
151  uint32_t *mass);
152 
153  void Decay(uint32_t *hist, int nr_bins) {
154  float df = params_.decay_factor;
155  for (int i = 0; i < nr_bins; ++i) {
156  hist[i] = static_cast<uint32_t>(static_cast<float>(hist[i]) * df);
157  }
158  }
159 
160  void GenerateHat(float *hist_hat, int nr_bins);
161 
162  // bool SaveHist(const std::string &filename,
163  // const uint32_t *hist, int nr_bins);
164 
165  private:
166  std::vector<uint32_t> hist_ = {};
167  std::vector<uint32_t> hist_buffer_ = {};
168 
169  std::vector<float> hist_hat_ = {};
170 
171  HistogramEstimatorParams params_;
172 
173  float step_bin_reversed_ = 0.0f;
174  float val_cur_ = 0.0f;
175  float val_estimation_ = 0.0f;
176 };
177 
178 } // namespace camera
179 } // namespace perception
180 } // namespace apollo
uint32_t histogram_mass_limit
Definition: histogram_estimator.h:45
float decay_factor
Definition: histogram_estimator.h:47
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
int smooth_kernel_width
Definition: histogram_estimator.h:39
float data_sp
Definition: histogram_estimator.h:34
std::vector< uint32_t > smooth_kernel
Definition: histogram_estimator.h:38
float get_val_cur() const
Definition: histogram_estimator.h:123
const std::vector< uint32_t > & get_hist() const
Definition: histogram_estimator.h:121
void Clear()
Definition: histogram_estimator.h:116
bool Push(float val)
Definition: histogram_estimator.h:99
~HistogramEstimator()
Definition: histogram_estimator.h:95
float data_ep
Definition: histogram_estimator.h:35
Definition: histogram_estimator.h:78
int smooth_kernel_radius
Definition: histogram_estimator.h:40
uint32_t get_bin_value(int i) const
Definition: histogram_estimator.h:127
int nr_bins_in_histogram
Definition: histogram_estimator.h:33
HistogramEstimatorParams()
Definition: histogram_estimator.h:30
HistogramEstimator()
Definition: histogram_estimator.h:82
float hat_std_allowed
Definition: histogram_estimator.h:43
Definition: histogram_estimator.h:29
void operator=(const HistogramEstimatorParams &params)
Definition: histogram_estimator.h:49
float get_val_estimation() const
Definition: histogram_estimator.h:125
#define AERROR
Definition: log.h:44
float step_bin
Definition: histogram_estimator.h:36
float hat_min_allowed
Definition: histogram_estimator.h:42