Apollo 11.0
自动驾驶开放平台
apollo::perception::lidar::CPDetection类 参考

#include <cpdet.h>

类 apollo::perception::lidar::CPDetection 继承关系图:
apollo::perception::lidar::CPDetection 的协作图:

Public 成员函数

 CPDetection ()
 
virtual ~CPDetection ()=default
 
bool Init (const CPDetectorInitOptions &options=CPDetectorInitOptions()) override
 Init the Base Lidar Detector object
 
bool Detect (const CPDetectorOptions &options, LidarFrame *frame) override
 Detect foreground objects
 
std::string Name () const
 Name of Base Lidar Detector class
 
void GeneratePfnFeature ()
 
void GenerateBackboneFeature (const base::Blob< float > *pillar_feature_blob)
 
void GetObjectsAndAssignPoints ()
 
- Public 成员函数 继承自 apollo::perception::lidar::BaseCPDetector
 BaseCPDetector ()=default
 Construct a new Base Lidar Detector object
 
virtual ~BaseCPDetector ()=default
 Destroy the Base Lidar Detector object
 

详细描述

在文件 cpdet.h 第 72 行定义.

构造及析构函数说明

◆ CPDetection()

apollo::perception::lidar::CPDetection::CPDetection ( )

在文件 cpdet.cc 第 52 行定义.

53 : x_min_range_(MIN_X_RANGE), x_max_range_(MAX_X_RANGE),
54 y_min_range_(MIN_Y_RANGE), y_max_range_(MAX_Y_RANGE) {}
const float MIN_X_RANGE
Definition cpdet.cc:45
const float MAX_X_RANGE
Definition cpdet.cc:46
const float MIN_Y_RANGE
Definition cpdet.cc:47
const float MAX_Y_RANGE
Definition cpdet.cc:48

◆ ~CPDetection()

virtual apollo::perception::lidar::CPDetection::~CPDetection ( )
virtualdefault

成员函数说明

◆ Detect()

bool apollo::perception::lidar::CPDetection::Detect ( const CPDetectorOptions &  options,
LidarFrame *  frame 
)
overridevirtual

Detect foreground objects

参数
optionslidar detector options
framelidar frame
返回
true
false

实现了 apollo::perception::lidar::BaseCPDetector.

在文件 cpdet.cc 第 1551 行定义.

