示例#1
0
def test(args):
    print('[%s] Selected mode: Test' % appName)

    # Local Variables
    numSamples = None

    # -----------------------------------------
    #  Network Testing Model - Importing Graph
    # -----------------------------------------
    # Loads the dataset and restores a specified trained model.
    data = Dataloader(args)

    # Searches dataset images filenames
    if TEST_EVALUATE_SUBSET == 0:
        _, _, _, _, numSamples = data.getTestData()
    elif TEST_EVALUATE_SUBSET == 1:
        data.test_image_filenames, data.test_depth_filenames, tf_test_image_filenames, tf_test_depth_filenames, numSamples = data.getTrainData(
        )

    model = Test(args, data)

    with tf.Session() as sess:
        print('\n[network/Testing] Loading the model...')

        # Use to load from *.ckpt file
        saver = tf.train.Saver()
        saver.restore(sess, args.model_path)

        # Use to load from npy file
        # net.load(model_data_path, sess)

        # ==============
        #  Testing Loop
        # ==============
        if args.show_test_results:
            test_plotObj = Plot(args.mode, title='Test Predictions')

        timer = -time.time()
        pred_list, gt_list = [], []
        for i in range(numSamples):
            # for i in range(5): # Only for testing!

            timer2 = -time.time()

            # Evalute the network for the given image
            # data.test_depth_filenames = [] # Only for testing the following condition!!! # FIXME: Atualmente, o código não dá suporte para esta situação
            if data.test_depth_filenames:  # It's not empty
                feed_test = {
                    model.tf_image_key: data.test_image_filenames[i],
                    model.tf_depth_key: data.test_depth_filenames[i]
                }

                _, depth, depth_resized = sess.run(model.depth_op, feed_test)

            else:
                feed_test = {model.tf_image_key: data.test_image_filenames[i]}

            _, image, image_resized = sess.run(model.image_op, feed_test)
            pred, pred_up = sess.run(model.pred_op, feed_test)

            # Clips Predictions at 50, 80 meters
            try:
                pred_50, pred_80 = sess.run(
                    [model.tf_pred_50, model.tf_pred_80], feed_test)
            except AttributeError:
                pred_50 = np.zeros((model.batch_size, ) +
                                   model.output_size.getSize())
                pred_80 = np.zeros((model.batch_size, ) +
                                   model.output_size.getSize())

            # Fill arrays for later on metrics evaluation
            pred_list.append(pred_up[0, :, :, 0])
            gt_list.append(depth[:, :, 0])

            # Saves the Test Predictions as uint16 PNG Images
            if SAVE_TEST_DISPARITIES:
                # Convert the Predictions Images from float32 to uint16
                pred_up_uint16 = exposure.rescale_intensity(pred_up[0],
                                                            out_range='float')
                pred_up_uint16 = img_as_uint(pred_up_uint16)

                depth_uint16 = exposure.rescale_intensity(depth,
                                                          out_range='float')
                depth_uint16 = img_as_uint(depth_uint16)

                # Save PNG Images
                imageio.imsave("output/tmp/pred/pred" + str(i) + ".png",
                               pred_up_uint16)
                imageio.imsave("output/tmp/gt/gt" + str(i) + ".png",
                               depth_uint16)

            # Prints Testing Progress
            timer2 += time.time()
            print('step: %d/%d | t: %f | size(pred_list+gt_list): %d' %
                  (i + 1, numSamples, timer2,
                   total_size(pred_list) + total_size(gt_list)))
            # break # Test

            # Show Results
            if args.show_test_results:
                test_plotObj.showTestResults(image=image,
                                             depth=depth[:, :, 0],
                                             image_resized=image_resized,
                                             depth_resized=depth_resized[:, :,
                                                                         0],
                                             pred=pred[0, :, :, 0],
                                             pred_up=pred_up[0, :, :, 0],
                                             pred_50=pred_50[0, :, :, 0],
                                             pred_80=pred_80[0, :, :, 0],
                                             i=i + 1)

            # input("Continue...")

        # Testing Finished.
        timer += time.time()
        print("\n[Network/Testing] Testing FINISHED! Time elapsed: %f s" %
              timer)

        # =========
        #  Results
        # =========
        # Calculate Metrics
        if data.test_depth_filenames:
            print(
                "[Network/Testing] Calculating Metrics based on Testing Predictions..."
            )

            pred_array = np.array(pred_list)
            gt_array = np.array(gt_list)

            # LainaMetrics.evaluate(pred_array, gt_array) # FIXME:
            # myMetrics.evaluate(pred_array, gt_array) # FIXME:
            MonodepthMetrics.evaluate(pred_array, gt_array)

        else:
            print(
                "[Network/Testing] It's not possible to calculate Metrics. There are no corresponding labels for Testing Predictions!"
            )