def benchmark(config): model_config = config['model'] benchmark_config = config['benchmark'] model_path = model_config['model_filename'] dataset_path = benchmark_config['dataset_path'] # Parameters params = { 'dim': model_config['input_shape'], 'batch_size': benchmark_config['batch_size'], 'shuffle': False } # Dataset train_dataset = ImageDataset(dataset_path, 'train') train_dataset.prepare(benchmark_config['test_cases'] // 2) train_generator = DataGenerator(train_dataset, **params) test_dataset = ImageDataset(dataset_path, 'validation') test_dataset.prepare(benchmark_config['test_cases'] // 2) test_generator = DataGenerator(test_dataset, **params) if os.path.exists(model_path): feature_model = ResNet50Fused(include_top=False, weights=None, input_shape=model_config['input_shape']) img_a_in = Input(shape=model_config['input_shape'], name='ImageA_Input') img_b_in = Input(shape=model_config['input_shape'], name='ImageB_Input') if model_config['two_gpus']: with tf.device('/gpu:0'): img_a_feat = feature_model(img_a_in) with tf.device('/gpu:1'): img_b_feat = feature_model(img_b_in) else: img_a_feat = feature_model(img_a_in) img_b_feat = feature_model(img_b_in) distance = Lambda(l1_distance)([img_a_feat, img_b_feat]) distance = Dense(1, activation='sigmoid')(distance) similarity_model = Model(inputs=[img_a_in, img_b_in], outputs=distance, name='Similarity_Model') similarity_model.load_weights(model_path) else: print('No model exists at the given path!') exit(1) # preds = np.array([]) # gts = np.array([]) # for i in tqdm(range(len(train_generator))): # batch = train_generator[i] # pred = similarity_model.predict_on_batch(batch[0]) # preds = np.append(preds, pred.flatten()) # gts = np.append(gts, batch[1]) # # if config['vis_output'] and not i % config['test_cases']//(5*config['batch_size']): # # show_output(batch[0][0], batch[0][1], pred, batch[1]) # tr_acc = compute_accuracy(preds, gts) # print('* Accuracy on training set: %0.2f%%' % (100 * tr_acc)) evaluation_times = [] preds = np.array([]) gts = np.array([]) for i in tqdm(range(len(test_generator))): batch = test_generator[i] start_t = time.time() pred = similarity_model.predict_on_batch(batch[0]) evaluation_times.append((time.time() - start_t) / len(batch)) preds = np.append(preds, pred.flatten()) gts = np.append(gts, batch[1]) if benchmark_config['vis_output'] and not i % benchmark_config[ 'test_cases'] // (5 * benchmark_config['batch_size']): show_output(batch[0][0], batch[0][1], pred, batch[1]) te_acc = compute_accuracy(preds, gts) print('* Accuracy on test set: %0.2f%%' % (100 * te_acc)) print("Average Evaluation Time Per Sample: " + str(np.mean(evaluation_times)))
def train(config): model_dir = config['model']['dir'] model_name = config['model']['name'] dataset_path = config['dataset']['path'] train_config = config['training'] # Parameters params = { 'dim': train_config['img_dims'], 'batch_size': train_config['batch_size'], 'shuffle': train_config['shuffle_training_inputs'] } # Datasets train_dataset = ImageDataset(dataset_path, 'train') train_dataset.prepare(1000) val_dataset = ImageDataset(dataset_path, 'validation') val_dataset.prepare(1000) # Generators training_generator = DataGenerator(train_dataset, **params) validation_generator = DataGenerator(val_dataset, **params) if config['model']['weights'] == 'random': feature_model = ResNet50Fused(include_top=False, weights=None, input_shape=train_config['img_dims']) elif config['model']['weights'] == 'imagenet': feature_model = ResNet50Fused(include_top=False, weights='imagenet', input_shape=train_config['img_dims']) elif config['model']['weights'] == 'last': if os.path.exists(os.path.join(model_dir, model_name + '.h5')): feature_model = load_model( os.path.join(model_dir, model_name + '.h5')) else: print( 'No model exists at the given path; starting new randomly initialized model' ) feature_model = ResNet50Fused(include_top=False, weights=None, input_shape=train_config['img_dims']) else: print('Invalid weights value given, exiting....') exit(1) img_a_in = Input(shape=train_config['img_dims'], name='ImageA_Input') img_b_in = Input(shape=train_config['img_dims'], name='ImageB_Input') if train_config['use_two_gpus']: with tf.device('/gpu:0'): img_a_feat = feature_model(img_a_in) with tf.device('/gpu:1'): img_b_feat = feature_model(img_b_in) else: img_a_feat = feature_model(img_a_in) img_b_feat = feature_model(img_b_in) if train_config['distance'] == 'l1': distance = Lambda(utils.l1_distance)([img_a_feat, img_b_feat]) elif train_config['distance'] == 'l2': distance = Lambda(utils.l2_distance)([img_a_feat, img_b_feat]) else: print('Distance function not supported') exit(1) # distance = Dense(3840, activation = 'linear')(distance) # distance = BatchNormalization()(distance) # distance = Activation('relu')(distance) distance = Dense(1, activation='sigmoid')(distance) similarity_model = Model(inputs=[img_a_in, img_b_in], outputs=distance, name='Similarity_Model') similarity_model.compile(loss=utils.contrastive_loss, optimizer=Adam(lr=train_config['learning_rate']), metrics=[utils.accuracy]) similarity_model.summary() # Directory for training logs now = datetime.datetime.now() log_dir = os.path.join(model_dir, "{}{:%Y%m%dT%H%M}".format(model_name.lower(), now)) # Create log_dir if not exists if not os.path.exists(log_dir): os.makedirs(log_dir) # Path to save after each epoch. Include placeholders that get filled by Keras. checkpoint_path = os.path.join(log_dir, "{}_*epoch*.h5".format(model_name.lower())) checkpoint_path = checkpoint_path.replace("*epoch*", "{epoch:04d}") callbacks = [ keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=0, write_graph=True, write_images=False), keras.callbacks.ModelCheckpoint(checkpoint_path, verbose=0, save_weights_only=True), ] similarity_model.fit_generator(generator=training_generator, validation_data=validation_generator, epochs=50, use_multiprocessing=True, callbacks=callbacks, workers=multiprocessing.cpu_count()) similarity_model.save(os.path.join( model_dir, model_name + '.h5')) # creates a HDF5 file 'my_model.h5'
def train(self, config): train_dataset = ImageDataset(config['dataset_path'], 'train', config['data_augmentation_suffixes'], config['allow_different_views']) train_dataset.prepare(config['num_train_pairs']) val_dataset = ImageDataset(config['dataset_path'], 'validation') val_dataset.prepare(config['num_val_pairs']) train_generator = DataGenerator( train_dataset, batch_size=config['batch_size'], dim=self.config['input_shape'], shuffle=config['shuffle_training_inputs'], dataset_type=config['dataset_type']) val_generator = DataGenerator( val_dataset, batch_size=config['batch_size'], dim=self.config['input_shape'], shuffle=config['shuffle_training_inputs'], dataset_type=config['dataset_type']) model_path, _ = os.path.split(self.config['model_filename']) callbacks = [ keras.callbacks.TensorBoard(log_dir=self.log_dir, histogram_freq=0, write_graph=True, write_images=False), keras.callbacks.ModelCheckpoint(self.checkpoint_path, verbose=0, save_weights_only=True) ] self.keras_model.compile( loss=utils.contrastive_loss, optimizer=Adam(lr=config['learning_rate']), metrics=[utils.accuracy, utils.auc_roc, 'acc']) history = self.keras_model.fit_generator( generator=train_generator, validation_data=val_generator, epochs=config['epochs'], use_multiprocessing=True, callbacks=callbacks, workers=multiprocessing.cpu_count()) self.keras_model.save(self.config['model_filename']) #------------------------------------------------------- pred_generator = DataGenerator( val_dataset, batch_size=config['batch_size'], dim=self.config['input_shape'], shuffle=config['shuffle_training_inputs'], dataset_type=config['dataset_type'], output=True) predictions = self.keras_model.predict_generator(pred_generator, verbose=1) np.save('predictions.npy', np.array(predictions)) #------------------------------------------------------- acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs = range(1, len(acc) + 1) plt.plot(epochs, acc, 'b', label='Training acc') plt.plot(epochs, val_acc, 'r', label='Validation acc') plt.xlabel('Epochs') plt.ylabel('Accuracy %') plt.title('Training and validation accuracy') plt.legend() plt.savefig('acc.png') plt.figure() plt.plot(epochs, loss, 'b', label='Training loss') plt.plot(epochs, val_loss, 'r', label='Validation loss') plt.xlabel('Epochs') plt.ylabel('Validation %') plt.title('Training and validation loss') plt.legend() plt.savefig('loss.png') plt.show()
def train(self, config): train_dataset = ImageDataset(config['dataset_path'], 'seen', config['data_augmentation_suffixes'], config['allow_different_views']) train_dataset.prepare(config['num_train_pairs']) val_dataset = ImageDataset(config['dataset_path'], 'test') val_dataset.prepare(config['num_val_pairs']) train_generator = DataGenerator( train_dataset, batch_size=config['batch_size'], dim=self.config['input_shape'], shuffle=config['shuffle_training_inputs'], dataset_type=config['dataset_type']) val_generator = DataGenerator( val_dataset, batch_size=config['batch_size'], dim=self.config['input_shape'], shuffle=config['shuffle_training_inputs'], dataset_type=config['dataset_type']) model_path, _ = os.path.split(self.config['model_filename']) callbacks = [ keras.callbacks.TensorBoard(log_dir=self.log_dir, histogram_freq=0, write_graph=True, write_images=False), keras.callbacks.ModelCheckpoint(self.checkpoint_path, verbose=0, save_weights_only=True) ] self.keras_model.compile( loss=utils.contrastive_loss, optimizer=Adam(lr=config['learning_rate']), metrics=[utils.accuracy, utils.auc_roc, 'acc']) history = self.keras_model.fit_generator( generator=train_generator, validation_data=val_generator, epochs=config['epochs'], use_multiprocessing=True, callbacks=callbacks, workers=multiprocessing.cpu_count()) self.keras_model.save(self.config['model_filename']) #------------------------------------------------------- #make new dataset seen_dataset = ImageDataset(config['dataset_path'], 'seen') seen = [] #only add imgs that are returned by nearpy new = [] for i in range(5): new += [ os.path.join(x, 'view_00000{}'.format(i)) for x in os.listdir( os.path.join(config['dataset_path'], 'test')) ] pred_arr = [] dimension = 9984 engine = Engine(dimension, vector_filters=[NearestFilter(5)]) #for i in range(0, iter): #seen = list(seen_dataset._class_labels) seen = [] for i in range(5): seen += [ os.path.join(x, 'view_00000{}'.format(i)) for x in os.listdir( os.path.join(config['dataset_path'], 'seen')) ] for class1 in seen: folder1 = os.path.join( os.path.join(config['dataset_path'], 'seen'), class1) for obj in os.listdir(folder1): im2 = os.path.join(folder1, obj) image = np.load(im2) engine.store_vector(image['arr_0'], class1) for img in new: #nea rpy stuff folder1 = os.path.join( os.path.join(config['dataset_path'], 'test'), img) im = os.path.join(folder1, os.listdir(folder1)[0]) image = np.load(im)['arr_0'] neighbors = engine.neighbours(image) for n in neighbors: folder1 = os.path.join( os.path.join(config['dataset_path'], 'seen'), n[1]) im = os.path.join(folder1, os.listdir(folder1)[0]) #make random neighbor = np.load(im)['arr_0'] prediction = self.predict( [np.array([image]), np.array([neighbor])], 1) pred_arr += [[img[:-12], n[1][:-12], prediction]] for item in pred_arr: val_dataset.prepare_specific(1, item[0], item[1]) f = open("ground.txt", "a") if item[0] == item[1]: f.write('1 {} {} {} '.format(item[0], item[1], item[2])) else: f.write('0 {} {} {} '.format(item[0], item[1], item[2])) f.close()