120 lines
5.0 KiB
Python
120 lines
5.0 KiB
Python
from keras import backend as K
|
|
from keras.models import load_model
|
|
from keras.optimizers import Adam
|
|
#from scipy.misc import imread
|
|
import numpy as np
|
|
from matplotlib import pyplot as plt
|
|
import argparse
|
|
import json
|
|
|
|
from models.keras_ssd300 import ssd_300
|
|
from keras_loss_function.keras_ssd_loss import SSDLoss
|
|
from keras_layers.keras_layer_AnchorBoxes import AnchorBoxes
|
|
from keras_layers.keras_layer_DecodeDetections import DecodeDetections
|
|
from keras_layers.keras_layer_DecodeDetectionsFast import DecodeDetectionsFast
|
|
from keras_layers.keras_layer_L2Normalization import L2Normalization
|
|
from data_generator.object_detection_2d_data_generator import DataGenerator
|
|
from eval_utils.average_precision_evaluator import Evaluator
|
|
|
|
def _main_(args):
|
|
|
|
config_path = args.conf
|
|
|
|
with open(config_path) as config_buffer:
|
|
config = json.loads(config_buffer.read())
|
|
|
|
###############################
|
|
# Parse the annotations
|
|
###############################
|
|
path_imgs_test = config['test']['test_image_folder']
|
|
path_anns_test = config['test']['test_annot_folder']
|
|
labels = config['model']['labels']
|
|
categories = {}
|
|
#categories = {"Razor": 1, "Gun": 2, "Knife": 3, "Shuriken": 4} #la categoría 0 es la background
|
|
for i in range(len(labels)): categories[labels[i]] = i+1
|
|
print('\nTraining on: \t' + str(categories) + '\n')
|
|
|
|
img_height = config['model']['input'] # Height of the model input images
|
|
img_width = config['model']['input'] # Width of the model input images
|
|
img_channels = 3 # Number of color channels of the model input images
|
|
n_classes = len(labels) # Number of positive classes, e.g. 20 for Pascal VOC, 80 for MS COCO
|
|
classes = ['background'] + labels
|
|
|
|
model_mode = 'training'
|
|
# TODO: Set the path to the `.h5` file of the model to be loaded.
|
|
model_path = config['train']['saved_weights_name']
|
|
|
|
# We need to create an SSDLoss object in order to pass that to the model loader.
|
|
ssd_loss = SSDLoss(neg_pos_ratio=3, alpha=1.0)
|
|
|
|
K.clear_session() # Clear previous models from memory.
|
|
|
|
model = load_model(model_path, custom_objects={'AnchorBoxes': AnchorBoxes,
|
|
'L2Normalization': L2Normalization,
|
|
'DecodeDetections': DecodeDetections,
|
|
'compute_loss': ssd_loss.compute_loss})
|
|
|
|
test_dataset = DataGenerator()
|
|
test_dataset.parse_xml(images_dirs= [config['test']['test_image_folder']],
|
|
image_set_filenames=[config['test']['test_image_set_filename']],
|
|
annotations_dirs=[config['test']['test_annot_folder']],
|
|
classes=classes,
|
|
include_classes='all',
|
|
exclude_truncated=False,
|
|
exclude_difficult=False,
|
|
ret=False)
|
|
evaluator = Evaluator(model=model,
|
|
n_classes=n_classes,
|
|
data_generator=test_dataset,
|
|
model_mode=model_mode)
|
|
|
|
results = evaluator(img_height=img_height,
|
|
img_width=img_width,
|
|
batch_size=4,
|
|
data_generator_mode='resize',
|
|
round_confidences=False,
|
|
matching_iou_threshold=0.5,
|
|
border_pixels='include',
|
|
sorting_algorithm='quicksort',
|
|
average_precision_mode='sample',
|
|
num_recall_points=11,
|
|
ignore_neutral_boxes=True,
|
|
return_precisions=True,
|
|
return_recalls=True,
|
|
return_average_precisions=True,
|
|
verbose=True)
|
|
|
|
mean_average_precision, average_precisions, precisions, recalls = results
|
|
|
|
total_instances = []
|
|
precisions = []
|
|
for i in range(1, len(average_precisions)):
|
|
print('{:.0f} instances of class'.format(len(recalls[i])),
|
|
classes[i], 'with average precision: {:.4f}'.format(average_precisions[i]))
|
|
total_instances.append(len(recalls[i]))
|
|
precisions.append(average_precisions[i])
|
|
|
|
if sum(total_instances) == 0:
|
|
print('No test instances found.')
|
|
return
|
|
|
|
print('mAP using the weighted average of precisions among classes: {:.4f}'.format(sum([a * b for a, b in zip(total_instances, precisions)]) / sum(total_instances)))
|
|
print('mAP: {:.4f}'.format(sum(precisions) / sum(x > 0 for x in total_instances)))
|
|
|
|
for i in range(1, len(average_precisions)):
|
|
print("{:<14}{:<6}{}".format(classes[i], 'AP', round(average_precisions[i], 3)))
|
|
print()
|
|
print("{:<14}{:<6}{}".format('','mAP', round(mean_average_precision, 3)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
argparser = argparse.ArgumentParser(description='train and evaluate ssd model on any dataset')
|
|
argparser.add_argument('-c', '--conf', help='path to configuration file')
|
|
|
|
args = argparser.parse_args()
|
|
_main_(args)
|