Apollo 10.0
自动驾驶开放平台
apollo::perception::camera::YoloObstacleDetector类 参考

#include <yolo_obstacle_detector.h>

类 apollo::perception::camera::YoloObstacleDetector 继承关系图:
apollo::perception::camera::YoloObstacleDetector 的协作图:

Public 成员函数

 YoloObstacleDetector ()=default
 
virtual ~YoloObstacleDetector ()
 
bool Init (const ObstacleDetectorInitOptions &options=ObstacleDetectorInitOptions()) override
 Load obstacle detector configs
 
bool Detect (onboard::CameraFrame *frame) override
 Get obstacles detection result, detector main part
 
std::string Name () const override
 ObstacleDetector name
 
- Public 成员函数 继承自 apollo::perception::camera::BaseObstacleDetector
 BaseObstacleDetector ()=default
 
virtual ~BaseObstacleDetector ()=default
 
virtual bool Detect (CameraFrame *frame)=0
 Interface for obstacle detector main part
 
virtual bool InitNetwork (const common::ModelInfo &model_info, const std::string &model_root)
 Interface for network initialization
 
 BaseObstacleDetector ()=default
 
virtual ~BaseObstacleDetector ()=default
 
virtual bool Detect (CameraFrame *frame)=0
 Interface for obstacle detector main part
 
virtual bool InitNetwork (const common::ModelInfo &model_info, const std::string &model_root)
 Interface for network initialization
 
 BaseObstacleDetector ()=default
 
virtual ~BaseObstacleDetector ()=default
 
virtual bool InitNetwork (const common::ModelInfo &model_info, const std::string &model_root)
 Interface for network initialization
 

Protected 成员函数

void LoadInputShape (const yolo::ModelParam &model_param)
 
void LoadParam (const yolo::ModelParam &model_param)
 
void InitYoloBlob ()
 
- Protected 成员函数 继承自 apollo::perception::camera::BaseObstacleDetector
 DISALLOW_COPY_AND_ASSIGN (BaseObstacleDetector)
 
 DISALLOW_COPY_AND_ASSIGN (BaseObstacleDetector)
 
 DISALLOW_COPY_AND_ASSIGN (BaseObstacleDetector)
 

额外继承的成员函数

- Protected 属性 继承自 apollo::perception::camera::BaseObstacleDetector
int gpu_id_ = 0
 
std::shared_ptr< inference::Inferencenet_
 

详细描述

在文件 yolo_obstacle_detector.h32 行定义.

构造及析构函数说明

◆ YoloObstacleDetector()

apollo::perception::camera::YoloObstacleDetector::YoloObstacleDetector ( )
default

◆ ~YoloObstacleDetector()

virtual apollo::perception::camera::YoloObstacleDetector::~YoloObstacleDetector ( )
inlinevirtual

在文件 yolo_obstacle_detector.h35 行定义.

35 {
36 if (stream_ != nullptr) {
37 cudaStreamDestroy(stream_);
38 }
39 }

成员函数说明

◆ Detect()

bool apollo::perception::camera::YoloObstacleDetector::Detect ( onboard::CameraFrame frame)
overridevirtual

Get obstacles detection result, detector main part

参数
framecamera frame
返回
true
false

实现了 apollo::perception::camera::BaseObstacleDetector.

在文件 yolo_obstacle_detector.cc196 行定义.

