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
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
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
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])