1552 {
1553 if (frame == nullptr) {
1554 AERROR << "Input null frame ptr.";
1555 return false;
1556 }
1557 if (frame->cloud == nullptr) {
1558 AERROR << "Input null frame cloud.";
1559 return false;
1560 }
1561 if (frame->cloud->size() == 0) {
1562 AERROR << "Input none points.";
1563 return false;
1564 }
1565 frame->segmented_objects.clear();
1566 original_cloud_ = frame->cloud;
1567 original_world_cloud_ = frame->world_cloud;
1568 lidar_frame_ref_ = frame;
1569 cur_cloud_ptr_ = std::shared_ptr<base::PointFCloud>(
1570 new base::PointFCloud(*original_cloud_));
1571
1572 // BASE_GPU_CHECK(cudaStreamCreate(&stream_));
1573 if (cudaSetDevice(cpdet_config_.model_param().preprocess().gpu_id()) != cudaSuccess) {
1574 AERROR << "Failed to set device to "
1575 << cpdet_config_.model_param().preprocess().gpu_id();
1576 return false;
1577 }
1578
1579 Timer timer;
1580 PointCloudPreprocess();
1581 AINFO << "Downsample PointCloud from " << original_cloud_->size() << " to " << cur_cloud_ptr_->size();
1582 double pointcloud_pre_time = timer.toc(true);
1583
1584 model_cloud_size_ = static_cast<int>(cur_cloud_ptr_->size());
1585 total_cloud_size_ = static_cast<int>(original_cloud_->size());
1587 double pfn_feature_generate_time = timer.toc(true);
1588
1589 // pfn_output
1590 pfn_inference_->Infer();
1591 // cudaStreamSynchronize(stream_);
1592 double pfn_inference_time = timer.toc(true);
1593
1594 // generate backbone feature
1595 GenerateBackboneFeature(pfn_pillar_feature_blob_.get());
1596 double backbone_feature_generate_time = timer.toc(true);
1597
1598 // backbone output
1599 backbone_inference_->Infer();
1600 // cudaStreamSynchronize(stream_);
1601 double backbone_inference_time = timer.toc(true);
1602
1604 double get_objects_and_assign_time = timer.toc(true);
1605
1606 GenerateObjects(frame);
1607 std::stringstream sstr;
1608 sstr << "[CPDetection BeforeNMS] "
1609 << std::to_string(frame->timestamp)
1610 << " objs: " << frame->segmented_objects.size() << std::endl;
1611 for (auto obj : frame->segmented_objects) {
1612 sstr << "id = " << obj->id << ": " << obj->center(0) << ", "
1613 << obj->center(1) << ", " << obj->center(2) << ", "
1614 << obj->size(0) << ", " << obj->size(1) << ", "
1615 << obj->size(2) << ", " << obj->theta << ", "
1616 << static_cast<int>(obj->type) << ", "
1617 << obj->confidence << std::endl;
1618 }
1619 ADEBUG << sstr.str();
1620 // filter
1621 if (num_tasks_ > 1 && inter_class_nms_) {
1622 FilterObjectsbyClassNMS(&frame->segmented_objects);
1623 }
1624 std::stringstream ssstr;
1625 ssstr << "[CenterPointDetection AfterNMS] "
1626 << std::to_string(frame->timestamp)
1627 << " objs: " << frame->segmented_objects.size() << std::endl;
1628 for (auto obj : frame->segmented_objects) {
1629 ssstr << "id = " << obj->id << ": " << obj->center(0) << ", "
1630 << obj->center(1) << ", " << obj->center(2) << ", "
1631 << obj->size(0) << ", " << obj->size(1) << ", "
1632 << obj->size(2) << ", " << obj->theta << ", "
1633 << static_cast<int>(obj->type) << std::endl;
1634 }
1635 ADEBUG << ssstr.str();
1636
1637 // filter semantic if it's not unknown
1638 SetPointsInROI(&frame->segmented_objects);
1639 if (filter_by_semantic_type_) {
1640 FilterObjectsbySemanticType(&frame->segmented_objects);
1641 }
1642 RemoveForePoints(&frame->segmented_objects);
1643
1644 res_outputs_.clear();
1645 double post_process_time = timer.toc(true);
1646
1647 double total_time = pointcloud_pre_time + pfn_feature_generate_time +
1648 pfn_inference_time + backbone_feature_generate_time +
1649 backbone_inference_time + get_objects_and_assign_time + post_process_time;
1650 AINFO << "[CpDetTime] " << std::to_string(frame->timestamp)
1651 << ", pointcloud preprocess: " << pointcloud_pre_time
1652 << ", pfn feature generate: " << pfn_feature_generate_time
1653 << ", pfn inference: " << pfn_inference_time
1654 << ", backbone feature generate: " << backbone_feature_generate_time
1655 << ", backbone inference: " << backbone_inference_time
1656 << ", getObjects and assignPoints: " << get_objects_and_assign_time
1657 << ", postProcess: " << post_process_time
1658 << ", Total: " << total_time;
1659 return true;
1660}
void GenerateBackboneFeature(const base::Blob< float > *pillar_feature_blob)
Definition cpdet.h:93
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
AttributePointCloud< PointF > PointFCloud
optional common::PointCloudPreProcess preprocess

◆ GenerateBackboneFeature()

void apollo::perception::lidar::CPDetection::GenerateBackboneFeature ( const base::Blob< float > *  pillar_feature_blob)
inline

在文件 cpdet.h 第 93 行定义.

94 {
95 if (use_gpu_generate_feature_) {
96 GenerateBackboneFeatureGPU(pillar_feature_blob);
97 } else {
98 GenerateBackboneFeatureCPU(pillar_feature_blob);
99 }
100 }

◆ GeneratePfnFeature()

void apollo::perception::lidar::CPDetection::GeneratePfnFeature ( )
inline

在文件 cpdet.h 第 85 行定义.

85 {
86 if (use_gpu_generate_feature_) {
87 GeneratePfnFeatureGPU();
88 } else {
89 GeneratePfnFeatureCPU();
90 }
91 }

◆ GetObjectsAndAssignPoints()

void apollo::perception::lidar::CPDetection::GetObjectsAndAssignPoints ( )
inline

