feature_output.cc 8.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/******************************************************************************
 * Copyright 2017 The Apollo Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *****************************************************************************/

#include "modules/prediction/common/feature_output.h"

19
#include "absl/strings/str_cat.h"
20
#include "cyber/common/file.h"
21
#include "modules/prediction/common/prediction_system_gflags.h"
22 23 24 25

namespace apollo {
namespace prediction {

26
using apollo::common::TrajectoryPoint;
K
kechxu 已提交
27

28
Features FeatureOutput::features_;
P
panjiacheng 已提交
29
ListDataForLearning FeatureOutput::list_data_for_learning_;
30
ListPredictionResult FeatureOutput::list_prediction_result_;
K
kechxu 已提交
31
ListFrameEnv FeatureOutput::list_frame_env_;
32
ListDataForTuning FeatureOutput::list_data_for_tuning_;
33 34
std::size_t FeatureOutput::idx_feature_ = 0;
std::size_t FeatureOutput::idx_learning_ = 0;
35
std::size_t FeatureOutput::idx_prediction_result_ = 0;
K
kechxu 已提交
36
std::size_t FeatureOutput::idx_frame_env_ = 0;
37
std::size_t FeatureOutput::idx_tuning_ = 0;
38

39 40
void FeatureOutput::Close() {
  ADEBUG << "Close feature output";
41 42 43
  switch (FLAGS_prediction_offline_mode) {
    case 1: {
      WriteFeatureProto();
K
kechxu 已提交
44
      break;
45 46 47
    }
    case 2: {
      WriteDataForLearning();
K
kechxu 已提交
48
      break;
49 50 51
    }
    case 3: {
      WritePredictionResult();
K
kechxu 已提交
52
      break;
53
    }
K
kechxu 已提交
54 55
    case 4: {
      WriteFrameEnv();
K
kechxu 已提交
56 57
      break;
    }
58 59 60 61
    case 5: {
      WriteDataForTuning();
      break;
    }
K
kechxu 已提交
62 63 64
    default: {
      // No data dump
      break;
K
kechxu 已提交
65
    }
66
  }
K
kechxu 已提交
67 68 69 70
  Clear();
}

void FeatureOutput::Clear() {
71 72
  idx_feature_ = 0;
  idx_learning_ = 0;
I
Ilya Belkin 已提交
73 74 75
  idx_prediction_result_ = 0;
  idx_frame_env_ = 0;
  idx_tuning_ = 0;
K
kechxu 已提交
76
  features_.Clear();
P
panjiacheng 已提交
77
  list_data_for_learning_.Clear();
I
Ilya Belkin 已提交
78 79 80
  list_prediction_result_.Clear();
  list_frame_env_.Clear();
  list_data_for_tuning_.Clear();
81
}
82

C
Calvin Miao 已提交
83 84 85 86
bool FeatureOutput::Ready() {
  Clear();
  return true;
}
K
kechxu 已提交
87

88
void FeatureOutput::InsertFeatureProto(const Feature& feature) {
89 90 91
  features_.add_feature()->CopyFrom(feature);
}

P
panjiacheng 已提交
92
void FeatureOutput::InsertDataForLearning(
93
    const Feature& feature, const std::vector<double>& feature_values,
94
    const std::string& category, const LaneSequence* lane_sequence_ptr) {
P
panjiacheng 已提交
95
  const std::vector<std::string> dummy_string_feature_values;
96 97 98 99
  InsertDataForLearning(feature, feature_values, dummy_string_feature_values,
                        category, lane_sequence_ptr);
}

X
Xiangquan Xiao 已提交
100 101 102 103
void FeatureOutput::InsertDataForLearning(
    const Feature& feature, const std::vector<double>& feature_values,
    const std::vector<std::string>& string_feature_values,
    const std::string& category, const LaneSequence* lane_sequence_ptr) {
P
panjiacheng 已提交
104 105 106 107
  DataForLearning* data_for_learning =
      list_data_for_learning_.add_data_for_learning();
  data_for_learning->set_id(feature.id());
  data_for_learning->set_timestamp(feature.timestamp());
P
panjiacheng 已提交
108 109 110 111
  *(data_for_learning->mutable_features_for_learning()) = {
      feature_values.begin(), feature_values.end()};
  *(data_for_learning->mutable_string_features_for_learning()) = {
      string_feature_values.begin(), string_feature_values.end()};
112
  data_for_learning->set_category(category);
X
 
Xiangquan Xiao 已提交
113 114
  ADEBUG << "Insert [" << category
         << "] data for learning with size = " << feature_values.size();
115 116 117 118
  if (lane_sequence_ptr != nullptr) {
    data_for_learning->set_lane_sequence_id(
        lane_sequence_ptr->lane_sequence_id());
  }
119 120
}

121
void FeatureOutput::InsertPredictionResult(
122 123
    const Obstacle* obstacle, const PredictionObstacle& prediction_obstacle,
    const ObstacleConf& obstacle_conf, const Scenario& scenario) {
124 125
  PredictionResult* prediction_result =
      list_prediction_result_.add_prediction_result();
126
  prediction_result->set_id(obstacle->id());
127 128 129 130
  prediction_result->set_timestamp(prediction_obstacle.timestamp());
  for (int i = 0; i < prediction_obstacle.trajectory_size(); ++i) {
    prediction_result->add_trajectory()->CopyFrom(
        prediction_obstacle.trajectory(i));
131
    prediction_result->mutable_obstacle_conf()->CopyFrom(obstacle_conf);
132
  }
133 134 135 136 137 138 139
  // Insert the scenario that the single obstacle is in
  if (scenario.type() == Scenario::JUNCTION &&
      obstacle->IsInJunction(scenario.junction_id())) {
    prediction_result->mutable_scenario()->set_type(Scenario::JUNCTION);
  } else if (obstacle->IsOnLane()) {
    prediction_result->mutable_scenario()->set_type(Scenario::CRUISE);
  }
140 141
}

K
kechxu 已提交
142 143 144 145
void FeatureOutput::InsertFrameEnv(const FrameEnv& frame_env) {
  list_frame_env_.add_frame_env()->CopyFrom(frame_env);
}

146 147
void FeatureOutput::InsertDataForTuning(
    const Feature& feature, const std::vector<double>& feature_values,
148 149
    const std::string& category, const LaneSequence& lane_sequence,
    const std::vector<TrajectoryPoint>& adc_trajectory) {
A
Aaron Xiao 已提交
150
  DataForTuning* data_for_tuning = list_data_for_tuning_.add_data_for_tuning();
151 152
  data_for_tuning->set_id(feature.id());
  data_for_tuning->set_timestamp(feature.timestamp());
A
Aaron Xiao 已提交
153 154
  *data_for_tuning->mutable_values_for_tuning() = {feature_values.begin(),
                                                   feature_values.end()};
155 156 157
  data_for_tuning->set_category(category);
  ADEBUG << "Insert [" << category
         << "] data for tuning with size = " << feature_values.size();
158
  data_for_tuning->set_lane_sequence_id(lane_sequence.lane_sequence_id());
159 160 161
  for (const auto& adc_traj_point : adc_trajectory) {
    data_for_tuning->add_adc_trajectory_point()->CopyFrom(adc_traj_point);
  }
162 163
}

164
void FeatureOutput::WriteFeatureProto() {
165
  if (features_.feature().empty()) {
K
kechxu 已提交
166
    ADEBUG << "Skip writing empty feature.";
167
  } else {
168 169
    const std::string file_name = absl::StrCat(
        FLAGS_prediction_data_dir, "/feature.", idx_feature_, ".bin");
170
    cyber::common::SetProtoToBinaryFile(features_, file_name);
171
    features_.Clear();
172
    ++idx_feature_;
173
  }
174
}
175

176
void FeatureOutput::WriteDataForLearning() {
K
kechxu 已提交
177
  if (list_data_for_learning_.data_for_learning().empty()) {
178 179
    ADEBUG << "Skip writing empty data_for_learning.";
  } else {
180 181
    const std::string file_name = absl::StrCat(
        FLAGS_prediction_data_dir, "/datalearn.", idx_learning_, ".bin");
182
    cyber::common::SetProtoToBinaryFile(list_data_for_learning_, file_name);
P
panjiacheng 已提交
183
    list_data_for_learning_.Clear();
184
    ++idx_learning_;
K
kechxu 已提交
185
  }
186
}
187

188
void FeatureOutput::WritePredictionResult() {
K
kechxu 已提交
189
  if (list_prediction_result_.prediction_result().empty()) {
190 191
    ADEBUG << "Skip writing empty prediction_result.";
  } else {
192
    const std::string file_name =
193 194
        absl::StrCat(FLAGS_prediction_data_dir, "/prediction_result.",
                     idx_prediction_result_, ".bin");
195
    cyber::common::SetProtoToBinaryFile(list_prediction_result_, file_name);
196 197 198 199 200
    list_prediction_result_.Clear();
    ++idx_prediction_result_;
  }
}

K
kechxu 已提交
201
void FeatureOutput::WriteFrameEnv() {
K
kechxu 已提交
202
  if (list_frame_env_.frame_env().empty()) {
K
kechxu 已提交
203 204
    ADEBUG << "Skip writing empty prediction_result.";
  } else {
205 206
    const std::string file_name = absl::StrCat(
        FLAGS_prediction_data_dir, "/frame_env.", idx_frame_env_, ".bin");
K
kechxu 已提交
207
    cyber::common::SetProtoToBinaryFile(list_frame_env_, file_name);
K
kechxu 已提交
208 209 210 211 212
    list_frame_env_.Clear();
    ++idx_frame_env_;
  }
}

213 214 215 216 217
void FeatureOutput::WriteDataForTuning() {
  if (list_data_for_tuning_.data_for_tuning().empty()) {
    ADEBUG << "Skip writing empty data_for_tuning.";
    return;
  }
218 219
  const std::string file_name = absl::StrCat(
      FLAGS_prediction_data_dir, "/datatuning.", idx_tuning_, ".bin");
220 221 222 223 224
  cyber::common::SetProtoToBinaryFile(list_data_for_tuning_, file_name);
  list_data_for_tuning_.Clear();
  ++idx_tuning_;
}

225 226
int FeatureOutput::Size() { return features_.feature_size(); }

227 228 229 230
int FeatureOutput::SizeOfDataForLearning() {
  return list_data_for_learning_.data_for_learning_size();
}

231 232 233 234
int FeatureOutput::SizeOfPredictionResult() {
  return list_prediction_result_.prediction_result_size();
}

235
int FeatureOutput::SizeOfFrameEnv() { return list_frame_env_.frame_env_size(); }
K
kechxu 已提交
236

237 238 239 240
int FeatureOutput::SizeOfDataForTuning() {
  return list_data_for_tuning_.data_for_tuning_size();
}

241 242
}  // namespace prediction
}  // namespace apollo