From be046ae2fdffe4f4335f2d868bf00f5fa82ce4af Mon Sep 17 00:00:00 2001
From: Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
Date: Tue, 4 May 2021 16:01:54 +0200
Subject: [PATCH] FRGC dataset

---
 bob/bio/face/database/__init__.py   |  2 +
 bob/bio/face/database/frgc.py       | 63 +++++++++++++++++++++++++++++
 bob/bio/face/test/test_databases.py | 21 ++++++++++
 3 files changed, 86 insertions(+)
 create mode 100644 bob/bio/face/database/frgc.py

diff --git a/bob/bio/face/database/__init__.py b/bob/bio/face/database/__init__.py
index b0dda7c4..5e9b8e78 100644
--- a/bob/bio/face/database/__init__.py
+++ b/bob/bio/face/database/__init__.py
@@ -12,6 +12,7 @@ from .multipie import MultipieDatabase
 from .ijbc import IJBCDatabase
 from .replaymobile import ReplayMobileBioDatabase
 from .fargo import FargoBioDatabase
+from .frgc import FRGCDatabase
 from .meds import MEDSDatabase
 from .morph import MorphDatabase
 from .casia_africa import CasiaAfricaDatabase
@@ -52,5 +53,6 @@ __appropriate__(
     CasiaAfricaDatabase,
     PolaThermalDatabase,
     CBSRNirVis2Database,
+    FRGCDatabase,
 )
 __all__ = [_ for _ in dir() if not _.startswith("_")]
diff --git a/bob/bio/face/database/frgc.py b/bob/bio/face/database/frgc.py
new file mode 100644
index 00000000..12964a31
--- /dev/null
+++ b/bob/bio/face/database/frgc.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+# Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
+
+"""
+  Multipie database implementation 
+"""
+
+from bob.bio.base.database import CSVDataset
+from bob.bio.base.database import CSVToSampleLoaderBiometrics
+from bob.bio.face.database.sample_loaders import EyesAnnotations
+from bob.extension import rc
+from bob.extension.download import get_file
+import bob.io.base
+from sklearn.pipeline import make_pipeline
+
+
+class FRGCDatabase(CSVDataset):
+    """
+    Face Recognition Grand Test dataset
+    """
+
+    def __init__(self, protocol):
+
+        # Downloading model if not exists
+        urls = FRGCDatabase.urls()
+        filename = get_file(
+            "frgc.tar.gz", urls, file_hash="328d2c71ae19a41679defa9585b3140f"
+        )
+
+        self.annotation_type = "eyes-center"
+        self.fixed_positions = None
+
+        super().__init__(
+            filename,
+            protocol,
+            csv_to_sample_loader=make_pipeline(
+                CSVToSampleLoaderBiometrics(
+                    data_loader=bob.io.base.load,
+                    dataset_original_directory=rc["bob.db.frgc.directory"]
+                    if rc["bob.db.frgc.directory"]
+                    else "",
+                    extension=".JPG",
+                ),
+                EyesAnnotations(),
+            ),
+        )
+
+    @staticmethod
+    def protocols():
+        # TODO: Until we have (if we have) a function that dumps the protocols, let's use this one.
+        return [
+            "2.0.1",
+            "2.0.2",
+            "2.0.3",
+        ]
+
+    @staticmethod
+    def urls():
+        return [
+            "https://www.idiap.ch/software/bob/databases/latest/frgc.tar.gz",
+            "http://www.idiap.ch/software/bob/databases/latest/frgc.tar.gz",
+        ]
diff --git a/bob/bio/face/test/test_databases.py b/bob/bio/face/test/test_databases.py
index faf4a5c0..7c68ed4e 100644
--- a/bob/bio/face/test/test_databases.py
+++ b/bob/bio/face/test/test_databases.py
@@ -408,6 +408,27 @@ def test_casia_africa():
     assert len(database.probes()) == 2426
 
 
+def test_frgc():
+
+    from bob.bio.face.database import FRGCDatabase
+
+    database = FRGCDatabase("2.0.1")
+
+    assert len(database.background_model_samples()) == 12776
+    assert len(database.references()) == 7572
+    assert len(database.probes()) == 8456
+
+    database = FRGCDatabase("2.0.2")
+    assert len(database.background_model_samples()) == 12776
+    assert len(database.references()) == 1893
+    assert len(database.probes()) == 8456
+
+    database = FRGCDatabase("2.0.4")
+    assert len(database.background_model_samples()) == 12776
+    assert len(database.references()) == 7572
+    assert len(database.probes()) == 4228
+
+
 def test_polathermal():
 
     from bob.bio.face.database import PolaThermalDatabase
-- 
GitLab