Source code for bob.example.faceverify.utils

#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# @author: Manuel Guenther <Manuel.Guenther@idiap.ch>
# @date: Mon Jul 22 19:56:11 CEST 2013
#
# Copyright (C) 2011-2013 Idiap Research Institute, Martigny, Switzerland
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import os
import bob.io.base
import bob.ip.color
import numpy

def atnt_database_directory(atnt_user_directory = None):
  #Checks, where the AT&T database is located and downloads it on need
  if atnt_user_directory is not None:
    # a user directory is specified
    atnt_default_directory = atnt_user_directory
  elif 'ATNT_DATABASE_DIRECTORY' in os.environ:
    # the environment variable is set
    atnt_default_directory = os.environ['ATNT_DATABASE_DIRECTORY']
  else:
    atnt_default_directory = 'Database'

  # Check if the database is already in the specified directory
  if os.path.isdir(atnt_default_directory) and set(['s%d'%s for s in range(1,41)]).issubset(os.listdir(atnt_default_directory)):
    return atnt_default_directory

  # ... download the database ...

  # create directory
  if not os.path.exists(atnt_default_directory):
    os.mkdir(atnt_default_directory)

  # setup
  import sys, tempfile
  if sys.version_info[0] <= 2:
    import urllib2 as urllib
  else:
    import urllib.request as urllib

  db_url = 'http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip'
  import logging
  logger = logging.getLogger('bob')
  logger.warn("Downloading the AT&T database from '%s' to '%s' ..." % (db_url, atnt_default_directory))

  # download
  url = urllib.urlopen(db_url)
  local_zip_file = tempfile.mkstemp(prefix='atnt_db_', suffix='.zip')[1]
  dfile = open(local_zip_file, 'wb')
  dfile.write(url.read())
  dfile.close()

  # unzip
  import zipfile
  zip = zipfile.ZipFile(local_zip_file)
  zip.extractall(atnt_default_directory)
  zip.close()

  # remove temporary zip file
  os.remove(local_zip_file)

  return atnt_default_directory


[docs]def load_images(database, files, face_cropper = None, preprocessor = None): """Loads the original images for the given list of File objects. Keyword Parameters: database : :py:class:`bob.db.verification.utils.Database` or derived from it The database interface to query. files : [:py:class:`bob.db.verification.utils.File`] or derived from it A list of ``File`` objects for which the images should be loaded. face_cropper : :py:class:`bob.ip.base.FaceEyesNorm` or ``None`` If a face cropper is given, the face will be cropped using the eye annotations of the database. preprocessor : ``function``, ``object`` or ``None`` If a preprocessor is given, it will be applied to the (cropped) faces. """ file_names = database.original_file_names(files) # iterate through the list of file names and load images images = [bob.io.base.load(file_name) for file_name in file_names] # convert color to gray images if necessary gray_images = [] for image in images: gray_image = bob.ip.color.rgb_to_gray(image).astype(numpy.float64) if len(image.shape) == 3 else image gray_images.append(gray_image.astype(numpy.float64)) if face_cropper is not None: cropped_images = [] for i in range(len(files)): # get the annotations for the files annotations = database.annotations(files[i]) assert 'reye' in annotations and 'leye' in annotations cropped_images.append(face_cropper(gray_images[i], right_eye = annotations['reye'], left_eye = annotations['leye'])) else: cropped_images = gray_images if preprocessor is not None: preprocessed_images = [preprocessor(i) for i in cropped_images] else: preprocessed_images = cropped_images return preprocessed_images