#include #include #include #include #ifdef QCOM #include #else #include #endif #include "common/timing.h" #include "driving.h" #ifdef MEDMODEL #define MODEL_WIDTH 512 #define MODEL_HEIGHT 256 #define MODEL_NAME "driving_model_dlc" #else #define MODEL_WIDTH 320 #define MODEL_HEIGHT 160 #define MODEL_NAME "driving_model_dlc" #endif #define OUTPUT_SIZE (200 + 2*201 + 26) #define LEAD_MDN_N 5 #ifdef TEMPORAL #define TEMPORAL_SIZE 512 #else #define TEMPORAL_SIZE 0 #endif Eigen::Matrix vander; void model_init(ModelState* s, cl_device_id device_id, cl_context context, int temporal) { model_input_init(&s->in, MODEL_WIDTH, MODEL_HEIGHT, device_id, context); const int output_size = OUTPUT_SIZE + TEMPORAL_SIZE; s->output = (float*)malloc(output_size * sizeof(float)); memset(s->output, 0, output_size * sizeof(float)); s->m = new DefaultRunModel("../../models/driving_model.dlc", s->output, output_size); #ifdef TEMPORAL assert(temporal); s->m->addRecurrent(&s->output[OUTPUT_SIZE], TEMPORAL_SIZE); #endif // Build Vandermonde matrix for(int i = 0; i < MODEL_PATH_DISTANCE; i++) { for(int j = 0; j < POLYFIT_DEGREE; j++) { vander(i, j) = pow(i, POLYFIT_DEGREE-j-1); } } } ModelData model_eval_frame(ModelState* s, cl_command_queue q, cl_mem yuv_cl, int width, int height, mat3 transform, void* sock) { struct { float *path; float *left_lane; float *right_lane; float *lead; } net_outputs = {NULL}; //for (int i = 0; i < OUTPUT_SIZE + TEMPORAL_SIZE; i++) { printf("%f ", s->output[i]); } printf("\n"); float *net_input_buf = model_input_prepare(&s->in, q, yuv_cl, width, height, transform); //printf("readinggggg \n"); //FILE *f = fopen("goof_frame", "r"); //fread(net_input_buf, sizeof(float), MODEL_HEIGHT*MODEL_WIDTH*3/2, f); //fclose(f); //sleep(1); //printf("done \n"); s->m->execute(net_input_buf); // net outputs net_outputs.path = &s->output[0]; net_outputs.left_lane = &s->output[MODEL_PATH_DISTANCE*2]; net_outputs.right_lane = &s->output[MODEL_PATH_DISTANCE*2 + MODEL_PATH_DISTANCE*2 + 1]; net_outputs.lead = &s->output[MODEL_PATH_DISTANCE*2 + (MODEL_PATH_DISTANCE*2 + 1)*2]; ModelData model = {0}; for (int i=0; i net_outputs.lead[mdn_max_idx*5 + 4]) { mdn_max_idx = i; } } model.lead.prob = sigmoid(net_outputs.lead[LEAD_MDN_N*5]); model.lead.dist = net_outputs.lead[mdn_max_idx*5] * max_dist; model.lead.std = softplus(net_outputs.lead[mdn_max_idx*5 + 2]) * max_dist; model.lead.rel_v = net_outputs.lead[mdn_max_idx*5 + 1] * max_rel_vel; model.lead.rel_v_std = softplus(net_outputs.lead[mdn_max_idx*5 + 3]) * max_rel_vel; return model; } void model_free(ModelState* s) { free(s->output); model_input_free(&s->in); delete s->m; } void poly_fit(float *in_pts, float *in_stds, float *out) { // References to inputs Eigen::Map > pts(in_pts, MODEL_PATH_DISTANCE); Eigen::Map > std(in_stds, MODEL_PATH_DISTANCE); Eigen::Map > p(out, POLYFIT_DEGREE); // Build Least Squares equations Eigen::Matrix lhs = vander.array().colwise() / std.array(); Eigen::Matrix rhs = pts.array() / std.array(); // Solve inplace Eigen::ColPivHouseholderQR > qr(lhs); p = qr.solve(rhs); }