2020-02-06 16:47:03 -03:00
#! /usr/bin/env python
import argparse
import os
import numpy as np
import json
from voc import parse_voc_annotation
from yolo import create_yolov3_model
from generator import BatchGenerator
from utils . utils import normalize , evaluate
2020-03-25 18:23:00 -03:00
from tensorflow . keras . callbacks import EarlyStopping , ModelCheckpoint
from tensorflow . keras . optimizers import Adam
from tensorflow . keras . models import load_model
2020-02-06 16:47:03 -03:00
def _main_ ( args ) :
config_path = args . conf
with open ( config_path ) as config_buffer :
config = json . loads ( config_buffer . read ( ) )
###############################
# Create the validation generator
###############################
valid_ints , labels = parse_voc_annotation (
config [ ' test ' ] [ ' test_annot_folder ' ] ,
config [ ' test ' ] [ ' test_image_folder ' ] ,
config [ ' test ' ] [ ' cache_name ' ] ,
config [ ' model ' ] [ ' labels ' ]
)
labels = labels . keys ( ) if len ( config [ ' model ' ] [ ' labels ' ] ) == 0 else config [ ' model ' ] [ ' labels ' ]
labels = sorted ( labels )
valid_generator = BatchGenerator (
instances = valid_ints ,
anchors = config [ ' model ' ] [ ' anchors ' ] ,
labels = labels ,
downsample = 32 , # ratio between network input's size and network output's size, 32 for YOLOv3
max_box_per_image = 0 ,
batch_size = config [ ' train ' ] [ ' batch_size ' ] ,
min_net_size = config [ ' model ' ] [ ' min_input_size ' ] ,
max_net_size = config [ ' model ' ] [ ' max_input_size ' ] ,
shuffle = True ,
jitter = 0.0 ,
norm = normalize
)
###############################
# Load the model and do evaluation
###############################
os . environ [ ' CUDA_VISIBLE_DEVICES ' ] = config [ ' train ' ] [ ' gpus ' ]
infer_model = load_model ( config [ ' train ' ] [ ' saved_weights_name ' ] )
# compute mAP for all the classes
average_precisions = evaluate ( infer_model , valid_generator )
# print the score
total_instances = [ ]
precisions = [ ]
print ( average_precisions . items ( ) )
for label , ( average_precision , num_annotations ) in average_precisions . items ( ) :
print ( ' {:.0f} instances of class ' . format ( num_annotations ) ,
labels [ label ] , ' with average precision: {:.4f} ' . format ( average_precision ) )
total_instances . append ( num_annotations )
precisions . append ( average_precision )
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 ) ) )
if __name__ == ' __main__ ' :
argparser = argparse . ArgumentParser ( description = ' Evaluate YOLO_v3 model on any dataset ' )
argparser . add_argument ( ' -c ' , ' --conf ' , help = ' path to configuration file ' )
args = argparser . parse_args ( )
_main_ ( args )