77 const std::string &model_path) {
79 std::string proto_file =
80 GetModelFile(model_path, model_info.proto_file().file());
81 std::string weight_file =
82 GetModelFile(model_path, model_info.weight_file().file());
85 std::vector<std::string> input_names =
87 std::vector<std::string> output_names =
91 const auto &framework = model_info.framework();
92 std::string plugin_name = model_info.infer_plugin();
93 static const std::string class_namespace =
"apollo::perception::inference::";
94 if (model_info.has_infer_plugin() && !plugin_name.empty()) {
95 plugin_name = class_namespace + plugin_name;
98 net_3D_->set_model_info(proto_file, input_names, output_names);
99 AINFO <<
"net_3D load plugin success: " << plugin_name;
102 weight_file, output_names,
103 input_names, model_path));
106 ACHECK(net_3D_ !=
nullptr);
107 net_3D_->set_gpu_id(gpu_id_);
109 std::map<std::string, std::vector<int>> shape_map;
113 if (!net_3D_->Init(shape_map)) {
114 AERROR << model_info.name() <<
"init failed!";
121 const cv::Size &dstSize,
122 const cv::Scalar &bgcolor) {
125 double h1 = dstSize.width * (input.rows /
static_cast<double>(input.cols));
126 double w2 = dstSize.height * (input.cols /
static_cast<double>(input.rows));
127 if (h1 <= dstSize.height) {
128 cv::resize(input, output, cv::Size(dstSize.width, h1));
130 cv::resize(input, output, cv::Size(w2, dstSize.height));
133 int top = (dstSize.height - output.rows) / 2;
134 int down = (dstSize.height - output.rows + 1) / 2;
135 int left = (dstSize.width - output.cols) / 2;
136 int right = (dstSize.width - output.cols + 1) / 2;
138 cv::copyMakeBorder(output, output, top, down, left, right,
139 cv::BORDER_CONSTANT, bgcolor);
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()));
159 float width = right_x - left_x;
160 float height = right_y - left_y;
163 cv::Rect object_roi(left_x, left_y, width, height);
164 cv::Mat cropped_obj = img_(object_roi);
169 cv::resize(cropped_obj, cropped_obj, cv::Size(224, 224));
172 cropped_obj.convertTo(cropped_obj, CV_32F, 1.0f / 255.0);
175 std::vector<float> mean_values{0.406, 0.456, 0.485};
176 std::vector<float> std_values{0.225, 0.224, 0.229};
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]);
185 cv::merge(bgrChannels, dst);
188 auto model_inputs = model_param_.
info_3d().
info().inputs();
190 auto input_blob_3d = net_3D_->get_blob(model_inputs[0].name());
192 ACHECK(input_blob_3d !=
nullptr);
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();
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) {
205 cv::Mat(model_input_rows, model_input_cols, CV_32FC1,
206 input_data + i * model_input_rows * model_input_cols),
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());
219 ACHECK(blob_orient !=
nullptr);
220 ACHECK(blob_conf !=
nullptr);
221 ACHECK(blob_dim !=
nullptr);
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();
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];
238 int orient_index = 2 * max_index;
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);
244 float wedge = 2 * M_PI / bin_number;
245 alpha = angle_offset + max_index * wedge;
246 alpha = alpha + wedge / 2 - M_PI;
250 obj->camera_supplement.alpha = alpha;
253 obj->size[0] += dim_data[2];
254 obj->size[1] += dim_data[1];
255 obj->size[2] += dim_data[0];
302 ACHECK(input_blob !=
nullptr);
305 img_ = cv::Mat(image->
rows(), image->
cols(), CV_8UC3);
306 memcpy(img_.data, image->
cpu_data(),
310 float ratio = std::max(image_width_, image_height_);
311 cv::Mat out(ratio, ratio, CV_8UC3, {114, 114, 114});
313 img_.copyTo(out(cv::Rect(0, 0, img_.cols,
316 cv::resize(out, out, cv::Size(width_, height_),
319 out.convertTo(out, CV_32F, 1.0);
322 int model_input_chs = out.channels();
323 int model_input_rows = out.rows;
324 int model_input_cols = out.cols;
327 input_blob->Reshape({1, model_input_chs, model_input_rows, model_input_cols});
328 float *input_data = input_blob->mutable_cpu_data();
330 for (
int i = 0; i < model_input_chs; ++i) {
333 cv::Mat(model_input_rows, model_input_cols, CV_32FC1,
334 input_data + i * model_input_rows * model_input_cols),
341 if (frame ==
nullptr) {
345 if (cudaSetDevice(gpu_id_) != cudaSuccess) {
346 AERROR <<
"Failed to set device to " << gpu_id_;
350 auto model_inputs = model_param_.
info().inputs();
351 auto input_blob_2d =
net_->get_blob(model_inputs[0].name());
371 auto model_outputs = model_param_.
info().outputs();
374 auto predict_blob =
net_->get_blob(model_outputs[1].name());
383 float border_ratio = 0.01;
385 static_cast<int>(border_ratio *
static_cast<float>(image.
cols()));
386 int right_boundary =
static_cast<int>((1.0f - border_ratio) *
387 static_cast<float>(image.
cols()));
389 obj->camera_supplement.area_id = 1;
396 auto &box = obj->camera_supplement.box;
397 if (box.xmin >= left_boundary) {
398 obj->camera_supplement.cut_off_ratios[2] = 0;
400 if (box.xmax <= right_boundary) {
401 obj->camera_supplement.cut_off_ratios[3] = 0;