196 {
197 if (frame == nullptr) {
198 return false;
199 }
200
201 if (cudaSetDevice(gpu_id_) != cudaSuccess) {
202 AERROR << "Failed to set device to " << gpu_id_;
203 return false;
204 }
205
206 auto model_inputs = model_param_.info().inputs();
207 auto input_blob = net_->get_blob(model_inputs[0].name());
208
209 DataProvider::ImageOptions image_options;
210 image_options.target_color = base::Color::BGR;
211 image_options.crop_roi = base::RectI(0, offset_y_, options_.image_width,
212 options_.image_height - offset_y_);
213 image_options.do_crop = true;
214 base::Image8U image;
215 frame->data_provider->GetImage(image_options, &image);
216
217 inference::ResizeGPU(image, input_blob, frame->data_provider->src_width(), 0);
218 PERF_BLOCK("camera_2d_detector_infer")
219 net_->Infer();
221
222 PERF_BLOCK("camera_2d_detector_get_obj")
223 get_objects_cpu(yolo_blobs_, stream_, types_, nms_, model_param_,
224 light_vis_conf_threshold_, light_swt_conf_threshold_,
225 overlapped_.get(), idx_sm_.get(), &frame->detected_objects);
227
228 filter_bbox(min_dims_, &frame->detected_objects);
229
230 recover_bbox(frame->data_provider->src_width(),
231 frame->data_provider->src_height() - offset_y_, offset_y_,
232 &frame->detected_objects);
233
234 // appearance features for tracking
235 frame->feature_blob = yolo_blobs_.feat_blob;
236
237 // post processing
238 int left_boundary =
239 static_cast<int>(border_ratio_ * static_cast<float>(image.cols()));
240 int right_boundary = static_cast<int>((1.0f - border_ratio_) *
241 static_cast<float>(image.cols()));
242 for (auto &obj : frame->detected_objects) {
243 // recover alpha
244 obj->camera_supplement.alpha /= ori_cycle_;
245 // get area_id from visible_ratios
246 if (model_param_.num_areas() == 0) {
247 obj->camera_supplement.area_id =
248 get_area_id(obj->camera_supplement.visible_ratios);
249 }
250 // clear cut off ratios
251 auto &box = obj->camera_supplement.box;
252 if (box.xmin >= left_boundary) {
253 obj->camera_supplement.cut_off_ratios[2] = 0;
254 }
255 if (box.xmax <= right_boundary) {
256 obj->camera_supplement.cut_off_ratios[3] = 0;
257 }
258 }
259
260 return true;
261}
double f
std::shared_ptr< inference::Inference > net_
#define AERROR
Definition log.h:44
Rect< int > RectI
Definition box.h:159
void recover_bbox(int roi_w, int roi_h, int offset_y, std::vector< base::ObjectPtr > *objects)
recover detect bbox result to raw image
int get_area_id(float visible_ratios[4])
calculate the area id based on the visible ratios
void get_objects_cpu(const YoloBlobs &yolo_blobs, const cudaStream_t &stream, const std::vector< base::ObjectSubType > &types, const NMSParam &nms, const yolo::ModelParam &model_param, float light_vis_conf_threshold, float light_swt_conf_threshold, base::Blob< bool > *overlapped, base::Blob< int > *idx_sm, std::vector< base::ObjectPtr > *objects)
Get the objects cpu object
void filter_bbox(const MinDims &min_dims, std::vector< base::ObjectPtr > *objects)
filter out the objects in the object array based on the given minimum dimension conditions and retain...
bool ResizeGPU(const base::Image8U &src, std::shared_ptr< apollo::perception::base::Blob< float > > dst, int stepwidth, int start_axis)
#define PERF_BLOCK_END
Definition profiler.h:53
#define PERF_BLOCK(...)
Definition profiler.h:52

◆ Init()

bool apollo::perception::camera::YoloObstacleDetector::Init ( const ObstacleDetectorInitOptions options = ObstacleDetectorInitOptions())
overridevirtual

Load obstacle detector configs

参数
optionsthe option object of obstacle
返回
true
false

实现了 apollo::perception::camera::BaseObstacleDetector.

在文件 yolo_obstacle_detector.cc150 行定义.

