start = time.time()

    if show_images:
        image_viewer = ImageViewer()

    dataloader = DataLoader(path='Dataset/')
    training_images, training_labels = dataloader.get_training_set(
        shuffle=True)
    validation_images, validation_labels = dataloader.get_validation_set(
        shuffle=True)

    if show_images:
        image_viewer.add_to_plot(training_images[0], training_labels[0])

    feature_extractor = FeatureExtractor(training_images)
    training_keypoints = feature_extractor.get_keypoints(
        method=feature_extractor_method)

    if show_images:
        keypoint_image = training_images[0].copy()
        cv2.drawKeypoints(training_images[0], training_keypoints[0],
                          keypoint_image)
        image_viewer.add_to_plot(
            keypoint_image,
            feature_extractor_method + " " + training_labels[0])

    feature_descriptor = FeatureDescriptor(training_images, training_keypoints)
    training_descriptors = feature_descriptor.get_SIFT_descriptors()

    BOF = BagOfFeatures(training_descriptors, training_labels,
                        clustering_method)
    BOF.train()