Exemple #1
0
    def run_checkpoint_once(self, checkpoint_to_restore):
        """Evaluates network metrics once over all the validation samples.

        Args:
            checkpoint_to_restore: The directory of the checkpoint to restore.
        """

        self._saver.restore(self._sess, checkpoint_to_restore)

        data_split = self.dataset_config.data_split
        predictions_base_dir = self.paths_config.pred_dir

        num_samples = self.model.dataset.num_samples
        train_val_test = self.model._train_val_test

        validation = train_val_test == 'val'

        global_step = trainer_utils.get_global_step(self._sess,
                                                    self.global_step_tensor)

        # Rpn average losses dictionary
        if validation:
            eval_rpn_losses = self._create_rpn_losses_dict()

        # Add folders to save predictions
        prop_score_predictions_dir = predictions_base_dir + \
            "/proposals_and_scores/{}/{}".format(
                data_split, global_step)
        trainer_utils.create_dir(prop_score_predictions_dir)

        if self.full_model:
            # Make sure the box representation is valid
            box_rep = self.model_config.avod_config.avod_box_representation
            if box_rep not in [
                    'box_3d', 'box_8c', 'box_8co', 'box_4c', 'box_4ca'
            ]:
                raise ValueError(
                    'Invalid box representation {}.'.format(box_rep))

            avod_predictions_dir = predictions_base_dir + \
                "/final_predictions_and_scores/{}/{}".format(
                    data_split, global_step)
            trainer_utils.create_dir(avod_predictions_dir)

            if box_rep in ['box_8c', 'box_8co', 'box_4c', 'box_4ca']:
                avod_box_corners_dir = predictions_base_dir + \
                    "/final_boxes_{}_and_scores/{}/{}".format(
                        box_rep, data_split, global_step)
                trainer_utils.create_dir(avod_box_corners_dir)

            # Avod average losses dictionary
            eval_avod_losses = self._create_avod_losses_dict()

        num_valid_samples = 0

        # Keep track of feed_dict and inference time
        total_feed_dict_time = []
        total_inference_time = []

        # Run through a single epoch
        current_epoch = self.model.dataset.epochs_completed
        while current_epoch == self.model.dataset.epochs_completed:

            # Keep track of feed_dict speed
            start_time = time.time()
            feed_dict = self.model.create_feed_dict()
            feed_dict_time = time.time() - start_time

            # Get sample name from model
            sample_name = self.model.sample_info['sample_name']

            # File paths for saving proposals and predictions
            rpn_file_path = prop_score_predictions_dir + "/{}.txt".format(
                sample_name)

            if self.full_model:
                avod_file_path = avod_predictions_dir + \
                    "/{}.txt".format(sample_name)

                if box_rep in ['box_8c', 'box_8co', 'box_4c', 'box_4ca']:
                    avod_box_corners_file_path = avod_box_corners_dir + \
                        '/{}.txt'.format(sample_name)

            num_valid_samples += 1
            print("Step {}: {} / {}, Inference on sample {}".format(
                global_step, num_valid_samples, num_samples, sample_name))

            # Do predictions, loss calculations, and summaries
            if validation:
                if self.summary_merged is not None:
                    predictions, eval_losses, eval_total_loss, summary_out = \
                        self._sess.run([self._prediction_dict,
                                        self._loss_dict,
                                        self._total_loss,
                                        self.summary_merged],
                                       feed_dict=feed_dict)
                    self.summary_writer.add_summary(summary_out, global_step)

                else:
                    predictions, eval_losses, eval_total_loss = \
                        self._sess.run([self._prediction_dict,
                                        self._loss_dict,
                                        self._total_loss],
                                       feed_dict=feed_dict)

                rpn_objectness_loss = eval_losses[RpnModel.LOSS_RPN_OBJECTNESS]
                rpn_regression_loss = eval_losses[RpnModel.LOSS_RPN_REGRESSION]

                self._update_rpn_losses(eval_rpn_losses, rpn_objectness_loss,
                                        rpn_regression_loss, eval_total_loss,
                                        global_step)

                # Save proposals
                proposals_and_scores = \
                    self.get_rpn_proposals_and_scores(predictions)
                np.savetxt(rpn_file_path, proposals_and_scores, fmt='%.3f')

                # Save predictions
                predictions_and_scores = \
                    self.get_avod_predicted_boxes_3d_and_scores(predictions,
                                                                box_rep)
                np.savetxt(avod_file_path, predictions_and_scores, fmt='%.5f')

                if self.full_model:
                    if box_rep in ['box_3d', 'box_4ca']:
                        self._update_avod_box_cls_loc_orient_losses(
                            eval_avod_losses, eval_losses, eval_total_loss,
                            global_step)

                    elif box_rep in ['box_8c', 'box_8co', 'box_4c']:
                        self._update_avod_box_cls_loc_losses(
                            eval_avod_losses, eval_losses, eval_total_loss,
                            global_step)

                    if box_rep != 'box_3d':
                        # Save box corners for all box reps
                        # except for box_3d which is not a corner rep
                        predicted_box_corners_and_scores = \
                            self.get_avod_predicted_box_corners_and_scores(
                                predictions, box_rep)
                        np.savetxt(avod_box_corners_file_path,
                                   predicted_box_corners_and_scores,
                                   fmt='%.5f')

                # Calculate accuracies
                self.get_cls_accuracy(predictions, eval_avod_losses,
                                      eval_rpn_losses, global_step)
                print("Step {}: Total time {} s".format(
                    global_step,
                    time.time() - start_time))

            else:
                # Test mode --> train_val_test == 'test'
                inference_start_time = time.time()
                # Don't calculate loss or run summaries for test
                predictions = self._sess.run(self._prediction_dict,
                                             feed_dict=feed_dict)
                inference_time = time.time() - inference_start_time

                # Add times to list
                total_feed_dict_time.append(feed_dict_time)
                total_inference_time.append(inference_time)

                proposals_and_scores = \
                    self.get_rpn_proposals_and_scores(predictions)
                predictions_and_scores = \
                    self.get_avod_predicted_boxes_3d_and_scores(predictions,
                                                                box_rep)

                np.savetxt(rpn_file_path, proposals_and_scores, fmt='%.3f')
                np.savetxt(avod_file_path, predictions_and_scores, fmt='%.5f')

        # end while current_epoch == model.dataset.epochs_completed:

        if validation:
            self.save_proposal_losses_results(eval_rpn_losses,
                                              num_valid_samples, global_step,
                                              predictions_base_dir)
            if self.full_model:
                self.save_prediction_losses_results(eval_avod_losses,
                                                    num_valid_samples,
                                                    global_step,
                                                    predictions_base_dir,
                                                    box_rep=box_rep)

                # Kitti native evaluation, do this during validation
                # and when running Avod model.
                # Store predictions in kitti format
                if self.do_kitti_native_eval:
                    self.run_kitti_native_eval(global_step)

        else:
            # Test mode --> train_val_test == 'test'
            evaluator_utils.print_inference_time_statistics(
                total_feed_dict_time, total_inference_time)

        print("Step {}: Finished evaluation, results saved to {}".format(
            global_step, prop_score_predictions_dir))
    def run_checkpoint_once(self, checkpoint_to_restore):
        """Evaluates network metrics once over all the validation samples.

        Args:
            checkpoint_to_restore: The directory of the checkpoint to restore.
        """

        self._saver.restore(self._sess, checkpoint_to_restore)

        data_split = self.dataset_config.data_split
        predictions_base_dir = self.paths_config.pred_dir

        num_samples = self.model.dataset.num_samples
        train_val_test = self.model._train_val_test
        print('model: train_val_test: ', train_val_test)

        validation = train_val_test == 'val'

        global_step = trainer_utils.get_global_step(self._sess,
                                                    self.global_step_tensor)

        # Rpn average losses dictionary
        if validation:
            sum_losses = self._create_losses_dict()

        # Make sure the box representation is valid
        predictions_dir = predictions_base_dir + \
                "/final_predictions_and_scores/{}/{}".format(
                data_split, global_step)
        trainer_utils.create_dir(predictions_dir)

        num_valid_samples = 0

        # Keep track of feed_dict and inference time
        total_feed_dict_time = []
        total_inference_time = []

        # Run through a single epoch
        current_epoch = self.model.dataset.epochs_completed

        #run_metadata = tf.RunMetadata()
        #run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
        while current_epoch == self.model.dataset.epochs_completed:
            # Keep track of feed_dict speed
            start_time = time.time()
            #feed_dict = self.model.create_feed_dict(sample_index=sample_index)
            feed_dict = self.model.create_feed_dict()
            feed_dict_time = time.time() - start_time

            # Get sample name from model
            sample_name = self.model.sample_info['sample_name']
            stereo_calib = calib_utils.read_calibration(
                self.model.dataset.calib_dir, int(sample_name))
            stereo_calib_p2 = stereo_calib.p2

            output_file_path = predictions_dir + \
                "/{}.txt".format(sample_name)

            num_valid_samples += 1
            #if num_valid_samples > 1:
            #    break
            print("Step {}: {} / {}, Inference on sample {}".format(
                global_step, num_valid_samples, num_samples, sample_name))

            # Do predictions, loss calculations, and summaries

            if validation:
                if self.summary_merged is not None:
                    predictions, eval_losses, eval_total_loss, summary_out = \
                        self._sess.run([self._prediction_dict,
                                        self._loss_dict,
                                        self._total_loss,
                                        self.summary_merged],
                                       feed_dict=feed_dict)

                    if num_valid_samples == 2 and num_samples == 2:
                        self.summary_writer2.add_summary(
                            summary_out, global_step)
                    else:
                        self.summary_writer.add_summary(
                            summary_out, global_step)

                else:
                    print('start inference without smry:')
                    predictions, eval_losses, eval_total_loss = \
                        self._sess.run([self._prediction_dict,
                                        self._loss_dict,
                                        self._total_loss],
                                       feed_dict=feed_dict)
                    #options=run_options,
                    #run_metadata=run_metadata)
                    #self.summary_writer.add_run_metadata(run_metadata, \
                    #        'step {} sp:{}'.format(global_step/1000, int(sample_name)))

                self._update_losses(eval_losses, eval_total_loss, sum_losses,
                                    global_step)
                # Save predictions

                print('save predictions')
                predictions_and_scores = \
                    self.get_predicted_boxes_3d_and_scores(predictions,
                                                            stereo_calib_p2)
                np.savetxt(output_file_path,
                           predictions_and_scores,
                           fmt='%.5f')

                # Calculate accuracies
                #Unnecessary because there is only one class.. object class without bkg class..
                self.get_cls_accuracy(predictions, sum_losses, global_step)
                print("Step {}: Total time {} s".format(
                    global_step,
                    time.time() - start_time))

            else:
                # Test mode --> train_val_test == 'test'
                inference_start_time = time.time()
                # Don't calculate loss or run summaries for test
                predictions = self._sess.run(self._prediction_dict,
                                             feed_dict=feed_dict)
                inference_time = time.time() - inference_start_time

                # Add times to list
                total_feed_dict_time.append(feed_dict_time)
                total_inference_time.append(inference_time)

                predictions_and_scores = \
                    self.get_predicted_boxes_3d_and_scores(predictions,
                                                            stereo_calib_p2)
                np.savetxt(file_path, predictions_and_scores, fmt='%.5f')

        # end while current_epoch == model.dataset.epochs_completed:

        if validation:
            # Kitti native evaluation, do this during validation
            # and when running Avod model.
            # Store predictions in kitti format
            self.save_prediction_losses_results(sum_losses, num_valid_samples, \
                    global_step, predictions_base_dir)
            if self.do_kitti_native_eval:
                pass
                #self.run_kitti_native_eval(global_step)

        else:
            # Test mode --> train_val_test == 'test'
            evaluator_utils.print_inference_time_statistics(
                total_feed_dict_time, total_inference_time)

        print("Step {}: Finished evaluation, results saved to {}".format(
            global_step, predictions_dir))