@ -77,11 +77,10 @@ ModelDataRaw model_eval_frame(ModelState* s, cl_mem yuv_cl, int width, int heigh
// net outputs
ModelDataRaw net_outputs {
. plan = ( ModelDataRawPlans * ) & s - > output [ PLAN_IDX ] ,
. plans = ( ModelDataRawPlans * ) & s - > output [ PLAN_IDX ] ,
. lane_lines = ( ModelDataRawLaneLines * ) & s - > output [ LL_IDX ] ,
. road_edges = ( ModelDataRawRoadEdges * ) & s - > output [ RE_IDX ] ,
. lead = & s - > output [ LEAD_IDX ] ,
. lead_prob = & s - > output [ LEAD_PROB_IDX ] ,
. leads = ( ModelDataRawLeads * ) & s - > output [ LEAD_IDX ] ,
. meta = & s - > output [ DESIRE_STATE_IDX ] ,
. pose = ( ModelDataRawPose * ) & s - > output [ POSE_IDX ] ,
} ;
@ -92,59 +91,38 @@ void model_free(ModelState* s) {
delete s - > frame ;
}
static const float * get_best_data ( const float * data , int size , int group_size , int weight_idx ) {
int max_idx = 0 ;
for ( int i = 1 ; i < size ; i + + ) {
if ( data [ i * group_size + weight_idx ] >
data [ max_idx * group_size + weight_idx ] ) {
max_idx = i ;
}
}
return & data [ max_idx * group_size ] ;
}
static const float * get_lead_data ( const float * lead , int t_offset ) {
return get_best_data ( lead , LEAD_MHP_N , LEAD_MHP_GROUP_SIZE , LEAD_MHP_GROUP_SIZE - LEAD_MHP_SELECTION + t_offset ) ;
}
void fill_sigmoid ( const float * input , float * output , int len , int stride ) {
for ( int i = 0 ; i < len ; i + + ) {
output [ i ] = sigmoid ( input [ i * stride ] ) ;
}
}
void fill_lead_v3 ( cereal : : ModelDataV2 : : LeadDataV3 : : Builder lead , const float * lead_data , const float * prob , int t_offset , float prob_t ) {
float t [ LEAD_TRAJ_LEN ] = { 0.0 , 2.0 , 4.0 , 6.0 , 8.0 , 10.0 } ;
const float * data = get_lead_data ( lead_data , t_offset ) ;
lead . setProb ( sigmoid ( prob [ t_offset ] ) ) ;
void fill_lead ( cereal : : ModelDataV2 : : LeadDataV3 : : Builder lead , const ModelDataRawLeads & leads , int t_idx , float prob_t ) {
std : : array < float , LEAD_TRAJ_LEN > lead_t = { 0.0 , 2.0 , 4.0 , 6.0 , 8.0 , 10.0 } ;
auto best_prediction = leads . get_best_prediction ( t_idx ) ;
lead . setProb ( sigmoid ( leads . prob [ t_idx ] ) ) ;
lead . setProbTime ( prob_t ) ;
float x_arr [ LEAD_TRAJ_LEN ] ;
float y_arr [ LEAD_TRAJ_LEN ] ;
float v_arr [ LEAD_TRAJ_LEN ] ;
float a_arr [ LEAD_TRAJ_LEN ] ;
float x_stds_arr [ LEAD_TRAJ_LEN ] ;
float y_stds_arr [ LEAD_TRAJ_LEN ] ;
float v_stds_arr [ LEAD_TRAJ_LEN ] ;
float a_stds_arr [ LEAD_TRAJ_LEN ] ;
std : : array < float , LEAD_TRAJ_LEN > lead_x , lead_y , lead_v , lead_a ;
std : : array < float , LEAD_TRAJ_LEN > lead_x_std , lead_y_std , lead_v_std , lead_a_std ;
for ( int i = 0 ; i < LEAD_TRAJ_LEN ; i + + ) {
x_arr [ i ] = data [ i * LEAD_PRED_DIM + 0 ] ;
y_arr [ i ] = data [ i * LEAD_PRED_DIM + 1 ] ;
v_arr [ i ] = data [ i * LEAD_PRED_DIM + 2 ] ;
a_arr [ i ] = data [ i * LEAD_PRED_DIM + 3 ] ;
x_stds_arr [ i ] = exp ( data [ LEAD_MHP_VALS + i * LEAD_PRED_DIM + 0 ] ) ;
y_stds_arr [ i ] = exp ( data [ LEAD_MHP_VALS + i * LEAD_PRED_DIM + 1 ] ) ;
v_stds_arr [ i ] = exp ( data [ LEAD_MHP_VALS + i * LEAD_PRED_DIM + 2 ] ) ;
a_stds_arr [ i ] = exp ( data [ LEAD_MHP_VALS + i * LEAD_PRED_DIM + 3 ] ) ;
lead_x [ i ] = best_prediction . mean [ i ] . x ;
lead_y [ i ] = best_prediction . mean [ i ] . y ;
lead_v [ i ] = best_prediction . mean [ i ] . velocity ;
lead_a [ i ] = best_prediction . mean [ i ] . acceleration ;
lead_x_std [ i ] = exp ( best_prediction . std [ i ] . x ) ;
lead_ y_std[ i ] = exp ( best_prediction . std [ i ] . y ) ;
lead_ v_std[ i ] = exp ( best_prediction . std [ i ] . velocity ) ;
lead_ a_std[ i ] = exp ( best_prediction . std [ i ] . acceleration ) ;
}
lead . setT ( t ) ;
lead . setX ( x_arr ) ;
lead . setY ( y_arr ) ;
lead . setV ( v_arr ) ;
lead . setA ( a_arr ) ;
lead . setXStd ( x_stds_arr ) ;
lead . setYStd ( y_stds_arr ) ;
lead . setVStd ( v_stds_arr ) ;
lead . setAStd ( a_stds_arr ) ;
lead . setT ( to_kj_array_ptr ( lead_t ) ) ;
lead . setX ( to_kj_array_ptr ( lead_x ) ) ;
lead . setY ( to_kj_array_ptr ( lead_y ) ) ;
lead . setV ( to_kj_array_ptr ( lead_v ) ) ;
lead . setA ( to_kj_array_ptr ( lead_a ) ) ;
lead . setXStd ( to_kj_array_ptr ( lead_x_std ) ) ;
lead . setYStd ( to_kj_array_ptr ( lead_y_std ) ) ;
lead . setVStd ( to_kj_array_ptr ( lead_v_std ) ) ;
lead . setAStd ( to_kj_array_ptr ( lead_a_std ) ) ;
}
void fill_meta ( cereal : : ModelDataV2 : : MetaData : : Builder meta , const float * meta_data ) {
@ -219,7 +197,7 @@ void fill_xyzt(cereal::ModelDataV2::XYZTData::Builder xyzt, const std::array<flo
xyzt . setZStd ( to_kj_array_ptr ( z_std ) ) ;
}
void fill_plan ( cereal : : ModelDataV2 : : Builder & framed , const ModelDataRawPlanPath & plan ) {
void fill_plan ( cereal : : ModelDataV2 : : Builder & framed , const ModelDataRawPlanPrediction & plan ) {
std : : array < float , TRAJECTORY_SIZE > pos_x , pos_y , pos_z ;
std : : array < float , TRAJECTORY_SIZE > pos_x_std , pos_y_std , pos_z_std ;
std : : array < float , TRAJECTORY_SIZE > vel_x , vel_y , vel_z ;
@ -250,7 +228,7 @@ void fill_plan(cereal::ModelDataV2::Builder &framed, const ModelDataRawPlanPath
fill_xyzt ( framed . initOrientationRate ( ) , T_IDXS_FLOAT , rot_rate_x , rot_rate_y , rot_rate_z ) ;
}
void fill_lane_lines ( cereal : : ModelDataV2 : : Builder & framed , const std : : array < float , TRAJECTORY_SIZE > & plan_t_arr ,
void fill_lane_lines ( cereal : : ModelDataV2 : : Builder & framed , const std : : array < float , TRAJECTORY_SIZE > & plan_t ,
const ModelDataRawLaneLines & lanes ) {
std : : array < float , TRAJECTORY_SIZE > left_far_y , left_far_z ;
std : : array < float , TRAJECTORY_SIZE > left_near_y , left_near_z ;
@ -268,10 +246,10 @@ void fill_lane_lines(cereal::ModelDataV2::Builder &framed, const std::array<floa
}
auto lane_lines = framed . initLaneLines ( 4 ) ;
fill_xyzt ( lane_lines [ 0 ] , plan_t_arr , X_IDXS_FLOAT , left_far_y , left_far_z ) ;
fill_xyzt ( lane_lines [ 1 ] , plan_t_arr , X_IDXS_FLOAT , left_near_y , left_near_z ) ;
fill_xyzt ( lane_lines [ 2 ] , plan_t_arr , X_IDXS_FLOAT , right_near_y , right_near_z ) ;
fill_xyzt ( lane_lines [ 3 ] , plan_t_arr , X_IDXS_FLOAT , right_far_y , right_far_z ) ;
fill_xyzt ( lane_lines [ 0 ] , plan_t , X_IDXS_FLOAT , left_far_y , left_far_z ) ;
fill_xyzt ( lane_lines [ 1 ] , plan_t , X_IDXS_FLOAT , left_near_y , left_near_z ) ;
fill_xyzt ( lane_lines [ 2 ] , plan_t , X_IDXS_FLOAT , right_near_y , right_near_z ) ;
fill_xyzt ( lane_lines [ 3 ] , plan_t , X_IDXS_FLOAT , right_far_y , right_far_z ) ;
framed . setLaneLineStds ( {
exp ( lanes . std . left_far [ 0 ] . y ) ,
@ -288,7 +266,7 @@ void fill_lane_lines(cereal::ModelDataV2::Builder &framed, const std::array<floa
} ) ;
}
void fill_road_edges ( cereal : : ModelDataV2 : : Builder & framed , const std : : array < float , TRAJECTORY_SIZE > & plan_t_arr ,
void fill_road_edges ( cereal : : ModelDataV2 : : Builder & framed , const std : : array < float , TRAJECTORY_SIZE > & plan_t ,
const ModelDataRawRoadEdges & edges ) {
std : : array < float , TRAJECTORY_SIZE > left_y , left_z ;
std : : array < float , TRAJECTORY_SIZE > right_y , right_z ;
@ -300,8 +278,8 @@ void fill_road_edges(cereal::ModelDataV2::Builder &framed, const std::array<floa
}
auto road_edges = framed . initRoadEdges ( 2 ) ;
fill_xyzt ( road_edges [ 0 ] , plan_t_arr , X_IDXS_FLOAT , left_y , left_z ) ;
fill_xyzt ( road_edges [ 1 ] , plan_t_arr , X_IDXS_FLOAT , right_y , right_z ) ;
fill_xyzt ( road_edges [ 0 ] , plan_t , X_IDXS_FLOAT , left_y , left_z ) ;
fill_xyzt ( road_edges [ 1 ] , plan_t , X_IDXS_FLOAT , right_y , right_z ) ;
framed . setRoadEdgeStds ( {
exp ( edges . std . left [ 0 ] . y ) ,
@ -310,18 +288,18 @@ void fill_road_edges(cereal::ModelDataV2::Builder &framed, const std::array<floa
}
void fill_model ( cereal : : ModelDataV2 : : Builder & framed , const ModelDataRaw & net_outputs ) {
auto best_plan = net_outputs . plan - > get_best_pla n ( ) ;
std : : array < float , TRAJECTORY_SIZE > plan_t_arr ;
std : : fill_n ( plan_t_arr . data ( ) , plan_t_arr . size ( ) , NAN ) ;
plan_t_arr [ 0 ] = 0.0 ;
auto best_plan = net_outputs . plans - > get_best_predictio n ( ) ;
std : : array < float , TRAJECTORY_SIZE > plan_t ;
std : : fill_n ( plan_t . data ( ) , plan_t . size ( ) , NAN ) ;
plan_t [ 0 ] = 0.0 ;
for ( int xidx = 1 , tidx = 0 ; xidx < TRAJECTORY_SIZE ; xidx + + ) {
// increment tidx until we find an element that's further away than the current xidx
for ( int next_tid = tidx + 1 ; next_tid < TRAJECTORY_SIZE & & best_plan . mean [ next_tid ] . position . x < X_IDXS [ xidx ] ; next_tid + + ) {
tidx + + ;
}
if ( tidx = = TRAJECTORY_SIZE - 1 ) {
// if the p lan doesn't extend far enough, set plan_t to the max value (10s), then break
plan_t_arr [ xidx ] = T_IDXS [ TRAJECTORY_SIZE - 1 ] ;
// if the P lan doesn't extend far enough, set plan_t to the max value (10s), then break
plan_t [ xidx ] = T_IDXS [ TRAJECTORY_SIZE - 1 ] ;
break ;
}
@ -329,21 +307,21 @@ void fill_model(cereal::ModelDataV2::Builder &framed, const ModelDataRaw &net_ou
float current_x_val = best_plan . mean [ tidx ] . position . x ;
float next_x_val = best_plan . mean [ tidx + 1 ] . position . x ;
float p = ( X_IDXS [ xidx ] - current_x_val ) / ( next_x_val - current_x_val ) ;
plan_t_arr [ xidx ] = p * T_IDXS [ tidx + 1 ] + ( 1 - p ) * T_IDXS [ tidx ] ;
plan_t [ xidx ] = p * T_IDXS [ tidx + 1 ] + ( 1 - p ) * T_IDXS [ tidx ] ;
}
fill_plan ( framed , best_plan ) ;
fill_lane_lines ( framed , plan_t_arr , * net_outputs . lane_lines ) ;
fill_road_edges ( framed , plan_t_arr , * net_outputs . road_edges ) ;
fill_lane_lines ( framed , plan_t , * net_outputs . lane_lines ) ;
fill_road_edges ( framed , plan_t , * net_outputs . road_edges ) ;
// meta
fill_meta ( framed . initMeta ( ) , net_outputs . meta ) ;
// leads
auto leads = framed . initLeadsV3 ( LEAD_MHP_SELECTION ) ;
float t_offsets [ LEAD_MHP_SELECTION ] = { 0.0 , 2.0 , 4.0 } ;
for ( int t_offset = 0 ; t_offset < LEAD_MHP_SELECTION ; t_offset + + ) {
fill_lead_v3 ( leads [ t_offset ] , net_outputs . lead , net_outputs . lead_prob , t_offset , t_offsets [ t_offset ] ) ;
std : : array < float , LEAD_MHP_SELECTION > t_offsets = { 0.0 , 2.0 , 4.0 } ;
for ( int i = 0 ; i < LEAD_MHP_SELECTION ; i + + ) {
fill_lead ( leads [ i ] , * net_outputs . leads , i , t_offsets [ i ] ) ;
}
}