From aa4903a731e7c5140078b9d8cbd6f5490472f431 Mon Sep 17 00:00:00 2001
From: Tiago Freitas Pereira <tiagofrepereira@gmail.com>
Date: Sat, 10 Sep 2016 13:42:26 +0200
Subject: [PATCH] [refactoring2016] Moved highlevel interface to bob.bio.face

---
 .gitlab-ci.yml                                |   2 +-
 bob/bio/face/config/database/__init__.py      |   0
 bob/bio/face/config/database/arface.py        |  11 ++
 bob/bio/face/config/database/atnt.py          |   9 ++
 bob/bio/face/config/database/banca_english.py |  12 ++
 bob/bio/face/config/database/caspeal.py       |  11 ++
 bob/bio/face/config/database/frgc.py          |  11 ++
 bob/bio/face/config/database/gbu.py           |  17 +++
 .../face/config/database/lfw_restricted.py    |  19 +++
 .../face/config/database/lfw_unrestricted.py  |  20 +++
 bob/bio/face/config/database/mobio_female.py  |  21 ++++
 bob/bio/face/config/database/mobio_image.py   |  19 +++
 bob/bio/face/config/database/mobio_male.py    |  22 ++++
 bob/bio/face/config/database/multipie.py      |  13 ++
 bob/bio/face/config/database/multipie_pose.py |  24 ++++
 bob/bio/face/config/database/scface.py        |  10 ++
 bob/bio/face/config/database/xm2vts.py        |  10 ++
 bob/bio/face/database/__init__.py             |  21 ++++
 bob/bio/face/database/arface.py               |  36 ++++++
 bob/bio/face/database/atnt.py                 |  36 ++++++
 bob/bio/face/database/banca.py                |  47 ++++++++
 bob/bio/face/database/caspeal.py              |  36 ++++++
 bob/bio/face/database/cuhk_cufs.py            |  47 ++++++++
 bob/bio/face/database/database.py             |  23 ++++
 bob/bio/face/database/frgc.py                 |  37 ++++++
 bob/bio/face/database/gbu.py                  |  36 ++++++
 bob/bio/face/database/ijba.py                 |  36 ++++++
 bob/bio/face/database/lfw.py                  |  37 ++++++
 bob/bio/face/database/mobio.py                |  49 ++++++++
 bob/bio/face/database/multipie.py             |  48 ++++++++
 bob/bio/face/database/replay.py               | 114 ++++++++++++++++++
 bob/bio/face/database/scface.py               |  47 ++++++++
 bob/bio/face/database/xm2vts.py               |  36 ++++++
 .../face/script/display_face_annotations.py   |   2 +-
 bob/bio/face/test/test_databases.py           |   4 +-
 buildout-dev.cfg                              |  79 ++++++++++++
 setup.py                                      |  26 ++--
 37 files changed, 1011 insertions(+), 17 deletions(-)
 create mode 100644 bob/bio/face/config/database/__init__.py
 create mode 100644 bob/bio/face/config/database/arface.py
 create mode 100644 bob/bio/face/config/database/atnt.py
 create mode 100644 bob/bio/face/config/database/banca_english.py
 create mode 100644 bob/bio/face/config/database/caspeal.py
 create mode 100644 bob/bio/face/config/database/frgc.py
 create mode 100644 bob/bio/face/config/database/gbu.py
 create mode 100644 bob/bio/face/config/database/lfw_restricted.py
 create mode 100644 bob/bio/face/config/database/lfw_unrestricted.py
 create mode 100644 bob/bio/face/config/database/mobio_female.py
 create mode 100644 bob/bio/face/config/database/mobio_image.py
 create mode 100644 bob/bio/face/config/database/mobio_male.py
 create mode 100644 bob/bio/face/config/database/multipie.py
 create mode 100644 bob/bio/face/config/database/multipie_pose.py
 create mode 100644 bob/bio/face/config/database/scface.py
 create mode 100644 bob/bio/face/config/database/xm2vts.py
 create mode 100644 bob/bio/face/database/__init__.py
 create mode 100644 bob/bio/face/database/arface.py
 create mode 100644 bob/bio/face/database/atnt.py
 create mode 100644 bob/bio/face/database/banca.py
 create mode 100644 bob/bio/face/database/caspeal.py
 create mode 100644 bob/bio/face/database/cuhk_cufs.py
 create mode 100644 bob/bio/face/database/database.py
 create mode 100644 bob/bio/face/database/frgc.py
 create mode 100644 bob/bio/face/database/gbu.py
 create mode 100644 bob/bio/face/database/ijba.py
 create mode 100644 bob/bio/face/database/lfw.py
 create mode 100644 bob/bio/face/database/mobio.py
 create mode 100644 bob/bio/face/database/multipie.py
 create mode 100644 bob/bio/face/database/replay.py
 create mode 100644 bob/bio/face/database/scface.py
 create mode 100644 bob/bio/face/database/xm2vts.py
 create mode 100644 buildout-dev.cfg

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f26a01e9..0add73b2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -33,7 +33,7 @@ variables:
   variables: &build_variables
     BOB_DOCUMENTATION_SERVER: "http://www.idiap.ch/software/bob/docs/latest/bob/%s/master/"
   script:
-    - ./bin/buildout
+    - ./bin/buildout -c buildout-dev.cfg
     - if [ -x ./bin/bob_dbmanage.py ]; then ./bin/bob_dbmanage.py all download --force; fi
     - ./bin/sphinx-build doc sphinx
     - ./bin/python setup.py bdist_wheel --python-tag ${WHEEL_TAG}
