Commit 00df1750 authored by Tiago de Freitas Pereira's avatar Tiago de Freitas Pereira
Browse files

Ported IJBC database

parent 8c50e1ee
#!/usr/bin/env python
from import IJBCBioDatabase
from import DatabaseConnector
from import IJBCDatabase
from bob.extension import rc
ijbc_directory = rc[""]
database = DatabaseConnector(
IJBCBioDatabase(original_directory=ijbc_directory, protocol="1:1"),
annotation_type = "eyes-center",
fixed_positions = None,
#ijbc_covariates = DatabaseConnector(
# IJBCBioDatabase(
# original_directory=ijbc_directory, protocol="Covariates"
# )
database = IJBCDatabase()
......@@ -9,7 +9,7 @@ from .gbu import GBUBioDatabase
from .arface import ARFaceBioDatabase
from .lfw import LFWBioDatabase
from .multipie import MultipieDatabase
from .ijbc import IJBCBioDatabase
from .ijbc import IJBCDatabase
from .replaymobile import ReplayMobileBioDatabase
from .fargo import FargoBioDatabase
from .meds import MEDSDatabase
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# Tiago de Freitas Pereira <>
# Sat 20 Aug 15:43:10 CEST 2016
# Sat 20 Aug 15:43:10 CEST 2020
IJBC database implementation of interface.
It is an extension of the database interface, which directly talks to IJBC database, for
verification experiments (good to use in framework).
from .database import FaceBioFile
from import BioDatabase, BioFileSet
from bob.pipelines.utils import hash_string
from import get_file, find_element_in_tarball
import pickle
import os
class IJBCBioFile(FaceBioFile):
def __init__(self, f):
super(IJBCBioFile, self).__init__(
client_id=f.client_id, path=f.path,
self.f = f
def load(self, directory, extension=None, add_client_id=False):
return, self.f.extension, add_client_id))
def make_path(self, directory, extension, add_client_id=True):
if add_client_id:
# add client ID to the path, so that a unique path is generated
# (there might be several identities in each physical file)
path = "%s-%s%s" % (self.path, self.client_id, extension or '')
# do not add the client ID to be able to obtain the original image file
path = "%s%s" % (self.path, extension or '')
return str(os.path.join(directory or '', path))
class IJBCBioFileSet(BioFileSet):
def __init__(self, template):
super(IJBCBioFileSet, self).__init__(, files=[
IJBCBioFile(f) for f in template.files], path=template.path)
class IJBCBioDatabase(BioDatabase):
IJBC database implementation of :py:class:`` interface.
It is an extension of an SQL-based database interface, which directly talks to IJBC database, for
verification experiments (good to use in framework).
def __init__(
from bob.db.ijbc.query import Database as LowLevelDatabase
self._db = LowLevelDatabase(
# call base class constructors to open a session to the database
super(IJBCBioDatabase, self).__init__(
def original_directory(self):
return self._db.original_directory
def original_directory(self, value):
self._db.original_directory = value
def annotation_directory(self):
return self._db.annotation_directory
def annotation_directory(self, value):
self._db.annotation_directory = value
def uses_probe_file_sets(self):
return True
def model_ids_with_protocol(self, groups=None, protocol="1:1", **kwargs):
return self._db.model_ids(groups=groups, protocol=protocol)
def objects(self, groups=None, protocol="1:1", purposes=None, model_ids=None, **kwargs):
return [IJBCBioFile(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="1:1", purposes=None, model_ids=None):
return [IJBCBioFileSet(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(self.protocol, model_id)
def original_file_names(self, files):
return [f.make_path(self.original_directory, f.f.extension, False) for f in files]
def load_ijbc_sample(original_path, extension=[".jpg", ".png"]):
for e in extension:
path = original_path + e
if os.path.exists(path):
return path
return ""
class IJBCDatabase:
def __init__(self, pkl_directory=None):
self.annotation_type = "bounding-box"
self.fixed_positions = None
self.allow_scoring_with_all_biometric_references = False
self.hash_fn = hash_string
self.memory_demanding = True
if pkl_directory is None:
urls = IJBCDatabase.urls()
pkl_directory = get_file(
"ijbc.tar.gz", urls, file_hash="4b25d7f10595eb9f97f328a2d448d957"
self.pkl_directory = pkl_directory
def _assert_group(self, group):
assert (
group == "dev"
), "The IJBC database only has a `dev` group. Received : {}".format(group)
def references(self, group="dev"):
return pickle.loads(
find_element_in_tarball(self.pkl_directory, "db_references.pickle", True)
def probes(self, group="dev"):
return pickle.loads(
find_element_in_tarball(self.pkl_directory, "db_probes.pickle", True)
def background_model_samples(self):
import cloudpickle
return cloudpickle.loads(
self.pkl_directory, "db_background_model_samples.pickle", True
def urls():
return [
......@@ -313,22 +313,24 @@ def test_replaymobile_spoof():
def test_ijbc():
database =
"ijbc-11", "database", preferred_package=""
check_database(database, models_depend=True, training_depends=True)
except IOError as e:
pytest.skip("The database could not queried; Here is the error: '%s'" % e)
from import IJBCDatabase
# Getting the absolute path
urls = IJBCDatabase.urls()
filename = get_file("ijbc.tar.gz", urls)
# Removing the file before the test
_check_annotations(database, topleft=True, limit_files=1000)
except IOError as e:
"The annotations could not be queried; probably the annotation files are missing. Here is the error: '%s'"
% e
except Exception:
database = IJBCDatabase()
assert len(database.background_model_samples()) == 140732
assert len(database.references()) == 3531
assert len(database.probes()) == 19593
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment