mirror of https://github.com/AlexeyAB/darknet.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.4 KiB
104 lines
3.4 KiB
#!/usr/bin/env python |
|
|
|
# Adapt from -> |
|
# -------------------------------------------------------- |
|
# Fast R-CNN |
|
# Copyright (c) 2015 Microsoft |
|
# Licensed under The MIT License [see LICENSE for details] |
|
# Written by Ross Girshick |
|
# -------------------------------------------------------- |
|
# <- Written by Yaping Sun |
|
|
|
"""Reval = re-eval. Re-evaluate saved detections.""" |
|
|
|
import os, sys, argparse |
|
import numpy as np |
|
import _pickle as cPickle |
|
#import cPickle |
|
|
|
from voc_eval_py3 import voc_eval |
|
|
|
def parse_args(): |
|
""" |
|
Parse input arguments |
|
""" |
|
parser = argparse.ArgumentParser(description='Re-evaluate results') |
|
parser.add_argument('output_dir', nargs=1, help='results directory', |
|
type=str) |
|
parser.add_argument('--voc_dir', dest='voc_dir', default='data/VOCdevkit', type=str) |
|
parser.add_argument('--year', dest='year', default='2017', type=str) |
|
parser.add_argument('--image_set', dest='image_set', default='test', type=str) |
|
|
|
parser.add_argument('--classes', dest='class_file', default='data/voc.names', type=str) |
|
|
|
if len(sys.argv) == 1: |
|
parser.print_help() |
|
sys.exit(1) |
|
|
|
args = parser.parse_args() |
|
return args |
|
|
|
def get_voc_results_file_template(image_set, out_dir = 'results'): |
|
filename = 'comp4_det_' + image_set + '_{:s}.txt' |
|
path = os.path.join(out_dir, filename) |
|
return path |
|
|
|
def do_python_eval(devkit_path, year, image_set, classes, output_dir = 'results'): |
|
annopath = os.path.join( |
|
devkit_path, |
|
'VOC' + year, |
|
'Annotations', |
|
'{}.xml') |
|
imagesetfile = os.path.join( |
|
devkit_path, |
|
'VOC' + year, |
|
'ImageSets', |
|
'Main', |
|
image_set + '.txt') |
|
cachedir = os.path.join(devkit_path, 'annotations_cache') |
|
aps = [] |
|
# The PASCAL VOC metric changed in 2010 |
|
use_07_metric = True if int(year) < 2010 else False |
|
print('VOC07 metric? ' + ('Yes' if use_07_metric else 'No')) |
|
print('devkit_path=',devkit_path,', year = ',year) |
|
|
|
if not os.path.isdir(output_dir): |
|
os.mkdir(output_dir) |
|
for i, cls in enumerate(classes): |
|
if cls == '__background__': |
|
continue |
|
filename = get_voc_results_file_template(image_set).format(cls) |
|
rec, prec, ap = voc_eval( |
|
filename, annopath, imagesetfile, cls, cachedir, ovthresh=0.5, |
|
use_07_metric=use_07_metric) |
|
aps += [ap] |
|
print('AP for {} = {:.4f}'.format(cls, ap)) |
|
with open(os.path.join(output_dir, cls + '_pr.pkl'), 'wb') as f: |
|
cPickle.dump({'rec': rec, 'prec': prec, 'ap': ap}, f) |
|
print('Mean AP = {:.4f}'.format(np.mean(aps))) |
|
print('~~~~~~~~') |
|
print('Results:') |
|
for ap in aps: |
|
print('{:.3f}'.format(ap)) |
|
print('{:.3f}'.format(np.mean(aps))) |
|
print('~~~~~~~~') |
|
print('') |
|
print('--------------------------------------------------------------') |
|
print('Results computed with the **unofficial** Python eval code.') |
|
print('Results should be very close to the official MATLAB eval code.') |
|
print('-- Thanks, The Management') |
|
print('--------------------------------------------------------------') |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
args = parse_args() |
|
|
|
output_dir = os.path.abspath(args.output_dir[0]) |
|
with open(args.class_file, 'r') as f: |
|
lines = f.readlines() |
|
|
|
classes = [t.strip('\n') for t in lines] |
|
|
|
print('Evaluating detections') |
|
do_python_eval(args.voc_dir, args.year, args.image_set, classes, output_dir)
|
|
|