150 {
151 options_ = options;
152
153 gpu_id_ = options.gpu_id;
154 BASE_GPU_CHECK(cudaSetDevice(gpu_id_));
155 BASE_GPU_CHECK(cudaStreamCreate(&stream_));
156
157 std::string config_file =
158 GetConfigFile(options.config_path, options.config_file);
159 if (!cyber::common::GetProtoFromFile(config_file, &model_param_)) {
160 AERROR << "Read proto_config failed! " << config_file;
161 return false;
162 }
163
164 const auto &model_info = model_param_.info();
165 std::string model_path = GetModelPath(model_info.name());
166 std::string anchors_file =
167 GetModelFile(model_path, model_info.anchors_file().file());
168 std::string types_file =
169 GetModelFile(model_path, model_info.types_file().file());
170 std::string expand_file =
171 GetModelFile(model_path, model_info.expand_file().file());
172 LoadInputShape(model_param_);
173 LoadParam(model_param_);
174 min_dims_.min_2d_height /= static_cast<float>(height_);
175
176 if (!LoadAnchors(anchors_file, &anchors_)) {
177 return false;
178 }
179 if (!LoadTypes(types_file, &types_)) {
180 return false;
181 }
182 if (!LoadExpand(expand_file, &expands_)) {
183 return false;
184 }
185 ACHECK(expands_.size() == types_.size());
186
187 if (!InitNetwork(model_param_.info(), model_path)) {
188 AERROR << "Init network failed!";
189 return false;
190 }
191
192 InitYoloBlob();
193 return true;
194}
virtual bool InitNetwork(const common::ModelInfo &model_info, const std::string &model_root)
Interface for network initialization
void LoadInputShape(const yolo::ModelParam &model_param)
void LoadParam(const yolo::ModelParam &model_param)
#define ACHECK(cond)
Definition log.h:80
bool GetProtoFromFile(const std::string &file_name, google::protobuf::Message *message)
Parses the content of the file specified by the file_name as a representation of protobufs,...
Definition file.cc:132
bool LoadTypes(const std::string &path, std::vector< base::ObjectSubType > *types)
Definition util.cc:51
bool LoadAnchors(const std::string &path, std::vector< float > *anchors)
Definition util.cc:31
bool LoadExpand(const std::string &path, std::vector< float > *expands)
Definition util.cc:72
std::string GetModelFile(const std::string &model_name, const std::string &file_name)
Get the model file path by model path and file name
Definition util.cc:55
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
Definition util.cc:80
std::string GetModelPath(const std::string &model_name)
Get the model path by model name, search from APOLLO_MODEL_PATH
Definition util.cc:44

◆ InitYoloBlob()

void apollo::perception::camera::YoloObstacleDetector::InitYoloBlob ( )
protected

在文件 yolo_obstacle_detector.cc74 行定义.

