123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #!/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)
|