Skip to content
Snippets Groups Projects
Commit cb705dd3 authored by Manuel Günther's avatar Manuel Günther
Browse files

Added script to display annotations on images

parent b54974c2
No related branches found
No related tags found
No related merge requests found
#!../bin/python
"""This script displays the iamges with annotations provided by any face database.
Basically, anything that can be used as a --database for .bin/verify.py can be specified here as well, including configuration files and ``database`` resources: ``./bin/resources.py -d database``.
By default, all images and their corresponding annotations are displayed, and you have to press ``Enter`` after each image.
If the database does not include annotations, or you want to display a different set of annotations, you can specify the ``--annotation-directory`` (and if required modify the ``--annotation-file-extension`` and ``--annotation-file-type``.
The list of images can be narrowed down by the ``--file-ids`` parameter, where the file ids are specific to the database.
Note that this script can only be used with face image databases, not with video or other biometric databases.
"""
from __future__ import print_function
import os
import argparse
import bob.bio.base
import bob.core
logger = bob.core.log.setup("bob.bio.face")
def command_line_arguments(command_line_parameters):
"""Defines the command line parameters that are accepted."""
# create parser
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.ArgumentDefaultsHelpFormatter)
# add parameters
parser.add_argument('-d', '--database', nargs = '+', help = 'Select the database for which the images plus annotations should be shown.')
parser.add_argument('-f', '--file-ids', nargs = '+', help = 'If given, only the images of the --database with the given file id are shown (non-existing IDs will be silently skipped).')
parser.add_argument('-a', '--annotation-directory', help = 'If given, use the annotations stored in the given annotation directory (this might be required for some databases).')
parser.add_argument('-x', '--annotation-file-extension', default = '.pos', help = 'Annotation files have the given filename extension.')
parser.add_argument('-t', '--annotation-file-type', default = 'named', help = 'Select the annotation file style, see bob.db.verification.utils documentation for valid types.')
parser.add_argument('-n', '--annotate-names', action = 'store_true', help = 'Plot the names of the annotations, too.')
parser.add_argument('-m', '--marker-style', default='rx', help = 'Select the marker style')
parser.add_argument('-M', '--marker-size', type=float, default=10., help = 'Select the marker size')
parser.add_argument('-F', '--font-size', type=int, default=16, help = 'Select the font size for the annotation names')
parser.add_argument('-C', '--font-color', default = 'b', help = 'Select the color for the annotation names')
parser.add_argument('--database-directories-file', metavar = 'FILE', default = "%s/.bob_bio_databases.txt" % os.environ["HOME"], help = 'An optional file, where database directories are stored (to avoid changing the database configurations)')
parser.add_argument('--self-test', action='store_true', help=argparse.SUPPRESS)
bob.core.log.add_command_line_option(parser)
args = parser.parse_args(command_line_parameters)
bob.core.log.set_verbosity_level(logger, args.verbose)
return args
def main(command_line_parameters=None):
args = command_line_arguments(command_line_parameters)
# load database
database = bob.bio.base.load_resource("".join(args.database), "database")
# replace directories
if isinstance(database, bob.bio.base.database.DatabaseBob):
database.replace_directories(args.database_directories_file)
# get all files
files = database.all_files()
# filter file ids; convert them to str first
if args.file_ids is not None:
files = [f for f in files if str(f.id) in args.file_ids]
# open figure
if not args.self_test:
from matplotlib import pyplot
figure = pyplot.figure()
for f in files:
# load image
logger.info("loading image for file %s", f.id)
image = bob.io.base.load(database.original_file_names([f])[0])
# convert to color if it is not
if image.ndim == 2:
image = bob.ip.color.gray_to_rgb(image)
# get annotations
annotations = {}
if args.annotation_directory is not None:
# load annotation file
annotation_file = f.make_path(args.annotation_directory, args.annotation_file_extension)
if os.path.exists(annotation_file):
logger.info("Loading annotations from file %s", annotation_file)
annotations = bob.db.verification.utils.read_annotation_file(annotation_file, args.annotation_file_type)
else:
logger.warn("Could not find annotation file %s", annotation_file)
else:
# get annotations from database
annotations = database.annotations(f)
if not annotations:
logger.warn("Could not find annotations for file %s", f.id)
if not args.self_test:
pyplot.clf()
pyplot.imshow(image.transpose(1,2,0))
global_annotation = []
for n,a in annotations.items():
if isinstance(a, (list,tuple)) and len(a) == 2:
pyplot.plot(a[1], a[0], args.marker_style, ms = args.marker_size, mew = args.marker_size / 5.)
if args.annotate_names:
pyplot.annotate(n, (a[1], a[0]), color=args.font_color, fontsize=args.font_size)
else:
global_annotation.append("%s=%s"%(n,a))
# plot all global annotations, at the top center of the image
pyplot.annotate(";".join(global_annotation), (image.shape[-1]/2, 0), color=args.font_color, fontsize=args.font_size, ha='center', va='baseline')
pyplot.gca().set_aspect("equal")
pyplot.gca().autoscale(tight=True)
raw_input("Press Enter to continue to the next image (or Ctrl-C + Enter to exit)")
......@@ -22,3 +22,11 @@ def test_baselines():
main(parameters)
parameters.extend(['-e', 'HTER'])
main(parameters)
def test_display_annotations():
from bob.bio.face.script.display_face_annotations import main
with bob.bio.base.test.utils.Quiet():
parameters = ['-d', 'atnt', '-a', '/very/unlikely/directory', '--self-test']
main(parameters)
......@@ -163,6 +163,9 @@ Here is the list of files and replacement strings for all databases that are reg
You can use the ``./bin/databases.py`` script to list, which data directories are correctly set up.
In order to view the annotations inside your database on top of the images, you can use the ``./bin/display_face_annotations.py`` script that is provided.
Please see ``./bin/display_face_annotations.py --help`` for more details and a list of options.
.. _bob.bio.face.preprocessors:
......
......@@ -101,7 +101,8 @@ setup(
# scripts should be declared using this entry:
'console_scripts' : [
'baselines.py = bob.bio.face.script.baselines:main'
'baselines.py = bob.bio.face.script.baselines:main',
'display_face_annotations.py = bob.bio.face.script.display_face_annotations:main'
],
'bob.bio.database': [
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment