diff --git a/python/armarx_face_recognition/armarx_face_recognition/app/memory_face_recognition.py b/python/armarx_face_recognition/armarx_face_recognition/app/memory_face_recognition.py index 0331ce551bda21dc8fb1b1b5895e7d08cddfc6b4..daf1ae0d1b18d5c1006fd9a5a36c4f5c235a186d 100755 --- a/python/armarx_face_recognition/armarx_face_recognition/app/memory_face_recognition.py +++ b/python/armarx_face_recognition/armarx_face_recognition/app/memory_face_recognition.py @@ -5,6 +5,7 @@ import typing as ty import numpy as np +from armarx_core import ice_manager from armarx.parser import ArmarXArgumentParser as ArgumentParser from armarx_memory.client import MemoryNameSystem @@ -30,12 +31,13 @@ def main(): persons: ty.List[Person] = FaceDetection.query_human_profiles(mns=mns, logger=logger) if persons: - logger.debug(f"Found {len(persons)} persons with images: {persons}") + logger.info(f"Found {len(persons)} persons with images.") + logger.debug(f"Images: {persons}") else: logger.error("No persons with images found. Aborting.") return - logger.debug("Starting image processor") + logger.info("Starting image processor") image_processor = FaceDetection( args.input_provider, persons=persons, @@ -45,6 +47,8 @@ def main(): image_processor.on_connect() image_processor.update_calibration() + ice_manager.wait_for_shutdown() + if __name__ == "__main__": main() diff --git a/python/armarx_face_recognition/armarx_face_recognition/datatypes.py b/python/armarx_face_recognition/armarx_face_recognition/datatypes.py index e11e3a7f9c36f0c3821973db569123f6319d8fcb..303b0f075f119776a9b3bd067a20dd65bd4031f9 100644 --- a/python/armarx_face_recognition/armarx_face_recognition/datatypes.py +++ b/python/armarx_face_recognition/armarx_face_recognition/datatypes.py @@ -43,5 +43,5 @@ class FaceRecognition(AronDataclass): "position3D": self.position_3d.astype(np.float32).reshape(3, 1), "position2D": self.position_2d.astype(np.int32), "extents2D": self.extents_2d.astype(np.int32), - "profileID": self.profile_id.to_aron() if self.profile_id else mem.MemoryID().to_aron(), + "profileID": self.profile_id.to_aron() if self.profile_id else None, }) diff --git a/python/armarx_face_recognition/armarx_face_recognition/face_detection.py b/python/armarx_face_recognition/armarx_face_recognition/face_detection.py index 1f063e9545dfd6f1c36825a2b5990b1efe417c50..431a0b3ac807a5e6a6c2786ba8cea6c0eb001b3f 100755 --- a/python/armarx_face_recognition/armarx_face_recognition/face_detection.py +++ b/python/armarx_face_recognition/armarx_face_recognition/face_detection.py @@ -10,13 +10,16 @@ import cv2 import numpy as np import face_recognition -from armarx_core import cmake_helper +from armarx_core import slice_loader + from armarx import arviz as viz from armarx_memory import client as mem from armarx.pose_helper import convert_position_to_global from armarx import FramedPositionBase +slice_loader.load_armarx_slice("VisionX", "core/ImageProcessorInterface.ice") +slice_loader.load_armarx_slice("VisionX", "components/Calibration.ice") from armarx_vision.image_processor import ImageProcessor from visionx import StereoCalibrationInterfacePrx @@ -80,11 +83,15 @@ class FaceDetection(ImageProcessor): abs_path = face_image_path.get_system_path() if os.path.isfile(abs_path): name = profile.names.spoken[0] or id.entity_name - if logger is not None: - logger.info("Loading person '%s'.", name) - logger.debug("Creating face encoding for person '%s'.", name) image = face_recognition.load_image_file(abs_path) - encoding = face_recognition.face_encodings(image)[0] + encodings_of_faces = face_recognition.face_encodings(image) + if len(encodings_of_faces) > 0: + if logger: + logger.info(f"Loaded image of person '{name}' from '{abs_path}.") + encoding = encodings_of_faces[0] + else: + if logger: + logger.info(f"Found no faces in image '{abs_path}' ...") face_encodings.append(encoding) @@ -193,7 +200,7 @@ class FaceDetection(ImageProcessor): position_3d=position_3d, position_2d=position_2d, extents_2d=extents_2d, - profile_id=person.profile_id + profile_id=person.profile_id, ) face_recognitions.append(recognition) diff --git a/python/armarx_face_recognition/pyproject.toml b/python/armarx_face_recognition/pyproject.toml index 5e0b5670055818803f4816ed33e522e675b03d90..28f388f58ae6d32007da43441bd5db6727869952 100644 --- a/python/armarx_face_recognition/pyproject.toml +++ b/python/armarx_face_recognition/pyproject.toml @@ -10,12 +10,11 @@ python = "^3.6.9" # armarx-dev = "^0.16.2" # armarx-dev = { path="../../../python3-armarx/", develop=true } # "^0.16.2" ipython = "5.5" -zeroc-ice = "^3.7" -numpy = "1.19.5" +numpy = "*" face-recognition = "^1.3.0" opencv-python = "4.3.0.36" peewee = "^3.14.4" -transforms3d = "^0.3.1" +transforms3d = "*" pyzbar = "^0.1.8" cbor2 = "^5.4.2" base45 = "^0.4.3" diff --git a/source/VisionX/libraries/armem_human/aron/FaceRecognition.xml b/source/VisionX/libraries/armem_human/aron/FaceRecognition.xml index 541dfe95764e8b9fdac587dc7ceb23ab9042440b..27b2b673dbbdf10bc6210eba9801b0e06e00efb9 100644 --- a/source/VisionX/libraries/armem_human/aron/FaceRecognition.xml +++ b/source/VisionX/libraries/armem_human/aron/FaceRecognition.xml @@ -29,8 +29,8 @@ <Time /> </ObjectChild> - <ObjectChild key='profileID'> - <armarx::armem::arondto::MemoryID /> + <ObjectChild key='profileID' > + <armarx::armem::arondto::MemoryID optional="true"/> </ObjectChild> </Object>