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

Implemented IJBA database interface correctly

parent b96e367c
No related branches found
No related tags found
1 merge request!25Resolve "IJB-A database implemented incorrectly"
Pipeline #
#!/usr/bin/env python
from bob.bio.face.database import IJBABioDatabase
ijba_directory = "[YOUR_IJBA_DIRECTORY]"
database = IJBABioDatabase(
original_directory=ijba_directory,
protocol='search_split1'
)
...@@ -4,33 +4,60 @@ ...@@ -4,33 +4,60 @@
# Sat 20 Aug 15:43:10 CEST 2016 # Sat 20 Aug 15:43:10 CEST 2016
""" """
IJBA database implementation of bob.bio.base.database.Database interface. IJBA database implementation of bob.bio.base.database.BioDatabase interface.
It is an extension of an SQL-based database interface, which directly talks to IJBA database, for It is an extension of the database interface, which directly talks to IJBA database, for
verification experiments (good to use in bob.bio.base framework). verification experiments (good to use in bob.bio.base framework).
""" """
from .database import FaceBioFile from .database import FaceBioFile
from bob.bio.base.database import BioDatabase, BioFile from bob.bio.base.database import BioDatabase, BioFileSet
import os
class IJBABioFile(FaceBioFile):
def __init__(self, f):
super(IJBABioFile, self).__init__(client_id=f.client_id, path=f.path, file_id=f.id)
self.f = f
def make_path(self, directory, extension):
# add file ID to the path, so that a unique path is generated (there might be several identities in each physical file)
return str(os.path.join(directory or '', self.path + "-" + str(self.id) + (extension or '')))
class IJBABioFileSet(BioFileSet):
def __init__(self, template):
super(IJBABioFileSet, self).__init__(file_set_id = template.id, files = [IJBABioFile(f) for f in template.files], path = template.path)
class IJBABioDatabase(BioDatabase): class IJBABioDatabase(BioDatabase):
""" """
Implements verification API for querying IJBA database. Implements verification API for querying IJBA database.
""" """
def __init__( def __init__(
self, self,
**kwargs **kwargs
): ):
# call base class constructors to open a session to the database # call base class constructors to open a session to the database
super(IJBABioDatabase, self).__init__(name='ijba', **kwargs) super(IJBABioDatabase, self).__init__(name='ijba', models_depend_on_protocol=True, training_depends_on_protocol=True, **kwargs)
from bob.db.ijba.query import Database as LowLevelDatabase import bob.db.ijba
self.__db = LowLevelDatabase() self._db = bob.db.ijba.Database()
def model_ids_with_protocol(self, groups=None, protocol="search_split1", **kwargs): def uses_probe_file_sets(self):
return self.__db.model_ids(groups=groups, protocol=protocol) return True
def objects(self, groups=None, protocol="search_split1", purposes=None, model_ids=None, **kwargs): def model_ids_with_protocol(self, groups=None, protocol="search_split1", **kwargs):
retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs) return self._db.model_ids(groups=groups, protocol=protocol)
return [FaceBioFile(client_id=f.client_id, path=f.path, file_id=f.id) for f in retval]
def objects(self, groups=None, protocol="search_split1", purposes=None, model_ids=None, **kwargs):
return [IJBABioFile(f) for f in self._db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)]
def object_sets(self, groups=None, protocol="search_split1", purposes=None, model_ids=None):
return [IJBABioFileSet(t) for t in self._db.object_sets(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids)]
def annotations(self, biofile):
return self._db.annotations(biofile.f)
def client_id_from_model_id(self, model_id, group='dev'):
return self._db.get_client_id_from_model_id(model_id)
...@@ -25,13 +25,14 @@ from bob.bio.base.test.utils import db_available ...@@ -25,13 +25,14 @@ from bob.bio.base.test.utils import db_available
from bob.bio.base.test.test_database_implementations import check_database, check_database_zt from bob.bio.base.test.test_database_implementations import check_database, check_database_zt
def _check_annotations(database): def _check_annotations(database, require_eyes=True):
for file in database.all_files(): for file in database.all_files():
annotations = database.annotations(file) annotations = database.annotations(file)
if annotations is not None: if annotations is not None:
assert isinstance(annotations, dict) assert isinstance(annotations, dict)
assert 'reye' in annotations if require_eyes:
assert 'leye' in annotations assert 'reye' in annotations
assert 'leye' in annotations
@db_available('arface') @db_available('arface')
...@@ -119,8 +120,8 @@ def test_gbu(): ...@@ -119,8 +120,8 @@ def test_gbu():
def test_ijba(): def test_ijba():
database = bob.bio.base.load_resource('ijba', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource('ijba', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database) check_database(database,models_depend=True, training_depends=True)
_check_annotations(database) _check_annotations(database, require_eyes=False)
except IOError as e: except IOError as e:
raise SkipTest( raise SkipTest(
"The database could not queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e) "The database could not queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e)
......
...@@ -109,11 +109,12 @@ setup( ...@@ -109,11 +109,12 @@ setup(
'bob.bio.database': [ 'bob.bio.database': [
'arface = bob.bio.face.config.database.arface:database', 'arface = bob.bio.face.config.database.arface:database',
'atnt = bob.bio.face.config.database.atnt:database', 'atnt = bob.bio.face.config.database.atnt:database',
'banca = bob.bio.face.config.database.banca_english:database', 'banca = bob.bio.face.config.database.banca_english:database',
'caspeal = bob.bio.face.config.database.caspeal:database', 'caspeal = bob.bio.face.config.database.caspeal:database',
'frgc = bob.bio.face.config.database.frgc:database', 'frgc = bob.bio.face.config.database.frgc:database',
'gbu = bob.bio.face.config.database.gbu:database', 'gbu = bob.bio.face.config.database.gbu:database',
'ijba = bob.bio.face.config.database.ijba:database',
'lfw-restricted = bob.bio.face.config.database.lfw_restricted:database', 'lfw-restricted = bob.bio.face.config.database.lfw_restricted:database',
'lfw-unrestricted = bob.bio.face.config.database.lfw_unrestricted: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-male = bob.bio.face.config.database.mobio_male:database', # MOBIO gender-dependent training
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment