From c518f84e96149604e52d58a72b46395baa08ddce Mon Sep 17 00:00:00 2001
From: Olegs NIKISINS <onikisins@italix03.idiap.ch>
Date: Thu, 12 Oct 2017 15:24:22 +0200
Subject: [PATCH] Added the HLDI for the putvein database

---
 bob/bio/vein/database/putvein.py | 177 +++++++++++++++++++++++++++++++
 1 file changed, 177 insertions(+)
 create mode 100644 bob/bio/vein/database/putvein.py

diff --git a/bob/bio/vein/database/putvein.py b/bob/bio/vein/database/putvein.py
new file mode 100644
index 0000000..dc51b50
--- /dev/null
+++ b/bob/bio/vein/database/putvein.py
@@ -0,0 +1,177 @@
+# vim: set fileencoding=utf-8 :
+
+"""
+PUTVEIN database implementation of bob.bio.db.BioDatabase interface.
+It is an extension of low level database interface, which directly talks to
+PUTVEIN database for verification experiments (good to use in bob.bio.base
+framework).
+"""
+
+from bob.bio.base.database import BioFile, BioDatabase
+import bob.ip.color
+import numpy as np
+
+
+class File(BioFile):
+    """
+    Implements extra properties of vein files for the PUTVEIN database
+
+    Parameters:
+
+      f (object): Low-level file (or sample) object that is kept inside
+    """
+    def __init__(self, f):
+        super(File, self).__init__(client_id=f.client_id,
+                                   path=f.path,
+                                   file_id=f.id)
+
+        self.f = f
+
+    def load(self, directory=None, extension='.bmp'):
+        """
+        The image returned by the ``bob.db.putvein`` is RGB (with shape
+        (3, 768, 1024)). This method converts image to a greyscale (shape
+        (768, 1024)) and then rotates image by 270 deg so that images can be
+        used with ``bob.bio.vein`` algorythms designed for the
+        ``bob.db.biowave_v1`` database.
+        Output images dimentions - (1024, 768).
+        """
+        color_image = self.f.load(directory=directory,
+                                  extension=extension)
+        grayscale_image = bob.ip.color.rgb_to_gray(color_image)
+        grayscale_image = np.rot90(grayscale_image, k=3)
+        return grayscale_image
+
+
+class PutveinBioDatabase(BioDatabase):
+    """
+    Implements verification API for querying PUTVEIN database.
+    This class allows to use the following protocols:
+
+    palm-L_1
+    palm-LR_1
+    palm-R_1
+    palm-RL_1
+    palm-R_BEAT_1
+
+    palm-L_4
+    palm-LR_4
+    palm-R_4
+    palm-RL_4
+    palm-R_BEAT_4
+
+    wrist-L_1
+    wrist-LR_1
+    wrist-R_1
+    wrist-RL_1
+    wrist-R_BEAT_1
+
+    wrist-L_4
+    wrist-LR_4
+    wrist-R_4
+    wrist-RL_4
+    wrist-R_BEAT_4
+    """
+
+    def __init__(self, **kwargs):
+
+        super(PutveinBioDatabase, self).__init__(name='putvein', **kwargs)
+
+        from bob.db.putvein.query import Database as LowLevelDatabase
+        self.__db = LowLevelDatabase()
+
+    def __protocol_split__(self, prot_name):
+        """
+        Overrides the "high level" database names (see the list abowe) to the
+        low level ``protocols`` (currently there are 8 low level protocols:
+            L_1;
+            LR_1;
+            R_1;
+            RL_1;
+            R_BEAT_1;
+            L_4;
+            LR_4;
+            R_4;
+            RL_4;
+            R_BEAT_4;
+        And the kinds - wrist or palm.
+        The low level protocols are derived from the original 4:
+            L;
+            R;
+            LR;
+            RL;
+        please read the ``bob.db.putvein`` documentation.
+        """
+        allowed_prot_names = ["palm-L_1",
+                              "palm-LR_1",
+                              "palm-R_1",
+                              "palm-RL_1",
+                              "palm-R_BEAT_1",
+                              "palm-L_4",
+                              "palm-LR_4",
+                              "palm-R_4",
+                              "palm-RL_4",
+                              "palm-R_BEAT_4",
+                              "wrist-L_1",
+                              "wrist-LR_1",
+                              "wrist-R_1",
+                              "wrist-RL_1",
+                              "wrist-R_BEAT_1",
+                              "wrist-L_4",
+                              "wrist-LR_4",
+                              "wrist-R_4",
+                              "wrist-RL_4",
+                              "wrist-R_BEAT_4"]
+
+        if prot_name not in allowed_prot_names:
+            raise IOError("Protocol name {} not allowed. Allowed names - {}".\
+                          format(prot_name, allowed_prot_names))
+
+        kind, prot = prot_name.split("-")
+
+        return kind, prot
+
+    def client_id_from_model_id(self, model_id, group='dev'):
+        """Required as ``model_id != client_id`` on this database"""
+        return self.__db.client_id_from_model_id(model_id)
+
+
+    def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
+        """model_ids_with_protocol(groups = None, protocol = None, **kwargs) -> ids
+
+        Returns a list of model ids for the given groups and given protocol.
+
+        **Parameters:**
+
+        groups : one or more of ``('world', 'dev', 'eval')``
+          The groups to get the model ids for.
+
+        protocol: a protocol name
+
+        **Returns:**
+
+        ids : [int]
+          The list of (unique) model ids for the given groups.
+        """
+        kind, prot = self.__protocol_split__(protocol)
+
+        return self.__db.model_ids(protocol=prot,
+                                   groups=groups,
+                                   kinds=kind)
+
+
+    def objects(self, protocol=None, groups=None, purposes=None, model_ids=None, kinds=None, **kwargs):
+
+        kind, prot = self.__protocol_split__(protocol)
+        retval = self.__db.objects(protocol=prot,
+                                   groups=groups,
+                                   purposes=purposes,
+                                   model_ids=model_ids,
+                                   kinds=kind)
+        return [File(f) for f in retval]
+
+
+    def annotations(self, file):
+        return None
+
+
-- 
GitLab