def load_images(img_path, flip, rotate, zoom, shear, batch_size, img_size,
                seed):
    logger.info(
        'Loading training data from {}. {}, rotate={}, zoom={}, shear={}. Batch size={}. Image size={}.'.
        format(img_path, 'flip' if flip else 'no flip', rotate, zoom, shear,
               batch_size, img_size))
    training = image.ImageDataGenerator(
        horizontal_flip=flip,
        vertical_flip=flip,
        rotation_range=rotate,
        zoom_range=zoom,
        shear_range=shear)
    train_gen = image.DirectoryIterator(
        os.path.join(img_path, 'training'),
        training,
        batch_size=batch_size,
        target_size=(img_size, img_size),
        seed=seed)
    validation = image.ImageDataGenerator()
    valid_gen = image.DirectoryIterator(
        os.path.join(img_path, 'validation'),
        validation,
        batch_size=batch_size,
        target_size=(img_size, img_size),
        seed=seed)
    return train_gen, valid_gen
Example #2
0
def evaluate(model_root,
             model,
             images,
             image_size,
             num_batches,
             seed,
             top_n=None):
    imagegen = image.ImageDataGenerator()
    test_gen = image.DirectoryIterator(os.path.join(images, 'testing'),
                                       imagegen,
                                       target_size=(image_size, image_size),
                                       seed=seed,
                                       shuffle=True)
    # Get classes sorted by their value
    classes = [
        x[0]
        for x in sorted(test_gen.class_indices.items(), key=lambda x: x[1])
    ]
    metrics_path = model_root + "_metrics.csv"
    cm_path = model_root + "_cm.png"
    metrics, _, _ = score_keras.evaluate_model(model,
                                               test_gen,
                                               classes,
                                               num_batches,
                                               metrics_path,
                                               cm_path,
                                               top_n=top_n)
    return classes, cm_path, metrics
Example #3
0
def evaluate(model_root, model, images, image_size, seed, top_n=None):
    imagegen = image.ImageDataGenerator()
    test_gen = image.DirectoryIterator(os.path.join(images, 'testing'),
                                       imagegen,
                                       target_size=(image_size, image_size),
                                       seed=seed,
                                       shuffle=True)
    # Get classes sorted by their value
    classes = [
        x[0]
        for x in sorted(test_gen.class_indices.items(), key=lambda x: x[1])
    ]
    metrics_path = model_root.with_name(model_root.name + "_metrics.csv")
    cm_path = model_root.with_name(model_root.name + "_cm.png")
    metrics, _, _ = score_keras.evaluate_model(model,
                                               test_gen,
                                               classes,
                                               metrics_path,
                                               cm_path,
                                               top_n=top_n)
    class_map = model_root.with_name(model_root.name + "_classes.csv")
    try:
        with class_map.open('w', encoding='utf-8') as cmfp:
            cmfp.write('Class,ID\n')
            for i, c in enumerate(classes):
                cmfp.write('"{}",{}\n'.format(c, i))
    except:
        logger.warn('Failed to write class map file.')
    return classes, cm_path, metrics
def load_model_and_images(model_file, image_dir, seed):
    testpath = image_dir

    imagegen = image.ImageDataGenerator()
    test_gen = image.DirectoryIterator(testpath,
                                       imagegen,
                                       target_size=(224, 224),
                                       seed=seed,
                                       shuffle=True)

    model = load_model(model_file)
    # Get classes sorted by their value
    classes = [
        x[0]
        for x in sorted(test_gen.class_indices.items(), key=lambda x: x[1])
    ]

    return model, test_gen, classes
Example #5
0
def extract_neg_hard_pairs():
    path = os.path.join(os.path.join(os.path.join(base_path, "img"), "BOTH"),
                        "train")

    datagen_anchor = image.ImageDataGenerator(rescale=1 / 255.)
    datagen_negative = image.ImageDataGenerator(rescale=1 / 255.)

    iterator_anchor = image.DirectoryIterator(
        directory=path,
        image_data_generator=datagen_anchor,
        batch_size=1,
        target_size=(64, 64))
    iterator_negative = image.DirectoryIterator(
        directory=path,
        image_data_generator=datagen_negative,
        batch_size=1,
        target_size=(64, 64))

    def euclidean_dist(a, n):
        return np.sum(np.square((a - n))) / 64

    for i in tqdm(range(len(iterator_anchor)),
                  ncols=100,
                  desc="Training",
                  bar_format="{l_bar}%s{bar}%s{r_bar}" %
                  (Fore.GREEN, Fore.RESET)):
        info_anchor = iterator_anchor.filenames[i].split("/")
        cls_idx_anchor = info_anchor[0]
        item_idx_anchor = info_anchor[1]
        item_name_anchor = info_anchor[2]

        img_anchor, y_anchor = next(iterator_anchor)
        closest_dist = 1e9
        closest_cls_idx = -1
        closest_item_idx = -1
        closest_item_name = ""
        dist = 0
        for j in range(len(iterator_negative)):
            info_negative = iterator_negative.filenames[j].split("/")
            cls_idx_negative = info_negative[0]
            item_idx_negative = info_negative[1]
            item_name_negative = info_negative[2]

            img_negative, y_negative = next(iterator_negative)
            # dist = euclidean_dist(img_anchor, img_negative)

            if cls_idx_anchor != cls_idx_negative and closest_dist > dist:
                closest_dist = dist
                closest_cls_idx = cls_idx_negative
                closest_item_idx = item_idx_negative
                closest_item_name = item_name_negative

        pair_dict = {
            "c_idx_anc": cls_idx_anchor,
            "c_idx_neg": closest_cls_idx,
            "i_idx_anc": item_idx_anchor,
            "i_idx_neg": closest_item_idx,
            "i_name_anc": item_name_anchor,
            "i_name_neg": closest_item_name,
            "distance": closest_dist
        }

        print(pair_dict)

        with open('./data/Anno/hard_neg_pairs.csv', 'w') as output_file:
            writer = csv.writer(output_file)
            for key, value in pair_dict.items():
                writer.writerow([key, value])