145 {
147
148
149 float left_x =
Yoloxclamp(obj->camera_supplement.box.xmin, 0.f,
150 static_cast<float>(image->cols()));
151 float left_y =
Yoloxclamp(obj->camera_supplement.box.ymin, 0.f,
152 static_cast<float>(image->rows()));
153 float right_x =
Yoloxclamp(obj->camera_supplement.box.xmax, 0.f,
154 static_cast<float>(image->cols()));
155 float right_y =
Yoloxclamp(obj->camera_supplement.box.ymax, 0.f,
156 static_cast<float>(image->rows()));
157
158
159 float width = right_x - left_x;
160 float height = right_y - left_y;
161
162
163 cv::Rect object_roi(left_x, left_y, width, height);
164 cv::Mat cropped_obj = img_(object_roi);
165
166
167
168
169 cv::resize(cropped_obj, cropped_obj, cv::Size(224, 224));
170
171
172 cropped_obj.convertTo(cropped_obj, CV_32F, 1.0f / 255.0);
173
174
175 std::vector<float> mean_values{0.406, 0.456, 0.485};
176 std::vector<float> std_values{0.225, 0.224, 0.229};
177
178 std::vector<cv::Mat> bgrChannels(3);
179 cv::split(cropped_obj, bgrChannels);
180 for (int i = 0; i < 3; ++i) {
181 bgrChannels[i].convertTo(bgrChannels[i], CV_32FC1, 1 / std_values[i],
182 (0.0 - mean_values[i]) / std_values[i]);
183 }
184 cv::Mat dst;
185 cv::merge(bgrChannels, dst);
186 cropped_obj = dst;
187
188 auto model_inputs = model_param_.
info_3d().
info().inputs();
189
190 auto input_blob_3d = net_3D_->get_blob(model_inputs[0].name());
191
192 ACHECK(input_blob_3d !=
nullptr);
193
194 int model_input_chs = cropped_obj.channels();
195 int model_input_rows = cropped_obj.rows;
196 int model_input_cols = cropped_obj.cols;
197 float *input_data = input_blob_3d->mutable_cpu_data();
198
199
200 input_blob_3d->Reshape(
201 {1, model_input_chs, model_input_rows, model_input_cols});
202 for (int i = 0; i < model_input_chs; ++i) {
203 cv::extractChannel(
204 cropped_obj,
205 cv::Mat(model_input_rows, model_input_cols, CV_32FC1,
206 input_data + i * model_input_rows * model_input_cols),
207 i);
208 }
209
210
211 net_3D_->Infer();
212
213
214 auto model_outputs = model_param_.
info_3d().
info().outputs();
215 auto blob_orient = net_3D_->get_blob(model_outputs[0].name());
216 auto blob_conf = net_3D_->get_blob(model_outputs[1].name());
217 auto blob_dim = net_3D_->get_blob(model_outputs[2].name());
218
219 ACHECK(blob_orient !=
nullptr);
220 ACHECK(blob_conf !=
nullptr);
221 ACHECK(blob_dim !=
nullptr);
222
223 const float *orient_data = blob_orient->cpu_data();
224 const float *conf_data = blob_conf->cpu_data();
225 const float *dim_data = blob_dim->cpu_data();
226
227
229 int max_index = 0;
230 int max_conf = conf_data[max_index];
231 for (int i = 1; i < bin_number; ++i) {
232 if (conf_data[i] > max_conf) {
233 max_conf = conf_data[i];
234 max_index = i;
235 }
236 }
237
238 int orient_index = 2 * max_index;
239 float alpha = 0.f;
240 float cos_result = orient_data[orient_index];
241 float sin_result = orient_data[orient_index + 1];
242 float angle_offset = std::atan2(sin_result, cos_result);
243
244 float wedge = 2 * M_PI / bin_number;
245 alpha = angle_offset + max_index * wedge;
246 alpha = alpha + wedge / 2 - M_PI;
247 if (alpha > M_PI) {
248 alpha -= 2 * M_PI;
249 }
250 obj->camera_supplement.alpha = alpha;
251
252
253 obj->size[0] += dim_data[2];
254 obj->size[1] += dim_data[1];
255 obj->size[2] += dim_data[0];
256 return;
257}
uint32_t height
Height of point cloud
uint32_t width
Width of point cloud
constexpr T Yoloxclamp(const T &val, const T &low, const T &high)
Clamp target value between low and high tools for iou