Skip to content
Snippets Groups Projects
Commit d493de11 authored by Tiago de Freitas Pereira's avatar Tiago de Freitas Pereira
Browse files

Merge branch 'ijbc' into 'master'

Ported IJBC database

See merge request !116
parents 8c50e1ee 00df1750
No related branches found
No related tags found
1 merge request!116Ported IJBC database
Pipeline #50227 passed
#!/usr/bin/env python #!/usr/bin/env python
from bob.bio.face.database import IJBCBioDatabase from bob.bio.face.database import IJBCDatabase
from bob.bio.base.pipelines.vanilla_biometrics import DatabaseConnector
from bob.extension import rc from bob.extension import rc
database = IJBCDatabase()
ijbc_directory = rc["bob.db.ijbc.directory"]
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"
# )
#)
...@@ -9,7 +9,7 @@ from .gbu import GBUBioDatabase ...@@ -9,7 +9,7 @@ from .gbu import GBUBioDatabase
from .arface import ARFaceBioDatabase from .arface import ARFaceBioDatabase
from .lfw import LFWBioDatabase from .lfw import LFWBioDatabase
from .multipie import MultipieDatabase from .multipie import MultipieDatabase
from .ijbc import IJBCBioDatabase from .ijbc import IJBCDatabase
from .replaymobile import ReplayMobileBioDatabase from .replaymobile import ReplayMobileBioDatabase
from .fargo import FargoBioDatabase from .fargo import FargoBioDatabase
from .meds import MEDSDatabase from .meds import MEDSDatabase
......
#!/usr/bin/env python #!/usr/bin/env python
# vim: set fileencoding=utf-8 : # vim: set fileencoding=utf-8 :
# Tiago de Freitas Pereira <tiago.pereira@idiap.ch> # Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
# Sat 20 Aug 15:43:10 CEST 2016 # Sat 20 Aug 15:43:10 CEST 2020
""" from bob.pipelines.utils import hash_string
IJBC database implementation of bob.bio.base.database.BioDatabase interface. from bob.extension.download import get_file, find_element_in_tarball
It is an extension of the database interface, which directly talks to IJBC database, for import pickle
verification experiments (good to use in bob.bio.base framework).
"""
from .database import FaceBioFile
from bob.bio.base.database import BioDatabase, BioFileSet
import os import os
import bob.io.image
class IJBCBioFile(FaceBioFile):
def __init__(self, f):
super(IJBCBioFile, self).__init__(
client_id=f.client_id, path=f.path, file_id=f.id)
self.f = f
def load(self, directory, extension=None, add_client_id=False):
return bob.io.image.load(self.make_path(directory, 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 '')
else:
# 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__(file_set_id=template.id, files=[
IJBCBioFile(f) for f in template.files], path=template.path)
class IJBCBioDatabase(BioDatabase):
"""
IJBC database implementation of :py:class:`bob.bio.base.database.BioDatabase` interface.
It is an extension of an SQL-based database interface, which directly talks to IJBC database, for
verification experiments (good to use in bob.bio.base framework).
"""
def __init__(
self,
original_directory=None,
annotation_directory=None,
original_extension=None,
**kwargs
):
from bob.db.ijbc.query import Database as LowLevelDatabase
self._db = LowLevelDatabase(
original_directory)
# call base class constructors to open a session to the database
super(IJBCBioDatabase, self).__init__(
name='ijbc',
models_depend_on_protocol=True,
training_depends_on_protocol=True,
original_directory=original_directory,
annotation_directory=annotation_directory,
original_extension=original_extension,
**kwargs)
@property
def original_directory(self):
return self._db.original_directory
@original_directory.setter
def original_directory(self, value):
self._db.original_directory = value
@property
def annotation_directory(self):
return self._db.annotation_directory
@annotation_directory.setter
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): def load_ijbc_sample(original_path, extension=[".jpg", ".png"]):
return [f.make_path(self.original_directory, f.f.extension, False) for f in files] for e in extension:
path = original_path + e
if os.path.exists(path):
return path
else:
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"):
self._assert_group(group)
return pickle.loads(
find_element_in_tarball(self.pkl_directory, "db_references.pickle", True)
)
def probes(self, group="dev"):
self._assert_group(group)
return pickle.loads(
find_element_in_tarball(self.pkl_directory, "db_probes.pickle", True)
)
def background_model_samples(self):
import cloudpickle
return cloudpickle.loads(
find_element_in_tarball(
self.pkl_directory, "db_background_model_samples.pickle", True
)
)
@staticmethod
def urls():
return [
"https://www.idiap.ch/software/bob/databases/latest/ijbc.tar.gz",
"http://www.idiap.ch/software/bob/databases/latest/ijbc.tar.gz",
]
...@@ -313,22 +313,24 @@ def test_replaymobile_spoof(): ...@@ -313,22 +313,24 @@ def test_replaymobile_spoof():
) )
@db_available("ijbc")
def test_ijbc(): def test_ijbc():
database = bob.bio.base.load_resource( from bob.bio.face.database import IJBCDatabase
"ijbc-11", "database", preferred_package="bob.bio.face"
) # Getting the absolute path
try: urls = IJBCDatabase.urls()
check_database(database, models_depend=True, training_depends=True) filename = get_file("ijbc.tar.gz", urls)
except IOError as e:
pytest.skip("The database could not queried; Here is the error: '%s'" % e) # Removing the file before the test
try: try:
_check_annotations(database, topleft=True, limit_files=1000) os.remove(filename)
except IOError as e: except Exception:
pytest.skip( pass
"The annotations could not be queried; probably the annotation files are missing. Here is the error: '%s'"
% e database = IJBCDatabase()
)
assert len(database.background_model_samples()) == 140732
assert len(database.references()) == 3531
assert len(database.probes()) == 19593
@db_available("fargo") @db_available("fargo")
......
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