From a21eb531547aacb092682d9f66751c578419fe53 Mon Sep 17 00:00:00 2001
From: Guillaume HEUSCH <guillaume.heusch@idiap.ch>
Date: Wed, 11 Jul 2018 10:12:04 +0200
Subject: [PATCH] [preprocessor] fixed the exception catching when landmarks
 are not detected

---
 .../face/preprocessor/LiPulseExtraction.py    | 42 ++++++++++++-------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/bob/pad/face/preprocessor/LiPulseExtraction.py b/bob/pad/face/preprocessor/LiPulseExtraction.py
index 35a88d31..cd65389c 100644
--- a/bob/pad/face/preprocessor/LiPulseExtraction.py
+++ b/bob/pad/face/preprocessor/LiPulseExtraction.py
@@ -117,31 +117,45 @@ class LiPulseExtraction(Preprocessor):
         pyplot.show()
      
       # detect landmarks
-      try:
-        ldms = detector(frame)
-      except TypeError:
-        logger.warning("Exception caught -> problems with landmarks")
-        # looks like one video from replay mobile is upside down !
+      ldms = detector(frame)
+      
+      if ldms is None:
+        logger.warning("Landmarks not detected ...")
+
+        # looks like some videos from replay mobile are upside down !
         rotated_shape = bob.ip.base.rotated_output_shape(frame, 180)
         frame_rotated = numpy.ndarray(rotated_shape, dtype=numpy.float64)
         from bob.ip.base import rotate
         bob.ip.base.rotate(frame, frame_rotated, 180)
         frame_rotated = frame_rotated.astype(numpy.uint8)
-        logger.warning("Rotating again ...")
-        try:
-          ldms = detector(frame_rotated)
-        except TypeError:
+        logger.warning("Rotating 180 degrees ...")
+
+        # check the rotated frame
+        if self.debug:
+          from matplotlib import pyplot
+          pyplot.imshow(numpy.rollaxis(numpy.rollaxis(frame_rotated, 2),2))
+          pyplot.show()
+        
+        ldms = detector(frame_rotated)
+        # if landmarks are still not detected, do nothing
+        if ldms is None:
           ldms = previous_ldms
           # so do nothing ...
           logger.warning("No mask detected in frame {}".format(i))
           face_color[i] = [0, 0, 0]
           continue
+        
         frame = frame_rotated
-      
-      # landmarks have not been detected: use the one from previous frame
+        
+      # if landmarks are still not detected, use the one from previous frame (if any)
       if ldms is None:
-        ldms = previous_ldms
-        logger.warning("Frame {}: no landmarks detected, using the ones from previous frame".format(i))
+        if previous_ldms is None:
+          logger.warning("No mask detected in frame {}".format(i))
+          face_color[i] = [0, 0, 0]
+          continue
+        else: 
+          ldms = previous_ldms
+          logger.warning("Frame {}: no landmarks detected, using the ones from previous frame".format(i))
 
       if self.debug:
         from matplotlib import pyplot
@@ -153,9 +167,7 @@ class LiPulseExtraction(Preprocessor):
 
       ldms = numpy.array(ldms)
       mask_points, mask = kp66_to_mask(frame, ldms, self.indent, self.debug)
-      
       face_color[i] = compute_average_colors_mask(frame, mask, self.debug)
-      logger.debug("Face color in frame {} = {}".format(i, face_color[i]))
 
       previous_ldms = ldms 
       counter += 1
-- 
GitLab