diff --git a/bob/bio/face/config/database/__init__.py b/bob/bio/face/config/database/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/bob/bio/face/config/database/arface.py b/bob/bio/face/config/database/arface.py
new file mode 100644
index 00000000..3bae0e88
--- /dev/null
+++ b/bob/bio/face/config/database/arface.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import ARFaceBioDatabase
+
+arface_directory = "[YOUR_ARFACE_DIRECTORY]"
+
+database = ARFaceBioDatabase(
+    original_directory=arface_directory,
+    original_extension=".png",
+    protocol='all'
+)
diff --git a/bob/bio/face/config/database/atnt.py b/bob/bio/face/config/database/atnt.py
new file mode 100644
index 00000000..95c38b30
--- /dev/null
+++ b/bob/bio/face/config/database/atnt.py
@@ -0,0 +1,9 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import AtntBioDatabase
+
+atnt_directory = "[YOUR_ATNT_DIRECTORY]"
+
+database = AtntBioDatabase(
+    original_directory=atnt_directory,
+)
diff --git a/bob/bio/face/config/database/banca_english.py b/bob/bio/face/config/database/banca_english.py
new file mode 100644
index 00000000..53fbc36a
--- /dev/null
+++ b/bob/bio/face/config/database/banca_english.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import BancaBioDatabase
+
+banca_directory = "[YOUR_BANCA_DIRECTORY]"
+
+database = BancaBioDatabase(
+    original_directory=banca_directory,
+    original_extension=".ppm",
+    protocol='P'
+)
+
diff --git a/bob/bio/face/config/database/caspeal.py b/bob/bio/face/config/database/caspeal.py
new file mode 100644
index 00000000..f4fd257a
--- /dev/null
+++ b/bob/bio/face/config/database/caspeal.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import CaspealBioDatabase
+
+caspeal_directory = "[YOUR_CAS-PEAL_DIRECTORY]"
+
+database = CaspealBioDatabase(
+    original_directory=caspeal_directory,
+    protocol='lighting'
+)
+
diff --git a/bob/bio/face/config/database/frgc.py b/bob/bio/face/config/database/frgc.py
new file mode 100644
index 00000000..f351cea4
--- /dev/null
+++ b/bob/bio/face/config/database/frgc.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import FRGCBioDatabase
+
+frgc_directory = "[YOUR_FRGC_DIRECTORY]"
+
+database = FRGCBioDatabase(
+    original_directory=frgc_directory,
+    protocol='2.0.1',
+    models_depend_on_protocol=True
+)
diff --git a/bob/bio/face/config/database/gbu.py b/bob/bio/face/config/database/gbu.py
new file mode 100644
index 00000000..c74b3b3c
--- /dev/null
+++ b/bob/bio/face/config/database/gbu.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import GBUBioDatabase
+
+mbgc_v1_directory = "[YOUR_MBGC-V1_DIRECTORY]"
+
+database = GBUBioDatabase(
+    original_directory=mbgc_v1_directory,
+    protocol='Good',
+    models_depend_on_protocol=True,
+
+    all_files_options={'subworld': 'x2'},
+    extractor_training_options={'subworld': 'x2'},
+    projector_training_options={'subworld': 'x2'},
+    enroller_training_options={'subworld': 'x2'}
+)
+
diff --git a/bob/bio/face/config/database/lfw_restricted.py b/bob/bio/face/config/database/lfw_restricted.py
new file mode 100644
index 00000000..373aac0c
--- /dev/null
+++ b/bob/bio/face/config/database/lfw_restricted.py
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import LFWBioDatabase
+
+lfw_directory = "[YOUR_LFW_FUNNELED_DIRECTORY]"
+
+database = LFWBioDatabase(
+    original_directory=lfw_directory,
+    annotation_type='funneled',
+
+    protocol='view1',
+    training_depends_on_protocol=True,
+    models_depend_on_protocol=True,
+
+    all_files_options={'world_type': 'restricted'},
+    extractor_training_options={'world_type': 'restricted'},  # 'subworld' : 'twofolds'
+    projector_training_options={'world_type': 'restricted'},  # 'subworld' : 'twofolds'
+    enroller_training_options={'world_type': 'restricted'}  # 'subworld' : 'twofolds'
+)
diff --git a/bob/bio/face/config/database/lfw_unrestricted.py b/bob/bio/face/config/database/lfw_unrestricted.py
new file mode 100644
index 00000000..db4ecb9e
--- /dev/null
+++ b/bob/bio/face/config/database/lfw_unrestricted.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import LFWBioDatabase
+
+lfw_directory = "[YOUR_LFW_FUNNELED_DIRECTORY]"
+
+database = LFWBioDatabase(
+    original_directory=lfw_directory,
+    annotation_type='funneled',
+
+    protocol='view1',
+    training_depends_on_protocol=True,
+    models_depend_on_protocol=True,
+
+    all_files_options = { 'world_type' : 'unrestricted' },
+    extractor_training_options = { 'world_type' : 'unrestricted' }, # 'subworld' : 'twofolds'
+    projector_training_options = { 'world_type' : 'unrestricted' }, # 'subworld' : 'twofolds'
+    enroller_training_options =  { 'world_type' : 'unrestricted' } # 'subworld' : 'twofolds'
+)
+
diff --git a/bob/bio/face/config/database/mobio_female.py b/bob/bio/face/config/database/mobio_female.py
new file mode 100644
index 00000000..9e472b67
--- /dev/null
+++ b/bob/bio/face/config/database/mobio_female.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import MobioBioDatabase
+
+mobio_image_directory = "[YOUR_MOBIO_IMAGE_DIRECTORY]"
+mobio_annotation_directory = "[YOUR_MOBIO_ANNOTATION_DIRECTORY]"
+
+database = MobioBioDatabase(
+    original_directory=mobio_image_directory,
+    original_extension=".png",
+    annotation_directory=mobio_annotation_directory,
+
+    protocol = 'female',
+    models_depend_on_protocol=True,
+
+    all_files_options={'gender': 'female'},
+    extractor_training_options={'gender': 'female'},
+    projector_training_options={'gender': 'female'},
+    enroller_training_options={'gender': 'female'},
+    z_probe_options={'gender': 'female'}
+)
diff --git a/bob/bio/face/config/database/mobio_image.py b/bob/bio/face/config/database/mobio_image.py
new file mode 100644
index 00000000..3ac114ac
--- /dev/null
+++ b/bob/bio/face/config/database/mobio_image.py
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import MobioBioDatabase
+
+mobio_image_directory = "[YOUR_MOBIO_IMAGE_DIRECTORY]"
+mobio_annotation_directory = "[YOUR_MOBIO_ANNOTATION_DIRECTORY]"
+
+database = MobioBioDatabase(
+    original_directory=mobio_image_directory,
+    original_extension=".png",
+    annotation_directory=mobio_annotation_directory,
+
+    protocol='male',
+    models_depend_on_protocol = True,
+)
+
+
+
+
diff --git a/bob/bio/face/config/database/mobio_male.py b/bob/bio/face/config/database/mobio_male.py
new file mode 100644
index 00000000..6d572d7d
--- /dev/null
+++ b/bob/bio/face/config/database/mobio_male.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import MobioBioDatabase
+
+mobio_image_directory = "[YOUR_MOBIO_IMAGE_DIRECTORY]"
+mobio_annotation_directory = "[YOUR_MOBIO_ANNOTATION_DIRECTORY]"
+
+database = MobioBioDatabase(
+    original_directory=mobio_image_directory,
+    original_extension=".png",
+    annotation_directory=mobio_annotation_directory,
+
+    protocol='male',
+    models_depend_on_protocol = True,
+
+    all_files_options={'gender': 'male'},
+    extractor_training_options={'gender': 'male'},
+    projector_training_options={'gender': 'male'},
+    enroller_training_options={'gender': 'male'},
+    z_probe_options={'gender': 'male'}
+)
+
diff --git a/bob/bio/face/config/database/multipie.py b/bob/bio/face/config/database/multipie.py
new file mode 100644
index 00000000..405c60aa
--- /dev/null
+++ b/bob/bio/face/config/database/multipie.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import MultipieBioDatabase
+
+multipie_image_directory = "[YOUR_MULTI-PIE_IMAGE_DIRECTORY]"
+multipie_annotation_directory = "[YOUR_MULTI-PIE_ANNOTATION_DIRECTORY]"
+
+database = MultipieBioDatabase(
+    original_directory=multipie_image_directory,
+    annotation_directory=multipie_annotation_directory,
+    protocol='U',
+    training_depends_on_protocol = True
+)
diff --git a/bob/bio/face/config/database/multipie_pose.py b/bob/bio/face/config/database/multipie_pose.py
new file mode 100644
index 00000000..3260f0e0
--- /dev/null
+++ b/bob/bio/face/config/database/multipie_pose.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+
+from bob.bio.face.database import MultipieBioDatabase
+
+# here, we only want to have the cameras that are used in the P protocol
+cameras = ('24_0', '01_0', '20_0', '19_0', '04_1', '05_0', '05_1', '14_0', '13_0', '08_0', '09_0', '12_0', '11_0')
+
+multipie_image_directory = "[YOUR_MULTI-PIE_IMAGE_DIRECTORY]"
+multipie_annotation_directory = "[YOUR_MULTI-PIE_ANNOTATION_DIRECTORY]"
+
+database = MultipieBioDatabase(
+    original_directory=multipie_image_directory,
+    annotation_directory=multipie_annotation_directory,
+    protocol = 'P',
+    training_depends_on_protocol = True,
+
+    all_files_options={'cameras': cameras},
+    extractor_training_options={'cameras': cameras},
+    projector_training_options={'cameras': cameras, 'world_sampling': 3, 'world_first': True},
+    enroller_training_options={'cameras': cameras}
+
+)
+
diff --git a/bob/bio/face/config/database/scface.py b/bob/bio/face/config/database/scface.py
new file mode 100644
index 00000000..6fd8e7ea
--- /dev/null
+++ b/bob/bio/face/config/database/scface.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import SCFaceBioDatabase
+
+scface_directory = "[YOUR_SC_FACE_DIRECTORY]"
+
+database = SCFaceBioDatabase(
+    original_directory=scface_directory,
+    protocol='combined'
+)
diff --git a/bob/bio/face/config/database/xm2vts.py b/bob/bio/face/config/database/xm2vts.py
new file mode 100644
index 00000000..e9cb98a0
--- /dev/null
+++ b/bob/bio/face/config/database/xm2vts.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+
+from bob.bio.face.database import XM2VTSBioDatabase
+
+xm2vts_directory = "[YOUR_XM2VTS_DIRECTORY]"
+
+database = XM2VTSBioDatabase(
+    original_directory=xm2vts_directory,
+    protocol='lp1'
+)
diff --git a/bob/bio/face/database/__init__.py b/bob/bio/face/database/__init__.py
new file mode 100644
index 00000000..c74a3abf
--- /dev/null
+++ b/bob/bio/face/database/__init__.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+
+
+from .mobio import MobioBioDatabase
+from .replay import ReplayBioDatabase
+from .atnt import AtntBioDatabase
+from .banca import BancaBioDatabase
+from .gbu import GBUBioDatabase
+from .arface import ARFaceBioDatabase
+from .caspeal import CaspealBioDatabase
+from .lfw import LFWBioDatabase
+from .multipie import MultipieBioDatabase
+from .ijba import IJBABioDatabase
+from .xm2vts import XM2VTSBioDatabase
+from .frgc import FRGCBioDatabase
+from .cuhk_cufs import CUHK_CUFSBioDatabase
+from .scface import SCFaceBioDatabase
+
+# gets sphinx autodoc done right - don't remove it
+__all__ = [_ for _ in dir() if not _.startswith('_')]
diff --git a/bob/bio/face/database/arface.py b/bob/bio/face/database/arface.py
new file mode 100644
index 00000000..0165931b
--- /dev/null
+++ b/bob/bio/face/database/arface.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  ARFACE database implementation of bob.bio.base.database.ZTDatabase interface.
+  It is an extension of an SQL-based database interface, which directly talks to ARFACE database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class ARFaceBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying ARFACE database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(ARFaceBioDatabase, self).__init__(name='arface', **kwargs)
+
+        from bob.db.arface.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
diff --git a/bob/bio/face/database/atnt.py b/bob/bio/face/database/atnt.py
new file mode 100644
index 00000000..16226a94
--- /dev/null
+++ b/bob/bio/face/database/atnt.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Amir Mohammadi <amir.mohammadi@idiap.ch>
+# Wed 13 Jul 16:43:22 CEST 2016
+
+"""
+  Atnt database implementation of bob.bio.base.database.Database interface.
+  It is an extension of an SQL-based database interface, which directly talks to Atnt database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class AtntBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying Atnt database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(AtntBioDatabase, self).__init__(name='atnt', **kwargs)
+
+        from bob.db.atnt.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(f) for f in retval]
diff --git a/bob/bio/face/database/banca.py b/bob/bio/face/database/banca.py
new file mode 100644
index 00000000..45de3dda
--- /dev/null
+++ b/bob/bio/face/database/banca.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  BANCA database implementation of bob.bio.base.database.ZTDatabase interface.
+  It is an extension of an SQL-based database interface, which directly talks to Banca database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import ZTBioDatabase, BioFile
+
+
+class BancaBioDatabase(ZTBioDatabase):
+    """
+    Implements verification API for querying Banca database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(BancaBioDatabase, self).__init__(name='banca', **kwargs)
+
+        from bob.db.banca.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def tmodel_ids_with_protocol(self, protocol=None, groups=None, **kwargs):
+        return self.__db.tmodel_ids(protocol=protocol, groups=groups, **kwargs)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
+
+    def tobjects(self, groups=None, protocol=None, model_ids=None, **kwargs):
+        retval = self.__db.tobjects(groups=groups, protocol=protocol, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
+
+    def zobjects(self, groups=None, protocol=None, **kwargs):
+        retval = self.__db.zobjects(groups=groups, protocol=protocol, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
diff --git a/bob/bio/face/database/caspeal.py b/bob/bio/face/database/caspeal.py
new file mode 100644
index 00000000..d1568408
--- /dev/null
+++ b/bob/bio/face/database/caspeal.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  CASPEAL database implementation of bob.bio.base.database.Database interface.
+  It is an extension of an SQL-based database interface, which directly talks to CASPEAL database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class CaspealBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying Caspeal database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(CaspealBioDatabase, self).__init__(name='caspeal', **kwargs)
+
+        from bob.db.caspeal.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
diff --git a/bob/bio/face/database/cuhk_cufs.py b/bob/bio/face/database/cuhk_cufs.py
new file mode 100644
index 00000000..62ed153d
--- /dev/null
+++ b/bob/bio/face/database/cuhk_cufs.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  CUHK_CUFS database implementation of bob.bio.base.database.ZTDatabase interface.
+  It is an extension of an SQL-based database interface, which directly talks to CUHK_CUFS database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import ZTBioDatabase, BioFile
+
+
+class CUHK_CUFSBioDatabase(ZTBioDatabase):
+    """
+    Implements verification API for querying CUHK_CUFS database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(CUHK_CUFSBioDatabase, self).__init__(name='cuhk_cufs', **kwargs)
+
+        from bob.db.cuhk_cufs.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol="search_split1_p2s", **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def tmodel_ids_with_protocol(self, protocol="search_split1_p2s", groups=None, **kwargs):
+        return self.__db.tmodel_ids(protocol=protocol, groups=groups, **kwargs)
+
+    def objects(self, groups=None, protocol="search_split1_p2s", purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(client_id=f.client_id, path=f.path, file_id=f.id) for f in retval]
+
+    def tobjects(self, groups=None, protocol="search_split1_p2s", model_ids=None, **kwargs):
+        retval = self.__db.tobjects(groups=groups, protocol=protocol, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(client_id=f.client_id, path=f.path, file_id=f.id) for f in retval]
+
+    def zobjects(self, groups=None, protocol="search_split1_p2s", **kwargs):
+        retval = self.__db.zobjects(groups=groups, protocol=protocol, **kwargs)
+        return [FaceBioFile(client_id=f.client_id, path=f.path, file_id=f.id) for f in retval]
diff --git a/bob/bio/face/database/database.py b/bob/bio/face/database/database.py
new file mode 100644
index 00000000..8b001459
--- /dev/null
+++ b/bob/bio/face/database/database.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Wed 20 July 14:43:22 CEST 2016
+
+"""
+  Verification API for bob.db.voxforge
+"""
+
+from bob.bio.base.database.file import BioFile
+
+
+class FaceBioFile(BioFile):
+    def __init__(self, f):
+        """
+        Initializes this File object with an File equivalent for
+        VoxForge database.
+        """
+        super(FaceBioFile, self).__init__(client_id=f.client_id, path=f.path, file_id=f.id)
+
+        self.__f = f
+
+
diff --git a/bob/bio/face/database/frgc.py b/bob/bio/face/database/frgc.py
new file mode 100644
index 00000000..b6d8ac7a
--- /dev/null
+++ b/bob/bio/face/database/frgc.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  FRGC database implementation of bob.bio.base.database.Database interface.
+  It is an extension of an SQL-based database interface, which directly talks to FRGC database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class FRGCBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying FRGC database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(FRGCBioDatabase, self).__init__(name='frgc', **kwargs)
+
+        from bob.db.frgc.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(client_id=f.client_id, path=f.path, file_id=f.id) for f in retval]
diff --git a/bob/bio/face/database/gbu.py b/bob/bio/face/database/gbu.py
new file mode 100644
index 00000000..0e8eab53
--- /dev/null
+++ b/bob/bio/face/database/gbu.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  GBU database implementation of bob.bio.base.database.ZTDatabase interface.
+  It is an extension of an SQL-based database interface, which directly talks to GBU database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class GBUBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying gbu database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(GBUBioDatabase, self).__init__(name='GBU', **kwargs)
+
+        from bob.db.gbu.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
diff --git a/bob/bio/face/database/ijba.py b/bob/bio/face/database/ijba.py
new file mode 100644
index 00000000..711b11f3
--- /dev/null
+++ b/bob/bio/face/database/ijba.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  IJBA database implementation of bob.bio.base.database.Database interface.
+  It is an extension of an SQL-based database interface, which directly talks to IJBA database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class IJBABioDatabase(BioDatabase):
+    """
+    Implements verification API for querying IJBA database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(IJBABioDatabase, self).__init__(name='ijba', **kwargs)
+
+        from bob.db.ijba.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol="search_split1", **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol="search_split1", purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(client_id=f.client_id, path=f.path, file_id=f.id) for f in retval]
diff --git a/bob/bio/face/database/lfw.py b/bob/bio/face/database/lfw.py
new file mode 100644
index 00000000..c4039f80
--- /dev/null
+++ b/bob/bio/face/database/lfw.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  LFW database implementation of bob.bio.base.database.Database interface.
+  It is an extension of an SQL-based database interface, which directly talks to LFW database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class LFWBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying LFW database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(LFWBioDatabase, self).__init__(name='lfw', **kwargs)
+
+        from bob.db.lfw.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
diff --git a/bob/bio/face/database/mobio.py b/bob/bio/face/database/mobio.py
new file mode 100644
index 00000000..d7d4fd32
--- /dev/null
+++ b/bob/bio/face/database/mobio.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Amir Mohammadi <amir.mohammadi@idiap.ch>
+# Wed 13 Jul 16:43:22 CEST 2016
+
+"""
+  MOBIO database implementation of bob.bio.base.database.ZTDatabase interface.
+  It is an extension of an SQL-based database interface, which directly talks to Mobio database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+
+from .database import FaceBioFile
+from bob.bio.base.database import ZTBioDatabase, BioFile
+
+
+class MobioBioDatabase(ZTBioDatabase):
+    """
+    Implements verification API for querying Mobio database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(MobioBioDatabase, self).__init__(name='mobio',
+                                               **kwargs)
+
+        from bob.db.mobio.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, gender=None):
+        return self.__db.model_ids(groups=groups, protocol=protocol, gender=gender)
+
+    def tmodel_ids_with_protocol(self, protocol=None, groups=None, **kwargs):
+        return self.__db.tmodel_ids(protocol=protocol, groups=groups, **kwargs)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(f) for f in retval]
+
+    def tobjects(self, groups=None, protocol=None, model_ids=None, **kwargs):
+        retval = self.__db.tobjects(groups=groups, protocol=protocol, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(f) for f in retval]
+
+    def zobjects(self, groups=None, protocol=None, **kwargs):
+        retval = self.__db.zobjects(groups=groups, protocol=protocol, **kwargs)
+        return [FaceBioFile(f) for f in retval]
diff --git a/bob/bio/face/database/multipie.py b/bob/bio/face/database/multipie.py
new file mode 100644
index 00000000..ac726e5f
--- /dev/null
+++ b/bob/bio/face/database/multipie.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  Multipie database implementation of bob.bio.base.database.Database interface.
+  It is an extension of an SQL-based database interface, which directly talks to Multipie database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import ZTBioDatabase, BioFile
+
+
+class MultipieBioDatabase(ZTBioDatabase):
+    """
+    Implements verification API for querying MULTIPIE database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(MultipieBioDatabase, self).__init__(name='multipie', **kwargs)
+
+        from bob.db.multipie.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [BioFile(client_id=f.client_id, path=f.path, file_id=f.id) for f in retval]
+
+    def tmodel_ids_with_protocol(self, protocol=None, groups=None, **kwargs):
+        return self.__db.tmodel_ids(protocol=protocol, groups=groups, **kwargs)
+
+    def tobjects(self, groups=None, protocol=None, model_ids=None, **kwargs):
+        retval = self.__db.tobjects(groups=groups, protocol=protocol, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
+
+    def zobjects(self, groups=None, protocol=None, **kwargs):
+        retval = self.__db.zobjects(groups=groups, protocol=protocol, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
+
diff --git a/bob/bio/face/database/replay.py b/bob/bio/face/database/replay.py
new file mode 100644
index 00000000..a9f5555c
--- /dev/null
+++ b/bob/bio/face/database/replay.py
@@ -0,0 +1,114 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Pavel Korshunov <pavel.korshunov@idiap.ch>
+# Mon 12 Oct 14:43:22 CEST 2015
+
+"""
+  Replay attack database implementation of bob.bio.base.database.BioDatabase interface.
+  It is an extension of an SQL-based database interface, which directly talks to Replay database, for
+  verification experiments (good to use in bob.bio.base framework).
+  It also implements a kind of hack so that you can run vulnerability analysis with it.
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class ReplayBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying Replay database.
+    """
+    __doc__ = __doc__
+
+    def __init__(self, **kwargs):
+        # call base class constructors to open a session to the database
+        super(ReplayBioDatabase, self).__init__(name='replay', **kwargs)
+
+        from bob.db.replay import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+        self.low_level_group_names = ('train', 'devel', 'test')
+        self.high_level_group_names = ('world', 'dev', 'eval')
+
+    def protocol_names(self):
+        """Returns all registered protocol names
+        Here I am going to hack and double the number of protocols
+        with -licit and -spoof. This is done for running vulnerability
+        analysis"""
+        names = [p.name + '-licit' for p in self.__db.protocols()]
+        names += [p.name + '-spoof' for p in self.__db.protocols()]
+        return names
+
+    def groups(self):
+        return self.convert_names_to_highlevel(
+            self.__db.groups(), self.low_level_group_names, self.high_level_group_names)
+
+    def annotations(self, file):
+        """Will return the bounding box annotation of all frames of the video."""
+        # fn = 10  # 10th frame number
+        annots = file.bbx(directory=self.original_directory)
+        # bob uses the (y, x) format
+        annotations = dict()
+        for i in range(annots.shape[0]):
+            topleft = (annots[i][2], annots[i][1])
+            bottomright = (annots[i][2] + annots[i][4], annots[i][1] + annots[i][3])
+            annotations[str(i)] = {'topleft': topleft, 'bottomright': bottomright}
+        return annotations
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        # since the low-level API does not support verification straight-forward-ly, we improvise.
+        files = self.objects(groups=groups, protocol=protocol)
+        return sorted(set(f.client_id for f in files))
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        if protocol == '.':
+            protocol = None
+        protocol = self.check_parameter_for_validity(protocol, "protocol", self.protocol_names(), 'grandtest-licit')
+        groups = self.check_parameters_for_validity(groups, "group", self.groups(), self.groups())
+        purposes = self.check_parameters_for_validity(purposes, "purpose", ('enroll', 'probe'), ('enroll', 'probe'))
+        purposes = list(purposes)
+        groups = self.convert_names_to_lowlevel(
+            groups, self.low_level_group_names, self.high_level_group_names)
+
+        # protocol licit is not defined in the low level API
+        # so do a hack here.
+        if '-licit' in protocol:
+            # for licit we return the grandtest protocol
+            protocol = protocol.replace('-licit', '')
+            # The low-level API has only "attack", "real", "enroll" and "probe"
+            # should translate to "real" or "attack" depending on the protocol.
+            # enroll does not to change.
+            if 'probe' in purposes:
+                purposes.remove('probe')
+                purposes.append('real')
+                if len(purposes) == 1:
+                    # making the model_ids to None will return all clients which make
+                    # the impostor data also available.
+                    model_ids = None
+                elif model_ids:
+                    raise NotImplementedError(
+                       'Currently returning both enroll and probe for specific '
+                       'client(s) in the licit protocol is not supported. '
+                       'Please specify one purpose only.')
+        elif '-spoof' in protocol:
+            protocol = protocol.replace('-spoof', '')
+            # you need to replace probe with attack and real for the spoof protocols.
+            # I am adding the real here also to create positives scores also.
+            if 'probe' in purposes:
+                purposes.remove('probe')
+                purposes.append('attack')
+
+        # now, query the actual Replay database
+        objects = self.__db.objects(groups=groups, protocol=protocol, cls=purposes, clients=model_ids, **kwargs)
+
+        # make sure to return BioFile representation of a file, not the database one
+        # also make sure you replace client ids with spoof/metatdata1/metadata2/...
+        retval = []
+        for f in objects:
+            if f.is_real():
+                retval.append(FaceBioFile(f))
+            else:
+                temp = FaceBioFile(f)
+                temp.client_id = 'attack'
+                retval.append(temp)
+        return retval
diff --git a/bob/bio/face/database/scface.py b/bob/bio/face/database/scface.py
new file mode 100644
index 00000000..9a9f799c
--- /dev/null
+++ b/bob/bio/face/database/scface.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  SCFace database implementation of bob.bio.base.database.ZTDatabase interface.
+  It is an extension of an SQL-based database interface, which directly talks to SCFace database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import ZTBioDatabase, BioFile
+
+
+class SCFaceBioDatabase(ZTBioDatabase):
+    """
+    Implements verification API for querying SCFace database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(SCFaceBioDatabase, self).__init__(name='scface', **kwargs)
+
+        from bob.db.scface.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def tmodel_ids_with_protocol(self, protocol=None, groups=None, **kwargs):
+        return self.__db.tmodel_ids(protocol=protocol, groups=groups, **kwargs)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
+
+    def tobjects(self, groups=None, protocol=None, model_ids=None, **kwargs):
+        retval = self.__db.tobjects(groups=groups, protocol=protocol, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
+
+    def zobjects(self, groups=None, protocol=None, **kwargs):
+        retval = self.__db.zobjects(groups=groups, protocol=protocol, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
diff --git a/bob/bio/face/database/xm2vts.py b/bob/bio/face/database/xm2vts.py
new file mode 100644
index 00000000..6666bf59
--- /dev/null
+++ b/bob/bio/face/database/xm2vts.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+# Sat 20 Aug 15:43:10 CEST 2016
+
+"""
+  XM2VTS database implementation of bob.bio.base.database.Database interface.
+  It is an extension of an SQL-based database interface, which directly talks to XM2VTS database, for
+  verification experiments (good to use in bob.bio.base framework).
+"""
+
+from .database import FaceBioFile
+from bob.bio.base.database import BioDatabase, BioFile
+
+
+class XM2VTSBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying XM2VTS database.
+    """
+
+    def __init__(
+            self,
+            **kwargs
+    ):
+        # call base class constructors to open a session to the database
+        super(XM2VTSBioDatabase, self).__init__(name='xm2vts', **kwargs)
+
+        from bob.db.xm2vts.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        return self.__db.model_ids(groups=groups, protocol=protocol)
+
+    def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs):
+        retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)
+        return [FaceBioFile(BioFile(client_id=f.client_id, path=f.path, file_id=f.id)) for f in retval]
diff --git a/bob/bio/face/script/display_face_annotations.py b/bob/bio/face/script/display_face_annotations.py
index b0202f63..6421c020 100644
--- a/bob/bio/face/script/display_face_annotations.py
+++ b/bob/bio/face/script/display_face_annotations.py
@@ -55,7 +55,7 @@ def main(command_line_parameters=None):
   # load database
   database = bob.bio.base.load_resource("".join(args.database), "database")
   # replace directories
-  if isinstance(database, bob.bio.db.BioDatabase):
+  if isinstance(database, bob.bio.base.database.BioDatabase):
     database.replace_directories(args.database_directories_file)
 
   # get all files
diff --git a/bob/bio/face/test/test_databases.py b/bob/bio/face/test/test_databases.py
index 53d159c4..d6dacb9f 100644
--- a/bob/bio/face/test/test_databases.py
+++ b/bob/bio/face/test/test_databases.py
@@ -26,7 +26,7 @@ from bob.bio.base.test.utils import db_available
 
 
 def _check_database(database, groups=('dev',), protocol=None, training_depends=False, models_depend=False):
-    assert isinstance(database, bob.bio.db.BioDatabase)
+    assert isinstance(database, bob.bio.base.database.BioDatabase)
 
     # load the directories
     if 'HOME' in os.environ:
@@ -52,7 +52,7 @@ def _check_database(database, groups=('dev',), protocol=None, training_depends=F
 
 def _check_database_zt(database, groups=('dev', 'eval'), protocol=None, training_depends=False, models_depend=False):
     _check_database(database, groups, protocol, training_depends, models_depend)
-    assert isinstance(database, bob.bio.db.ZTBioDatabase)
+    assert isinstance(database, bob.bio.base.database.ZTBioDatabase)
     for group in groups:
         t_model_ids = database.t_model_ids(group)
         assert len(t_model_ids) > 0
diff --git a/buildout-dev.cfg b/buildout-dev.cfg
new file mode 100644
index 00000000..67f6a74e
--- /dev/null
+++ b/buildout-dev.cfg
@@ -0,0 +1,79 @@
+; vim: set fileencoding=utf-8 :
+; Manuel Guenther <manuel.guenther@idiap.ch>
+; Thu Oct  9 16:51:06 CEST 2014
+
+[buildout]
+parts = scripts
+eggs = bob.bio.face
+       bob.db.arface
+       bob.db.banca
+       bob.db.caspeal
+       bob.db.frgc
+       bob.db.gbu
+       bob.db.lfw
+       bob.db.mobio
+       bob.db.multipie
+       bob.db.scface
+       bob.db.xm2vts
+       gridtk
+
+extensions = bob.buildout
+             mr.developer
+auto-checkout = *
+develop = src/bob.extension
+          src/bob.db.base
+          src/bob.db.atnt
+          src/bob.bio.base
+          src/bob.db.arface
+          src/bob.db.banca
+          src/bob.db.caspeal
+          src/bob.db.frgc
+          src/bob.db.gbu
+          src/bob.db.lfw
+          src/bob.db.mobio
+          src/bob.db.multipie
+          src/bob.db.scface
+          src/bob.db.xm2vts
+          .
+
+; options for bob.buildout
+debug = true
+verbose = true
+newest = false
+
+[sources]
+bob.extension = git https://gitlab.idiap.ch/bob/bob.extension
+;bob.blitz = git https://gitlab.idiap.ch/bob/bob.blitz
+;bob.core = git https://gitlab.idiap.ch/bob/bob.core
+;bob.io.base = git https://gitlab.idiap.ch/bob/bob.io.base
+;bob.io.image = git https://gitlab.idiap.ch/bob/bob.io.image
+;bob.learn.activation = git https://gitlab.idiap.ch/bob/bob.learn.activation
+;bob.math = git https://gitlab.idiap.ch/bob/bob.math
+;bob.sp = git https://gitlab.idiap.ch/bob/bob.sp
+;bob.ip.base = git https://gitlab.idiap.ch/bob/bob.ip.base
+;bob.ip.color = git https://gitlab.idiap.ch/bob/bob.ip.color
+;bob.ip.draw = git https://gitlab.idiap.ch/bob/bob.ip.draw
+;bob.ip.gabor = git https://gitlab.idiap.ch/bob/bob.ip.gabor
+;bob.learn.linear = git https://gitlab.idiap.ch/bob/bob.learn.linear
+;bob.learn.em = git https://gitlab.idiap.ch/bob/bob.learn.em
+;bob.measure = git https://gitlab.idiap.ch/bob/bob.measure
+bob.db.base = git https://gitlab.idiap.ch/bob/bob.db.base
+bob.db.atnt = git https://gitlab.idiap.ch/bob/bob.db.atnt
+bob.bio.base = git git@gitlab.idiap.ch:bob/bob.bio.base branch=issue-8-remove-database-configuration
+;bob.learn.boosting = git https://gitlab.idiap.ch/bob/bob.learn.boosting
+;bob.ip.facedetect = git https://gitlab.idiap.ch/bob/bob.ip.facedetect
+;bob.ip.flandmark = git https://gitlab.idiap.ch/bob/bob.ip.flandmark
+bob.db.arface = git https://gitlab.idiap.ch/bob/bob.db.arface
+bob.db.banca = git https://gitlab.idiap.ch/bob/bob.db.banca
+bob.db.caspeal = git https://gitlab.idiap.ch/bob/bob.db.caspeal
+bob.db.frgc = git https://gitlab.idiap.ch/bob/bob.db.frgc
+bob.db.gbu = git https://gitlab.idiap.ch/bob/bob.db.gbu
+bob.db.lfw = git https://gitlab.idiap.ch/bob/bob.db.lfw
+bob.db.mobio = git https://gitlab.idiap.ch/bob/bob.db.mobio
+bob.db.multipie = git https://gitlab.idiap.ch/bob/bob.db.multipie
+bob.db.scface = git https://gitlab.idiap.ch/bob/bob.db.scface
+bob.db.xm2vts = git https://gitlab.idiap.ch/bob/bob.db.xm2vts
+
+[scripts]
+recipe = bob.buildout:scripts
+dependent-scripts = true
diff --git a/setup.py b/setup.py
index 03bd32d2..30b08122 100644
--- a/setup.py
+++ b/setup.py
@@ -108,19 +108,19 @@ setup(
         ],
 
         'bob.bio.database': [
-            'arface            = bob.bio.db.default_configs.arface:database',
-            'banca             = bob.bio.db.default_configs.banca_english:database',
-            'caspeal           = bob.bio.db.default_configs.caspeal:database',
-            'frgc              = bob.bio.db.default_configs.frgc:database',
-            'gbu               = bob.bio.db.default_configs.gbu:database',
-            'lfw-restricted    = bob.bio.db.default_configs.lfw_restricted:database',
-            'lfw-unrestricted  = bob.bio.db.default_configs.lfw_unrestricted:database',
-            'mobio-male        = bob.bio.db.default_configs.mobio_male:database',  # MOBIO gender-dependent training
-            'mobio-female      = bob.bio.db.default_configs.mobio_female:database',  # MOBIO gender-dependent training
-            'multipie          = bob.bio.db.default_configs.multipie:database',
-            'multipie-pose     = bob.bio.db.default_configs.multipie_pose:database',
-            'scface            = bob.bio.db.default_configs.scface:database',
-            'xm2vts            = bob.bio.db.default_configs.xm2vts:database',
+            'arface            = bob.bio.face.config.database.arface:database',
+            'banca             = bob.bio.face.config.database.banca_english:database',
+            'caspeal           = bob.bio.face.config.database.caspeal:database',
+            'frgc              = bob.bio.face.config.database.frgc:database',
+            'gbu               = bob.bio.face.config.database.gbu:database',
+            'lfw-restricted    = bob.bio.face.config.database.lfw_restricted:database',
+            'lfw-unrestricted  = bob.bio.face.config.database.lfw_unrestricted:database',
+            'mobio-male        = bob.bio.face.config.database.mobio_male:database',  # MOBIO gender-dependent training
+            'mobio-female      = bob.bio.face.config.database.mobio_female:database',  # MOBIO gender-dependent training
+            'multipie          = bob.bio.face.config.database.multipie:database',
+            'multipie-pose     = bob.bio.face.config.database.multipie_pose:database',
+            'scface            = bob.bio.face.config.database.scface:database',
+            'xm2vts            = bob.bio.face.config.database.xm2vts:database',
         ],
 
         'bob.bio.preprocessor': [
-- 
GitLab