74 {
75 auto obj_blob_scale1 = net_->get_blob("obj_pred");
76 auto obj_blob_scale2 = net_->get_blob("det2_obj_blob");
77 auto obj_blob_scale3 = net_->get_blob("det3_obj_blob");
78 int output_height_scale1 = obj_blob_scale1->shape(1);
79 int output_width_scale1 = obj_blob_scale1->shape(2);
80 int obj_size = output_height_scale1 * output_width_scale1 *
81 static_cast<int>(anchors_.size()) / anchorSizeFactor;
82 // todo(daohu527): why just obj_blob_scale2 != nullptr
83 if (obj_blob_scale2) {
84 int output_height_scale2 = obj_blob_scale2->shape(1);
85 int output_width_scale2 = obj_blob_scale2->shape(2);
86 int output_height_scale3 = obj_blob_scale3->shape(1);
87 int output_width_scale3 = obj_blob_scale3->shape(2);
88 obj_size = (output_height_scale1 * output_width_scale1 +
89 output_height_scale2 * output_width_scale2 +
90 output_height_scale3 * output_width_scale3) *
91 static_cast<int>(anchors_.size()) / anchorSizeFactor / numScales;
92 }
93
94 yolo_blobs_.res_box_blob.reset(
95 new base::Blob<float>(1, 1, obj_size, kBoxBlockSize));
96 yolo_blobs_.res_cls_blob.reset(new base::Blob<float>(
97 1, 1, static_cast<int>(types_.size() + 1), obj_size));
98 yolo_blobs_.res_cls_blob->cpu_data();
99 overlapped_.reset(
100 new base::Blob<bool>(std::vector<int>{obj_k_, obj_k_}, true));
101 overlapped_->cpu_data();
102 overlapped_->gpu_data();
103 idx_sm_.reset(new base::Blob<int>(std::vector<int>{obj_k_}, true));
104 yolo_blobs_.anchor_blob.reset(
105 new base::Blob<float>(1, 1, static_cast<int>(anchors_.size() / 2), 2));
106 yolo_blobs_.expand_blob.reset(
107 new base::Blob<float>(1, 1, 1, static_cast<int>(expands_.size())));
108 auto expand_cpu_data = yolo_blobs_.expand_blob->mutable_cpu_data();
109 memcpy(expand_cpu_data, expands_.data(), expands_.size() * sizeof(float));
110 auto anchor_cpu_data = yolo_blobs_.anchor_blob->mutable_cpu_data();
111 memcpy(anchor_cpu_data, anchors_.data(), anchors_.size() * sizeof(float));
112 yolo_blobs_.anchor_blob->gpu_data();
113
114 yolo_blobs_.det1_loc_blob = net_->get_blob("loc_pred");
115 yolo_blobs_.det1_obj_blob = net_->get_blob("obj_pred");
116 yolo_blobs_.det1_cls_blob = net_->get_blob("cls_pred");
117 yolo_blobs_.det1_ori_conf_blob = net_->get_blob("detect1_ori_conf_pred");
118 yolo_blobs_.det1_ori_blob = net_->get_blob("ori_pred");
119 yolo_blobs_.det1_dim_blob = net_->get_blob("dim_pred");
120 yolo_blobs_.det2_loc_blob = net_->get_blob("detect2_loc_pred");
121 yolo_blobs_.det2_obj_blob = net_->get_blob("detect2_obj_pred");
122 yolo_blobs_.det2_cls_blob = net_->get_blob("detect2_cls_pred");
123 yolo_blobs_.det2_ori_conf_blob = net_->get_blob("detect2_ori_conf_pred");
124 yolo_blobs_.det2_ori_blob = net_->get_blob("detect2_ori_pred");
125 yolo_blobs_.det2_dim_blob = net_->get_blob("detect2_dim_pred");
126 yolo_blobs_.det3_loc_blob = net_->get_blob("detect3_loc_pred");
127 yolo_blobs_.det3_obj_blob = net_->get_blob("detect3_obj_pred");
128 yolo_blobs_.det3_cls_blob = net_->get_blob("detect3_cls_pred");
129 yolo_blobs_.det3_ori_conf_blob = net_->get_blob("detect3_ori_conf_pred");
130 yolo_blobs_.det3_ori_blob = net_->get_blob("detect3_ori_pred");
131 yolo_blobs_.det3_dim_blob = net_->get_blob("detect3_dim_pred");
132
133 yolo_blobs_.lof_blob = net_->get_blob("lof_pred");
134 yolo_blobs_.lor_blob = net_->get_blob("lor_pred");
135
136 yolo_blobs_.brvis_blob = net_->get_blob("brvis_pred");
137 yolo_blobs_.brswt_blob = net_->get_blob("brswt_pred");
138 yolo_blobs_.ltvis_blob = net_->get_blob("ltvis_pred");
139 yolo_blobs_.ltswt_blob = net_->get_blob("ltswt_pred");
140 yolo_blobs_.rtvis_blob = net_->get_blob("rtvis_pred");
141 yolo_blobs_.rtswt_blob = net_->get_blob("rtswt_pred");
142
143 yolo_blobs_.area_id_blob = net_->get_blob("area_id_pred");
144 yolo_blobs_.visible_ratio_blob = net_->get_blob("vis_pred");
145 yolo_blobs_.cut_off_ratio_blob = net_->get_blob("cut_pred");
146
147 yolo_blobs_.feat_blob = net_->get_blob("conv3_3");
148}
constexpr int anchorSizeFactor
std::shared_ptr< base::Blob< float > > area_id_blob
std::shared_ptr< base::Blob< float > > lof_blob
Definition postprocess.h:97
std::shared_ptr< base::Blob< float > > det3_dim_blob
Definition postprocess.h:95
std::shared_ptr< base::Blob< float > > det2_obj_blob
Definition postprocess.h:85
std::shared_ptr< base::Blob< float > > det3_ori_conf_blob
Definition postprocess.h:93
std::shared_ptr< base::Blob< float > > expand_blob
std::shared_ptr< base::Blob< float > > visible_ratio_blob
std::shared_ptr< base::Blob< float > > det3_cls_blob
Definition postprocess.h:92
std::shared_ptr< base::Blob< float > > ltvis_blob
std::shared_ptr< base::Blob< float > > res_cls_blob
std::shared_ptr< base::Blob< float > > res_box_blob
std::shared_ptr< base::Blob< float > > det3_loc_blob
Definition postprocess.h:90
std::shared_ptr< base::Blob< float > > feat_blob
std::shared_ptr< base::Blob< float > > det1_loc_blob
Definition postprocess.h:78
std::shared_ptr< base::Blob< float > > det1_cls_blob
Definition postprocess.h:80
std::shared_ptr< base::Blob< float > > det1_dim_blob
Definition postprocess.h:83
std::shared_ptr< base::Blob< float > > lor_blob
Definition postprocess.h:98
std::shared_ptr< base::Blob< float > > anchor_blob
std::shared_ptr< base::Blob< float > > det3_obj_blob
Definition postprocess.h:91
std::shared_ptr< base::Blob< float > > brswt_blob
std::shared_ptr< base::Blob< float > > det1_ori_conf_blob
Definition postprocess.h:81
std::shared_ptr< base::Blob< float > > ltswt_blob
std::shared_ptr< base::Blob< float > > det2_ori_blob
Definition postprocess.h:88
std::shared_ptr< base::Blob< float > > brvis_blob
Definition postprocess.h:99
std::shared_ptr< base::Blob< float > > det3_ori_blob
Definition postprocess.h:94
std::shared_ptr< base::Blob< float > > det1_ori_blob
Definition postprocess.h:82
std::shared_ptr< base::Blob< float > > det1_obj_blob
Definition postprocess.h:79
std::shared_ptr< base::Blob< float > > rtvis_blob
std::shared_ptr< base::Blob< float > > det2_ori_conf_blob
Definition postprocess.h:87
std::shared_ptr< base::Blob< float > > cut_off_ratio_blob
std::shared_ptr< base::Blob< float > > det2_cls_blob
Definition postprocess.h:86
std::shared_ptr< base::Blob< float > > det2_dim_blob
Definition postprocess.h:89
std::shared_ptr< base::Blob< float > > det2_loc_blob
Definition postprocess.h:84
std::shared_ptr< base::Blob< float > > rtswt_blob