在文件 cpdet.h 第 102 行定义.

102 {
103 // all-gpu
104 if (!use_cpu_get_objects_ && !use_cpu_assign_points_) {
105 GetObjectsAndAssignPointsGPU();
106 return;
107 }
108 if (use_cpu_get_objects_) {
109 GetObjectsCPU();
110 } else {
111 GetObjectsGPU();
112 }
113 if (use_cpu_assign_points_) {
114 AssignPointsCPU();
115 } else {
116 AERROR << "Error: Not Support AssignPoints is False when GetObjects is not False";
117 return;
118 }
119 }

◆ Init()

bool apollo::perception::lidar::CPDetection::Init ( const CPDetectorInitOptions &  options = CPDetectorInitOptions())
overridevirtual

Init the Base Lidar Detector object

参数
optionslidar detector init options
返回
true
false

实现了 apollo::perception::lidar::BaseCPDetector.

在文件 cpdet.cc 第 56 行定义.

56 {
57 std::string conf_file =
58 GetConfigFile(options.config_path, options.config_file);
59 ACHECK(apollo::cyber::common::GetProtoFromFile(conf_file, &cpdet_config_));
60
61 LoadParams(cpdet_config_);
62
63 if (!InitModel(cpdet_config_.model_param())) {
64 AERROR << "Init CPDetection Model Failed";
65 return false;
66 }
67
68 // create cuda stream
69 cudaStreamCreate(&stream_);
70 pfn_inference_->SetStream(stream_);
71 backbone_inference_->SetStream(stream_);
72
73 // set private feature blob
74 point2grid_blob_.reset(new base::Blob<int>(std::vector<int>{max_voxel_num_}));
75 grid2pointnum_blob_.reset(new base::Blob<int>(std::vector<int>{map_size_}));
76
77 if (use_gpu_generate_feature_) {
78 voxels_blob_->mutable_gpu_data();
79 canvas_feature_blob_->mutable_gpu_data();
80 point2grid_blob_->mutable_gpu_data();
81 grid2pointnum_blob_->mutable_gpu_data();
82 } else {
83 voxels_blob_->mutable_cpu_data();
84 canvas_feature_blob_->mutable_cpu_data();
85 point2grid_blob_->mutable_cpu_data();
86 grid2pointnum_blob_->mutable_cpu_data();
87 }
88
89 int channel_index = pillar_feature_dim_;
90 feature_offset_["canvas_feature"] = canvas_feature_blob_->offset(0, 0);
91 if (use_cnnseg_features_) {
92 feature_offset_["max_height"] = canvas_feature_blob_->offset(0, channel_index++);
93 feature_offset_["mean_height"] = canvas_feature_blob_->offset(0, channel_index++);
94 feature_offset_["top_intensity"] = canvas_feature_blob_->offset(0, channel_index++);
95 feature_offset_["mean_intensity"] = canvas_feature_blob_->offset(0, channel_index++);
96 feature_offset_["count"] = canvas_feature_blob_->offset(0, channel_index++);
97 feature_offset_["nonempty"] = canvas_feature_blob_->offset(0, channel_index++);
98 feature_offset_["height_bin"] = canvas_feature_blob_->offset(0, channel_index);
99 }
100
101 max_candidate_num_ = num_tasks_ * nms_pre_max_size_;
102 all_res_box_blob_.reset(new base::Blob<float>(std::vector<int>{max_candidate_num_, kBoxBlockSize}));
103 all_res_conf_blob_.reset(new base::Blob<float>(std::vector<int>{max_candidate_num_}));
104 all_res_cls_blob_.reset(new base::Blob<int>(std::vector<int>{max_candidate_num_}));
105
106 res_box_num_blob_.reset(new base::Blob<int>(std::vector<int>{1}));
107 res_box_blob_.reset(new base::Blob<float>(std::vector<int>{nms_pre_max_size_, kBoxBlockSize}));
108 res_conf_blob_.reset(new base::Blob<float>(std::vector<int>{nms_pre_max_size_}));
109 res_cls_blob_.reset(new base::Blob<int>(std::vector<int>{nms_pre_max_size_}));
110
111 score_class_map_blob_.reset(new base::Blob<float>(std::vector<int>{num_classes_}));
112
113 res_sorted_indices_blob_.reset(new base::Blob<int>(std::vector<int>{nms_pre_max_size_}));
114 box_for_nms_blob_.reset(new base::Blob<float>(std::vector<int>{max_candidate_num_, 4}));
115 box_corner_blob_.reset(new base::Blob<float>(std::vector<int>{max_candidate_num_, 8}));
116 remain_conf_blob_.reset(new base::Blob<float>(std::vector<int>{nms_pre_max_size_}));
117 rotate_overlapped_blob_.reset(new base::Blob<bool>(std::vector<int>{nms_pre_max_size_, nms_pre_max_size_}));
118 kept_indices_blob_.reset(new base::Blob<int>(std::vector<int>{num_tasks_ * nms_post_max_size_}));
119
120 box_corners_blob_.reset(new base::Blob<float>(std::vector<int>{max_candidate_num_, 8}));
121 box_rects_blob_.reset(new base::Blob<float>(std::vector<int>{max_candidate_num_, 4}));
122 valid_point_num_blob_.reset(new base::Blob<int>(std::vector<int>{1}));
123 valid_point_indices_blob_.reset(new base::Blob<int>(std::vector<int>{max_valid_point_size_}));
124 valid_point2boxid_blob_.reset(new base::Blob<int>(std::vector<int>{max_valid_point_size_}));
125
126 res_box_num_blob_->mutable_gpu_data();
127 res_box_blob_->mutable_gpu_data();
128 res_conf_blob_->mutable_gpu_data();
129 res_cls_blob_->mutable_gpu_data();
130 all_res_box_blob_->mutable_gpu_data();
131 all_res_conf_blob_->mutable_gpu_data();
132 all_res_cls_blob_->mutable_gpu_data();
133 score_class_map_blob_->mutable_gpu_data();
134 remain_conf_blob_->mutable_gpu_data();
135 rotate_overlapped_blob_->mutable_gpu_data();
136 kept_indices_blob_->mutable_gpu_data();
137 box_corners_blob_->mutable_gpu_data();
138 box_rects_blob_->mutable_gpu_data();
139 valid_point_num_blob_->mutable_gpu_data();
140 valid_point_indices_blob_->mutable_gpu_data();
141 valid_point2boxid_blob_->mutable_gpu_data();
142
143 res_box_num_blob_->mutable_cpu_data();
144 all_res_box_blob_->mutable_cpu_data();
145 all_res_conf_blob_->mutable_cpu_data();
146 all_res_cls_blob_->mutable_cpu_data();
147 rotate_overlapped_blob_->mutable_cpu_data();
148 box_corners_blob_->mutable_cpu_data();
149 box_rects_blob_->mutable_cpu_data();
150 valid_point_num_blob_->mutable_cpu_data();
151 valid_point_indices_blob_->mutable_cpu_data();
152 valid_point2boxid_blob_->mutable_cpu_data();
153
154 if (cpdet_config_.has_plugins()) {
155 const auto &plugin = cpdet_config_.plugins();
156 const auto &name = plugin.name();
158 ->CreateInstance<BaseDownSample>(ConfigUtil::GetFullClassName(name));
159 if (!down_sample_) {
160 AINFO << "Failed to find down_sample plugin: " << name << ", skipped";
161 return false;
162 }
163 DownSampleInitOptions option;
164 option.config_path = plugin.config_path();
165 option.config_file = plugin.config_file();
166 if (!down_sample_->Init(option)) {
167 AINFO << "Failed to init down_sample plugin: " << name << ", skipped";
168 return false;
169 }
170 }
171
172 return true;
173}
static PluginManager * Instance()
get singleton instance of PluginManager
std::shared_ptr< Base > CreateInstance(const std::string &derived_class)
create plugin instance of derived class based on Base
static std::string GetFullClassName(const std::string &class_name)
Given the class name of perception module, combine the namespace "apollo::perception::lidar::" with i...
#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
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
Definition util.cc:80

◆ Name()

std::string apollo::perception::lidar::CPDetection::Name ( ) const
inlinevirtual

Name of Base Lidar Detector class

返回
std::string

实现了 apollo::perception::lidar::BaseCPDetector.

在文件 cpdet.h 第 83 行定义.

83{ return "CPDetection"; }

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