◆ LoadInputShape()

void apollo::perception::camera::YoloObstacleDetector::LoadInputShape ( const yolo::ModelParam model_param)
protected

在文件 yolo_obstacle_detector.cc29 行定义.

29 {
30 float offset_ratio = model_param.offset_ratio();
31 float cropped_ratio = model_param.cropped_ratio();
32 int resized_width = model_param.resized_width();
33 int aligned_pixel = model_param.aligned_pixel();
34
35 int image_width = options_.image_width;
36 int image_height = options_.image_height;
37
38 offset_y_ = static_cast<int>(std::round(offset_ratio * image_height));
39 float roi_ratio = cropped_ratio * image_height / image_width;
40 width_ = (resized_width + aligned_pixel / 2) / aligned_pixel * aligned_pixel;
41 height_ = static_cast<int>(width_ * roi_ratio + aligned_pixel / 2) /
42 aligned_pixel * aligned_pixel;
43
44 AINFO << "image_height=" << image_height << ", image_width=" << image_width
45 << ", roi_ratio=" << roi_ratio;
46 AINFO << "offset_y=" << offset_y_ << ", height=" << height_
47 << ", width=" << width_;
48}
#define AINFO
Definition log.h:42

◆ LoadParam()

void apollo::perception::camera::YoloObstacleDetector::LoadParam ( const yolo::ModelParam model_param)
protected

在文件 yolo_obstacle_detector.cc50 行定义.

50 {
51 confidence_threshold_ = model_param.confidence_threshold();
52 light_vis_conf_threshold_ = model_param.light_vis_conf_threshold();
53 light_swt_conf_threshold_ = model_param.light_swt_conf_threshold();
54
55 auto min_dims = model_param.min_dims();
56 min_dims_.min_2d_height = min_dims.min_2d_height();
57 min_dims_.min_3d_height = min_dims.min_3d_height();
58 min_dims_.min_3d_width = min_dims.min_3d_width();
59 min_dims_.min_3d_length = min_dims.min_3d_length();
60
61 ori_cycle_ = model_param.ori_cycle();
62
63 border_ratio_ = model_param.border_ratio();
64
65 // init NMS
66 const auto &nms_param = model_param.nms_param();
67 nms_.sigma = nms_param.sigma();
68 nms_.type = nms_param.type();
69 nms_.threshold = nms_param.threshold();
70 nms_.inter_cls_nms_thresh = nms_param.inter_cls_nms_thresh();
71 nms_.inter_cls_conf_thresh = nms_param.inter_cls_conf_thresh();
72}

◆ Name()

std::string apollo::perception::camera::YoloObstacleDetector::Name ( ) const
inlineoverridevirtual

ObstacleDetector name

返回
std::string

实现了 apollo::perception::camera::BaseObstacleDetector.

在文件 yolo_obstacle_detector.h62 行定义.

62{ return "YoloObstacleDetector"; }

该类的文档由以下文件生成: