From 0751e37be1d1253730ac605eb4a3587c57c6d8ff Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Tue, 5 Dec 2023 18:30:30 +0000 Subject: [PATCH 01/69] testtesttest --- .../vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv | 1 + skills/src/lasr_skills/describe_people.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv index 2edc1abba..db88a8041 100644 --- a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv @@ -1,5 +1,6 @@ # Image to run inference on sensor_msgs/Image image_raw + --- # Detection result lasr_vision_msgs/FeatureWithColour[] detected_features \ No newline at end of file diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 762e705c7..a6ed0256f 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -184,7 +184,7 @@ def execute(self, userdata): msg = cv2_img.cv2_img_to_msg(face_region) features.extend(self.torch_face_features( - msg).detected_features) + msg, False).detected_features) except Exception as e: rospy.logerr(f"Failed to process extraction: {e}") From a8f97ced6bf0b8e4989b53d8822259e1d51d95a1 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Tue, 5 Dec 2023 18:34:55 +0000 Subject: [PATCH 02/69] Test --- common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv | 1 + 1 file changed, 1 insertion(+) diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv index db88a8041..f71b95aec 100644 --- a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv @@ -2,5 +2,6 @@ sensor_msgs/Image image_raw --- + # Detection result lasr_vision_msgs/FeatureWithColour[] detected_features \ No newline at end of file From 5fe6a931bdbc54b2e53a6b684f2bd5e0273a0358 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Tue, 5 Dec 2023 18:44:38 +0000 Subject: [PATCH 03/69] Test --- common/vision/lasr_vision_torch/nodes/service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index 4a0144396..ab8705380 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -62,7 +62,7 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti ] return response - +#test test rospy.init_node('torch_service') rospy.Service('/torch/detect/face_features', TorchFaceFeatureDetection, detect) From 768ad461a825992ca3de8f62a9531683491c4afb Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Wed, 6 Dec 2023 17:02:13 +0000 Subject: [PATCH 04/69] Message Change --- common/helpers/numpy2message/doc/usage.md | 1 + common/helpers/numpy2message/src/__init__.py | 19 ++++++ .../srv/TorchFaceFeatureDetection.srv | 7 +++ common/vision/lasr_vision_torch/nodes/service | 62 ++++++++++++++++++- skills/scripts/unit_test_describe_people.py | 2 +- skills/src/lasr_skills/describe_people.py | 35 +++++++++++ 6 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 common/helpers/numpy2message/doc/usage.md create mode 100644 common/helpers/numpy2message/src/__init__.py diff --git a/common/helpers/numpy2message/doc/usage.md b/common/helpers/numpy2message/doc/usage.md new file mode 100644 index 000000000..3f19ff99e --- /dev/null +++ b/common/helpers/numpy2message/doc/usage.md @@ -0,0 +1 @@ +To send numpy arrays with messages. \ No newline at end of file diff --git a/common/helpers/numpy2message/src/__init__.py b/common/helpers/numpy2message/src/__init__.py new file mode 100644 index 000000000..3ddad23fe --- /dev/null +++ b/common/helpers/numpy2message/src/__init__.py @@ -0,0 +1,19 @@ +import numpy as np + + +def numpy2message(np_array: np.ndarray) -> list[bytes, list[int], str]: + data = np_array.tobytes() + shape = list(np_array.shape) + dtype = str(np_array.dtype) + return data, shape, dtype + + +def message2numpy(data:bytes, shape:list[int], dtype:str) -> np.ndarray: + array_shape = tuple(shape) + array_dtype = np.dtype(dtype) + + deserialized_array = np.frombuffer(data, dtype=array_dtype) + deserialized_array = deserialized_array.reshape(array_shape) + + return deserialized_array + diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv index f71b95aec..e958bcd57 100644 --- a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv @@ -1,6 +1,13 @@ # Image to run inference on sensor_msgs/Image image_raw +uint8[] head_mask_data # For serialized array data +uint32[] head_mask_shape # To store the shape of the array +string head_mask_dtype # Data type of the array elements + +uint8[] torso_mask_data +uint32[] torso_mask_shape +string torso_mask_dtype --- # Detection result diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index ab8705380..e09829dae 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -3,12 +3,14 @@ from lasr_vision_msgs.msg import FeatureWithColour, ColourPrediction from colour_estimation import closest_colours, RGB_COLOURS, RGB_HAIR_COLOURS from cv2_img import msg_to_cv2_img from torch_module.helpers import binary_erosion_dilation, median_color_float +from numpy2message import message2numpy import numpy as np import torch import rospy import lasr_vision_torch + model = lasr_vision_torch.load_face_classifier_model() @@ -16,6 +18,12 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti # decode the image rospy.loginfo('Decoding') frame = msg_to_cv2_img(request.image_raw) + torso_mask_data, torso_mask_shape, torso_mask_dtype = request.torso_mask_data, request.torso_mask_shape, request.torso_mask_dtype + head_mask_data, head_mask_shape, head_mask_dtype = request.head_mask_data, request.head_mask_shape, request.head_mask_dtype + torsal_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) + head_mask = message2numpy(head_mask_data, head_mask_shape, head_mask_dtype) + print(torso_mask_shape) + print(head_mask_shape) # 'hair', 'hat', 'glasses', 'face' input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() @@ -62,7 +70,59 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti ] return response -#test test + + +# def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetectionResponse: +# # decode the image +# rospy.loginfo('Decoding') +# frame = msg_to_cv2_img(request.image_raw) + +# # 'hair', 'hat', 'glasses', 'face' +# input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() +# input_image /= 255.0 +# masks_batch_pred, pred_classes = model(input_image) + +# thresholds_mask = [ +# 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, +# ] +# thresholds_pred = [ +# 0.6, 0.8, 0.1, 0.5, +# ] +# erosion_iterations = 1 +# dilation_iterations = 1 +# categories = ['hair', 'hat', 'glasses', 'face',] + +# masks_batch_pred = binary_erosion_dilation( +# masks_batch_pred, thresholds=thresholds_mask, +# erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations +# ) + +# median_colours = (median_color_float( +# input_image, masks_batch_pred).detach().squeeze(0)*255).numpy().astype(np.uint8) + +# # discarded: masks = masks_batch_pred.detach().squeeze(0).numpy().astype(np.uint8) +# # discarded: mask_list = [masks[i,:,:] for i in range(masks.shape[0])] + +# pred_classes = pred_classes.detach().squeeze(0).numpy() +# # discarded: class_list = [categories[i] for i in range( +# # pred_classes.shape[0]) if pred_classes[i].item() > thresholds_pred[i]] +# colour_list = [median_colours[i, :] +# for i in range(median_colours.shape[0])] + +# response = TorchFaceFeatureDetectionResponse() +# response.detected_features = [ +# FeatureWithColour(categories[i], [ +# ColourPrediction(colour, distance) +# for colour, distance +# in closest_colours(colour_list[i], RGB_HAIR_COLOURS if categories[i] == 'hair' else RGB_COLOURS) +# ]) +# for i +# in range(pred_classes.shape[0]) +# if pred_classes[i].item() > thresholds_pred[i] +# ] + +# return response +# test test rospy.init_node('torch_service') rospy.Service('/torch/detect/face_features', TorchFaceFeatureDetection, detect) diff --git a/skills/scripts/unit_test_describe_people.py b/skills/scripts/unit_test_describe_people.py index 3cf73d34c..44a87463e 100644 --- a/skills/scripts/unit_test_describe_people.py +++ b/skills/scripts/unit_test_describe_people.py @@ -16,6 +16,6 @@ sm.execute() - print('\n\nDetected people:', sm.userdata['people']) + # print('\n\nDetected people:', sm.userdata['people']) rospy.signal_shutdown("down") diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index a6ed0256f..aa33ddf51 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -9,6 +9,7 @@ from colour_estimation import closest_colours, RGB_COLOURS from lasr_vision_msgs.msg import BodyPixMaskRequest, ColourPrediction, FeatureWithColour from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection +from numpy2message import numpy2message from .vision import GetImage, ImageMsgToCv2 @@ -136,6 +137,40 @@ def execute(self, userdata): # keep track features = [] + # process part masks + for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): + part_mask = np.array(bodypix_mask.mask).reshape( + bodypix_mask.shape[0], bodypix_mask.shape[1]) + + # filter out part for current person segmentation + try: + part_mask[mask_bin == 0] = 0 + except Exception: + rospy.logdebug('|> Failed to check {part} is visible') + continue + + if part_mask.any(): + rospy.logdebug(f'|> Person has {part} visible') + else: + rospy.logdebug( + f'|> Person does not have {part} visible') + continue + + if part == 'torso': + torso_mask = part_mask + elif part == 'head': + head_mask = part_mask + + torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) + head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) + + full_frame = cv2_img.cv2_img_to_msg(face_region) + features.extend(self.torch_face_features( + full_frame, + torso_mask_data, torso_mask_shape, torso_mask_dtype, + head_mask_data, head_mask_shape, head_mask_dtype, + ).detected_features) + # process part masks for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): part_mask = np.array(bodypix_mask.mask).reshape( From 6452c1d1ba1f0c1b8d420f06a36ddc2699b7d441 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 7 Dec 2023 14:25:53 +0000 Subject: [PATCH 05/69] fixed message writting and reading --- common/helpers/numpy2message/CMakeLists.txt | 202 ++++++++++++++++++ common/helpers/numpy2message/package.xml | 59 +++++ common/helpers/numpy2message/setup.py | 11 + .../src/{ => numpy2message}/__init__.py | 4 +- common/helpers/torch_module/package.xml | 2 +- skills/src/lasr_skills/describe_people.py | 8 +- 6 files changed, 279 insertions(+), 7 deletions(-) create mode 100644 common/helpers/numpy2message/CMakeLists.txt create mode 100644 common/helpers/numpy2message/package.xml create mode 100644 common/helpers/numpy2message/setup.py rename common/helpers/numpy2message/src/{ => numpy2message}/__init__.py (72%) diff --git a/common/helpers/numpy2message/CMakeLists.txt b/common/helpers/numpy2message/CMakeLists.txt new file mode 100644 index 000000000..b5898aff7 --- /dev/null +++ b/common/helpers/numpy2message/CMakeLists.txt @@ -0,0 +1,202 @@ +cmake_minimum_required(VERSION 3.0.2) +project(numpy2message) + +## Compile as C++11, supported in ROS Kinetic and newer +# add_compile_options(-std=c++11) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend tag for "message_generation" +## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependency has been pulled in +## but can be declared for certainty nonetheless: +## * add a exec_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +## Generate services in the 'srv' folder +# add_service_files( +# FILES +# Service1.srv +# Service2.srv +# ) + +## Generate actions in the 'action' folder +# add_action_files( +# FILES +# Action1.action +# Action2.action +# ) + +## Generate added messages and services with any dependencies listed here +# generate_messages( +# DEPENDENCIES +# std_msgs # Or other packages containing msgs +# ) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +## Generate dynamic reconfigure parameters in the 'cfg' folder +# generate_dynamic_reconfigure_options( +# cfg/DynReconf1.cfg +# cfg/DynReconf2.cfg +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if your package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( +# INCLUDE_DIRS include +# LIBRARIES numpy2message +# CATKIN_DEPENDS other_catkin_pkg +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +include_directories( +# include +# ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ library +# add_library(${PROJECT_NAME} +# src/${PROJECT_NAME}/numpy2message.cpp +# ) + +## Add cmake target dependencies of the library +## as an example, code may need to be generated before libraries +## either from message generation or dynamic reconfigure +# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Declare a C++ executable +## With catkin_make all packages are built within a single CMake context +## The recommended prefix ensures that target names across packages don't collide +# add_executable(${PROJECT_NAME}_node src/numpy2message_node.cpp) + +## Rename C++ executable without prefix +## The above recommended prefix causes long target names, the following renames the +## target back to the shorter version for ease of user use +## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" +# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") + +## Add cmake target dependencies of the executable +## same as for the library above +# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Specify libraries to link a library or executable target against +# target_link_libraries(${PROJECT_NAME}_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# catkin_install_python(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables for installation +## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html +# install(TARGETS ${PROJECT_NAME}_node +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark libraries for installation +## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html +# install(TARGETS ${PROJECT_NAME} +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_torch_module.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/common/helpers/numpy2message/package.xml b/common/helpers/numpy2message/package.xml new file mode 100644 index 000000000..aa9384c64 --- /dev/null +++ b/common/helpers/numpy2message/package.xml @@ -0,0 +1,59 @@ + + + numpy2message + 0.0.0 + Various PyTorch helpers and utilties + + + + + Paul Makles + + + + + + MIT + + + + + + + + + + + + Benteng Ma + + + + + + + + + + + + + + + + + + + + + + + catkin + + + + + + + + diff --git a/common/helpers/numpy2message/setup.py b/common/helpers/numpy2message/setup.py new file mode 100644 index 000000000..d79792c72 --- /dev/null +++ b/common/helpers/numpy2message/setup.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 + +from distutils.core import setup +from catkin_pkg.python_setup import generate_distutils_setup + +setup_args = generate_distutils_setup( + packages=['numpy2message'], + package_dir={'': 'src'} +) + +setup(**setup_args) diff --git a/common/helpers/numpy2message/src/__init__.py b/common/helpers/numpy2message/src/numpy2message/__init__.py similarity index 72% rename from common/helpers/numpy2message/src/__init__.py rename to common/helpers/numpy2message/src/numpy2message/__init__.py index 3ddad23fe..7a330ca5f 100644 --- a/common/helpers/numpy2message/src/__init__.py +++ b/common/helpers/numpy2message/src/numpy2message/__init__.py @@ -1,14 +1,14 @@ import numpy as np -def numpy2message(np_array: np.ndarray) -> list[bytes, list[int], str]: +def numpy2message(np_array: np.ndarray) -> list: data = np_array.tobytes() shape = list(np_array.shape) dtype = str(np_array.dtype) return data, shape, dtype -def message2numpy(data:bytes, shape:list[int], dtype:str) -> np.ndarray: +def message2numpy(data:bytes, shape:list, dtype:str) -> np.ndarray: array_shape = tuple(shape) array_dtype = np.dtype(dtype) diff --git a/common/helpers/torch_module/package.xml b/common/helpers/torch_module/package.xml index e8752c9f4..622e78778 100644 --- a/common/helpers/torch_module/package.xml +++ b/common/helpers/torch_module/package.xml @@ -25,7 +25,7 @@ - Benteng Ma + Benteng Ma diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index aa33ddf51..d427b6b1b 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -156,10 +156,10 @@ def execute(self, userdata): f'|> Person does not have {part} visible') continue - if part == 'torso': - torso_mask = part_mask - elif part == 'head': - head_mask = part_mask + if part == 'torso': + torso_mask = part_mask + elif part == 'head': + head_mask = part_mask torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) From 5818b5e238de662cf4b1b81ac749e353c612880e Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 7 Dec 2023 14:32:44 +0000 Subject: [PATCH 06/69] fixed image crop --- common/vision/lasr_vision_torch/nodes/service | 4 ++-- skills/scripts/unit_test_describe_people.py | 2 +- skills/src/lasr_skills/describe_people.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index e09829dae..ec5081ba7 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -22,8 +22,8 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti head_mask_data, head_mask_shape, head_mask_dtype = request.head_mask_data, request.head_mask_shape, request.head_mask_dtype torsal_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) head_mask = message2numpy(head_mask_data, head_mask_shape, head_mask_dtype) - print(torso_mask_shape) - print(head_mask_shape) + # print(torso_mask_shape) + # print(head_mask_shape) # 'hair', 'hat', 'glasses', 'face' input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() diff --git a/skills/scripts/unit_test_describe_people.py b/skills/scripts/unit_test_describe_people.py index 44a87463e..3cf73d34c 100644 --- a/skills/scripts/unit_test_describe_people.py +++ b/skills/scripts/unit_test_describe_people.py @@ -16,6 +16,6 @@ sm.execute() - # print('\n\nDetected people:', sm.userdata['people']) + print('\n\nDetected people:', sm.userdata['people']) rospy.signal_shutdown("down") diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index d427b6b1b..d64b07cee 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -164,7 +164,7 @@ def execute(self, userdata): torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) - full_frame = cv2_img.cv2_img_to_msg(face_region) + full_frame = cv2_img.cv2_img_to_msg(img) features.extend(self.torch_face_features( full_frame, torso_mask_data, torso_mask_shape, torso_mask_dtype, From 4ed5176335dc2ed6981a2201959d0a9465c1d99f Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 7 Dec 2023 20:47:13 +0000 Subject: [PATCH 07/69] Updated the feature extraction node and changed the messages. --- .../hair_colours/beeline honey.jpg | Bin 0 -> 5211 bytes .../hair_colours/blowout burgundy.jpg | Bin 0 -> 6516 bytes .../hair_colours/butter scotch.jpg | Bin 0 -> 4525 bytes .../hair_colours/caramel.jpg | Bin 0 -> 5811 bytes .../hair_colours/chocolate brown.jpg | Bin 0 -> 5239 bytes .../hair_colours/chocolate-cherry.jpg | Bin 0 -> 5272 bytes .../hair_colours/copper-shimmer.jpg | Bin 0 -> 6993 bytes .../hair_colours/crushedgarnet.jpg | Bin 0 -> 5786 bytes .../hair_colours/dark golden brown.jpg | Bin 0 -> 4041 bytes .../hair_colours/espresso.jpg | Bin 0 -> 7104 bytes .../hair_colours/expresso.jpg | Bin 0 -> 3804 bytes .../hair_colours/french-roast.jpg | Bin 0 -> 6291 bytes .../colour_estimation/hair_colours/gray.png | Bin 0 -> 54379 bytes .../hair_colours/havanabrown.jpg | Bin 0 -> 7081 bytes .../hair_colours/hot-toffee.jpg | Bin 0 -> 7452 bytes .../hair_colours/jet black.jpg | Bin 0 -> 3536 bytes .../hair_colours/leatherblack.jpg | Bin 0 -> 5887 bytes .../hair_colours/light ash blonde.jpg | Bin 0 -> 5223 bytes .../hair_colours/light auburn.jpg | Bin 0 -> 4432 bytes .../hair_colours/light blonde.jpg | Bin 0 -> 5039 bytes .../hair_colours/light brown.jpg | Bin 0 -> 3611 bytes .../hair_colours/light cool brown.jpg | Bin 0 -> 5323 bytes .../hair_colours/light golden blonde.jpg | Bin 0 -> 5005 bytes .../hair_colours/light golden brown.jpg | Bin 0 -> 4205 bytes .../hair_colours/medium ash brown.jpg | Bin 0 -> 4209 bytes .../hair_colours/medium auburn.jpg | Bin 0 -> 4801 bytes .../hair_colours/medium champagne.jpg | Bin 0 -> 5302 bytes .../hair_colours/midnighrruby.jpg | Bin 0 -> 5809 bytes .../hair_colours/pure-diamond.jpg | Bin 0 -> 6282 bytes .../hair_colours/red hot cinnamon.jpg | Bin 0 -> 3878 bytes .../hair_colours/reddish blonde.jpg | Bin 0 -> 5022 bytes .../hair_colours/rubyfusion.jpg | Bin 0 -> 5129 bytes .../hair_colours/sparkling-amber.jpg | Bin 0 -> 6345 bytes .../hair_colours/sunflower-blonde.jpg | Bin 0 -> 6002 bytes .../src/colour_estimation/__init__.py | 331 +++++++++++++++++- .../src/colour_estimation/rgb.py | 172 +++++++-- .../src/torch_module/modules/__init__.py | 167 +++++++++ .../msg/FeatureWithColour.msg | 5 +- .../srv/TorchFaceFeatureDetection.srv | 3 +- common/vision/lasr_vision_torch/nodes/service | 94 ++--- .../src/lasr_vision_torch/__init__.py | 314 ++++++++++++++++- skills/scripts/unit_test_describe_people.py | 1 + skills/src/lasr_skills/describe_people.py | 104 +++--- 43 files changed, 1039 insertions(+), 152 deletions(-) create mode 100644 common/helpers/colour_estimation/hair_colours/beeline honey.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/butter scotch.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/caramel.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/chocolate brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/copper-shimmer.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/dark golden brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/espresso.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/expresso.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/french-roast.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/gray.png create mode 100644 common/helpers/colour_estimation/hair_colours/havanabrown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/hot-toffee.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/jet black.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/leatherblack.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light ash blonde.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light auburn.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light blonde.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light cool brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light golden blonde.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light golden brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/medium ash brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/medium auburn.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/medium champagne.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/midnighrruby.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/pure-diamond.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/red hot cinnamon.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/reddish blonde.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/rubyfusion.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/sparkling-amber.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/sunflower-blonde.jpg diff --git a/common/helpers/colour_estimation/hair_colours/beeline honey.jpg b/common/helpers/colour_estimation/hair_colours/beeline honey.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f83d188869a22c1b256c1d0e940b1faff6baa792 GIT binary patch literal 5211 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 Q9I~2vY+eFtJ?At31w#B?-v9sr literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg b/common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e2918952490abbf863be54f3bb1623c55207a483 GIT binary patch literal 6516 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 VJ~H3I$~hvu;2#^U&!l-X|6kqEm|g$? literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/butter scotch.jpg b/common/helpers/colour_estimation/hair_colours/butter scotch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..090d91ad1c669e5b250e9c6a37ac18eae4f6280d GIT binary patch literal 4525 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 Ot0eW**vnF9v;POG92gA% literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/caramel.jpg b/common/helpers/colour_estimation/hair_colours/caramel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a26d62c67506143964b8eb2f9148116649dfac5 GIT binary patch literal 5811 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/chocolate brown.jpg b/common/helpers/colour_estimation/hair_colours/chocolate brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7db8c90c971dd03aca732c4f05a83f2d2d782592 GIT binary patch literal 5239 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg b/common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7b9b2816182e6876311a494e2297eb156099aa0 GIT binary patch literal 5272 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg b/common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3723ce8cfe41ffc92d410c98acab0eaab856b12a GIT binary patch literal 5786 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/expresso.jpg b/common/helpers/colour_estimation/hair_colours/expresso.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c64850a6203298f14edd7cb37594668016a9fd3 GIT binary patch literal 3804 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/french-roast.jpg b/common/helpers/colour_estimation/hair_colours/french-roast.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac3368aa8884918b1775b5e78b5a712c91da2ded GIT binary patch literal 6291 zcmbuCNVJe<57>>RwDl2ATAsN{8VQSs}_a&pQ#S~?C6 z5upF8;Hn2;rUF8NH{>8;fQ%VL&J4Qh2a*7Qj2!e|)c*wx`R|5;iU}Yi1CfI$$;rvd zAdtUZ5E(f$0A>-o!78j_>JpF+!IiMVnq)Q2#@z z!u(hEAE5t4{~r(;v(OCJ&&7OHI`l450>B2 z=N(`lc!&rols_!Ifh}vF5W45h&&_B%W+1BH4~PiBODJDm0dA_>lN2s?SthFaN2ed9 z-c}?YeJ8DQX;^yDwY8h>t}8*ex#-JW$_bFNZIYa|4{lBZP=?~oR5iwXghCPF8T^c~ z(OP`#S3o5-a-`R|h;^RM3M=Zs@Ui}SwHj(nDE!#(fjj@wa@_N{o^t`&N*V9WGY7vj z_CYgEjT~y*#HN-f^dApCKuZjyZ<5llfWUm%H`x_@4Q`O~R1v!tm%ID0Nwd;Icmn#k z`rWNXZm-n@TgB=5=qDTU7Hlj#KR9P)z8bl43Sl!m^C&{ZO`Z6Q zJHpc zn^<464*rm7EruBgL$-t^l8-l2l1g1O^ykp;!4aL@syMC$b zjvS;Y8!lDdhm)v~A5t!q>hLk8W&>}u&M^KSvS}ZgAAw5jHF4n07wfzB zc=NI5lJB8_OEFxor)aVV!}}_igM#URFCin&3skXJ&MVwKWWQD69^<`KuhmO9U9OqF z0u=Ef0r2KSu|B=juqBQ6BkO+D9!a(wvgMc!AMQuiufdP7$+;FpSfZy{sJ1xG+lTv3 z>fEx6s!zaUl~NJ|k@PyRX#9A7ejLMQD9=Z8SCNknHV$Xq)RsCDX>k;Y{w4$QOi4U! z^j+$fJ^_ngDAG|v`bAEvL@pV;@u(q4GOT-RviJG?)#Fl3I0EG9m2BJ82nfR zL(C=#jn3hSC?)0CR*Fa#x)}3lwnQbNIP?fACc*OMr(w!!_*#sL5S7z?#uZnUn%na# zibJ)YL1?4>-?Wa@mkf6@c(1jVd?RAbUe09&{~Hix$oY-)oxRh`D$32E;>d^}K_M^0 z!Z0lHyju}CmvO=M*Mp%nK|Y&j00kUsPy3l%mcD%6m;ZMGhZ+Oc+S@ZVD58KO)pWBm zZ6cMKWt^eZ!m++0lJwx^=$%=Qsz`mdcuMIm!gIyu6UKq)j1wPk2vSx95r{p2*nPr5 z8P9SC{YSZP8fFu?rm_wxdfdei2kA>@Rj&ZUZ;gk=<<9=&LEKk>pMv!GI#stRgo`Z9 z-{hjxJv_x5Fr*pjTD&(v6k&O_p)>KPw={WoE52RgxUBDbi6i|PJ2cr_3VjUm5LOmO zlpYj|XNymg`ZLVX99v9pF0{Het5^S2VoT){v9 zz3AY&0-PxCRU}zAEn1uAPX3b%qW>l7Mo|=syKB2d;t3epexOomi;UejErs!p!oigrKYg9gu?M2}SsLeFeUD8@9W z|13+-{u_YPCF?d0VFZWW^+#Hd7`_WZvii23&I8}8n2hkyuv>)#L>b$IMjq`T% ztxs0p-L92=d;JlY*oo^Yo?#MupcsDjXG?1Xt^4r*ufTk{2%*}XGT-$kTt(nk5@SGX5Kn4Q+Jm8^VUOl^cSsS8If357Sz3d0be-6m+B@?7L93$Yl|+p zhei+jvS{DR9*JhF=1QOP1NNTyJ@yd8o5~66bh<uLzUGBx!H@jx3>4VC-fS+Vw;`8xooYzkFxUPJQvuChacA;l z3S&RUM;L1^z2s=hYGH2+8j{-XyaN76C}nVurR&r{^1VoJk~6qsHs`Ci87B7!oye6; zT?coD#Bpv_#g}Rim2e_K@$votDpVye#q>QK%IWAlmT>6%9xo&;-W>( zxBihsln#YBG}c7Yx&XGhwPU60xl(|RiCi~(WcJJWan0#)(#kXQvRIhpl5Ct4fDvgr zIj+x>) z*3-fVjqKYkF3bWV6--a$TGK=VV*@x+5)>p4$hWG}kCRJ0Qtud5&_np}q{e@($HbGh zzV>{zZvwA;va#S^^CH?UGbikscNc~C)(=>_0Uy-D{q18y%%7x!z!69BT3*fl`*!w= zNOd1QO2X6EM~a$L2UvyjYJP9K?y^5zVN_G-Z=eH)c`2$kScWe-PoG>qCl9ax_W?M6 z-?(z^Y5inBdr2iCIjiS46T_g*q8hjdRGi-(xwvQ4Y6AgK8yYr%TFY z7uBBZpxt$$vKd97HQxB8Q(7gpFtJQuqVc4MkD0i_ywsQGr)C)>(h>{W?GFGRlXYYsG6yNq}j;a$$p!j*~Nk)`9aX;2kDtnsq&o%_ZdD_ zL3B?cy3XOgT>B+%CAewB&iI#@25=LP$fGy*eO9u$$cC58yc@}LMG31Wy2nd%1>WM8 zWE`$;S#^?b?i_l2XGgMK<--_-F238f^mOGIUkNjdBerW~^bB$z_7_{7%w}Z+XvYrX zdIpsE0ydX74iV!F@4&J)Qm(KhPkqi`T?4j}@+uyz$0Br-N}a;UyD7)-{y}0DFkSi! zvcrfM#&=;HFoU>GdREq;-YejlGDErV-vuUYnBfCYiV|;_K)Iu69QOJi{`|{`o7&^% z>rzinbEXaX99o1nel9%qrdk;!{R!KsmrHwY@_F|k#H!Ju5P&rI_t(AFjio(N%v7#K zPy5IRv*$~O(z+0HoxW$v&n1XWS3bnpm}>26_B`MZW1zkaSf=NGX5YnDhGE6cc)7IB zJzmFaKQm^sZK|YWM20NDj$^%?+MIQHQ`2=%{D}m#GJ+4*c%dioiPM>$SUdRh3NR^^ z0Y(=Z8{8av&W3vab(x;&g|SeZhRzc3C#9fH3l}}E8pS!s*|pmYI80dKr{TW37r>~Q zJqO2g#aH;2AzA5%CB!(~b{c99bt?@&ZL07glRgpbtmVMtEoI|5! z*JO2L%FHz@vsZ98Tb#7jdNfRjpUs$jYsvvhb`DML}GUH~oQ^!$VIwEu$PmWz~KG;SqSOaLSW_4XqLvPg@(9 zJK+zUtbDbNuk=Hu4?$F)1wPf*Orv)G+cQuu#rlnQRURyZyIt7Bc}xPQ5~;JW<`IH0 zleo;C`_wBh;z!M)M(n$MLH8(XU{)qWEO!1phQI=e$Uj<9C3`xDJ`$!d=_4q6C@7tN z_}YZ#(wvLgMP31>4#gkng2iOoO=pQHD=>uQEOxx!c@br2d6xa{&chQoBSu}J*S?%W z{GKo%X7@yOtg`3w#msz5sC1px6rShJ!Iku|MyJsWBcJ87MI&aZ zwhJs1X{fV3^f!y0+4tT`Tr^9nS4};iT%ad!ycHAugtWzz5QX5uV;Q*J?#~AsDmp#> z&^WeIHnLYVV<#8*SQ||`YQC?_xt~8|SmR7WJc@<#t}k_eH?A9G8ewA+CY0r?Hj<@E zKE%XY^GN9>9ko3D_+W9!;IuPT99#M9b?H(>!^5wcX}^YX0|TAj&JlO|)aR(FrZ0WtEM!@3<0abwJDvJ8_FM11VwMw1LIQ`RMWy*(0xxy{+FCDqz z(x5!X!o{qw@66sI+)Pgu>X3Vn4ISte1sml?A&Us3yFfLSlNdmD%VIL!sL7BxgZ7Q~xtF~4z*h%3W`$L9)DZgJwQ%ZeRd%Obmwm-FMHz)3 zh;C=|?P1+rEuPb|)L$+^xlAT0?FmVja<$PE%d+S;pc;&c^^Ed6hg3)B6lW+mg>1gV zV8)6Qe9OS5?K5!3{`FO69jUR*kSRH)EOS?rK9o3#1pLxAGmn523;Qw(oLn!o7aP96|M>v2fOPN>?zTFKMw zz4;C|IW27E$g?5%B{N3hp=Y1rr6WY=L@o&;5Mv?h zDM3G*8gbK-*t|&of*jRMue-Wez{jR*#l{A1C3zpCBSP1gJ~Emv5U6ggA6;1Ancf#Z zwv<9VO>Ye2M~hDyf8L`}Cwp}5Zp1DddCHIaaWL;67A-|Qlz!MpV;rI0EFN&i;Zw9d za}ThXtYh9pbxk1a0!GS@MxD=UhD=+ev*SgIR8wQA8nwS!DrGTcWEk^X5vSg7@N8~< z!FNhB7tc_Zi*(#+`S^wMdnTY`osLn3H_tm#7!-E1J0Q~5(j`|qTxu*NbcE_p)K7XV z6Wcm}cYx!BjKOiGI@@%FX8N$8UN2AKNRE)E+Fu{qOyb`)Dh7J!V8zF?B0+t@m-y^* zMYDeHIb#_Vi2(XGiM;jaT?0q7RkiuxV)m<-c=CdCQm3%knPaj{^CX5E8jQr0J1CswRuR3orD~+evKot(%UnN;2tgj)4jy#naMby?(wfut=2Fjn3iwm5l@A zzCq5nFbWsoZV5)LmUw{0>mpH_jaR;*S)86p*SCP>MdeT!N@Z~LWto1|)|y9<7# zRH(b;@D>ntoD^EF#0hDTb^ju}QBlcxEz3qULOHfvupOJlqNJ#a_Z0Phrg`YFVMZQ$ zUabK*Qp5R6wUBywFj(lED=^_$69v0)};PZKcv-4Yx{gW&jGd9eB!$e&dX7zt+7p6 z^Vp9V0&g>29yHz%)ibEmoH$$rB04?c&dnTmCDw-%tP`(*xtXOVLBAnmD7ZArugOEv zvfe4}HOr=S_MNSg*&NrGy%^(L7XjgL5rdIUf`FDt;=8fPhd&1)y(=n%!K17KTA7;n z(v2isvmQi9TG}3z^Y)x%%;Ry?)p z_PWxO(pj~8uWO1ib|>N`6IlA(A1xBg9HBnzJsAamCir4TB|J($OAjzu75-S_ZV<<= zxYK9PGU*Buxjns}dh%Fr*u1OYZHMN1SUNF{H%?svU8?Lx{+c0BYaQLu(QNEpNhK|^CtTnmgJUR-G!TtBdI5t*3+d`sQXyiGI4bicJ#wp z*0uQ0JY_?$+OydqZ5~ur!P|0|zw;JCh)_3y2jFuJW`;Y{VX?_0W&PAK6t^M;wu%jKBs;K@ql6JGZH zO&jEP3!7K;w?~3462qB{nuAmqsoD7Hpc3Ig9fWdLtC2a`@d@ zpV6p8_Kxn(#ewzat{ezg$Q5gSJ6WwUAzRbd+tZTe7 zvPfainQ&uir)?($mrKO8bv`C5Fh{sAc4ib@d^E@{n<&-y`aTkZVN%U@RU6n?0oU{E z2P!;4T>;<444T0qc35shdpnd^kKp5h{IynZV~Vxg|JDp=BEv-5t~;CPj*uMgYo~U| Ly7zxbyITBzU#B&; literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/gray.png b/common/helpers/colour_estimation/hair_colours/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..97b47262a1f0a345af179b6e378a382b6fdb1cde GIT binary patch literal 54379 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 aD*SPR)sBESC9-j6egSZ}Vtn-Z(*FUJ6p^6- literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/jet black.jpg b/common/helpers/colour_estimation/hair_colours/jet black.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a56c66e494215d9f14e24c5b58148c1333b79a7 GIT binary patch literal 3536 zcmbu7XHe6L*2e!Sgakr~v`|gxQbWn^B7&h4lq!J$;th3ap(!Xtk!C0&0tzA^QW7Z% zAOazPXwXm=;w~b+D3?VR5LiV41(oa0J9p;&e$R70ooD9voHKI{rwFPWEJI(VU(0G#|*VJ zv<%HmOw1f?9sK>Tfc{s&ArC;ofmomu0#XIQC=dh%I^+W>004%7{#o_E1%U!!ArK5M z34lQm2p9?#f`TFcm>@6;fMB6VjI7+HR0HCKjMECGt*cvKs(Hls!DMU#|NR5=|3Uv; z5B`zzV+Q__@n1dwLK#_M1HkTaM-FEJ;T}YAV7x^GIm46`zk-H+`!M_H#WpwJ$4afpY(F=ERGMVFli!Z*CX!1SuRg9&m3!*RL!K(*C`*D48!vyeJ=DAL_y(q&F){q zlRih78B7j=u}${|bjmI|KJ1Bu+>p2)wjI@~wqd19YD-?|Der$^jj?|Z&o77!>@U~h zf5*_3t!58_Am79%a!akh&csTscx|^|OivkKVTT&@xEy$G^=Xv|`K^uRQNt4;=Fodw z^U_LQhU+0P5k8YS!*!F=h~82)#$63?_G_!sTzc}z2@DU_;n})`e?J2|1o}1}eZfb7 zQX#ql4Uj`X`6<$F0Si&*?4%~IbhgZmR(X$oJze6GI8Sj@N*4>@bg!4Zj$W`S@LK() zLVo4G6!T8wi>~+aotSk!2dNm<;+QNSqCQJ(S{wQjuaLUYr|1SUwrMZ(To)xMT<7n% zyLWDUL2UT_`&2U6cAVAmt~zU{;t&64Ouv-L$poijU8;uDhPTcs(l~L@)QlC%Fiy+q z`}=jaeuFCfDA^QPrYyUIytHt~A^kzRzu=G;(>lH>iuse#(CWd$%nW?Lx7)+u^TNM0 zLA$7<8p|RME2>^6lVOWqWs8BS`h0mz2%)Z+{YSCWtsxJ~184UX1t->A>|nh$+Tm}z zuVMpsP}XmA(A$*f55i=ap~Lr{h%FwqBn45Q48l6}Q;sQ!5W(V~L`Er;Wrg83rhg}@ zbB>D?x{CW9fyw<;<~d1z#CdG0b|7;d3|c}@em5aB%HKP23M$U1!e))840N(r+wEWU zaAtA|!eMf5zosAeD2bVIV@LH~udx!v8jV)tUxaKbs`mC`JI_PsANHBN7K$J$W-aK= zmvqD#Tr1ud%eN3t{%{CLa_Ezz8#t23Htg03m?>?4)6FmV^;aib1jxV!Sx>>Tgnd5f zUUYe}vQ!Gi4YpQJ+%Iuwzi_UXLn!)v)CD(HwvqR2u%3auRE*L<60D=;9G6^cz5#*r zhVoxIbv*Pma(QvopMOm4ij_g?2m_ zz{X{!J37{&WG1%VQm{UFRB=A+NG_2;!qp6+7dQfzvkJdR7};q zYT6-1?&__(*=DEC-IT{Ke|qq-dG5F9ZAeKG^5(Z&_>C0g?qzI8wR}L)vXtQRb69q{ zFYP3Jyd_l+|489n|NG081EJ+dC7jKzg}S0D{DQbS%Lpdk`=q$+IvM$vf(v*11#?yA z4sB^SLB!hsr*jlZb*11b=YopK$Kjt0LGkQM*UoyfkC-`3HELu!iKh>>=6HoLh zjZa*5TtGF#OR^Gw%)m7@M_oUUH?eN<@lg8t3Sh_FJyk*z# z^~+?Y_iL$qa4f%ebGLG_K$A@u*+$2Pvc1rLxx|ISmszTfyH>)%r+(ZbK+F(6b^7y_x^{1Bt(BuQZnQ>0z zL=R^xd^$CBp+6nA_Piy={hWhW$k(mO7@_U^_k4|j+?P|ABmOj`4_luV%&X;;B6WX1 z*R^DHI~8-}kul+fSGar2SuVAghcH1RemuM!MFUfqK9ZN5yRu>*%Rt<CTUkjz!FH+tUmeN%;91D^Yn`H&>BQqWE`<`LOqJvW=XwjBlUnJ&9&=y#>TzpX# zVI>Jx6ePeJ)ZYc9`WlN(kZ@IsigO$gav|Qp^TB+RT2UUbJH64 ztg_s!9{rM&wb$UKw}-GJvV_!KtvrlW+gI7+^38oKRT+4!ETKT%Sr!svj}zC9#DMra z(mc|xTDq}V;7c13cE2Niojef63ZKY^DVSI|9I%)j@iKxVT#IAXjBZ4yP}O!-Dc*$1 z*6+#F@6w5bW=O5;j;>wM=jtlvJ_}eZ)?N2jdwsKd^hU_Nd{&$dA%M=I4GFxNt-rcg zdvd38I8{K?3YEdn#)G0(cZk6;V{=>_PgaL7Rgp2s#m~)-9@@t>9Itwp#r<4KeAuzCvX<@oJJ~GR)Xv=Ebq*bsY^eTMdQLU3RX_36kW31 z`OBbI?_PN*K|a+X2+wRBKL(Z6B&I(@qVDDjXwNVun7IA`g7Y&gapDHCNZXBI87{n2 zQ$Qy>w61XF;>=H14mRn_s&-S9NWbyXsI@Xw6KWDoU5^)wBeNi%)VS3d(uu(HJjg!E z9;&X3GKQyZg!Pv;F9yDC!|ZzqLV~JHEI-*&*^HIgE7|ol`Qcjn;I#xROv;<&+ee=F z>0FY?EtdaW54-$0&(1HrbLDh8=Ae?^O)7ZwaOkh6xQN{f&Bgd;OuqIw2pCF-{>fIT zwpNTHt|^BP*ms%)Gk+JY$0{{+pz3WPG-3Z(F^Zq2Lv2qZyT_Tt2jHzbMeU6ypf=)Fby@X-o z+g>A#pG>sxIa=SKMb@I{)p6&I3dz3yveS=qd99ew=Xo$tUc+8fV&rC6)noD}t&uo! zlZvBpeyb+Y*F=$!BN)hb4xcFVS4@G5sJ{nev50{AV8I$SkN%LR$3s+t23%epOv*Cv zoCp8RI-MF6%XWL-?ZfEOA!^!tHFS#eb4~`?g{lS#wDRH7$^ypiIAO*FpeJku-CfF3 zN2+M&k@DFCEl9#v0bynoFGY{ zxi47<`w8qnBBVQF7p|Ya%G>b>FUS+f(B}pS0gyPQ3@1$5%E^-8cnN&7WCYu;?`Kr3 z=jGwY3fGpa4QZ0pUM@5bt>pUA&(~ZbR3~PO<090zZDye;sjcuY@H^4tlbAHwzZ)=p z=pr-a8{uLqodj$-zdhDKlazJhB14HPRvxh%voMWr@T)OH9})iByXV1Id`%hMS^_=q zT^cBkR_S0eNE77FhZ-IF&k;UaIERsq*l;oDwz|lnk{oFCG2ypLLc%iau=>c^c(!dC z)^H|X@BoT7o27Zjywi_By%hM1>M4#qMx{H9;7by)iu+DTsa~`U@B!-j&Zm21_c4k} z#2{hVT=~`cLUN~j&n#0odI_#Y`BHO5Ecne+>U=?9(u{iC^q77^*$I9jS~Ikf7>fNK zv-Lf&_{awMKB~FNfZIV7--#I|bLeseOxpVV(D#jf83p1`;|$-mFs`-g#(6 z%w2N5knhN;%d5CQc5lolzUfkFp5Yf9?|@i0WiMVfY`NMIPR2-{d;9g;0irIdJelSV zA0fL{5wgb5t(@dj&I~avl^M3QJAWVhX)`r-f2YB7a^0CltmA~-P7bLPyy0{?GYzKKy3RnNwG@S4#k>E?Nf-00IF3;6DRgeFa1T$p5dd zT_dNYq@bjvhEP#Ks9`j;{|v?fWrY574pvSUW)@CX5nec)SLCLUfY42ODJgkvO>G;S zP~iU-aMcNbQ34(Vn!!K>00aYqVZf^%z*7JK1P1;S;Qxt?{J+RG3Q8yd1OkFVWaMBl zm<;@1G9WMvK*qo)sm6#fb|6Q2N2Kzb)G?_S;M2O0QjR_vrW3pWq5ePEe-!|M$zcC8 z43lKwyP5~k`~!nv|F|lE^9L_@y|v|u;=i1pFiBOnu*27_ujg)0W}$FhVpJ4~4U#^V zNohVA*=QhAhMI|L%SYEkTDif6GeyqmdSs>pq##RYnQf+4UO+d{&6rv>^>@0F9yw@m zB{l?sGTQb`nQwmg!&X+kJA80~yJHouZwbL3BD#*)holW8!cODz<|FIGaB!ul zizYolf{6`5iJba)AL$(p*0{_#9wpok0DLhJXxB2T%Cqz_J9~#{ofs;1TSWMQy0@Yaboq6 zW1@XtqscJ*Lt|7WbTWFO!aDD3aNiYRx!(RejnIk?chnH#FCiE9CL`$?VkdTU3fGU; z9<@;VHqE*H**NWfHUOx;NN=L7;9|2|2ljZT0YX}9kU~|Ia4FsOo-{=8(CbCV{+~BW zD0jv&t~#AUg&!TgG7CB4bS2-!*-W&@R)>*%={FN30Q--uU>yoX{sZd zy5H>dVoKA=EFJbh&9lIKuSxq`zW_5XcuT9#R&(_N#U(~41ub$hwj5l(mh5%HN zk2}=ZBE9M~hm75UdkBANb&ObY-5UIQ*JUY86zWeYn-9On8hqzixgk_qJyh(G+KbFB zE;UyBFn+<*xe)BGW}JFe`M^8=>MOvQPD+e=t&%7^oFz_jer>j8@S^ijz8uembdC9Unxz>Fy&I981RVIX5V4m?wTf=mB&1>X{n0b@`%h&9%TrD zK4cuo$0XqBcfc)wj=E64-iu64mC$djqa@W zmQzxxC?6srD!;jWZ`kHJ1tOy+1yD0&eSOpK4>!DD<(Xp=odztPb8(h#y$`^YBtGXT z-t~_=FXqY9ZUDc3deX-6i4~TG!*o+IlxV1W*lIuyyB%X@*5}=zY!=woqC+Jfr;IzO z%{R5hcu-0ZUd!V2Pj?#g3lV-a-*b;oa-x(4{u?20SUfF0)1+p~aH?8tMf0b=D^H(! zbI6qD7_L(zsZgHkvjZDnrHM0 z?RT{KdE)qFCUZcneU(KNl$HB_fD%u^&@IF z`ejL9xPaV$EK*hD!xSQ0Obd>XF+4f!o6F8m?5AYcCGMGUG%RxflmDvZG7BYjLDhtf z>iMt%Ygjy(At<1u2w5kk^r*2mMS*C9B(T}-e0n#Y2jBO=ij-Yg#2VFuhw!1N!C$;H zWN*f)#Xlu>^Q9Tm07EJ(mhG_Jlq-|?BV@j>pu#wq=oO%F1y9+GySGqrC^x!b^6${+LqI&u3@hXC&ktSI7Tx z-ponO@nVgu6tijxcX}w8co@v&(H;b!4`n01Fm~q@eqv}dk)x6^$WW2iP+RnHy@mWe zErGR5L5pZ$E>hsh2abP4wi{$;r|ON%U|w}L<1N3g>4)5<|6b5r%Tn4NYiKnhP1-4CN$yQ!o&90>nb87%8qnsuJ0L4wv`l=DkZXRBQ~u@g#qX&blxppddcoDJFiuS`(*0?{D?-SC7$f!ubYZiMX1t5 zUlpWo{(4TlmoDgL;k)wFr32AXCX+P!n05I_B`T2bj$w)PneQm!CbdtvT1yXHyRQJ| zePu_!D8o|Bnkg@5dNsh3@+6j6BVaK$=VzKyef=^wGDX0MQs@f6YU>?k)g>4sA`}-( z9@QFD1j1fUiG@mV`8f;{UqZUB_1Q^aZM7g9#d}-63K}H7yAc`5u}GW<^}HrvTWBIy z)SL009@4GKEE1zyu|e686!lhGz*f!WMu}?uP(JX_JsW{Xjr%i<56(vdk%STD00_e&I4_rJ^LX}sm*RP98L>>*IK4A5$y>5RU_xqlY1P7iQaf*n=0 z8E2$uHBIUjnd#Pc+@y(TIQ0O%j7xEMlOfQr%C7*$b9>C_u+=HYO1>wf1(>;_`Ft-e z><-x?=kX_A?Hoh#lyX$39@-*21Vx+p>j7T-%}aw%@z?!7DB-D25BtFlJ=`)b_E`0v z>5JCt=+KjHX{q8zz6AwM@|0UW^L3YKcSvao)>1ZWTtmPJM&kcLubk6C$<*`Jsv9~n z)avnKV_bQn!8b8!%2ijV!j!9@eF?HId&^w$t($O1PmGU}8q+tDTHd_+Fv7)?0jwZhNmP zLT3&vEtYLGeIG(C*hV!F2yQW-eqMc)oI3E4zwMgUj#X7ukQs@tI z@nq6u%4i}}$hjC!5sxG3`)u+%T$o3<+3-DVV3#%Har1i1xq0{+hEYo}Q(|9nG-K#6 zq2CKXH$=~SZXTsVk>Szy^t9|OQ5XOHh30t{o2B-CDopK>SAdEz&x;u0uKd)}-R0+f z?uD*v)uoz=7XP{m(XL&+d>!%2;n_GC<)+HEvj+w_DFp}8iN>C0@)66@xjgVLII`3g zG#eH9CFh0#d&N{Yr-lOBF==jQNNzXNl4AVro3bvcnf$q8|Ky%0&0;=_EYAjb!_veK z+YX2%=h(X?)2d?GI3Ae~^m4bi#1FpIRCDO?zancP$Gi|OO5@Dg2tt$ih76`CR zW)g^t784GoIu;VsRSJ3>2X%buh8`_h1}WJK5A=s4@e!w5OKhPu)4{$Z_~S9$Qn8l6<)-cANiAvWY#HltX24nY zqQpo$PY?Jsor)~z*1osF+a9C)@irUXZj18TKXfSm4J%T-0ySP!A+$b}O@{S;ezR~& zn<9=d=HLZM)x^I?O@4DNcIJqVuUMESP?f?jzqCnVu>Oux!2;GaixEqVcJDs+NeaW9 z>3T-GN(8IqO-(?`f8BUaeaJ8@JrGMky{-gb^o5k0xoJL8pIbtsyw&0Ck=H7b`VIC+Bb8bHmhA?kQ;8iSwW16d4>5SkKFH*45i<>_jP#?p8BwHjD9mZRV>3k%AyK@ zOoC(Vyrk51NbJb?xXlIgJHGhsO6LP*oyp#5xt|Sm+8r|PDo0dh*hH}snjz*0#c{x5 znD@{5gOv1)4Cr`?AKbkZF!{aYl1|b|7%Hmy3GEYYuHNh?M;`vGUnA)!0h6ulBO*@A z;Q2F=+LVMe+?Vu-e&}wVhX4x5QhS+4aGh1JevFoTtyf7@Og(igyCc3rd$1$MQz{Zu zfz)Z--?X%TIumgM_V;QE^0cKdU^6H(=Fk_E1k=6K4Br*UF?B{PMx1|hc%wD_z~9PK z0{Srlwg!c7DF=&Gj=9}IZ&>`rJ+098GqHyZQ1L!4I+Uk?qe;81f!8uU(vPG6q6>qH zf&xA(E=zk>|5Y5Ra2JgJ<5g2QNb&V=Kggb0?WKbyWXD!67rGSL%S{(}1xP?PY%b04 zy>I+jxLUwRA7*#L&UQ$#LUZa)-|I9lQ#<4^t=TiLfG>W1&eI`5B(;SK)`Qik7>rql z-<9`I8L8y%bGVxsx0x^t8J59%%R5}(ML$)p;_;4Eoo^Ta;Mxr069X#!4yvU+_OC^0 zLx-E(k%CE5>Z?tQjTFjFOIE%AfFjAaMM9-XJ^o%I;fG4H)Rn0Y*&!bDM5|*V3?Y>LZzI&;QsF{t#9I^T?3#IhGf+>0Oocq%Y&riQ}<7U&PW0^*wt_^ z=3y3+0n=l)`ExbAJLX(QR@mZuAN67iRE_(tnx^Hci+eR@p4}1|F<8WV{eAuyJ(XgC4d<3JMT|mJ8*rguzp*FcC{|gXa*c#d!o)6cqn%g(N=X+*wCEPS*HK75%pD4} z5!B(Uys=V}Fu%Iay|ipaQJHWWDC_Y7;$(l@Pnl{kYJ?FBl6K4sqF%DY4yFa$NU`Tn z4%KDR7%&g~^g>J>oV}zB75y}+6kr8j(a?@b(wb1wIBBC$x8<*hz#s$DlBhLW7%09U z5VEZ&HL9aE*y1ZICKlT2Ay)t&_{RF(A}o>Q60H}NLJ@aLS7}S~8SfIzv1Sx01ep4% z>d=Y^&F)2gE;Ppy*l)FI`+1bMVRAjyeG4Y$sWAL^gy-ZaG8jNQZwF5k)e>P^u1@*- zTI02V9YVLjtM-{KNq9WpRGW(;Ou4U^2bJT0traE7wl1Qc1xtUDa=o%BFe90o&-8aU zO=+v{0VOV?NjD#{vo>|#=k*#6|CwQ%v1NDCsGgxTK4xF?*Ie0aryLE%%_GRr6uYWP zj}^1b0DsDx$c4my!&?b3twbMil>PMrTCP)xx?{Fr1j_A!mD+LfR(_}0SuXm@!W}Wa#i~Jz?sYStaBXA zg2MQ>+r_4#1S|AqA-lAri4&`s%zBB?2w-dYF`nkkC3`rPCXO#4OcL!Ca*O}twr7Y% z4e74IQOBKe1*pz_BgpHw*wOo8q(a4F&Ze&^9>s~_Yj;~{c1gd8igXjjK~5mT?kni#b#j4#!0C{wPZA(^An}cTLJ1iWb_7J{#lMO z<{A%mKX7XR)ZU&@$P!$h8=tycH|eoI5*oo2{izGDN`S{m+%Rr-FLGzX&-$JP{U~Uv zY25#9q>oB1OSn+aeHyg#-VsLSU{F_^aTBlps<6H8IT?p9V|$~A6>mGc>H(c%#+u_# zKg-ngaWhDF8J`Yoe_3Z7W-i-bm$PwfEW?j8(oX#vbvu)K915a>^;=B*!FLSUjgLJJh@S2fD~g} z_48ap$J}El_;%Z5bDC}k(}_+|M6J7QNya@;Qg^648>{A9#wwVO7^s^dhW#%MW2TCX$`*F_rTu{V)nT?bxkG?}{!-~Ker?jOZhl)7gnx`fQ)A2*31lSi!oU@ZrqL*gg&z>F~M*TZBEms>m8j`gDDNDiTI z*lSZ~Fvoq|h^(SX<0n@P&Y{(z?uX;e-9?GV>AKnOnlZ<_okzkKfyeSFTqV`xzEfu< zi4s~;UX}BC8ZS6@4{1j(X^q?ebMJj~-`?{%Z_aa`&v^P7nl2> z|F6JRH^2k|LV#8GB7~S#4IEytixjIP9Yzfl!s>((S6qQ$tp|%>jBeCUf%ydTK~-=r(^=az+d)X zpZ|3MF_FnJ3+Y&f<_WuBeFf;ipud^GOn?@!*VLrcD?3||2)Y887cVy|OWaEjBQiYT z$#89ke%6b#F=@VNt zBXLb8DNw$C>hwbYN0JFqOKE*WC1-BA>bwYg4V8z)1(*tT%O+Bpve z9q}7vR-JQTb+Y%3sV2rIwf*%)TMR?rKMU@C>1>#~ha!UC55AC-GOgP-V7a?KwMM#E z`MU^C$>La~z4FI!+go_*b8@)g z{s%(5?o$?o;b&FBq_)Ai0UnBWthXJP8cKYOFjd2SbX3&R2bIj{Ej#HIqZUxmHxt<8 zNe2g^b$FN~EnV1_ZWd&RJk+JTlX!h_nzMCgWKWOW&2V1M6*&7$uEX|EVM%#}{6CvP zYw>1$^o?e6dE)>wZv(Zu?jpS=P3j9yExK0hcJJ`^!13F8?T6JUBt}(;AZQiwTnWRX z+Zs4tUqh)ppF1g8eo{^CZ7jk`o2EmQ>5J6bmTY_{;mP#?AjozH(((}n0(jmXZR(yxBJl&1xQa5 zmi5JK*}R(U7Z#<(SD{#82(96+7S10(2Zu8C&-><&}7HhLxaN&@#ncN z6Ljr(1bu4R{USuS=cd*5@KpZfMEMnT#xy{`a0RdxO5xQX^yr$F72OeX)D~#}qvUB9 zY4(Le8wsE{FmDUqriugQg1|)wnIFIi!q#&bVfcmVUt@R)=Q918@a;b7 zlyAzXr8?V&kA*m*8Zr77WFW2j$7=`H$awkRPPH^{8HKuwM}hR>xcNVdEhEF%Oc+SK zdwx&-Zxj&-GsCasw_%YM*Tou5GVPX@KP(!yelcgp!^+xsputP75aZ4 zitK9e2;#k0FX3R~?r5@MC8Ho?i0#a`kAtu{DjF2b>-+uTGaJ^0aMH#_Wh2GAth97C zsev{rWvY$axetxf#ol9uZw5bp5ElZRelgnRaN2-`5r{*YW_59;N`mJu<1iOVe$L7b zMH1slfLTL8cBGt|zN=mdjvJ@(+BfNP5NmAfOX;oRTCckgkm9yG93o6%Pwqn57*^F8 zF&i(}8j|a$IHJ@!d`MR17SA}a#ur>-M#!Xjdm4BvgrlnAikXMaAX%Y9CE%ji3&uSw6g>OKZj;BvN0^=B(vcMyC8Pwtf|6yNd0GaYKod1DwX|4BztfcMLO`eSs>KQRR5|S@2kp6=Jw}nR&p_Tn$ zy>PHflzHIa?}3_R}1OpKXpkY%WU<@u8DWZ%GDm?u`RYrci5eg zRovp@WfxIQbeeO_^eV_kR~B;a-J^NOdahSs!8!DbokT>V;op3f3Ck83w5}W%k`5d2 zV}Q|TwsQx#18JcO`r61f{i(w4m~g*j;LB@A%B|oUhUlp%r3q}s$F9!u9!MA5Jo@8W z-sMn$z3{}GUyjMB@_3{aS9+Z|zi#JjFXn6JI;Z)WqVLNx;mKjE{NnwW@K8mQK2dF~ z<*eL-#3{|S`LIlvz?C?5z31i0@Wsp;l6MYQP2NjW1th~}zH`@@nNt6-*g)@S*y3th z^ewxDH{#E`_$7Zg3A=WLBIprw4#Falwn&!kq1cA6!_`dP3aiNIe7;v7oXE|?qs1kb z8)R^qh9i{SR{Ktm*~Xq2580GP2}a&bZB!hEb4Uedcv?VIdsaOc&f}+GV|w!ce1}dZ z{Pd8l>%e^T#}@@6;7f6IG(yb{>O^4cCTuxh-t3d>;vZ?*Yn8?@+F-WYAs#w>DDvBIf57Ry)MdBsGy-M{A2jAQ6 zIAhqE2Q=A~%G7M@z&Ml{|F7m08KPmAy`78-a9YU#f#xAI6lmWrNm zZ}bSTYQl@Y1%`~J?iGbU{hHqS_8>TDQtnf+hq;ZcWD6L=Av~gn<>WQSnIUS`MB|W=ReeMph|5(G1sN+rVHF=Fmdr}HHZRL4T-DHhmzyUI z)f9I6k9@+y7L${v5*qxC#eSj6?F?BcrkGy$SG)C>`6eK;gFs=m8U{|0B)Oqk>rgmG zvJmi>WWE9(<~aW@t#Oy_MdvkTAN&p<2mLVOIqKk$IH8u3yu-q=q+YRuo@YdCtYvzp zqqM&$cEEW+DJ`e=sL0w4(jcyZZf$cBoPSP}=VtGY1cYtp?o(0bOZai~xCaG)RuRZ3 zU^CNOa5WXMc0L{fv7>tKjOxaKk2NBGHJCzoK&rkPg*Ka1SHOHJKhmzNV~cSw>DoZJac5WkvPB4qqqF@ zgycG{#tG@(b2B~|d+Ne4PoweJFzeql%~}-{P=j%l_sP4Jk)!*F31SU-uHg-4)tN~{ zPa*{ngny@9)b$F+(XV=+ua#z+){9s<^?NY2OqGa$kKc>0Nh0R`_+#{7+Hg@zbNBDt zF-ir7ycs@|4sPz_g(6s8Qr>aRbSMwK1C3&`k<>!zrqGnPJbuv-G#;BRd)S)FVyUua zfy{q{pywEZ7p^@G6LEn6;|_@cYk`+n%LJe|or^2IiVa{0*B!-n`t`wXgL4}EUW*I)0+r9+We_Hr?eGG&hU zlwlFH3NqV_9TgNTAO|6@ZW$7&BDNLw^wt|kYK}3>uVNPSd~%=`A0A(&BjTq-CPEe) z{cP)YY^j)!fk*`|qk`45L05x{ZBKpCSUU(>1*N_~REL{r`}C;4G^exM%ICL|S+yLm z)B5fLZh6!C@KczT+>D`ofBA!fY@Qul4#jl_oMHo)o>z28j@H@re;Yh}%G$X=85WeX zvrCs%rJ}p++M-x}y8<$lhY=V|exZERaPj;O+er>I1Wj6bU^SV?9Eg^;R~d3Q!+E{7 z`xeF;PK3qVq^ z8GGkV=~Gho$L53}+b`j_{1;v~^RjQoEu$6iJj8?~ixq=aC(3ra&iorOgOw<)`Yx>l z^DbFJi_?5GEe5?eM6^{V9Lx?i4=#t$2D3^B2(7#L-5t3waR_{t^WlOf^;vbKnIL;w zMaW(o(~Dt;zrQ>Cfmft9j!Qt4dR)XBkNI6OJu|`TPt)D*XTQ{~R-<`KVfgub8uLsM zuTC5<9Z=~Oq7^`c<}IBqSxXlsW?$EQ=QaJgGIAg4Zu?r9F(f>+CL#+Y&Y^;hFHP#3!q6F$>d=!WHD?a-OB?&0GGs_#~8~V#^7He|Pe1lPioE=X9sS z>>fAKkEbg;LmqFyDQl%il@;>02b)fu6n~lD3vJ=k=Lb>Y?l_N{Witi$@2&A3vm{g8 z<-fMPaxVmJQ6El}S#>{T^DB0@UEeC*u=6FFopAMdzRbOu+38pZA{Yof?n^1hpWB$M z<1BuB#Fd|@s$&g;oTg-)QuV%th33%P%S>}{-ldh75~USjN(Z{n+s*`I-v|XVFLz#7 z$)))zcyaGYSMJXjQMw7yai-V_@prYXYs{An(+k%(f-~YCXMe5t%81T!c9DpIAan`q zh9BUwppAOhn_I#UmB8}tG#!5$q9z8~pJC`_#lPKng$;4c4LHTdi>aGo6 zhN1QIEMN2x+UN)RH!%QzFV~;Aba33+4z~_W!ayz&85<7L?vFeUS3#&zw>!C_{PDKq zvu$5io%yUrVm&MqDMKji>APt)j&@UoCK;4fkmP*DT{5l(_ya!r=^bU|FgcIzKWl+5 z_&r9GFFVsCm-2xn0wLGO(X0F^Z^9(QEVN^^4{KXn_WDCMUfCE%utr)iJc>3&5{iyd`Y>-|4SM3-u690`>wcqGzq{Te zEJ1EC1jWDow2OVm3Z9D-@p5AYquj@`hiNaq4C=9RKQ+dh&z85S7tk#DrYkhhvCG~~ zR_We>$6QpErsiyFQ_;w3^Ccb!6p^Hy)K%mG%1`a833pq5f=AjLuK<7Pr3?(TC8sE~ zP#&?1i;<2yN!$726|Ako>5?P>GNM3H)(UEuF{tZmJuH}e!RjyMCG2k-LMd#x3Jw@K YTybjlT81jCwE_%OgD(qZ1g_@(3%#jFwEzGB literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light auburn.jpg b/common/helpers/colour_estimation/hair_colours/light auburn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dd3c79f091360df0cd9e41374e5f1a9c2e3c1a8 GIT binary patch literal 4432 zcmbu9_cz;*_s3t6M8v2WwHw41J8DHmYs9G0Qi)M}Q>9v?TKkRKYVWNvibkv|TGW2q zRjaB>?RV8G-hBJ{j=$jheBPh#^W4X|=iGDd**9Jf!008|la5)b|0?_{v zH8qrm21Y|eM+=A3(lOIB{4p~Z6D!l7;=0Psj$r4$Du(3YL5fL>2#H85%gZb4+|seO z4gvjt0he6>GY#MaG=o6`02MO`%nZ8h0pbCG3Jm%q;Qs`H{^?MIU^Gks6$lKbf`b1D z`kxd;#SDP?AuO^u6IKDchhb2;6v5&KHcfle?yo5MJK^IX;6JGU1O4{|7y>|<0V*mG z1Ox>@(Eknpkiabbvbcw=0w#80nh-WQ)0BTM=Ky*z=+A0kX5a>JKIS8zB8S~Fhlmn} zIn^sjF~bhYtqM4Rq4!qUFG=Tm;+w_mlj0}g0lcbdHVf9Dq_lY-XqB<+~W;y^gLtnMH6wNPvHeTdJe3;m;oM9rXet27d7xe@d1Tkwva7U zbPmUa+_4VfitL`FhM8~Z9cMj{?Kq1mj{D#hhT>3-yq9An9b;JqQybQz|C%5DT~Ovj zohW&(;CeqKQ3fheJf8p0Ra1hGZk~~VA7Q@5e7Z+D3K`ZTw)V;={ZRx5p^!M*`<{!l zHLq}=&20j@YlsqGwC+R1g2U)N*l&8(%|p65_#&s1wPpojyWlLPUh@sRrhzo(efr6F z7WwSWzH5u6XztRoItIVOJL9q~(i@)`SsJ=`*mmxJ@V$L&_iy!*#wkP$y~Zk&ZTHsQ zk0Nm46rPm$ZwB9Ci3tpD-J7)OH#!u?-MsJHa_T}3esPpYZN96luyn#W7DE`i6m(pt54G2xl8hWw{f(29&D4E2_SO0H z?QDhijY0pmp}ER491@Uk3c4q;zARn7uOCMtH|w6oCBIi`*84ne;zbldiKlD=NlS6l zVn4}8u`s_OzECu}DX>XpD>Cag8{eRV!mI0^E|!Sa2kup0si0!PQzU66GE7Wgg`dwKKG5aU7`I(@Akb10JpoCH12k zKvy55sYkvwQG|U!4VTWbXDu@6?S4pWXFifP)O5Gk_Fqq@*7Ic)NDP;n=enOz&VI|2P z7AX7aPL3D4L^G9;^^re5)w$xUXI)wHhfN}RGDLBt9etWEA-p4CX`NbjG%J~+>yx?T!E^6s}SSoNBedr zL-f!96uohC#qYX9WT6=6&tm78A?~^Ppx4?mHS~DcQGMdT!>!G;YrARnmXs z&c$L3lTf{(xEZ6M^-y0=Tk)NI#&JTP#t<@#5ck@!QqmEN^=r0sxnkO@iGwzFC z(Iz6x?k49tEyKO#znm$_xm{~F{pP(K9_mV7fzvvSg)_)dTI;*A6`OHAnF@&UQ$|13 zwiD+MIC5-Xs?u0-G{7u=GKFlW~tUkYb#M*uyV` zBf8PMt{J|(l`S7T=zXww;kp<((#%x2*^?_}j%RmNxdxofxZ{`UwNNeS=%vYma0*vC zxt<0$4Au^q%4F|}He{IBOB`G)lMC=(W0z@RHEsE_wJr)T=y1P#?_hZR-=!NzI%bvc zGMn@RVj4q9^mfL^TpdpiRVw_F>GSdmPdJJbzEzIreW)*V$}U37N?>n4=TxwR`iA&K zW#~N+k;U2tw%(N}qCnr#(6SSd?APqRwQ ze~a;mv&}=(YVeJh|Z-d<+1*<>dm|;_^c(jcYN(A$EhOL1XXnnRUj@@E!k`IC&G5{ zW~g_A2fd!ORExJnPpG2oAq_n6#JuriTeohk1^HsS>nLC=~kODSY<#Em>emSEVyD6 z#2HxxI1VWMlWUz)AUgCC<>-M!CJV@#CO&e~ST^d=dq;K(a0-Ta-1kBH=w7307!0q@ z0%@GQdNO+NZU1Yy+|C&5&$!gPsb~>j&vA=@tABH68wb-iWq=5sQ@@W4##YSxUh?V7 za~-SGCYJkM0u6Q5HWq@y)tmfL6ar-=ZOwsq&DENj->UI<9h1?hyZe2wdKkY3qA8Ej z?kopk{M=!2Bn09vwPWJNMHdL#Ru+z)sF(Bx0V`uzsufrLp7sTxD`FyYg;IDTD7Dr&h`=#Duo+6-1G3~+k7j)?~;pr`>(f5wa>~H zd>?YRDj(D|nO_17Zi_mHSst|{0;R}K1645WXsTiUjrG0g!g@Uq?Sn&)_6RR(izwC; z>iRb&EnWbnjGAYEcL98!6L99x>6zD@R>UFuaQ1P^CpA&N4v+cAIf@0(wrZ5XMQrb< z!-pOpFMv-Tw*@rcha^3pHEFAcSCS>gpaZ$1rO;9t*Ve;*Uvt0a*vGB2G{2Qea-J|w zy7QInxq4f9$!PmoUL{0UBcDY?M(hDmWlRCUbQBrsB1B)zj4pn`h;FIs=Bq6~N$I`& zI%B(Q50OvdceJhH_*U)($sN>YJX^<9DC1Qy5io)Zzw~rb@E{r33Zx5HGJv zvf22P**!9j*Op67X!ZW;#kiraQhYy?gukmj(8GCBv&%A5(`-z8UMD^X$y*NB^80$_ z^&O8kXy_-Zc-FrMMs!+U2fTp;sf-4;_ehNKDhZ|g4D`>&dVb9(8k(T{v6(-7m1*JM zla|eDt(~dYEz|hopwz38tv|wa+Bs_Ll(c|H7Hogu+TL|1*tdN<1IxA=+XAuldbYm= zSHhZQBT{v*DQJ=_AZfjR*1QS(Uz{S~cTTP~an#DZ#jk~0FYrCFJ>vZl<*Q2v+%nZu zWsj`#t!dt!ZBB6m3W+}~O(heC0ac&3xMkWkat&ov&en(^QdBFwDg4v?!EU&=hMIk& z-gR+IUy%L$_vl66Jx_VZ##AE%gUR;HyRL(TlbxIBkJA;n70@WE{FcFF6A2ar_IrWwF$u~?sh zhFBFqj&P_8Lwf&Uf2qM+UqL^xTKb>*r)@MG!|M5x4Yjl_0~(JagF5;&69Zy5OtUTl zyzkB@{^xH)-OZZNv2HGWq=^Bh+p=599(be#^DN)KgkU|>rol0`-R$#A7nzfkv6-X5 znN*~);gAde$Csz^aic??_7yl`+=ej~UgPP|OH4;sGqd$A9&d2RlLF{syHyFD<6bk* z@8shj_EkwylE`7c#WzF=Sx|CdCelSP;?LVCt!->S8foqpOvjGU@uF+hv(P=FXMaIh zuqCeS7BaAxoZzvwyrQLcdKiz)gQ+yaZOnW9T0lq$6KXT0Q%*<@)-1vQ}nkx%UV$eiU*G@2<%or^qObdMP{s@-)oYPvXbYkct$Nz zOc$J=DTK=8&#;JcRx5aSsQ=NwTJaLtx5*H!BJOL>Vk;yjZfq)4k6GSmsUUe>0y~lI z2?3qsSx8yBuC5E$4(yu#%&hGz*v}lx7H=zG9HuGb*EPaw|Pl S>UBIZJ>A~vU#*7A&;JFsdhT!l literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light blonde.jpg b/common/helpers/colour_estimation/hair_colours/light blonde.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb8fe425d36573a5fe5082fbcb5667506d76fd16 GIT binary patch literal 5039 zcmbtXX*d*)w;pD!5o2qNouS5--3-Fm*D#m}zw9FGXk__W$Ck!2)@0wZgiM8@?8}TL zCDg=-P$J0|igLUE``qWb-|u*r&CKRuvoky5TA~Tvu;xnikn3jU63V32y43j=G0RFQ5 zAG-gPF@wPWAp`xNP7Gj131uFX9nd2zQBsA79ypr^Z~z(pN&|ucdH{ZpYofu3>cUA4 zMv)WVf112Gome_Juild^eSH5KGjO z<(+w>2iY4|o7k^SD9z3ZC>!dZ7pynTj845{Li>|iYN-CA-{)WWl`#O=qUr%MN3}9n zbxdgWN>9T;uo6c&Gg{-?T8!^QkdC!Jw@pcDDA$Mx-#~#OVV$tbGAsP%T*L#_+NgYN z=6D6(x~kZlg)K+7R;@L8w)*)ozIx=*aWWw%yuo`7`ltkPkj(8bRVW{p9r(_HOK8-N zdXpZwj;+spX|I)e&zV;O&49QqIG8uUvey~Vk%yLb8S-%s^3KdxixQ!Nz8zMlJgd4_ z-S~qlz8sSwiEMEN#fIT4(6t#Fh#=pI0U4(bR*di)QqWWRZ9JD&E^5IXM2MiM?VU^L z=hI3Y5PZe*`b~|$WQa^9B`8=4b$Deng!v{-Gp!-<8Hw{^oI1Ro@u|rDmbG6t$u?56 zCj|G`ofvb8Oh^F|$|h)X*rKrgLSByhd|c&u-A(@|)`FrqW{vl|Wf#|=2A(!Y5wO~^ zmHxQug=N3q_-Mai%d&_k0d{?<6c|^4w}OXq1#4nv+whZBI@ofpJ!`SuUt?SIZJNW4 zFbAv09-JKEIW2;&?x|wqv8cNJgS`x#qP@1R>cbLL=t$q(4Q_&`(b{^&138QCq7+N!3$sw6B%SdOt9(4Xw?Y$A{Ml}p{28{h z_P-TccPgAWW}nK}6Eqz3NsHo6CvLLVe0*D}d6$F$m2FtEdaE9E8AcX1&kt@nCXqyw zL+3<#4%##nub~7vjwM{;Ki~MIyHaj4{<1Dr%&TP$$Hb|x{srs1-R|1TdhWaHKK1w_gg4;fewWW<^CwP~Y?h(NJEMat7d4Yd{)iS{fmqlLfyk@dhyww5Lh5x!LfbyQk|iq+e8 zS0}jE?J9rolA4<@+?ClIq+|7ee}#_=lvBn-|Dn(4OtMPh4<2;Tew;+L71p?jqxt#hEx+y#3du>Yg=VQ_Cb8+Mf9sjJj%OO|$o?eHCLW499r`uf z1{nmnKWRj3h^7TA8yjJyQpXHC@YLg$Yi0zc{Sg{R>G@%35jM@@D`8uoPQV(QG1s*B zid-8`>5#qCf2`KKH+h$HuEX4;p>?@5{DI11sVsSz7)B(`-@AvKgMK>y3kzg!fk#NZ zr!f!y^dXFh%c!Vz3v>8yU-{~r0O(8a#Qjb
1c=c7lRuKk zkcX$jyg)m~A)v&Btz8}!B(N0f;P@2Y(2Wc_GTs!h=lAjLr_PY2W_fK5=PqwSR0PVt$kLpRczr>aVpzIG#@%s?&9 zgO%zd&E<&@kH$=HH#rY@mIzEiVn-aJ<5z42F`G)s!aQ6BiNBi`I6t+l#czz|==X~} zhXyQD>&U6->juC}kYW?|6D6@8)M@tgq1pd3>P;w+FDoE=SELrrVU@A7#=Nj~!cK&X3(9Do{;FVq+Am*o& zH^!D5n=WX=JD4w);Qyn+ZoCV&zhT(qBFqc)BEjrq97(j2zzi&>_(?>%7xz3)+oMSzTUwk+!6f_Y@UPwZ335=)AJ2mHQ@@Ji^&ga zq^mwnzo^$;J<0G0(Xtvzl+~vQWfL*}l|iykjbI`P;~Kw5t)FBNW^9h>M5<=iF)+Q<$D~bY7E@CyVH2y#q{LR3&&6X5rjfNkI^Lf>%> zcr8Re19TM7=+eWSp!cJpVtaX}`lCziKY^k3WQzFPS#>`WKO8O+Qu(sUWt*5MvG~n= z?Fe2m-(cE2BzM16KrMDiu92l&lYddBGxNSqyk+Rsf9p%*S6%ma(>@Yss|ye1jAQPP zIT<@-Rsyg)1%BfZu&$$8h%bl8uK(nAAeimI`1ykNVVQMPCVoLIT@)gw2~=@ ztV^Bcw47E$@l`e{P?pK9BK1i{udouAf}q|0i#et}+G#D;Y>p4S3KoT157i$2%IAX@t{G+J*0WyCe~Ck%v_p- zm_1Hq{`0vx;;|g}n2t{ZU8TU?1|peaZ-P5m$8O7b11^BdCzT>9gFWvSO_ht9N)al; zEURxFFDUY5v7z;mTPQx~VvCPOgHlL3cWi%)`gk{nsiR`C-H9ofH3sKL=)2uc5LYR zqKioT&49clXwLcP$8z;Qd>{B^*4$qv8P*~x>eTLcAB7e)q`58n5aL-&>Ib=2nKduF zXqsLX8E&)PQL$)d>ROF^;!eQ4wdZitW6lbNc)>96&Sgn|{s@BwB}(AzBjuEom%Z0% zr55*TK$7n0b1~;r?U2}Wstf7&gqarvTkWH!zjwnXr<1;5TT4@~L&N+owL7eZ--?TN zVXNLBklgN~;Rl*)4=>jZvwpxpzb(b~sl-Q*Gje&3wp@(2@7pjnndW*~k>MgTZI}9* z<>A#??`ws0(i9SqF;|izW)wY{rrjkcugE1^!G()I z0Mqa}tbye%+7I{Z0(8h2D zHG!omLlTtMJ1soh$k0g#9!)ud_q#mxxcXsS_a4F$!iopA)$0K=}3DN`jdGh(fqP zo$G)wkgAJw%QlQluIA@*$Ke~(KC zP|nS$!Q7`xf@q8}&==%B7py-{X;QNiusQaTz-fZ1sL?Y(LDMwnhh|uYNu`6|Q_i-4 zL~gUcMIq7j3Wib~M!lFVtLJRHXA7B*t6 z-Hv|i1q`CqvAWJlKU2N{&j1qW=KW>F3l^I2?!MU_DW>r2YR=1l->ur2Su&prz35I8 zP>k8C;%QXY1^sfHkw|Ln3_ntQH zJazGC5R@)_Kc(`O5Og(u)5(B~`KL5fhp!AhJLrd0Tyk3-<{;%KO>n zD+JuF5{#+XW`aXS7+FnSB3rV~H*#EKSOg}r^L|9gOEW#a8JnAv#rpAG@NCV<833bl zs?6}JO340v*6Q)2M|YN)a=eI1D9I-yCM5!vnA`rg_`F>6bvWryfilC7KNxykF`r7? z1&Jl>L__@Ab7+aU+LwAMQ2mg1#_U9>dc0=Zgb51zyb%VrSAAj(8vl1%0BsW*19iSV z)rm^zhe<_qFLU2am*G(#>HT*&5Ggnsa3_HvpdC}C6PV_2%WM$kL0HM)S}_n7Q=;L& z(xDB_-`O&Zv>#4hX?n?lmnee5ex=pKpV)9ftmglbH><^OP!H7$HY+6Dvhwf`#^c8H H&ffnQ1u+Du literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light brown.jpg b/common/helpers/colour_estimation/hair_colours/light brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ae276b24a9b4f9a2f4417e4d8afce346a5d3c21 GIT binary patch literal 3611 zcmbu3X*|@6+s1#h8WWlkvc+H+OUW1`+b|?slMG|0W3RDgDa28RI7VogC?fkV*>`2j zv8FJxlN=&TC3Kuqp87n`^Wy*de_i*x>%PC&eKd8n1fa}}OpO2#2mnAo4IIq^cLCV{ z3J!-M5L^hvF(fxP@)(+j_ovaKs1vB4BYILyNKi=Zqyk1<9HVd+CyP6)Ng!w%8yY)1 zM}q!az)>fFMgRdo69gm;fYBfb8g$eP!~g&o0{Zpp{|f>Ifnfj~fdarF$WMWxFev0# z2m+%4h!j6wA4+wV4rH82QO&FAf)NZX-GZXuypu^C0|Ea@`gH<NURhn@$1Mon8E}$W3Ko9u)px9E>jmDF-3s=~K`FV@MkXNNW_VaF-C_frz z32Z&_n3%&$;XmMZoTk?6Uc~E_Xkb?m(Oy^^;y(98g}=IV{m$H3IynmK@y}{)D@*Q; zRWo$AFcj5vS z*h$O@rp-U>T}=|MkWYncs_AVo*oN+eP3%8RK}#%R;oN?4W=dhW;fWezKzX@chBoLQ z4#1`3F_EnwnrrAA!5Fznb_r9t?bB$rcu+bnt&SOiW1xdy;CU7}DsDzcG!3hwv%6)Z zbX+2M*QD2Ou}R{BuynQ3vhlY3F&>Ib@BP3_v)4`VFiOm7?Mk!JR`V8-Q}ta-)942~ z#@X=Sn5Fq2qI_+IOE7*CqiE-1q=_6-O%e#cd}G7!%-F4l(!MZ;-NAfpx{C+PcFC=J zB&9`r_4LecF^)+vxhW0w%@|sBSZKA<2;ZU>>n)v4`Q)U3ljuag{iFEze=QSg-^$3? zEO=WJbqnfOb~`TR58EZ{7hpVNl1;K37aE#GOy5P^g(a`)^6lwMMVR82sNy1x1-IBc z7PH-1QK-woR$2+q&)?AUV=PC`l)Kc`QdzT|ZI)F^8W^E$Ehx@hM4e2esSFTmWHzrI zQ~u$0F97wPfDuJ8Ax|!eFhee*4{3`^>qu;WAE=lm$jOTP=M_B+cH2Y}PS5A78qfMB zh8#-coDbPX6@_LcZ1Cr0EA|9&eRQ^O2zN}%U!)ltk6(a?x@UGZJ`Ea)8kLG3Wy;?F z>%zygb4navgeSnuM8cH{W%HqjG-*bCO7X+|j{)}`I_o2#kW}=U_|iAi?q>3gmPb{tMHj`vraGMt z**eO$6A6JL?yFDzF7nTsGBz8IRhVKgI_XI#+Zv?7vE=gSW|-PX5X|@dhpop>;qarW zAq8n5{TTqP{n}tX9p|3Xp^T?J_l*BBequ&CFP$WlK&*yUBt}LZ5ycQkYRIX6oV zUj!*UzFlD}z!PP6>xAHa*)A*BMMYzcej-ObH=P_>RqFWceB^2Kl5^afAhuc;d}jKI z+`715g4xvdXS`TNzkRhUW!bXk_KA{OL3H~Tt~OH#XV0O;_KY>*ygB=3J1@c}y1UbGzXxnm54`dHMZozuX;MkBQEf%43V^wlUycA3ve~mUl^>CUp;+J+ zQD{F`*c;VW!&pK>lFX?gnz-(9Z*ZJW7UCUk^{%x`y=NmSme!HBtu?mM%!3dQCHllW ztY6;h)BaZQb>B|8*2OU85LteFwON?W6(&~_A)?ZzqKuO=bt9Eo+ETg(u*QvYSsoy} zEe+_{!AV4UA?jG!+bJ=z$2h$KUzbc#gV`rbWyNe6*S-@Sm*_U`FKe=vE>9Hrgs`DQ!(F^!`Cwaf?25DBp zd+0;tZwgHxJclu_{MBPSom#}qJFV2W_y=>vJ(ii{U;Ez6gJr8pE#IEXu21u&%?~3M zxYQgsxO+R=e9fQ6gd5kca14mEtoGEhWz|dG^L2R!rF$p=^jd?#*CIc>b+qyLWe9t} z=v=?+75#61iD<}orO_SRx~q<+om9qra(BJZNa<-K?y-_;c!QQQGpo$=E~x6n$`Ud( zz-!*axz=(fuge_{50k6(6AMwJ6DkBt(_`kY0)nDZUle>k+>W8^b~vCuiG05AYUEY` z`;*g>7jzFvid&5>%9#Jgx$mN6Un$=ZY@z}##lgAMB=g-=02p((Lk|r-TZ$AGNsYuY zEcgX8p@XHx;rIN?r?%QxxVy@li5Nwe7x_y7jMSnMQTe60WjI>@0B_|#eLAckGAHV` z93MAJBX2gBv__mB7OrABhP^UPP%BJ)+4OWkzqUnp5K&I7tJ-*mJ(~jdG3r;|UVam2 zQP9cqiYnM}avO)HnyjRNllX6#gR6l%%63OU6F7;^jnB{mN$6)vJG}M!*fj)|=zXc} zJs|fn8Xo07Fq07YWKhVcQwZ{Xy2={n8>Mc|-ljjE?2OPiA`?h2&1Si1i8V;Bun|%B z){SKk$f=6bwegU#tq+oEHx;I??7~D70Z{hR)uv2`m&F|cl%*lQo)I+*XR)OWXk!1$ zTC$RH$vO>6#L$13G7LZA z>}WH85-;=`q58($bZx33wQ*`lB2wNs1aH0Jmlo*C^JlSfD}x5(>&3 z9S|69oEQa3%E}g4-->IDw>|95L2|#;XncI>&lCVH(VHoIFWhFC0TPLS)#FR$@IJ}z zP_c7wCu1#?biY?Sfx4NxYee-e$XEN5axPES z=IUQBX=2IMRrORUJ$A9sy#<$neM{Bh;pJ^p@6o1Yq|b4D=am-|c)RU#K8qoH+9t%d zc@7Qb6IACSf`oN}SZmdvk79$(Jk?L;5sTDUZlm(8V<6Rp)^SlHjK1|24E zH+|H4n97&$u??52KeIUQy{o)gUZ%5wmu_!%a|kd2j*DmBtg2Ov_KeEf#G>>R&kTyH z9~O;I-1JzUk^&7gqOJ*rvx`q9W-FR3gNRxFDdThv-Ww=wM3lVQroVlv$>~bt7`(Na zZQ*)&+H^lpxiE`>W!ul&TJ1gi`aujJfLi)skdN|*uT8oukALRB1Rfb^7pCNxkVfMR z65Hsrs*z2;hdWLT>6xp;WUd|C5KotAp7q%P!$(D9U#99#kM$0q(It2Tt2{`{L(zp!dC8K4-EW>r45YKs4PGtrV#B z!GTKVT&Niwq1}}4!lA$PL3iT{bQR Q3z;GdPP};Y^=SHk07tea00000 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light cool brown.jpg b/common/helpers/colour_estimation/hair_colours/light cool brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c59c7ace3b0f4b229ea2ce6ff4f6bfab8794953 GIT binary patch literal 5323 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light golden blonde.jpg b/common/helpers/colour_estimation/hair_colours/light golden blonde.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f02c77e3921ec48dff9d0583d8e91bbd7d2046ca GIT binary patch literal 5005 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 PKZa2hpDa%{d^7zYwN@Gn literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light golden brown.jpg b/common/helpers/colour_estimation/hair_colours/light golden brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6592a4f7d09fb78503580173849af0586173515c GIT binary patch literal 4205 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 WHQsBDAzN3-U!MHMZ~+Wm%>4(srKscp literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/medium champagne.jpg b/common/helpers/colour_estimation/hair_colours/medium champagne.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c10df03711037976c279a48fbb8c292c06f0505 GIT binary patch literal 5302 zcmbu9`8U)7+s40RFq+0r27_V7Huez_vX8NZk!5UU8OzuiONts<(uC~U6=G1bj-`?< zOSY^Ll_DV|5oz)CocBC`!FyfzIrk6OxjyIq={}x2UIMtxaHco_1OfoiKLf`LKmx$> ze_~~2VPk`^v7LmTH~~G$4P*ajZXqsSu74vWAbg7dl(2v-5`jRZSJ!yV^fjr7+o15 zht-?8M{@R4a2`D9Y(wME2T_Zro~_nwv^kOl_{sGxQgBV@P4)a^0#u4K>1hkOrZ=vOB%;DFJ;%V+iYt_{i7apq7}ashkVF=xQnWuD;2iGOx|ZZjYQp_{k#O-e^iH-OsT770C2Re zrn;?Lt_@smznQqVneKMgoT>lbqWvBt8=4RfW!0V`_j%B8ugf2RoO1_Kk`D3f=~9B%qyz8}MFG$&>_w zY)RKDY*UCn)>XV_`fKedT{Cxookc2nwqbV|TyWYs=@?iQ(L>5yns(?w+E04yE32c> zLT+rYVYlODc1-1tCS>~}ur=S#Fc$%HUc%uL&zvvkr_rewF9$6DE=X@|VXn&ydwV+5 zw_b^Mbl{ZGk!Co}3hK<4$RFsdYs#01?Z~JNU72+6e&kA77eTq_)ZTB-odffpgGizq zw_da6(WiU+w#FHH8*`s4JUTLPMo&)5G4L4tF~Hi9M<1_Qcp>&U?C(UI4TsBT_q6Hw zTcM7Mj_Gk3N!$pahV{j_!APgdqd&<$SQeCER$1JivIc=7o!f9mNra=lK=6lx2F~C1tU-K!CDI@6Ztu@^r zj|I&6`lFbK;;5Rb?ag zpRX)hn5TQA7DIEA!-4C+q)O);2Y}&}JAKy0a|fO{@nzC#?9%s}J8gl}R?^SLKPWUH zDHu-i)#4@D zMnDe6*gu%NFKcAVVxf+;y!A(X3UK6Tf+O zLe?{=y$!V+H)LZL-2DvZDODK{2l3<pl$C_n(wbw(m>WpZu|w- zdTZs6U)c?z(?2CpVM{BB)imyW1Xzm)*KNzy+r{s(Q1i=1z;irA;Chy^IJL07n3kTX zlFnhOWgF{k!$%H@8WQZEo_`oGqX8BHL^b{O?L;X@7?Dx)LhI;7{^9u z*}dG--swAoRq@bM`A0H7^+FrtKF5*-gqP%>+#Qzw_Ki(a{%@Upc=J z?%Xxq9s;wSMTkC2WGOv=doY6U?a;&fmCqt0Kb_ zT8l6Y<0IAYo)?dQ{76cN%!8J8)5EHKPU|V`g>|teuz|N-=wwH7pNkTp-KQtKvo08U z41BQ)M7E|%MiF>qh7`@U0;l&X`o$Sbbt^^bR%bjrwX@EC``-sgyk@gODp!tBH!Y(#dbYle@1LfLoR1N}n}uz2peY;3;*Ze$$Mu zx!=$R`OD#Fuf6)JU5q=@tIdC`h=sfBb<2m}(BeAthhC8c=aXx^HwP-Is$0!_$o>hx ze8Jz>ponV8C3a7Z(Do6+#`vJWm^u7Q$Y*1rYsB-CwWkNRrfnO4kJRB4Xy%SCe#r>Y z3ap_H>dv<{ZNIMOfd$@ZA2-XK$D&RZ4K9Zm!mh2BeQ$tc=^m6gLCT$YL$z;lW`)b} zZC>-`C8#0Cp3lpAMy#~f3UtH#?-wxl*C%1B+hI6=db8lp?@vN;lG((CZ`|K3Z+mW~ zl)K^ou*hhd*G6svqpE_hL#kqm4VPY%_CmYFlFFX*W#nBqQ|mhNZjrR$TIefZgwXr8 z)fh`cBO#-veHG)XTt{0@(fOT=dYZy2n@sV9UERh@iNF2D)~#8XY7zflFk_jpSWq$Y zISTm8-DQe=%WU-0 z$(H^6ivfd6SM!g7%4cz?Z!zq(?(E;>>m480D!(nRN2MtKTsTm>@hgNldpgSiRxP)U zUJAJPJ@|Bh)b57Nmivfx!{1CqbH#q7aKUInjXF;#Jttp+qFqi7B9cgdiQVOa3YQ=A z`OXcj_prHd@K)&zZur%)cS|%76uM1NJIF;Qi2iH~BUP>M<*GVY5}5ML$9{McOdGiA z$Y5N*=wVqFTf<4nYOglcnc}pRJFkg4Swa89x<^v!WzMY6R#mMZbTy8W1`2Af=2{Z~ z$l@@K&ehFM8hP zE9;!-BpqV6HFoa3w;GwIamhe$?60%6XsEGrvnkQqx^cNUAySGI}z)Lb5TcUztt*y|8VEEb)S5W8(Bn;23Cl z*OC5q5&vs&yIglZ?nr2(Q0CBUGNr!@Q69MpClN49uXL~$jqt}N&18Z&^$HCY(74b!y(3w+aI zO7gd}ACkfM&xjTrY%ECW4bm|UXp+ntrZUn?<40Q6bJsPv>xw&%?4+~Dm5jxS zD96-iYQIUI16j_Y=B(O?bUOJ+Hh@s7vM;#@2s}BmN+lgf^Jb-Z4op}ZxrT8Tz3(TmPUHkv0R{N_hrYk z2!tpb#O+`(j#Of6q#!!QQv|4PnDCE7`DIds6uX`G;MSPEVkt>vLVD3~m?(Zl*5?7t z)3$EpEt>|+a&hzu^OT!vvOCzVSLkUXVvV2O$!2LIz4MJ7N?Q7h`5Q-W1H}u3cN$5~ z8#9zegJdI>Q?7B>0tV_IY+>cxE1B`HFJaVi*&EB zGc0k|`akJ9Q?ha_9sMIZ1CeOY{Rg`P(b!UZ?=E4)GODZM&Beyd;6BxYjW?12E@O94 z{)A`M4<&tuYF0 z0~cgH^HorweOkdFw)=Lw7I(K^5i*qXSTV7ZNEjtjNAA9Qij&399a9IdgylTx>u>6k zdK~kfbf+xRAd05g_x+YOkkh!_Cb=-{bGP3kNlv-uoh#%fY0o#51DoZmJ5{q8q=WH~oIK zDw{^Qla%wwX7-JS+lgS&2>%fHa%bttwa9AcLa*x`=YuTE(VZWyD8HejkERdUw^AR( zeD`esc{)b>Y;^4F)(!}w{2oTOM>cINzJ{;8Q>DdW-5p^$I4kucB@Fi7K`U# zZm3o!^5e&Q(aWNDU;6J|3*Lj90@-;aG{^74Fb1Ic3#IVYw z>i5G`+aPAl8$fe~ZSi1m{h~RF|57A3u8*qnZEaZHu*!d0T0mXD7DfffSp>eVa1B}b z$lryv2#+sie$~{V?VCan(6I9`)zo<&XPrO8_wchMu1o+X0I9C|+V&_V`hwP&LnJ;q zmGy9u_To}#;c${NalVJot&|)ntwSubJ8^C<;xoL(dR4>8A`B3as&_F-8~jit7|x2} z$LnoI_CxfIFD|^5H+uW7VYVG}0($QUScuNS+v7~Tc$3&{D9S`tw^pBvs=aZeU3)?` zyMdpY#@!R7kycg2et8(-;4q`G85pQwm@aOlAt-cfy$HN5{n&5Ar6dGle{STZ3*G)y zaxXzM|7QZ2@-ih}CWDJg;^rxG2R3}+26P_H-r<9~>n#H5N5yNyQLk04ka7s~^qZOV z70z5WHxc=g1koFr&h}L?L9QKB!&(G?pAGCC!ne-30VFFqn6ugcNwSmsU@r1NE0g@3 z`w9MIl$Ig~2;PsS?8t(O3zPIInnteZBBrNLGcmO#oD?5ajXvKYSX_T_?C_BQ)S$sU zR)UI`Kzqg&MI7EocTP5H`&sO6q^TBBL$}j^Y9~smNIn}u1N~^7WbO4&i%Yr?=honvfnRqWZfqM#=By7_deoT`i#(W~jtvm;Lfq}Mhs%IGie^M5?1 z0yX0Kfh&F7N3G{eFOTtC1^nGN6qI!5`3qnN(nY@GdTf-|&ru`Ec)=LTq;A3a>~xYk zZL-#~$8=~~U&D4>f?|XxINsnSbc=4f#V-jFboQI!#<1-ue3mA?ioV6c-LEJ68}TR3a`Zy9_X<2N$3XeF zKYIv^i@V5Z{GArj&h*W5(GI9LkVswz0g}{(QYS5FcX9iNjr)J1lcmun)F@Q`3&jHC z*2#v-N-$^zxxQ1QeyJcT=Fv&_e7m9*>5tw&M@fhIUdO;qVP5%s4wFrG=mKWa;73xB z+7%?VImJ@ck|wtvqkGe7=ZTTty(MaB(U#d|F?NL1)J$OhATv0npO3ytvrywJzB0q0ik@h=|(Jy|PiKTgJG4JpUg8 C5L(s% literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/midnighrruby.jpg b/common/helpers/colour_estimation/hair_colours/midnighrruby.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c057e82bc280c92704c28e6e05db180217625682 GIT binary patch literal 5809 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/pure-diamond.jpg b/common/helpers/colour_estimation/hair_colours/pure-diamond.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80da260a644733efe92bc425c6622448d037f1e2 GIT binary patch literal 6282 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 G+5ZBJ_J!>L literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/red hot cinnamon.jpg b/common/helpers/colour_estimation/hair_colours/red hot cinnamon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b5185bbed6a7185136653ac794a5dedeec8d2df GIT binary patch literal 3878 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/rubyfusion.jpg b/common/helpers/colour_estimation/hair_colours/rubyfusion.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c2174cc2753066291254b1e9945a8eb5e39ab85 GIT binary patch literal 5129 zcmbtVS3KMel>JZ9dkxVBgV8$?y_X>vCCZ2vHKRw1k{QC1=t2HUK~%003PRxLO3B0A&9Sa&j_C zN(xF!8fq#kY8ob5x@$7sWMpByj+-~Q*xA^*ZivFTxnZKxB0?h4D)RCwhI)ohPBEbW zufbI>z(fgz1MLuy003qJL6|^S13)?efFYo30RIaJ6abTf$SEip0Wb&x0Yjls@@vI) z8U$tnApB5fS#3)e0oNd0W+_2XPN$Dd9_1Ds$2zfAb_fFguh)OoK%ivgOaK@R27$@J zAhQ2ybM3`{?GprHmUG2r3J`Qy-1;UCuNDAW2hkFvAPAZ`6M z?^PDw4jC)BV@yhRJd)QDeK!05AqZ%n-&||{@jOJo-a%=dA+NtWtsbYKM15Wr=pp%m zXL{m^ zq2BT|MTh`lX>{H$D^W~~BV)H#&yKhFe4TW~(#kVT&k6()P=pG=qPP^ll!DcZ=Qe|? zcBeeKAZtEvkoi>i^cz`c1e=V!{6f$#wg@>^cV9BP8As@JD@)KY=YmTAs&&C+{}s?g zf&L6mV~u`xS90;mLbEWdjWjti5JLKS)4OeO391#4FC)4QH^+x$f2JvO_*NwXoP)rL ze+^s&0!to&26=Q+iIwDbr+}FaHmVmSck#$fz#%faO$OBL4ckaO8-O?{W$M>bUTcQr z8Oc1BJ)_oGay+zuw2SOKKw3oO$f>cf=X%LY>!V)X;Q5FLZ=aZIFPiEytVc);nsp&f_7`nRDz+KO3bhh#kHSIEo`)FMOQgO6$X& zyZtRg;MbAKJ56P8vTk>)xN3$y+GG2~)G|YTApC=1GoVuxt0>N3i0|mCO{>5jeh`Sv zEy!UVzqB{Z(RWcZ7*3Yt32WrLEe0Ru)><;J2&d?`?Cbqyi8BS-UW{of8F7lpl(l)W z-W4dwV#Wj=@P!np|wmE_~#4!-?7;CUm-?nha81IHCu2&?9 z=Rv(tic2PLCrHb~dBhm2-gyO#)aUiQGS|%e+e}pN0H=FI+geR={DK#^TKjv5#LYum zRvB{C{j@NY3pBiuu6({(Yg{FqNX(|%Fz+7DmJBtLmdMHrLu8+nIqU3J%TVN3%>tRO~6ccV{fMd0DwMhN>;lO&j}iD@BRmm-6i6>Z#BVJa&jZ zNVeHVQlnVIFj9uBBeNK_8QW_;CH1GGlfBO^YOew9GAh1L_1fNsP}Ok*5-0zH8C-C5yMNGPPeib z#rP`nbL*7Q9%UBx;T^ryas_hd9B&6IQOd9q+4l`K#duaZ*pr~Eym6l5w!2HbH-sv` zPpVk+h)biWy6`S!qkJ`$Z7M<>lPn016ql@+VQ>d5yUA#^C_^+;76b67iDU{k_TzsL zfP2RITPf5;nIJY7x~ZuQ_X0+p)i}9<{9kTlthHd);6R2pGiT2wM0^58E4xX;DT1Ov z3rh8=W=Ql0SH2yAalpKC9*#QwJc3{>VHcT*;JX=`?UA7Ud%;a5cTgB@)g~bozplcf z=~3R6>#>~YH}Dg%O;{A}_k>cWYp>*3z?7jR`QeDlq?|6)@7w(0YQ|vT1XElgP2oTB zB0%E2$V_2mg{OlzEH~X&fo%$+cg*6X$tFKZT|B7! zTvxq)R2iDSE(gmGlzVK}%7{=+?ITd+zafBGT_1-Sc9ieU&ZF4&b0_hSh-K8a}Wjab{)nD=k@Vx}n>^&p4fYDpIa z`K?dnX0jgoi`aayDeqizWr$>mAk48!d) zKQP&AUUO)pDEeW%R|p`&GkDC1VnG4W^J6mwQA3S$XBbm7j|zO_a-4bmb%0se*^Y~r zdbt5&9J3;ZFM-gi0)Z4G$&n5}?WbT^c}O<#U4P{j5Qa+i@j>nLNBR2f31p!+&i$EA zOPjdr93j*+#b#v`Y+)Xq)n0th!LblGhH5YhKE`kV;qa1{7*k&QDa*qY1a7G4;t0<&*B>&z0+>veB9!W-Dd6*xg zv{FE(itl~c@+&u$;+GDoPU^nM2H&$^+|*W&8Ak~YgjL^PbSCpdjB3p9cx4NuMwtv^ z9Blr&eqiZ8_Fb@1mTCf%RR}~v#=z7W^WHCBVtd&v%+?p zzl1i+p+Z$?nZPwm9sla%5Y;WRPS~S|4H9B_T8^cy&tQGe?1!- zojN#^2M|kJog85NoA~i$b>-Kok-=jw!gf*Vb2ht99d%RVRgm?fCw#n|m70lN#)W`*Ui6Ll}1mf^XRtoK8}Po?<3IJA%0ajJ8EqR{A6 z%&F?ql zBwxPt%h8wWimCPHRWp>=6kMWH@XWHg?(KES)51mXTRlV^@=Nij;z@Hz0jyh`M@PORn&^{i&UV=Iw_I@Bj^SCCKKGRiDLMs+!Yq>)oJCS6EK{0R<8 zW992nubEyxOnlxOmB=$}HXkgi&X5=o(T>8@5zQItDMrC5yZA8+KL^JL=P?MnwK=mh z&_h%Ftv#oISa`k5b3 za^hBtv=krIug3~P*5VvgaT$Uu^&tayHVBP;5+Ek(R(H$pv=Sj}ekYTW2Y?b3I=lPWNYHVOXXjiOsJP#c30X=?gK~z@@YUGO#z-=P|Kw_3SYcKK8}cr7V^Y68$>lcCiE~2M zSxU*gOwCYb!HUkgy_H^7>}j)mw|Q7m^0&4gtDayx2PV;F1*s2gTmgjACCjem3K_gm z%9t#trr4V$uJ(lI`u%@g$v~0y7Dh{dnF|p@A9ft-{QbKZ^{`>s+u14B_ALZ}7&qL~ z2QO$XlW5qK1+pG(W(JMN5ME}7-Zf3lmD&32QS(l5&t$>Q(H7)BN7%R^*ta>mEq9Zc zdQaSO=m+Co#t#`beYw2Trq~o7Y<)j_e3Q%Z>v8MdfB{i{i!l8wpzF~nezD^xad06@ zr*7aP#BK)1t^-j$(wu|lomJjkTj-1@@vueWjLX&}#8*ynT!|xVRwh1p68zWNm9Q*0B2MWwtZ;g)oUz+~n%5RWt zbryP(2V;;w7VCP6ubhMl^&fN_-i;N0-Wma28hGF7uE3>Su(v)eG2St(^B!`kZ%p)Q zNqzZ(zW85vJcHuwVSLf<{es~y86*!jt=uK|vPN)TPmI5_HKrm*LQCD~3Rtj5I}uy- zL|u%&jk6%N+b$1z>iHeRkgT-C24#!eL8$Dm=x~=iJZazN@BSS(L4>7q`p;k9-~awW zjdIn>HhbV*OG|`%2wxK)b&hyVkshj}gxLL{-G7OhkyU$!jJh{F95o^SU3_bb*Sa3HF@r4WXmOfra>`PeFhxk aYh5+X&K%zBNJp5)<<+1n$O6-^=Km9CBpd1g literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/sparkling-amber.jpg b/common/helpers/colour_estimation/hair_colours/sparkling-amber.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e36223b9cd3bcf29e1aa3af9f8851ccc48e53fa5 GIT binary patch literal 6345 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 F{|mBFUmE}b literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/sunflower-blonde.jpg b/common/helpers/colour_estimation/hair_colours/sunflower-blonde.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48b0181bfbb707a1e7e1862dd4809a0eb096334c GIT binary patch literal 6002 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 YGGYn%+~s^_A>#@)hqa*H@XLk&0k$&Mng9R* literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/src/colour_estimation/__init__.py b/common/helpers/colour_estimation/src/colour_estimation/__init__.py index 54779f81d..66d308c9d 100644 --- a/common/helpers/colour_estimation/src/colour_estimation/__init__.py +++ b/common/helpers/colour_estimation/src/colour_estimation/__init__.py @@ -1,6 +1,10 @@ -from .rgb import RGB_COLOURS, RGB_HAIR_COLOURS - import numpy as np +import os +import cv2 +# import torch +# from scipy.ndimage import convolve + +from .rgb import * def closest_colours(requested_colour, colours): @@ -18,3 +22,326 @@ def closest_colours(requested_colour, colours): for color_name, distance in top_three_colors] return formatted_colors + + +# def avg_color_float(rgb_image: torch.Tensor, mask: torch.Tensor) -> torch.Tensor: +# mask = mask.bool() +# avg_colors = torch.zeros((rgb_image.size(0), mask.size(1), rgb_image.size(1)), device=rgb_image.device) +# for i in range(rgb_image.size(0)): +# for j in range(mask.size(1)): +# for k in range(rgb_image.size(1)): +# valid_pixels = torch.masked_select(rgb_image[i, k], mask[i, j]) +# avg_color = valid_pixels.float().mean() if valid_pixels.numel() > 0 else torch.tensor(0.0) +# avg_colors[i, j, k] = avg_color + +# return avg_colors # / 255.0 + + +# def median_color_float(rgb_image: torch.Tensor, mask: torch.Tensor) -> torch.Tensor: +# mask = mask.bool() +# median_colors = torch.zeros((rgb_image.size(0), mask.size(1), rgb_image.size(1)), device=rgb_image.device) +# for i in range(rgb_image.size(0)): +# for j in range(mask.size(1)): +# for k in range(rgb_image.size(1)): +# valid_pixels = torch.masked_select(rgb_image[i, k], mask[i, j]) +# if valid_pixels.numel() > 0: +# median_value = valid_pixels.median() +# else: +# median_value = torch.tensor(0.0, device=rgb_image.device) +# median_colors[i, j, k] = median_value +# return median_colors # / 255.0 + + +# def plot_with_matplotlib(frame, categories, masks, predictions, colours): +# """Generate an image with matplotlib, showing the original frame and masks with titles and color overlays.""" +# assert len(masks) == len(categories) == len(predictions), "Length of masks, categories, and predictions must match." + +# num_masks = len(masks) +# cols = 3 +# rows = (num_masks + 1) // cols + ((num_masks + 1) % cols > 0) # Adding 1 for the frame +# position = range(1, num_masks + 2) # +2 to include the frame in the count + +# fig = plt.figure(figsize=(15, rows * 3)) # Adjust the size as needed + +# # Add the frame as the first image +# ax = fig.add_subplot(rows, cols, 1) +# # frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) +# ax.imshow(frame) +# ax.set_title('Original Frame') +# ax.axis('off') + +# # Iterate over the masks +# for i, idx in enumerate(position[1:], start=1): # Skip 1 for the frame +# ax = fig.add_subplot(rows, cols, idx) + +# # Create an RGB image for the colored mask +# colored_mask = np.stack([masks[i-1]]*3, axis=-1) # i-1 because we skip the frame in position + +# # Apply color if category is detected and color is provided +# if predictions[i-1]: +# if (i-1) < len(colours): +# color = np.array(colours[i-1], dtype=np.uint8) # Convert color to uint8 +# color_mask = np.zeros_like(colored_mask) # Initialize color_mask with the same shape as colored_mask +# color_mask[..., 0] = masks[i-1] * color[0] # Apply color channel 0 +# color_mask[..., 1] = masks[i-1] * color[1] # Apply color channel 1 +# color_mask[..., 2] = masks[i-1] * color[2] # Apply color channel 2 +# # Now combine the colored mask with the original grayscale mask +# colored_mask = np.where(masks[i-1][:, :, None], color_mask, colored_mask).astype(np.uint8) +# # Show the colored mask +# ax.imshow(colored_mask) +# # print(np.max(mask_image)) +# # mask_image = masks[i-1] +# # ax.imshow(mask_image, cmap="gray") +# else: +# # If there's no color provided for this category, use white color +# mask_image = masks[i-1] +# ax.imshow(mask_image, cmap="gray") +# else: +# # If the category is not detected, keep the mask black +# mask_image = masks[i-1] +# ax.imshow(mask_image, cmap="gray") + + +# # mask_image = masks[i-1] +# # ax.imshow(mask_image, cmap="gray") + +# # Set title with the detection status +# detection_status = 'yes' if predictions[i-1] else 'no' +# ax.set_title(f"{categories[i-1]} - {detection_status}") +# ax.axis('off') + +# plt.tight_layout() +# fig.canvas.draw() + +# # Retrieve buffer and close the plot to avoid memory issues +# data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) +# data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) +# plt.close(fig) + +# return data + + +def count_colours_in_masked_area(img, mask, colours, filter_size=3, sort=False): + """ + Counts the number of pixels of each color within the masked area of an image. + + Parameters: + img (numpy.ndarray): An RGB image, with the shape (height, width, 3). + mask (numpy.ndarray): A binary mask, with the shape (height, width), where 1 indicates the area of interest. + colours (dict): A dictionary where keys are color names and values are the corresponding RGB values. + filter_size (int): The size of the convolution filter to apply for smoothing the image, default is 3. + sort (bool): Whether to return a sorted list of colors based on pixel count, default is False. + + Returns: + dict: A dictionary containing the count of pixels for each color in the masked area. + If sort is True, it also returns a list of tuples, each containing a color name, its proportion in the masked area, and the pixel count. This list is sorted in descending order based on pixel count. + + The function first applies an averaging filter to the image for smoothing. Then, it calculates the Euclidean distance of each pixel in the masked area to the predefined colors. It identifies the closest color for each pixel, counts the occurrences of each color, and creates a dictionary mapping colors to their respective counts. If sorting is requested, it also calculates the proportion of each color and returns a sorted list of colors based on their pixel count. + """ + avg_filter = np.ones((filter_size, filter_size, 3)) / (filter_size ** 2) + img_filtered = img + # img_filtered = convolve(img, avg_filter, mode='constant', cval=0.0) + colours_array = np.array(list(colours.values())) + masked_img = img_filtered[mask == 1] + distances = np.linalg.norm(masked_img[:, None] - colours_array, axis=2) + closest_colours = np.argmin(distances, axis=1) + unique, counts = np.unique(closest_colours, return_counts=True) + colour_counts = {list(colours.keys())[i]: count for i, count in zip(unique, counts)} + if sort: + total_pixels = sum(counts) + sorted_colours = sorted(((list(colours.keys())[i], count / total_pixels, count) + for i, count in zip(unique, counts)), key=lambda item: item[2], reverse=True) + return colour_counts, sorted_colours + + return colour_counts + + +def average_colours_by_label(labels, colours): + """ + Computes the average values of colours associated with each label. + + Parameters: + labels (dict): A dictionary where keys are label names and values are lists of binary values (0 or 1). Each list represents whether a certain feature (labelled by the key) is present (1) or not (0) in a set of instances. + colours (dict): A dictionary where keys are label names and values are dictionaries. Each inner dictionary maps colour names to lists of values (e.g., pixel counts or intensities) associated with that colour for each instance. + + Returns: + dict: A dictionary where keys are label names and values are sorted lists of tuples. Each tuple contains a colour name and its average value calculated only from instances where the label is present (1). The tuples are sorted by average values in descending order. + + The function iterates through each label, calculating the average value for each colour only from instances where the label value is 1 (present). It then sorts these average values in descending order for each label and returns this sorted list along with the label name in a dictionary. + """ + averaged_colours = {} + + for label, label_values in labels.items(): + if label not in colours.keys(): + continue + + colour_values = colours[label] + averages = {} + + for colour, values in colour_values.items(): + valid_values = [value for value, label_value in zip(values, label_values) if label_value == 1] + if valid_values: + averages[colour] = sum(valid_values) / len(valid_values) + + sorted_colours = sorted(averages.items(), key=lambda item: item[1], reverse=True) + averaged_colours[label] = sorted_colours + + return averaged_colours + + +def load_images_to_dict(root_dir): + """ + Load images from a specified directory into a dictionary, removing file extensions from the keys. + + Parameters: + root_dir (str): The root directory containing the images. + + Returns: + dict: A dictionary with image names (without extensions) as keys and their corresponding numpy arrays as values. + """ + image_dict = {} + for filename in os.listdir(root_dir): + if filename.lower().endswith(('.png', '.jpg', '.jpeg')): + img_path = os.path.join(root_dir, filename) + # Read the image using OpenCV + img = cv2.imread(img_path) + # Convert it from BGR to RGB color space + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + # Remove the file extension from the filename + name_without_extension = os.path.splitext(filename)[0] + image_dict[name_without_extension] = img + + return image_dict + + +def generate_colour_table(image_dict: dict, colour_map: dict): + """ + Generates a colour table for each image in the given dictionary, counting the colours in each image. + + Parameters: + image_dict (dict): A dictionary where keys are image identifiers and values are image arrays in the format (height, width, 3). + colour_map (dict): A dictionary mapping colour names to their respective RGB values. + + Returns: + dict: A dictionary where keys are image identifiers and values are colour tables. Each colour table is generated by the 'count_colours_in_masked_area' function and contains a count of how many times each colour (as defined in colour_map) appears in the corresponding image. + + For each image in the image_dict, this function creates a mask that covers the entire image and uses 'count_colours_in_masked_area' to count the occurrences of each colour in the colour_map within the image. The results are stored in a new dictionary, mapping each image identifier to its corresponding colour table. + """ + colour_table = {} + for k in image_dict.keys(): + colour_table[k] = count_colours_in_masked_area(image_dict[k], np.ones((image_dict[k].shape[0], image_dict[k].shape[1])), colour_map, sort=True) + return colour_table + + +def compare_colour_distributions(averaged_colours_list, colour_table_dict): + """ + Compares colour distributions between an averaged colours list and a dictionary of colour tables by calculating the Euclidean distance. + + Parameters: + averaged_colours_list (list): A list of tuples, where each tuple contains a colour name and its proportion. This is typically the output from 'average_colours_by_label'. + colour_table_dict (dict): A dictionary where keys are image identifiers and values are colour tables. Each colour table is a list of tuples, each containing a colour name, its proportion in the image, and the pixel count. + + Returns: + dict: A dictionary where keys are image identifiers and values are the Euclidean distances between the colour distribution in the image and the averaged_colours_list. + + The function iterates over each image's colour table in colour_table_dict. For each image, it calculates the Euclidean distance between the colour proportions in averaged_colours_list and the colour proportions in the image's colour table. The results are stored in a dictionary, mapping each image identifier to the calculated distance. + """ + distances = {} + + avg_colours_dict = {colour: proportion for colour, proportion in averaged_colours_list} + + for image_name, colour_data in colour_table_dict.items(): + colour_proportions = {colour: proportion for colour, proportion, _ in colour_data[1]} + + common_colours = set(avg_colours_dict.keys()) & set(colour_proportions.keys()) + avg_values = [avg_colours_dict.get(colour, 0) for colour in common_colours] + prop_values = [colour_proportions.get(colour, 0) for colour in common_colours] + + distances[image_name] = np.linalg.norm(np.array(avg_values) - np.array(prop_values)) + + sorted_distances = sorted(distances.items(), key=lambda item: item[1]) + + return sorted_distances + +# Example usage +# sorted_distances = compare_colour_distributions(averaged_colours, colour_table) + +def extract_top_colours_by_threshold(colour_list, threshold): + """ + Extracts top colours based on a cumulative proportion threshold. + + Parameters: + colour_list (list): A list of tuples, each being a 2-element (colour, proportion) or + a 3-element (colour, proportion, count) tuple. + threshold (float): A float between 0 and 1, representing the threshold for the cumulative proportion. + + Returns: + list: A list of tuples (colour, proportion), sorted by proportion in descending order, + whose cumulative proportion just exceeds the threshold. + """ + # Sort the list by proportion in descending order + sorted_colours = sorted(colour_list, key=lambda x: x[1], reverse=True) + + # Extract top colours based on the cumulative proportion threshold + cumulative_proportion = 0.0 + top_colours = [] + for colour in sorted_colours: + cumulative_proportion += colour[1] + top_colours.append((colour[0], colour[1])) + if cumulative_proportion >= threshold: + break + + return top_colours + + +def find_nearest_colour_family(colour, colour_families): + """ + Determines the nearest colour family for a given colour. + + Parameters: + colour (tuple): The colour in RGB format. + colour_families (dict): A dictionary where keys are family names and values are lists of representative RGB colours for each family. + + Returns: + str: The name of the nearest colour family. + """ + min_distance = float('inf') + nearest_family = None + + for family, representative_colours in colour_families.items(): + for rep_colour in representative_colours: + distance = np.linalg.norm(np.array(colour) - np.array(rep_colour)) + if distance < min_distance: + min_distance = distance + nearest_family = family + + return nearest_family + + +def find_nearest_colour_family(colour, colour_families): + """ + Determines the nearest colour family for a given colour based on the minimum Euclidean distance. + + Parameters: + colour (tuple): The colour in RGB format. + colour_families (dict): A dictionary where keys are family names and values are lists of representative RGB colours for each family. + + Returns: + str: The name of the nearest colour family. + """ + min_distance = float('inf') + nearest_family = None + + # Convert colour to numpy array for distance calculation + colour = np.array(colour) + + for family, family_colours in colour_families.items(): + for rep_colour in family_colours: + # Calculate the Euclidean distance + distance = np.linalg.norm(colour - np.array(rep_colour)) + if distance < min_distance: + min_distance = distance + nearest_family = family + + return nearest_family + diff --git a/common/helpers/colour_estimation/src/colour_estimation/rgb.py b/common/helpers/colour_estimation/src/colour_estimation/rgb.py index 9854f110e..40d018fdc 100644 --- a/common/helpers/colour_estimation/src/colour_estimation/rgb.py +++ b/common/helpers/colour_estimation/src/colour_estimation/rgb.py @@ -1,42 +1,163 @@ import numpy as np -RGB_COLOURS = { +COLOURS = { + "red": [255, 0, 0], + "green": [0, 255, 0], + "blue": [0, 0, 255], + "white": [255, 255, 255], + "black": [0, 0, 0], + "yellow": [255, 255, 0], + "cyan": [0, 255, 255], + "magenta": [255, 0, 255], + "gray": [128, 128, 128], + "orange": [255, 165, 0], + "purple": [128, 0, 128], + "brown": [139, 69, 19], + "pink": [255, 182, 193], + "beige": [245, 245, 220], + "maroon": [128, 0, 0], + "olive": [128, 128, 0], + "navy": [0, 0, 128], + "lime": [50, 205, 50], + "golden": [255, 223, 0], + "teal": [0, 128, 128], + "coral": [255, 127, 80], + "salmon": [250, 128, 114], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "platinum": [229, 228, 226], + "ochre": [204, 119, 34], + "burntsienna": [233, 116, 81], + "chocolate": [210, 105, 30], + "tan": [210, 180, 140], + "ivory": [255, 255, 240], + "goldenrod": [218, 165, 32], + "orchid": [218, 112, 214], + "honey": [238, 220, 130] + } + +SPESIFIC_COLOURS = { + "red": [255, 0, 0], + "green": [0, 255, 0], + "blue": [0, 0, 255], + "white": [255, 255, 255], + "black": [0, 0, 0], + "yellow": [255, 255, 0], + "cyan": [0, 255, 255], + "magenta": [255, 0, 255], + "gray": [128, 128, 128], + "orange": [255, 165, 0], + "purple": [128, 0, 128], + "brown": [139, 69, 19], + "pink": [255, 182, 193], + "beige": [245, 245, 220], + "maroon": [128, 0, 0], + "olive": [128, 128, 0], + "navy": [0, 0, 128], + "lime": [50, 205, 50], + "golden": [255, 223, 0], + "teal": [0, 128, 128], + "coral": [255, 127, 80], + "salmon": [250, 128, 114], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "platinum": [229, 228, 226], + "ochre": [204, 119, 34], + "burntsienna": [233, 116, 81], + "chocolate": [210, 105, 30], + "tan": [210, 180, 140], + "ivory": [255, 255, 240], + "goldenrod": [218, 165, 32], + "orchid": [218, 112, 214], + "honey": [238, 220, 130], + "lavender": [230, 230, 250], + "mint": [189, 252, 201], + "peach": [255, 229, 180], + "ruby": [224, 17, 95], + "indigo": [75, 0, 130], + "amber": [255, 191, 0], + "emerald": [80, 200, 120], + "sapphire": [15, 82, 186], + "aquamarine": [127, 255, 212], + "periwinkle": [204, 204, 255], + "fuchsia": [255, 0, 255], + "raspberry": [227, 11, 92], + "slate": [112, 128, 144], + "charcoal": [54, 69, 79] + } + +DETAILED_COLOURS = { + "light_red": [255, 204, 204], + "bright_red": [255, 0, 0], + "dark_red": [139, 0, 0], + "light_green": [204, 255, 204], + "bright_green": [0, 255, 0], + "dark_green": [0, 100, 0], + "light_blue": [204, 204, 255], + "bright_blue": [0, 0, 255], + "dark_blue": [0, 0, 139], + "light_yellow": [255, 255, 204], + "bright_yellow": [255, 255, 0], + "dark_yellow": [204, 204, 0], + "light_cyan": [204, 255, 255], + "bright_cyan": [0, 255, 255], + "dark_cyan": [0, 139, 139], + "light_magenta": [255, 204, 255], + "bright_magenta": [255, 0, 255], + "dark_magenta": [139, 0, 139], + "light_orange": [255, 229, 204], + "bright_orange": [255, 165, 0], + "dark_orange": [255, 140, 0], + "light_purple": [229, 204, 255], + "bright_purple": [128, 0, 128], + "dark_purple": [102, 0, 102], + "light_pink": [255, 204, 229], + "bright_pink": [255, 105, 180], + "dark_pink": [255, 20, 147], + "light_brown": [210, 180, 140], + "medium_brown": [165, 42, 42], + "dark_brown": [101, 67, 33], + # ... +} + +COLOUR_FAMILIES = { + "light_reds": [[255, 182, 193], [255, 192, 203], [255, 160, 122]], + "dark_reds": [[139, 0, 0], [178, 34, 34], [165, 42, 42]], + "light_blues": [[173, 216, 230], [135, 206, 250], [176, 224, 230]], + "dark_blues": [[0, 0, 139], [25, 25, 112], [0, 0, 128]], + "bluish_greens": [[102, 205, 170], [32, 178, 170], [72, 209, 204]], + "light_greens": [[144, 238, 144], [152, 251, 152], [143, 188, 143]], + "dark_greens": [[0, 100, 0], [34, 139, 34], [47, 79, 79]], + "yellows": [[255, 255, 0], [255, 255, 102], [255, 215, 0]], + "oranges": [[255, 165, 0], [255, 140, 0], [255, 69, 0]], + "purples": [[128, 0, 128], [147, 112, 219], [138, 43, 226]], + "pinks": [[255, 192, 203], [255, 182, 193], [255, 105, 180]], + "browns": [[165, 42, 42], [139, 69, 19], [160, 82, 45]], + "cyans": [[0, 255, 255], [0, 139, 139], [72, 209, 204]], + "greys": [[128, 128, 128], [169, 169, 169], [192, 192, 192]], + # ... +} + +SIMPLIFIED_COLOURS = { "red": [255, 0, 0], "green": [0, 255, 0], "blue": [0, 0, 255], "white": [255, 255, 255], "black": [0, 0, 0], "yellow": [255, 255, 0], - "cyan": [0, 255, 255], - "magenta": [255, 0, 255], "gray": [128, 128, 128], "orange": [255, 165, 0], "purple": [128, 0, 128], - "brown": [139, 69, 19], "pink": [255, 182, 193], + "light blue": [173, 216, 230], + "dark green": [0, 100, 0], + "light gray": [211, 211, 211], + "dark red": [139, 0, 0], "beige": [245, 245, 220], - "maroon": [128, 0, 0], - "olive": [128, 128, 0], - "navy": [0, 0, 128], - "lime": [50, 205, 50], - "golden": [255, 223, 0], - "teal": [0, 128, 128], - "coral": [255, 127, 80], - "salmon": [250, 128, 114], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "platinum": [229, 228, 226], - "ochre": [204, 119, 34], - "burntsienna": [233, 116, 81], - "chocolate": [210, 105, 30], - "tan": [210, 180, 140], - "ivory": [255, 255, 240], - "goldenrod": [218, 165, 32], - "orchid": [218, 112, 214], - "honey": [238, 220, 130] + "navy": [0, 0, 128] } -RGB_HAIR_COLOURS = { +HAIR_COLOURS = { 'midnight black': (9, 8, 6), 'off black': (44, 34, 43), 'strong dark brown': (58, 48, 36), @@ -65,4 +186,5 @@ 'white blonde': (255, 24, 225), 'platinum blonde': (202, 191, 177), 'russet red': (145, 74, 67), - 'terra cotta': (181, 82, 57)} + 'terra cotta': (181, 82, 57) + } \ No newline at end of file diff --git a/common/helpers/torch_module/src/torch_module/modules/__init__.py b/common/helpers/torch_module/src/torch_module/modules/__init__.py index b0eac41aa..26331726f 100644 --- a/common/helpers/torch_module/src/torch_module/modules/__init__.py +++ b/common/helpers/torch_module/src/torch_module/modules/__init__.py @@ -129,3 +129,170 @@ def forward(self, x): if self.sigmoid: x = torch.sigmoid(x) return x + + +def x2conv(in_channels, out_channels, inner_channels=None): + inner_channels = out_channels // 2 if inner_channels is None else inner_channels + down_conv = nn.Sequential( + nn.Conv2d(in_channels, inner_channels, kernel_size=3, padding=1, bias=False), + nn.BatchNorm2d(inner_channels), + nn.ReLU(inplace=True), + nn.Conv2d(inner_channels, out_channels, kernel_size=3, padding=1, bias=False), + nn.BatchNorm2d(out_channels), + nn.ReLU(inplace=True)) + return down_conv + + +class Encoder(nn.Module): + def __init__(self, in_channels, out_channels): + super(Encoder, self).__init__() + self.down_conv = x2conv(in_channels, out_channels) + self.pool = nn.MaxPool2d(kernel_size=2, ceil_mode=True) + + def forward(self, x): + x = self.down_conv(x) + x = self.pool(x) + return x + + +class Decoder(nn.Module): + def __init__(self, in_channels, out_channels): + super(Decoder, self).__init__() + self.up = nn.ConvTranspose2d(in_channels, in_channels // 2, kernel_size=2, stride=2) + self.up_conv = x2conv(in_channels, out_channels) + + def forward(self, x_copy, x, interpolate=True): + x = self.up(x) + + if (x.size(2) != x_copy.size(2)) or (x.size(3) != x_copy.size(3)): + if interpolate: + # Iterpolating instead of padding + x = F.interpolate(x, size=(x_copy.size(2), x_copy.size(3)), + mode="bilinear", align_corners=True) + else: + # Padding in case the incomping volumes are of different sizes + diffY = x_copy.size()[2] - x.size()[2] + diffX = x_copy.size()[3] - x.size()[3] + x = F.pad(x, (diffX // 2, diffX - diffX // 2, + diffY // 2, diffY - diffY // 2)) + + # Concatenate + x = torch.cat([x_copy, x], dim=1) + x = self.up_conv(x) + return x + + +class UNetWithResnet18Encoder(nn.Module): + class Decoder(nn.Module): + def __init__(self, in_channels, skip_channels, out_channels): + super(UNetWithResnet18Encoder.Decoder, self).__init__() + self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2) + self.up_conv = x2conv(out_channels + skip_channels, out_channels) + + def forward(self, x_copy, x): + x = self.up(x) + if x.size(2) != x_copy.size(2) or x.size(3) != x_copy.size(3): + x = F.interpolate(x, size=(x_copy.size(2), x_copy.size(3)), mode='bilinear', align_corners=True) + x = torch.cat((x_copy, x), dim=1) + x = self.up_conv(x) + return x + + def __init__(self, num_classes, in_channels=3, freeze_bn=False, sigmoid=True): + super(UNetWithResnet18Encoder, self).__init__() + self.sigmoid = sigmoid + resnet18 = models.resnet18(pretrained=True) + + if in_channels != 3: + resnet18.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) + + self.encoder1 = nn.Sequential(resnet18.conv1, resnet18.bn1, resnet18.relu) + self.encoder2 = resnet18.layer1 + self.encoder3 = resnet18.layer2 + self.encoder4 = resnet18.layer3 + self.encoder5 = resnet18.layer4 + + self.up1 = UNetWithResnet18Encoder.Decoder(512, 256, 256) + self.up2 = UNetWithResnet18Encoder.Decoder(256, 128, 128) + self.up3 = UNetWithResnet18Encoder.Decoder(128, 64, 64) + self.up4 = UNetWithResnet18Encoder.Decoder(64, 64, 64) + + self.final_conv = nn.Conv2d(64, num_classes, kernel_size=1) + self._initialize_weights() + + if freeze_bn: + self.freeze_bn() + + def _initialize_weights(self): + for module in self.modules(): + if isinstance(module, nn.Conv2d) or isinstance(module, nn.ConvTranspose2d): + nn.init.kaiming_normal_(module.weight) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.BatchNorm2d): + module.weight.data.fill_(1) + module.bias.data.zero_() + + def forward(self, x): + x1 = self.encoder1(x) + x2 = self.encoder2(x1) + x3 = self.encoder3(x2) + x4 = self.encoder4(x3) + x5 = self.encoder5(x4) + + x = self.up1(x4, x5) + x = self.up2(x3, x) + x = self.up3(x2, x) + x = self.up4(x1, x) + x = F.interpolate(x, size=(x.size(2)*2, x.size(3)*2), mode='bilinear', align_corners=True) + + x = self.final_conv(x) + + if self.sigmoid: + x = torch.sigmoid(x) + return x + + def freeze_bn(self): + for module in self.modules(): + if isinstance(module, nn.BatchNorm2d): + module.eval() + + +class MultiLabelResNet(nn.Module): + def __init__(self, num_labels, input_channels=3, sigmoid=True, pretrained=True,): + super(MultiLabelResNet, self).__init__() + self.model = models.resnet18(pretrained=pretrained) + self.sigmoid = sigmoid + + if input_channels != 3: + self.model.conv1 = nn.Conv2d(input_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) + + num_ftrs = self.model.fc.in_features + + self.model.fc = nn.Linear(num_ftrs, num_labels) + + def forward(self, x): + x = self.model(x) + if self.sigmoid: + x = torch.sigmoid(x) + return x + + +class CombinedModel(nn.Module): + def __init__(self, segment_model: nn.Module, predict_model: nn.Module, cat_layers:int=None): + super(CombinedModel, self).__init__() + self.segment_model = segment_model + self.predict_model = predict_model + self.cat_layers = cat_layers + + def forward(self, x: torch.Tensor): + seg_masks = self.segment_model(x) + + if self.cat_layers: + seg_masks_ = seg_masks[:, 0:self.cat_layers] + x = torch.cat((x, seg_masks_), dim=1) + else: + x = torch.cat((x, seg_masks), dim=1) + + logic_outputs = self.predict_model(x) + return seg_masks, logic_outputs + diff --git a/common/vision/lasr_vision_msgs/msg/FeatureWithColour.msg b/common/vision/lasr_vision_msgs/msg/FeatureWithColour.msg index fe9ca3d71..21702415b 100644 --- a/common/vision/lasr_vision_msgs/msg/FeatureWithColour.msg +++ b/common/vision/lasr_vision_msgs/msg/FeatureWithColour.msg @@ -1,5 +1,8 @@ # Feature name string name +# Feature label +bool label + # Colour predictions -lasr_vision_msgs/ColourPrediction[] colours +string[] colours diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv index e958bcd57..fe7aa0812 100644 --- a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv @@ -11,4 +11,5 @@ string torso_mask_dtype --- # Detection result -lasr_vision_msgs/FeatureWithColour[] detected_features \ No newline at end of file +lasr_vision_msgs/FeatureWithColour[] detected_features +# string detected_features diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index ec5081ba7..fb51c5265 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -1,74 +1,43 @@ from lasr_vision_msgs.srv import TorchFaceFeatureDetection, TorchFaceFeatureDetectionRequest, TorchFaceFeatureDetectionResponse from lasr_vision_msgs.msg import FeatureWithColour, ColourPrediction -from colour_estimation import closest_colours, RGB_COLOURS, RGB_HAIR_COLOURS from cv2_img import msg_to_cv2_img from torch_module.helpers import binary_erosion_dilation, median_color_float from numpy2message import message2numpy import numpy as np +import cv2 import torch import rospy +import rospkg import lasr_vision_torch - - -model = lasr_vision_torch.load_face_classifier_model() +from os import path def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetectionResponse: # decode the image rospy.loginfo('Decoding') - frame = msg_to_cv2_img(request.image_raw) + full_frame = msg_to_cv2_img(request.image_raw) torso_mask_data, torso_mask_shape, torso_mask_dtype = request.torso_mask_data, request.torso_mask_shape, request.torso_mask_dtype head_mask_data, head_mask_shape, head_mask_dtype = request.head_mask_data, request.head_mask_shape, request.head_mask_dtype - torsal_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) + torso_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) head_mask = message2numpy(head_mask_data, head_mask_shape, head_mask_dtype) - # print(torso_mask_shape) - # print(head_mask_shape) - - # 'hair', 'hat', 'glasses', 'face' - input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() - input_image /= 255.0 - masks_batch_pred, pred_classes = model(input_image) - - thresholds_mask = [ - 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, - ] - thresholds_pred = [ - 0.6, 0.8, 0.1, 0.5, - ] - erosion_iterations = 1 - dilation_iterations = 1 - categories = ['hair', 'hat', 'glasses', 'face',] - - masks_batch_pred = binary_erosion_dilation( - masks_batch_pred, thresholds=thresholds_mask, - erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations - ) - - median_colours = (median_color_float( - input_image, masks_batch_pred).detach().squeeze(0)*255).numpy().astype(np.uint8) - - # discarded: masks = masks_batch_pred.detach().squeeze(0).numpy().astype(np.uint8) - # discarded: mask_list = [masks[i,:,:] for i in range(masks.shape[0])] - - pred_classes = pred_classes.detach().squeeze(0).numpy() - # discarded: class_list = [categories[i] for i in range( - # pred_classes.shape[0]) if pred_classes[i].item() > thresholds_pred[i]] - colour_list = [median_colours[i, :] - for i in range(median_colours.shape[0])] + head_frame = lasr_vision_torch.extract_mask_region(full_frame, head_mask.astype(np.uint8), expand_x=0.4, expand_y=0.5) + torso_frame = lasr_vision_torch.extract_mask_region(full_frame, torso_mask.astype(np.uint8), expand_x=0.2, expand_y=0.0) + class_pred, colour_pred = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) + response = TorchFaceFeatureDetectionResponse() - response.detected_features = [ - FeatureWithColour(categories[i], [ - ColourPrediction(colour, distance) - for colour, distance - in closest_colours(colour_list[i], RGB_HAIR_COLOURS if categories[i] == 'hair' else RGB_COLOURS) - ]) - for i - in range(pred_classes.shape[0]) - if pred_classes[i].item() > thresholds_pred[i] - ] - + # response.detected_features = str(class_pred) + str(colour_pred) + response.detected_features = [] + for c in ['hair', 'hat', 'glasses', 'cloth',]: + colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} + sorted_list = sorted(colour_pred[c].items(), key=lambda item: item[1], reverse=True) + rospy.loginfo(str(sorted_list)) + if len(sorted_list) > 3: + sorted_list = sorted_list[0:3] + sorted_list = [k for k, v in sorted_list] + # rospy.loginfo(str(colour_pred[c])) + response.detected_features.append(FeatureWithColour(c, class_pred[c], sorted_list)) return response @@ -80,7 +49,7 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti # # 'hair', 'hat', 'glasses', 'face' # input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() # input_image /= 255.0 -# masks_batch_pred, pred_classes = model(input_image) +# masks_batch_pred, pred_classes = lasr_vision_torch.model(input_image) # thresholds_mask = [ # 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, @@ -110,16 +79,17 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti # for i in range(median_colours.shape[0])] # response = TorchFaceFeatureDetectionResponse() -# response.detected_features = [ -# FeatureWithColour(categories[i], [ -# ColourPrediction(colour, distance) -# for colour, distance -# in closest_colours(colour_list[i], RGB_HAIR_COLOURS if categories[i] == 'hair' else RGB_COLOURS) -# ]) -# for i -# in range(pred_classes.shape[0]) -# if pred_classes[i].item() > thresholds_pred[i] -# ] +# # response.detected_features = [ +# # FeatureWithColour(categories[i], [ +# # ColourPrediction(colour, distance) +# # for colour, distance +# # in closest_colours(colour_list[i], HAIR_COLOURS if categories[i] == 'hair' else COLOURS) +# # ]) +# # for i +# # in range(pred_classes.shape[0]) +# # if pred_classes[i].item() > thresholds_pred[i] +# # ] +# response.detected_features = "feature" # return response # test test diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index fa62dbc3f..b1d380b4a 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -1,21 +1,317 @@ -from torch_module.modules import DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression -from torch_module.helpers import load_torch_model +from torch_module.modules import UNetWithResnet18Encoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression +from torch_module.helpers import load_torch_model, binary_erosion_dilation +from colour_estimation import closest_colours, load_images_to_dict, generate_colour_table, average_colours_by_label, count_colours_in_masked_area +from colour_estimation import COLOURS, HAIR_COLOURS, SPESIFIC_COLOURS, DETAILED_COLOURS + +import numpy as np +import cv2 +import torch +import rospy import rospkg +import lasr_vision_torch from os import path def load_face_classifier_model(): cat_layers = 4 - # 'cloth', 'hair', 'hat', 'glasses', 'face', - segment_model = DeepLabV3PlusMobileNetV3(num_classes=4) - # 'hair', 'hat', 'glasses', 'face', ; first three with colours, rgb - predict_model = MultiLabelMobileNetV3Large(cat_layers, 7) - model = CombinedModelNoRegression( - segment_model, predict_model, cat_layers=cat_layers) + segment_model = UNetWithResnet18Encoder(num_classes=4) + predict_model = MultiLabelResNet(num_labels=4, input_channels=7) + model = CombinedModel(segment_model, predict_model, cat_layers=cat_layers) model.eval() r = rospkg.RosPack() model, _, _, _ = load_torch_model(model, None, path=path.join(r.get_path( - "lasr_vision_torch"), "models", "best_model_epoch_31.pth"), cpu_only=True) + "lasr_vision_torch"), "models", "model.pth"), cpu_only=True) return model + + +model = load_face_classifier_model() +# setups +face_th_rate = 0.05 +thresholds_mask = [ + 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, +] +thresholds_pred = [ + 0.6, 0.8, 0.1, 0.5, +] +erosion_iterations = 1 +dilation_iterations = 1 +colour_distance_rate = 1.2 +categories = ['hair', 'hat', 'glasses', 'face',] +cat_layers = 4 + +# prepare hair colour table +r = rospkg.RosPack() +image_dict = load_images_to_dict(path.join(r.get_path( + "colour_estimation"), "hair_colours")) +hair_colour_table = generate_colour_table(image_dict, SPESIFIC_COLOURS) + + +def pad_image_to_even_dims(image): + # Get the current shape of the image + height, width, _ = image.shape + + # Calculate the padding needed for height and width + height_pad = 0 if height % 2 == 0 else 1 + width_pad = 0 if width % 2 == 0 else 1 + + # Pad the image. Pad the bottom and right side of the image + padded_image = np.pad(image, ((0, height_pad), (0, width_pad), (0, 0)), mode='constant', constant_values=0) + + return padded_image + + +def extract_mask_region(frame, mask, expand_x=0.5, expand_y=0.5): + """ + Extracts the face region from the image and expands the region by the specified amount. + + :param frame: The source image. + :param mask: The mask with the face part. + :param expand_x: The percentage to expand the width of the bounding box. + :param expand_y: The percentage to expand the height of the bounding box. + :return: The extracted face region as a numpy array, or None if not found. + """ + contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + if contours: + largest_contour = max(contours, key=cv2.contourArea) + x, y, w, h = cv2.boundingRect(largest_contour) + + # Expand the bounding box + new_w = w * (1 + expand_x) + new_h = h * (1 + expand_y) + x -= (new_w - w) // 2 + y -= (new_h - h) // 2 + + # Ensure the new bounding box is within the frame dimensions + x = int(max(0, x)) + y = int(max(0, y)) + new_w = min(frame.shape[1] - x, new_w) + new_h = min(frame.shape[0] - y, new_h) + + face_region = frame[y:y+int(new_h), x:x+int(new_w)] + return face_region + return None + + +def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): + """ + Processes the head frame to extract class counts and color information for head-related classes. + + Args: + - head_frame (np.ndarray): The head frame extracted by the BodyPix model. + - model: A PyTorch model instance for classifying and predicting masks for head features. + - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. + - thresholds_pred: A list of prediction thresholds. + + Returns: + - Tuple[dict, dict]: A tuple containing two dictionaries: + - head_class_count: A dictionary with counts for each head-related class. + - head_class_colours: A dictionary with color information for each head-related class. + """ + head_class_count = { + 'hair': 0, + 'hat': 0, + 'glasses': 0, + } + head_class_colours = { + 'hair': {}, + 'hat': {}, + 'glasses': {}, + } + + if head_frame is not None: + # try: + # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) + # cv2.imshow('Head Frame', _head_frame_bgr) + # except Exception as ignore: + # pass + + # Convert head frame to PyTorch tensor and normalize + head_frame_tensor = torch.from_numpy(head_frame).permute(2, 0, 1).unsqueeze(0).float() / 255.0 + masks_batch_pred, pred_classes = model(head_frame_tensor) + + # Apply binary erosion and dilation to the masks + processed_masks = binary_erosion_dilation( + masks_batch_pred, thresholds=thresholds_mask, + erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations + ) + masks = processed_masks.detach().squeeze(0).numpy().astype(np.uint8) + mask_list = [masks[i,:,:] for i in range(masks.shape[0])] + pred_classes = pred_classes.detach().squeeze(0).numpy() + + # Determine if each class is present + class_list = [pred_classes[i].item() > thresholds_pred[i] for i in range(pred_classes.shape[0])] + + # Update class count + for each_class, k in zip(class_list[0:3], ['hair', 'hat', 'glasses']): + head_class_count[k] = int(each_class) + + # Update class colours + for f, each_mask, k, c_map in zip([head_frame, head_frame, head_frame], mask_list[0:2], ['hair', 'hat', 'glasses'], [SPESIFIC_COLOURS, DETAILED_COLOURS, DETAILED_COLOURS]): + colours = count_colours_in_masked_area(f, each_mask, c_map, sort=True)[1] + for colour in colours: + if colour[0] not in head_class_colours[k]: + head_class_colours[k][colour[0]] = [colour[1]] + else: + head_class_colours[k][colour[0]].append(colour[1]) + + return head_class_count, head_class_colours + + +def process_cloth(full_frame, torso_mask): + """ + Processes the full frame with the torso mask to extract class counts and color information for cloth. + + Args: + - full_frame (np.ndarray): The full original frame from the video source. + - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. + + Returns: + - Tuple[dict, dict]: A tuple containing two dictionaries: + - cloth_class_count: A dictionary with counts for the cloth class. + - cloth_class_colours: A dictionary with color information for the cloth class. + """ + cloth_class_count = { + 'cloth': 0, + } + cloth_class_colours = { + 'cloth': {}, + } + + # Check if cloth is detected + if torso_mask is not None and np.sum(torso_mask) >= 50: + cloth_class_count['cloth'] = 1 + + # Update cloth colours + colours = count_colours_in_masked_area(full_frame, torso_mask, DETAILED_COLOURS, sort=True)[1] + for colour in colours: + if colour[0] not in cloth_class_colours['cloth']: + cloth_class_colours['cloth'][colour[0]] = [colour[1]] + else: + cloth_class_colours['cloth'][colour[0]].append(colour[1]) + + return cloth_class_count, cloth_class_colours + + +# you can use this function directly for prediction. +def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): + """ + Predicts classes and color information for a single processed video frame. + + Args: + - head_frame (np.ndarray): The head frame extracted by the BodyPix model. + - full_frame (np.ndarray): The full original frame from the video source. + - head_mask (np.ndarray): The head mask extracted by the BodyPix model. + - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. + - model: A PyTorch model instance for classifying and predicting masks for head features. + - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. + - thresholds_pred: A list of prediction thresholds. + + Returns: + - Tuple[dict, dict]: A tuple containing: + - class_pred: A dictionary with predicted classes for the single frame. + - colour_pred: A dictionary with predicted colors for the single frame. + """ + class_count = { + 'hair': 0, + 'hat': 0, + 'glasses': 0, + 'cloth': 0, + } + class_colours = { + 'hair': {}, + 'hat': {}, + 'glasses': {}, + 'cloth': {}, + } + + head_frame = pad_image_to_even_dims(head_frame) + torso_frame = pad_image_to_even_dims(torso_frame) + + # Process head and cloth separately for the single frame + head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) + cloth_class_count, cloth_class_colours = process_cloth(full_frame, torso_mask) + + # Update class counts and colours + for k in head_class_count: + class_count[k] = head_class_count[k] + class_colours[k] = head_class_colours[k] + + class_count['cloth'] = cloth_class_count['cloth'] + class_colours['cloth'] = cloth_class_colours['cloth'] + + # Compute final class predictions and colors for the single frame + class_pred = {k: bool(class_count[k]) for k in class_count} + colour_pred = {k: v for k, v in class_colours.items()} + + # class_pred, colour_pred = None, None + + return class_pred, colour_pred + + +# # if able to provide multiple frames (see __main__ seciton), then this should work better than the single frame version. +# def predict_frames(head_frames, torso_frames, full_frames, head_masks, torso_masks, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred, SPESIFIC_COLOURS): +# """ +# Predicts classes and color information for a sequence of processed video frames. + +# Args: +# - head_frames (list[np.ndarray]): List of head frames extracted by the BodyPix model. +# - torso_frames (list[np.ndarray]): List of body frames extracted by the BodyPix model. +# - full_frames (list[np.ndarray]): List of full original frames from the video source. +# - head_masks (list[np.ndarray]): List of head masks extracted by the BodyPix model. +# - torso_masks (list[np.ndarray]): List of torso masks extracted by the BodyPix model. +# - model: A PyTorch model instance for classifying and predicting masks for head features. +# - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. +# - thresholds_pred: A list of prediction thresholds. +# - SPESIFIC_COLOURS: A dictionary of specific colors. + +# Returns: +# - Tuple[dict, dict]: A tuple containing: +# - class_pred: A dictionary with predicted classes. +# - colour_pred: A dictionary with predicted colors. +# """ +# total_class_count = { +# 'hair': [], +# 'hat': [], +# 'glasses': [], +# 'cloth': [], +# } +# total_class_colours = { +# 'hair': {}, +# 'hat': {}, +# 'glasses': {}, +# 'cloth': {}, +# } + +# for head_frame, torso_frame, full_frame, head_mask, torso_mask in zip(head_frames, torso_frames, full_frames, head_masks, torso_masks): +# head_frame = pad_image_to_even_dims(head_frame) +# torso_frame = pad_image_to_even_dims(torso_frame) + +# # Process head and cloth separately +# head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) +# cloth_class_count, cloth_class_colours = process_cloth(full_frame, torso_mask) + +# # Accumulate class counts and colours +# for k in head_class_count: +# total_class_count[k].append(head_class_count[k]) +# if k in head_class_colours: +# for colour, count in head_class_colours[k].items(): +# if colour not in total_class_colours[k]: +# total_class_colours[k][colour] = count +# else: +# total_class_colours[k][colour].extend(count) + +# total_class_count['cloth'].append(cloth_class_count['cloth']) +# for colour, count in cloth_class_colours['cloth'].items(): +# if colour not in total_class_colours['cloth']: +# total_class_colours['cloth'][colour] = count +# else: +# total_class_colours['cloth'][colour].extend(count) + +# # Compute final class predictions and colors +# class_pred = {k: sum(v) >= len(v) / 2 for k, v in total_class_count.items()} +# colour_pred = average_colours_by_label(total_class_count, total_class_colours) + +# return class_pred, colour_pred + diff --git a/skills/scripts/unit_test_describe_people.py b/skills/scripts/unit_test_describe_people.py index 3cf73d34c..3445980b9 100644 --- a/skills/scripts/unit_test_describe_people.py +++ b/skills/scripts/unit_test_describe_people.py @@ -14,6 +14,7 @@ sm.add('DESCRIBE', DescribePeople(), transitions={ 'succeeded': 'end', 'failed': 'end'}) + # while True: sm.execute() print('\n\nDetected people:', sm.userdata['people']) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index d64b07cee..29a37c1ae 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -6,7 +6,7 @@ import cv2_img import numpy as np -from colour_estimation import closest_colours, RGB_COLOURS +# from colour_estimation import closest_colours, RGB_COLOURS from lasr_vision_msgs.msg import BodyPixMaskRequest, ColourPrediction, FeatureWithColour from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection from numpy2message import numpy2message @@ -171,57 +171,57 @@ def execute(self, userdata): head_mask_data, head_mask_shape, head_mask_dtype, ).detected_features) - # process part masks - for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): - part_mask = np.array(bodypix_mask.mask).reshape( - bodypix_mask.shape[0], bodypix_mask.shape[1]) - - # filter out part for current person segmentation - try: - part_mask[mask_bin == 0] = 0 - except Exception: - rospy.logdebug('|> Failed to check {part} is visible') - continue - - if part_mask.any(): - rospy.logdebug(f'|> Person has {part} visible') - else: - rospy.logdebug( - f'|> Person does not have {part} visible') - continue - - # do colour processing on the torso - if part == 'torso': - try: - features.append(FeatureWithColour("torso", [ - ColourPrediction(colour, distance) - for colour, distance - in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) - ])) - except Exception as e: - rospy.logerr(f"Failed to process colour: {e}") - - # do feature extraction on the head - if part == 'head': - try: - # crop out face - face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( - userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) - - mask_image_only_face = mask_image.copy() - mask_image_only_face[face_mask == 0] = 0 - - face_region = cv2_img.extract_mask_region( - img, mask_image_only_face) - if face_region is None: - raise Exception( - "Failed to extract mask region") - - msg = cv2_img.cv2_img_to_msg(face_region) - features.extend(self.torch_face_features( - msg, False).detected_features) - except Exception as e: - rospy.logerr(f"Failed to process extraction: {e}") + # # process part masks + # for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): + # part_mask = np.array(bodypix_mask.mask).reshape( + # bodypix_mask.shape[0], bodypix_mask.shape[1]) + + # # filter out part for current person segmentation + # try: + # part_mask[mask_bin == 0] = 0 + # except Exception: + # rospy.logdebug('|> Failed to check {part} is visible') + # continue + + # if part_mask.any(): + # rospy.logdebug(f'|> Person has {part} visible') + # else: + # rospy.logdebug( + # f'|> Person does not have {part} visible') + # continue + + # # do colour processing on the torso + # if part == 'torso': + # try: + # features.append(FeatureWithColour("torso", [ + # ColourPrediction(colour, distance) + # for colour, distance + # in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) + # ])) + # except Exception as e: + # rospy.logerr(f"Failed to process colour: {e}") + + # # do feature extraction on the head + # if part == 'head': + # try: + # # crop out face + # face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( + # userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) + + # mask_image_only_face = mask_image.copy() + # mask_image_only_face[face_mask == 0] = 0 + + # face_region = cv2_img.extract_mask_region( + # img, mask_image_only_face) + # if face_region is None: + # raise Exception( + # "Failed to extract mask region") + + # msg = cv2_img.cv2_img_to_msg(face_region) + # features.extend(self.torch_face_features( + # msg, False).detected_features) + # except Exception as e: + # rospy.logerr(f"Failed to process extraction: {e}") people.append({ 'detection': person, From 7e3c7afce5c5b702a4142cc1cb5f81a9de97b1cc Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 10:46:20 +0000 Subject: [PATCH 08/69] fixed that torsal and head frames were inversed. --- common/vision/lasr_vision_torch/full_frame.jpg | Bin 0 -> 70408 bytes common/vision/lasr_vision_torch/head_frame.jpg | Bin 0 -> 34700 bytes .../src/lasr_vision_torch/__init__.py | 15 ++++++++++++++- common/vision/lasr_vision_torch/torso_frame.jpg | Bin 0 -> 20771 bytes skills/src/lasr_skills/describe_people.py | 2 +- 5 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 common/vision/lasr_vision_torch/full_frame.jpg create mode 100644 common/vision/lasr_vision_torch/head_frame.jpg create mode 100644 common/vision/lasr_vision_torch/torso_frame.jpg diff --git a/common/vision/lasr_vision_torch/full_frame.jpg b/common/vision/lasr_vision_torch/full_frame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f307b546a1e7c72a4ed67d640560ffa3c628900 GIT binary patch literal 70408 zcmbTcWl$VX)IPefI0S;bF1on8I|=TR1P$))u2~i*uy}9}1Sf(o5+FFiVUghO_UHG$ zRrh|mAMU+ps?W^S^z=MWch%H6r=REf=QY4
Lg01^@afb?_3nE zpP>N%^Qb5&Kom4oG_?O|=$II2=$PneXc*WSm{|YW%M}hb7S4Y+{|)lLuOg!Yfv8yM zXz2gb<^Pj=?gHRrAgv*X0g)I0$oNP=e5B_-0PPD-)c=9^0``9m2^oljiiZ9I1N)^z z^XnJ*K;R2#)EC4ry@Ow#15of$3Fvuc(FnCI&>7r`_`*|)FhFt*-NZT*Cye}-9ub&W zB&1~I6im!4tZZNbK_OugQ89T1MI~hwRW)5beFH-yV-qWDn~%13_70w2-afv5{sECu z(J`@c@d>GE=^2@yv$A1dic3n%$}1|X8oxC)x3spkcl7l3^$)-YhlVGore|j7=Kn6N zZy+|ews-#R?wy{UUtC^Y-`w8)#|sGn{9jrx{{N8|{tGYU|JDHgKVC@4zAp`kkAh0i zi$)-;jc(yi$iNqlK_r(_)X7e@86h{};3Wi`f6o zYXN`*M0!~~AU;4EP`q_MTVh1Mgld)=s8eE{YsGkh+*IpKGC-2=isn*(DY8*#RM13RZ>x zQcITEiC`11+uWazdiW)DJXvoKV_(T^`~EJue3fx6LIm zKW?EfnCM)Osba<3TaYPny{CH3a*L;y*h0`Q)Licpdm!f6q1fukV~HIA<%QSZj)AOk zl}+4MG%!ofhFoOJN`{=5Y+gl6JOjXGN5qMoKYj5*|rqI17?05sxjS8(jGb&p>)(${{z!^?1Yn?KuCP|{JY7@yY0*E z8cO@GkL#2$!n{xda^1(o2`?&Ky&XGm->7UdYYa|5R9_H56FhyUzxh@xF$gUL(dfOy zWZ{^}|7~`}oVN4_&90I2Yu81|f+XwE7#7S2mtR);b(jw_gz95n(}|)aq3_Cr8!Oi= znI(aeUY&>Nc7A6pLoRVvav@f#$V|w+EfHa$i$e8MLJ+I(CeFDohwDw0XX%~ zbYtFSer5G(Sq5g=@9X;GZsHVET1K|Cc@~PUjH6L+A02hr<2lzf#k9zNB6+WcPvd6a zJp;tdDhw02Y#O>Ac55gZU)v9N$0$nB4S1>zk>pL_E}cWuQxzHqCPrwsEMic+iMb|4 zv^Ch0d8FFQvL?p%0#uuwiiT-Bf+Z8R&w46{H@7?5Yco}TdjN)&>1Mf#$|+U(+O4I% zQj&VIa#NQ^GRWP^f%%?tl@_he8rmOkjc98z!ZERAr6R&T>!O&bXnu%oXApferwW|f zM7OhSvvltl)SfO-rueUTOfC#iu=r@DYa^%&P+8) zrrq$c>wK_+@O-F>{G2jIgjZQzPhFde*Ua}V|L>aj&T1=_KIO8Dp_G2EBLz2BZ~YAx zfs6@^TBwKV-heteqA1N*(vRkcn`+Jd;rqZCHnN4<>mQo8)K%!2sySXzqq~MNdos_w zCSzcNqaIHm*(P4C1YOtS&1AI2pulBxMCRWl6CZ`MFVfsph&?;Iv%iZMf~@gZF5~Mu zaF^1rXqrDzE0(O;!myZC_kzKitOR7?mz9&8--*#mRBmotAZht*oK}=v31q z_*x!{qQ&5%UtqVyhB5!kk{qk1z*j~ZJ_*^JD?;;n-j|h52iqB6Q!-h;KrgW!4LCin z!~|h4vMzd5k@FF}~{a z+Du2wv6Y4j8Zoq<9OdA}cwGWfHMp>Lq`A=auGesX`OU^eu8rgUNh%|Pwwp+pc<5l)1Hs;Mp^5V+&oi027X5O0ca5+l_`E_l2IQo0Z z-Qh4dG=3e_o=1DnSF-d~VS&MHr-|7(QYBbH+L7l4@7aczeF1!a*QGw<^gIwGy)iMJ z%yHC^>>?Q*w_fzZavS%wNf=TmdD3ih5xiD}Z5*8@{jhDTDo!GGtlw!v*iZyVQd9Ox zQ0MCMXj6nzi#Egat{@!#usxXWA_+ur-YOcw9L$2+yZtMjHo-`t-J1=4U(JtSEFDmo_3_3BYkevk|$ zF6Hb#=|in5`|cBE6tAq{2tX(k9$M7(sBZCLkJNA~yN;Qo?^*)STwK>>Q%zgG*;yl4 zP3AypMl_N1%jwGul>F{{=<{4D#o~=r7vapHRZ~*4bJffUxSxD&m^eeX@~emcfUSfL z1%EQaEcI`qQ!>VO3;?&FR@?yrtQGv?=2lk4H5jWS`+#Dh3J1W1DyVQKZ~Wr&Ty3WF-QyV$<*FC3>JK$zs|%4dPOM{L z+Z>6J+~M_B?(Ax&j{< z<-wmw#UQ*%T>Z-T^N9W9n;8~9b^4U7R88hw?XXR(_e)s7y3%EC?Nq^g$tmRGBi_RU z$9J-e$?Um0=w`Ff&(;3Q2d%WeH%9sS@P&vel_@44#19l9QDO!KGZ!t9L)ZtltIedI zPYlyJ^yYG#INOEo&8i6A;jqfRS7u;kj$e7a$ux?915e*O&%dhQM9FVWr}b@=bmWo- zI!rsQ+meRe&k90fXTNee+cvcco#UikW6=5qYB5e=$id0VOSt(ligkVm0Qe1bhF+7j z2bn`E29!l4145-8Vx9r|;dFtfWP0cWJJ{h2SL}suY8rhCymCYvz zF}h?0c5C9YgTmncWLlblIwn!@3EMqo1#<3d-*P}6=5~qjyi5+%U56ophft8Iv}Vp& zg;3-r?n18%)PZ{=1FtZo=4Fw}2>gBa{%(@1h$p>&EevWFH#7V;ow|Zqm#xFvO5hIB zlBXCTyw8UsqYwdW5iMlp|G>6HYtLze45S7~siJq3d_x#m5WMePIe za#IG}*pA&f_CP*JM3y2ca$oQiwZqW==$r6P+pk)*`c#M1lC+1oSV*7aHNHY^!Po@> zw>4K|=vAI5QUkv)D3g=-!7tDX3D}j5C_3TOu64biy#P zz&}2`ONIp|K7W>8kM4E~fYk(~atYHg$rY=w@ktQP|*g(iF$yQHpDITa-Q%AW4q-m-O z%llh6)Ur}c?4CCwJ9M8XS*4^Yt4d`pB(#|p#!As)!ds2aGlIz>3vZP?Z@ zftjS4Xj4G>e*G5sIPnxpQ7qV()(-o~q3QXS1&E%OzmdtC5;+;s4DCUHB9+OzKJweFA+j5Dw|NVJkJkwfzq}v-CMmJEcYh74*~Wlr%hV=^F7cmHx0Y99Fg+8 zJsw=Jo?8_eQrih$Da!6NRNNAdGM&=>6_GNIR-)dU3;mhFknh&JM1iuT(&ukZWgQAm z6=C%KOZ9fyjo2gLW39<9pGw)D-ERleyk49xU%-=bWy#NoQHg5SM!yk4_%p!l4`)&8{q^WjDUhZyplXyhPdK%^D+2^3U}?5h z5a*_P1n$h{f)quu*pMteM^z~{gO+wKDxDJr1S%ve6@Z1rAK7*087)hN{H0kCY6!c^ zD|00u+FD6x#?r2IyNi}OM^Ua?V|e$QIS)$CM|k24s4c7cvKUP8TFQxT@vPq z*=jRWQXQg0mfM+uBs)+MXy}w%pOf=02UQI^!H_NolMqb4z!qxaT{;%P8Lz zix^xf1Gv1At}G*;fDZGl?%=qq2_=C6Sd0&+g;zDQ)$N}{Uj;c2#!j7mn}QilMAXsy zO>yC5R)FnM!sih~(d8jY`yrRY%~p*JK76vMdT38c)qpt<1mK`$cGdc$r( zC_-*EkEi=ja!>1z5-!o(u63h!6=m}K`H{;ffRf)5nC%#ttRvYaVnYDXqt(hox)znX z#J6X%9NUq4+&i???PTmo6(78MPus*Qimys$q$J6J67vt&to=@#V{%D#TWt%2O410oAP(^in9*;-&S+~nTS~PgLrk?e1fv}XH@bp& z*Qt)4UW*8R(D^F%zTxVh=FyIeAvIa5QQ%Jfj$XFnCF+2lZ@)T~tiL&CSyeS^D(?U~ zS{VelhOOKOz+<%LWo>$j^r3Cax`%gHxfO zVyx1Q(~dqLIs4_`glulqpM&)*&nG?uk8HIyGMMCoosDR%RI2d|mQ)^GkwTx2r7&c_ zhYGN=L(VWt(1;0%3E_8Xhac}!BD<_2R@E@vTr1^9G&+8zD>~9_XiD`oCEG8MjuT=Y z`Rm96l&1qO5trrf_Ous^zD?+C7>CsJsza>%|;{@+_fI#ugD%bi$SQHf!RKhEr*-cNs;}QEcrM+^uZ#wF+bW ztu`2t^9MN)*^OUq?Lt9Efw5ZxU(<-ZT}Px`87L7BKuLqw+9_J0*1UH?e+nk9h;BtPx%KM`w3<+KLm76hPL zw=jPH)zL(lpJ@WIk4Au}Ch=FDmczT}9q9ez(Vs-^ z2oJT_oL|+t39>o04YPth17sFE{1`3I=e>tms>|I1Ajtv9Z~Fh~lrmMG{pfFqq%;Il z0|vlCOG*?SoK{My)9G$_-k`~^M;7xc13Y&2csl7dSbQ`qGbjm*A%~`ZPjce0@HqD9 z3XcPEUv^Pya9OGK=i~z_p8Hxu+GCs9yv)VHPI^ zhI%Z*W&fhUmuIMR81WX&1b;-Ou=!o zesSAT_`W*UEWT$l_+8Dau$oMX5ZmpgfRI5ZUa6#&q)Lf`&z6IJbSxv%KJ-!;R~sK7 zN*AaXAqeCqdCAZde)EnH7C3y(EZV~Z-NF=REZ0lQ`cu%i$2=kR~2sFKZ0-ma29Ia zZ5_CQ@GgPdKGb;Bzd%|)J45t~z9op;WkG6yC~HVV52*Tp)|GK$p#}q`sE)bN_2txD!OiyIM(p zcf!z?Vmk*kf9K!a_wF7l4u2z5P4y`F2$O`?#v1IExG8V5%RAJ|YdiX+ESkYn>O<{DfdM7UvQ$ckt3mL-6{tUHIU}l`rQn6pe~tcx8O$+vJ>8SudYRl z&|1WtrLM+~?I4MV*V-Kg<+Uc6^F+5wc(d&)>vUv;D8ef^e6Jk-I?lZ=;PRkMLbza# z*YQbHT^#Bj*E>2`Yln18&`(KJN)KM5FL|2$8MO&md8?Dea}ghh6B7Ar zT2I&LaEvrkcl0Akhsa^bsC0Wdx1&4|CgK3-KpYxLeBt)2E$vIL%qi6OFEDITLh@~eRJlNwya=N zj{+!G4V9Ry)VQ{L08b6ld%npc)m+XLLkji?)blVE!#Uhl`&Z3qd+QXCG?wKYv(Xm} zsII3K7$U-r1nz45(;O`3pbP3PRU(d+zpOsQ5a|Axm!5A&oWmA|L6@(31oq=_ak0k# zlIhar3BMKen39DZ6Y`u{jPnhpr0hwC`~dscGc?54dNnWLy#jftBX1fmDKs@rOjvg) zrUpHvgioz5R5}=5-$j*{ft3Il6-0Q2L;`AKX5pzG8e%YyI@1J`$WQEz0-s{3CI#Es z!u*d7s5QiN%6fQ^%GeoR7e~DQSPCX{htHPGiM#Q9y#m=)8cOaaCO%PngF?=I|{W4XEqFs)g3VEg#uvNB2t z=JC11?MN9P>hNQwRIqEIx;eBHhRN~c@MnIhQ_P3^XTZ+Gxt>j`W6L>9dIL3*1YS>A z(coaev;_db_Kt$J&*3Gi&QNKn5hR-(X##&=AsG;7(^!xx5M8%sBnzr z4Toe`yPLN7^)oo#eG#eogOhPLQ&AgF%YYEHT<9KJTC-}lU)Y80brJ$4bQ@HOoG-2< z4PletCb3Umlwn1lhSFu8EX~}}*eyKF&QP?IL`8T#8b19<~XjalD z>d0@|=GaRS!Twdo5d1YK1u_=M_6IxzdT9Sj53ERLa9K>g6$4rX8;Q zOuu<^Pwz+D)zDwzmmoOps;{I4QHlyt{3Uz%{+FYzvn}$XsZ7d1Bqo&ua>WI}t1^9B z+aY85@76N_TiQlCwg7J(x}(#Or1Jwn$~S;Q-*HmVKkhUB$FNcvOCdr)tEw2QiU&|W zVKnTbvfzMz4ENF{$!mTo6^aQey*GFoWV0ZK_u<9BECOXa)aBpA z3k$aDSjXX3F4emfLkpN4DdbICR0ky@*e`=qjHn>nKb0Swe%X)<#O>TPob<}ubIfN8 zF29svT$jcPaI1&7ip#ZEDcD-#-KC`RiIoQMcJ!B&RP|AW{5P5f-*_n#D(O|@R0ETh zn{Af{I^Ratk}}NN*js^p1my;07Gasn-6O!X{gvVo@z>}GwF8bAQ6x8wU|xMLjtyU7 zo-Q|vR7Be0`UXqiNOhr)?4CLk zh>V~c2BfYh{JF(_V-&HUGw(gsBMiui=*4K%rAK;!`9JK}c0f?J!9qy0+FR$MP9@KT zfXF`ySf2f270KnSEa6E5$yOjxLIVoZ7=wm`%dngRc@BziHBXr`d+IAGagmJ=LU%SY zcwkY1ojFeP$CW$>`OtAgiR<0ld%dQ=s$Z5Ug8I<26~M}?pCJhbKPR0rRdf$EFqTy5 z{b?r~x4wVxG@m2nPxc#H3!w%ZaSoAN-RS*z#buiRbat4%m5yqaoRU~2JwBV2g5xF) zRyiEkaqw;(_k81KXr)_*CKXYlLcM3i*(D9$u9L@t1bs;*wpsMQ&+J(n-Zh^v~v61D-LJl(wJJ{JlS}PH$G1TaPvS}y01J1 z?!IfBsl8;X$`n11Y)4g-HHKG=6W&b*nx9!F7~7?qA87YjJXASAG{8RsA`K+olrt#f z#XA?x;}RSYceCfR(|SwLS{=%znr|d18ZzS01^~Lc$}xI2U-KW>;TLGJ>rE6e#he#7 zV2qRZizs2-R?zF6HJMQ ze=dY}N29q_-!-SAI;A@e;xp9mvOJi;jxB?}vR%?TnW?+2S->rczGC$c{kGq(yDSa~ z_QWM}hTx3wT)IQLz1Qc|xDOq{$}4mp*N_ApfL+ZS-WX?M_PNz|I7j!&MSFlO3bJgg zJwjZTtHug8>^Br6ZpaD4C_!!y?&FBt8FcUQ-y-F*uC8uAnA5^GEGUnXcH7w0#NSNz zz&5Sv{LVvf&(PaS96!QkVcT2hoHl5};9)u5V~o3KC^V z-;+R&AnW0KuRL3yP`{Ge>i+SWH{0Q>qURZ%UQfo4e42dHpN4bh-DPt!zk(LG-9cxl zlEZusX)Ya{2_|jXsYq49fA=y!*yd$%e31ILEq%bV_K1tu8jyXFEz5fPTDBX-;Nfb7 z(HU4_w|ES~iMdOlKT~kD^`&ew4{IDi&x(}Tkq)wIpnC>1fnE9sp*s6-ds0bVf3iz$ zAcr04pgA^wpCaqsJ_Xa@#LwSDt8bpjYd#gcdK1!b31jU^exs&BcGV>+sQuZ4S_&>r z#0iRFzIYXd_%Dy>g$15)mGdLMtXT^oBG zQ9%}#yNn-Ep;fq|c+tFi+W^{sNhkV6xwdYb03DS@gX-6`%zjPOjQ*~b_$X?#i)X<8 zbgG%@F2bg@}+GimCpPtM4=51lNr|@o5}=aPBh9jik7Fr zQwyj=rHjv6cknCp$HkK>D~)hcX!WJi|75B}^_5sc%NanE;W9hADT3Y4P&ZfJ1?{xsGbOoO}>1k+sFx`&xz_*sup*+D?PTSCucF(nhW}NJXzV z#p>TgioILnmbQ#~s0w%(U2W^SpyjRip7eUhE#IgvtUR^R+zPQ^h(-<{5cj>V_M?s_ zPOnmhF(w1hWfh6^a9F=209e1Ij`)!Hp{2aPK3gMZo zAS;Pck3B8e5Tk(Pri8iq43OT@cd<1J!P*$tJ=SC9I5O^>F=18H&D=cM z^KT<~8+J)Kz5?9eJv333(j)2~+&2o;y`TBmbF)yu8MDcf+ah!il~z;lYs&tLyFOUD zmGUuxem`4vJSHvXse~(xHw?q( z&oBx)-c7c2e4WlY$n+UBIde1O(kCQmd3cm+ z8c8&C<272uFr@YyLe$TlS1k$)orz7&;EE8vXEkuL;Qzg?n)Quvgm=3nVUIXL4GwdYHUUBKG90YqNOluUK3Amlj|J~7|ENEY z5FyL?3_#Km**C5YWLIfLlJ=_(XU{tj>F$=`en8}+HpZp1qTxyNq;hb8K)x&Tef(poU=JE`a6$CDVH;ydP1tzt1vVk1ZNOGbjimpEfAWMw*&Oyjct z6(qo;_V*~IiYPB(pVc&?a`$Yiwzz3xgT~%4O`-!578pHl7H~hq&or}7z09ABv(e%z zM=)j45j{QU@>|%MGe010&mm_qEw_A*p=omVtrfPa1O}-`9sjOzJ8#x!k}vu_tQ(bP zyQA0d`1oP}DCS>>Xy5Ab$pG%do`~Ax-JP?_Fh6j>S*E8nEZ-QCJnkyf& z-nOmqvd7c9mEhC%zQ5#S;wNq$o?v*X_RPf)cae3%S|6n-Mlsn1y!0J`GB`Fd9L1;X zO&ebFX8zy8JPoxS`Hm)l6J-Dwy6djqCT=WQ-LOpTR*ENVcv`@yJbeg7R&~F*^AYd% zs=ARW_ZB5LMMXwZ@k7THb7YJT#${DKR-H_lVhRbHo^7f~r9>JeV_&5*nni&82ieSm zhGxB*Q1ai60vwLRYyWEe-SHI0gNjJTBZ(=st#|V^U$f1?IB9?MGn<;Hrr-G7&u@M~ znoULMB$5s{$P|XRpUzfF?J&hN=9j>HzUIZ(U6OO5XGU5Euswn+$RyPzl%W?WWOR3v zsFrlGjNuTd{b`w!hS<~H>FIc)M50ySAFhyZjhm7b#v)}WFbI^kRTZ+5buGLo$)F;R4?}U3`j0P1%?1MzEX*9KuVu1$# zv_wm5mj2o^(rJn5Oeo6qB(N4DC$KW&sso4!(3!ulZaf1HHBWNZo&h=KdjXw$0Zl=n zmb+NYd76&`qSzSEfZ%jQq2O84fa_xMMtvV+n#N=^_l>f^fW%+B^VS7Mvx~r7;3a-E zbv#2IPkLO2BH`XDgtl3;hdc7^olk3B&Z7}tn!=QA30j7A4?}Tu{v^1yLej(kqaMh+AVv9o1O{j@d zxC$*NRnL}ni`XYq9;jK?(9TRqMl&HtWd|SDB@UiRPr{^Xo8q{n!)5w$xst+J-PA-t zM(LlX1A7K&iEc!U#dv@dA7dOur5EYXcFh-tyl&R%M$y{T4NfR7UQst~qK)G$sr~(Y z2{V-^*%RUZv1yyZCYB}>lTIx(7usy7(CnGuCT~Twl{nPpFf-G{-8ksNiCD&$l)aDr zGb0dLkgb7khQ*c2@9s;E@=*?{TC0nQz@Pl0G-1*1R!LGLV0uD6a<+6&&&t9IaH0WL zoX0a!)SiOO#5pmhyU^<^a~NIFGz%#j<0L`#UR0wDt(n^Guam`67837*E9q6!!{KD; z4^INA4!R>}N=2`|fE5p+y+p%YM==ZBD?c?>({ZEj3!WOvxGJok0ot@u?I5aqigCF~ zm3Q%sxv3he)ml9tAP8WZjEgGvu`CThUjht4y78&TqzIoZZVjU!>K3VXSI#A9yR6w^ zc0`FOk!PqgH6_^-`LeM1JDJc5!M|rhOc#lcW`*(Zz-#=k1Go?%Oq!`gqhcV*D zMoS=Ii_;I%fmL=Xs;-Q_!n0UhPUTuYOKk5A(;ghu2m;SF#KU(uU+Y4Zn+3{C?e>M- zI6eiM^E-R|wCTjt*bAQC3?Ww6Z6~jt&LK|09k?jA3efBK-@P2A>&cBC1Gi^+WNF2= zedh9)bktZuO_U4QvTxZDvEDy4Nm)?AeQUe8(v%h_ zvs+)|SC8vYq2r~xxz4vfr}{7F@LO%4Ym!*Gw;p9%q80fp(q3-t1S@A76W2;R`GvF5 zWi6?IR_vzy5-(!y9~Ugk9Ax^9jm)xpue3W)E_5Q9>QO>5B||Bu3{=tdA}@-HZIB|Z zBzf#RTc{G?+}@4?+|39ZI2l7+?Hjyou{mW=f@Q9uFbQAcg5XlKtb_#~5d?X6S&c30 zH!=Ie8r*rGPG})bhDKm^9j;B#c^5URl%qj>!e9xl9GF@C$L=!z*9F=9ize@484DS5 z5u&v=TAoS*-al+ZS0$WiV9)NmnJni>bEw}=Lh2+MN~$z?da7xN3uD+#1%Nagqobxs z#u><9Fp#l6QVj>l;n7*=;^c?HE@>k^G}iZpe!6CV(T2}PSTrg3EhJ8V6w&>sa+?&w z7n~TJcw%}5zA-)N9i9d}}i!B?_w8btwN85YZ=U%bZr zr7m|rQ81t;%4qSRzr{j4@jis!sGbnYQ|$EPkuTa;bCYDY@tM67a&HkyCJpf$BqQHU z_|)1^-bv&G#L7a>jRnCT_8$vF*E&~G#uB~11abcPNx$pM!-H=6j`9sWJ1q*^-Ag|` zOv61tYXCRIbS`wQ=~vU`#f0X1K?22vJp~f~yWX<;9C`_%`3-i8GqmOL@qkH@fK;A* zt|;mpX=mnC5&Tk^OhRGiOClWr+q%R{e3>tSU*E8goJZGw_87{=Wk4uWYwn#!w5tez-{2k4nWr$muA4Mh-z?|=QvNqjsEz; zhdAjI-SMy|;!~!%nD1#XM5uw!^>2_r%!)R#AX31`M>bH<{n zl|dla{+#czG-xMP79{@F?Y+o=dzbvU)wXXaAu}Ocj7O2tYy6+G7gw}u|Dd$5Xydjr z`H3YnlBO4*0XLlRI45s$O7m7RXj0jNBL3MI5<^%?Rdt6kOvb00$0BYxU$$Q0boGIx z^9p*3GS^CBbCpy)vOmmoS)Hhy z<&dk)Yz~HP1Zi@h=aI-%nJI(e+qoK z;V3_>T|1@+-Spa2{3Ro_pYbv^meGzZ;MF%3R}Q)>Fu52Bz2T@&lH#^Qtnb7Nu3L!7 zj0RTQ&AFS%dQQ;|mjBj62g^mH;Hsi0jhrHK66IK(Y<{_OV>fRie3z-+00ZdjZ=2>; z4-w*N+W-x3D|=5wY~!*;>4$ahi5i z5tP>^;r(wpc<&`L{BB(17pSlPruRK(foj{?OPyM!p*@>1ML~m9oTm=cxt#@+maJso z!5fGxlF+cKdwk!C0LY5RjpQ;kbi3s7&s99^b(&QRjUryYl`4ULI%RTFdYx0{@L4P| zuS=m5D&8wm<<_2pGs%mN)vmL2mv9vtyV_LVv+V!*4gdSyGb$8kIo25_Cj?SowCoTS zFLgk^Bj!Z9Mu%V4h;q^HHqUAzOFEwt?!NpF~vWnY!BSj?2G6 zX*GhGgkv(mWvQ3#@1cv%xdk-hj)aRY1SdHh0_qV7F?)Z8OKAjcSc+L0@*%iB7^T?>{p3#GaEEVKb{3H4 z(JrM!8a~af$+8)SAB|EfbTUey1s+M2yG>Zp=FyJGm%%)3(e@ZYTAMiF_=GUKk~t9ivv=18~5P zxn7>4u$%0vtCf;i|M}+H~dJc95C0?hyg%OQ4s3za%Wu#503WvfalF@ zx2T*l^2Rya*@N#rHv&Ry6$5-=&ownp*yKhopBg=kp7x!ElGss6_)EgA4wTX7VOUC^ zKYa&tUSifbe>I;LerI3as8P(Qp$Fzfu-OV?jg1fS~@Z(bXcgM&AVlJvbVGCA< zonAA9Qyh-@S7HgvwO^DqA`NXcza{SfIyngPFz7SD%f%Qqo^0y3IVbB*P9QRSzWh*f=a(qsGjv&>asAxB{I}&cq&epdx6nRxKWi{;5|U z5I(-wZYr0e|0JIQbPhlE*|b_FzC`avlhJByUT&U`I=o-}F~X~vVYCU^Y@NOqlyg+l zkW0C&Wtf~G7qA|28j~0M_$74-p4!uF9SaTAH;prDSxPARi}O3hL*1YQB0Wq>b5lKs z6wVIKZ#FR+!PNj~Zaa;_BzVoHabmw#pD&UO>89=Kzh{<*W*D}?+RX-PAEZm^;ysgJ znIufwhueHe_qLj>RdjYmq71QG&hom`Rc)kBp~*w-Q})cOhQ`z>i?BE*l`0u)dfw<9 zzo>6TV~1LAH0;TcCXJC{%vn;j539PoK0FdjQgi7lFZKEi^CAUhbT20MRy+elYd-y8*dQ?0ST86-&gSIH zLYL65AW9!116E3Z#p(Cmu7k6eU)>$# zbpQ5Kt4(WmGQ(=-h_|>3Rfzz6K(H7en2zmw-ThI1e zEw9a#{F$rIUD7u!Ns-@)G8c~fKMh{yDe@pRTTnR*o$|4RcLPJcY(Y3Yjw=u7YXv|* z?B1_8q3he>R%N?YzVKI3<{-kc4dqpq`@XbeQyUqpaBa3lE5DLB4zI;m;9*H&^@f;* z72?HL-|?dqKFFX0^q}`jfGQg1(}E}oYP*G`PeIz{_L=|qrar7Ng3%>X`;h)T>97AH zc?PVNhBmDB?wgKEts=(K0;}b5Z)ycTi6<%u@wj&^laqqz_=S)}=^L6V`p4vQ5vV@n zubu%BCC`9vwI`0Jp?rE*j39|qyr|*?tF3V7V4Q{T>YM0HYd#i4foDHI_Q)b!w{_0em-^TEAZ1mm)Yx&5eTo(gjItd%q@kK68=F=BV;z$JQ4E!B-^SK zwgaylGuEtW3dTz*eB*!q^++|<&|~2ahX5CH(jn=^!Pg^v> z2n=*tfzn(cOR2(H)t|<$rDjj+vnrzyGB0<(2Hz7d^j-L|H(hGxi7G1diVn9fnYP?E%gY z4l8LJj;vnxk;Rx_GTy2c2G62PJjx(ezF#5Ux4#K@Z9@&wi*Qs{o5>p59APNNZ_e(p znuRKHI|q+-_R}y=UD7*OEE>Zd-M=b(#KCd(0QGYb${)%C=cMkImql8OZs@v5|!Ko!o^J|P#=8J^%C%NAhoVrr!cf7uILh1eHmZ5+#4B4+Vvk;Z!HzVRId+ zb6USlP1$K1%$nxo7Pmp|9m&c-7TB32VIRSQ=BC+KFKRVN8r;RPT0LZF-gwlnQOU^P zd0Yaw&)syu$#D9Pbe-i86OqTF(=s7pia69c8W1%$p;oeG%{C_!>f<6Zzn~%+*C^2S z3mq_^sLk~a(2?apl`&px=imv|Yh$kY)C;-0+16ruR;R?t43QO&4Bj`}FaUyj@>{BU=|Y;5L|Yqen8K9ss6OUa z@TT4Bf3riU3u$^K_0e4FpX6c!VLNU{M}~qG)l@2j2EM0(iMWxJPSC)(_GH%C;BORj zx@UlGLR+|e4!T7CN`UUO)VE!?>zn#ljUkH! zQqcJ?*d8*E)hRU4F8NqFupEZYP#SM(jYo-GUPR2MII#4{FGJ+wb#qK-$2_F_&pmSA z?D8m2sz5YC|JvZ7cedjhz;QQCy5MCJ-5%low2xaAtO)Rs<9|_nvxxgVf_v?KQ_OOF zUgEQ)bZc7oL){#*+O$V5FWr1%Q+MeMdSXOa+fdhab>@|aN)F=F7JLF?VLJA~j3x@+px9K6%E1=zxZH_gF{W11nMVBIPec|}L8 zzQU8P&D?NSh%Q~r(3rHz z4@Va~MlZp%>B*y>1rrcevZEY^-s?hLx~Rf6%li3&l7}^b*tv1zZ0V@fJSrKrqshRO z$NE(6w1J7uaAl@~N`}cP64BOPm=c!>vaHL4-SCUzQT zoUQ{(hu4bJYedJ&IjQvRJ&^`f5C?YaS02PL2oo&F3KVirrA(V3#JJOuhfE)8t~93( zzH{wIY(_#BXF0|dMp=-Y`Ndf-=RO2Y8JsTf*_u4%@2PdyuNr9DiB848^EhBZ1f@5MG0qkG?dN9er`+)QZ8LWHT zdx<4!=8>70<(fvxHPDSbfwuqvIKb&uF0BCvC^82Co+^Onq<{gz>s4+o!weBy7uJe{ zcZ_VKWxy-LrrNRGu;k1ad1{^$PG$IjrgOTPKohRdXpNV>0R%4Y_|#)lP6a z{&l5x3nALQ`c-GKBzdxes(nXZam89mn7b50Za*Sqo;VcNvr;$8pq%sv`PG@7VI?44 zqaM9#h32CiQh7ibCfZ8F85^J9u+n2!ySWSI z5+YRv-b3h!xo1AW8l|h~zA@GA?Jo5H02oE5K@`kxtp=VZ4!ce;<&?3`IKW&J*Bq92 zFlqiIeH%s7ZzR-S(7ndDt3=s&_hbl0M&;a32o(n%YgC#sa#t={>Ni%_k9p!a1)Oaz z+hvinD=s>+u0Ugtx-v(8Yf2GsaHZmu5E}$wf)Akwk@(hoS=i{)8_inwSuZC{#~3^A zBtQVdsK&+i8&{l@%{txvg+|ytGtFg3tocXgwnhieBQI}cp@=Cschc71GwL6P>8<G_4n7*ner?_$e-*@qbp-bt^v&>pmqSOXfciy&K=RC2k1ZT7jEJ7a}a!VdMHX{bqOr%5dHmuGy1&1Wfh zH>FL>p{uRy!5J;|*%Yzm&N_Q@)}3Xo&8OTXYW%nuDo0+q{cD|B<+_*7bOWB%Fox;w z5>ie97QX=jV)jMT8{ zb2-bW9_F`(9;;?oiPiXj#7bacJE3xNRgO5UtzTRza`HysDSV7{$7-g!bm2VR%)3ue zDuj?sWGf<^lgGVOs7^bI(0xvV4Q30lvdfkOu6hb>?}@H$7sQthiMqgUKfpo(iHVPMa?2 zTE)e_t@c}+;>xlE8J7#VcH<-i(~SNmy2$)br^h5NZhDXy1~~jiYm3xu?rvl9ni6n0 zIO$aNVR)KqO%s0l*ylOGWdj&K^_!t6YQuexTC(vq#+9orwZb5dcz4EKPnR+rj+ymR zGuI=Iaaw*K@jcDFb7^Y?f>)W0Ei3L>6tBoKF}rI9QhMQsTJfzL;tY4XaE5l-BxmIX zx_b}v+PXVG9)`179EP424Y)ox4^ilU!lKWh)0A2EckFfXUdGQ?j^9zg8f=aXEj#bo zF$ostRw;zyQt$ z0q^QLt5N1hrG&*<*`Intr*8zZoAdV)H*K@Zu=E|Fk)b?XFC7?XWfQx99Ww|)UY8g`Eclp~M z^?fZcqX<5@sZzwT!!PAYO2U$6T3DR(`P7SKpp5r9HK`tyNXZpy-$FBd!E=h$JD9a& z87;O9DsfNyGoCirO=;m-resBg{LR!Zc<)_5g+2iMNb#G5@Xvy8?{Ws`f&sA)To)t( z*F2hb5$85H6IscEq{heQT>hipwa_f8Btig4qHKE{FB zoSb&7PF(&usnR7=kSbZNrnZ%!nli4345pPMKaEa^TEu9HjY|w2u~uz#+2#bSWB>sy z!wb*9PSs)t(k)3@ZrWE|Zd-NEGmhtj)YLa(;-6AGJ5!Phk&jx_wbSO=zsm}s51sfJ zKU$zQiPiCEYaCxTcM-hx&r|&cF;e2`w_IFFAqP2;vxD4$(0&yUQ&f#*ywh#Q!y`>5 zLE9SO55)DUmsYrivtp6JKZT=Qu=V8Db-k!j)~-PY@&~_4mtyRT7T#^_zJ1(}BL*Zh zws23TdRD!Z0oW-OO2*sE88x}4TB!k#AB9NPg!b0xgK1G#R^6E7FKV>}Ff2iwsN?T8 zIIGs$UG=~Z1)CMdcRK7`dgS9H=|Q4M%8u2fC!AKlh3}U})UiC6wz$N17#Z9B*ZQgF zKAEW2(@ul_KJ^{MxB8nD4aYq1Z65vUWw*#VdV&Iu}gj!kg?01*5wE|Vi+NhuFC6M7))1O~q%|)teaOv_jwv{2s z8(vgj5A^I&eFEc_+E54W|Nev=60AFf*DLo?Y@C z*cefdx;+5wJ*neQU@_$N>sqntj4x7qR?WqMjOO5Bhg9x8ja8a3NsUwzcnT|YjAbJhR0!t)9>Dghmn*sQ zTP(x@lh&~QCj4mdCxCVMdlfCOX`UC> z{>`Yj$g)Rfvn&ULnHiWWb?Js~cojof)^zU#Y0*O^rOo5ZJaEWuVU|diR^xQe0}wsP zC#M3hcy;w%cTNolhi)`$XqrVf7ZLrR$qL-Nw;9hT3NU-MO>cQ^7)U%m!sLUpJBYy% z01npj(SGpHamPHr6}HI5-HnnfuO!{-cLK`af#=GfJ2z!W$T&Xi3vu^pVKd0>28|4{ z`Je0OavFE^+)v#A7W>@uz!eq$0EM*CuiE&J#1h@fs9OgXu*Y`Aw!a4|4#XVx#y`Az zRF+oWF4i?k7F&A@Eg>RNXe{S*B#d%f%q0d#`=lw)Q&XeagHFX8JqJMWwdSRN5SLKB zyP0LWNw1mFSPTVeTowZy?IiW#M-?WIq4=}KR!eo`OK2<<$Vk)SIYj{AV+SwCJD(Wf zgsz6uO4785R#p*@EDzqxfD^V?vi2Nv?rOfJ;z;ewM{0nPk-kr$=%b$f@zcE*W_-Hp zJ`Fog(4a1-1%?_~Uo8ILr$NWHXW#2F4Z;DplY&N1<=gYmwP#;ylU+-_*|UsgpC=!X z1MmW>HNum$HczD{?ovwH4!XOM$#!CM)RU5Gi^xk8im@)|A1KCp)C{A)G=*V+f^yWM z&mmg?cA@h=9{0sh7uqgh+a0U{_6C)kAAf5AKn&Q%aJ1Ev2hC&WfA}Z|?L(?~H(HzF%Inu= z@T@XRYX!;(<5I+gApl{V0z-B_{QObkFN%7Ixt3i;)_0TwB30UmIN*2u`_+Gr{{RxT z9}|2@zt(lVWM16QGfQdp4t=Q~HAzPf(i>EP@D1_tMx>gQHGsVf7M@o;%V7cd}dJ4;Z4NsPA*G+#r zdL~C;M@re#w6g8c7V1W7BZPM~m3hr*X4!aqeX&xU`VQ3x_5_V1AXAWgn(wsT32v=C zxf5#^%CM@pngq7jK(b?;5G%SEC2dSxDmAIb+h}q{DT(4IcLJxG6`0StLz z7~p%>ex>l}Lvba%(2?_%+(t*!jt_eG9RtEJiB{zjFk@_zK;-0O`HIu=AAz)MjW*hL zxsH2<$e6TC6115t6+kB-D=5k2n&zpOIU}MIj2`F5KNCJ1P2pEMjfJ~4q~qsPoW|eb zT&z09+$ym}aLRLl+2||nEpOpIo#GDzJN=1>nI95K8!%(?ZQFt9$DI0C${!Ja9A9`_ zT6p8P#2bzoMtIG9_A>)ki@Z-pm1s^jW~ak%5X+~(mo>>;44fVhr}_7118Vw^iqh`o6HSqsibFh&fdj5^p}&Fp1C{g@_AZ}fWK0;({{UXUB>os{w|1Jf zwe60vai`p@nM<2#SzS7Eq;tUlo@FWqj>A%N5gF@_TNst)vu(s%gb+UTu1=M z@r45gv(5m>JPcPBB9nU_#s?6Zvu4yfL6Se+!QaxZ+4ySa;y@M?jyrYd7#{WXhr@5! zbH)0kab9@BYkf8{L3ELK$%CBX0V6#3BE7S~{{XVj!aoH@uKG9jjl$zH-hJGRau9LY zb#yatV_!D1F+S*!J+pVRAq)CGiY@Q}K_XHlq91wdEKp&Y9X{D~Nqtz~TBJlA9tz`nmD`4`V zNxfI6Bol_|#Vlw;m}SDS>5hy&MRwmC{0SezPl&pQg4^~~%!g0XjsOtI> zU#XtZD4j<`(ob)%y%r^_vzeIBcP8tpT2s3t%wlkTv(v3U3v;;qywu-ib(DufrFw=K z_N#W#CQAYMR6PnrFu)&>dLK%;3_&=+rHUR%LCHM@UxQ7NKY4WV+os%?oxpO-8KtW!THDUB***AIsB@_ zo13-G<;;_0^pWyEE|mtIW~es|6WrE>ac&p{3{YyeDw{x0%DBm;TSZgA@6R1--;&BQ zP6+Kzg3{vP;wyG=@)6J!l0P*y$Qf{{v|(A`r!7iqsIDur-=MAy8Wys zbuiF_~M zeF}dQ_|wFievhWwE^aUNJG6!Si&^-7M)K~y zDR{Elduvu*${+hO)k@8J_}l}ZEdfuwD@ZqT8Ncyc;#Yuv5$J2;Z;8Gux6&--kR_T( z43`&@9042K+mOjJ_TJ0K#qK7G<~b7mXWZ+gj&ocD~gKjTw$Nc`zI^Dfx0KyApJoMYqKt9!02l zr{hP1ygT6E14pMn{8QTe=I2s$<%P}V!pe|XZBVDm21Xw+Y#OKG9~|f(6f{ZT_yMZU zx^9%-R~$54%aR*u%{L5T`&U|1^w#ttxQ%s;alc-vNs#NV|Cj-~jAcWXbJ zrucEK1)qm>_Ua1Rq5l9%ah4urN2u{kFv0CG=k@kx8)3uGU;D&(98cEaPHM|SP# zJ?kG^)UGa0-0s`YqJ!)*e>0O=O)SjcIc8(iCnl=OTB9jTmva67sdYK|rDh=H6OKNB zbpC$zmp$w;ITA`Y9=SDv;!S78kzBR5oukUu`}UiGGzvc_ky``U8paxitgyA^>=Fo& z{PH-;uRYijKU$>;nEQHHwa&V0;^*WajTX`8_l(D{YRJ*`6uD4C1CfwH>MLz0jZ=a; zbg5~g<2cJinsp#5p1ox%q@{jh#JN%4E)maDC4wlZ32LUOu%GhDQiN}!NulP7AkpPOm` zs=G!wr70+)qZvr@tzS|}?^<%h48-;1@@qExP-}uBjFnJNezgU}?KAGqYBDykB-b43 zHqN+0$WVo(3Y|%>S@=!iU@Vg2LP}WUd-tuY zD;JFcJfB=w-q6D+#b|tts<}Iv*BWe$m}KYMwLuP?U9ic}^X*&G3=9#^YJwOElOcQd z71*f~mG@>N=_Mu0M}galaIkFQ5T9Ju?C_ZzEx;bt9JYl(0e?Dv#f?S?$C}YL@DJrw z<+M=8Xu+-dwD)z~st3L+J+%2e+{vDMR&u6Vw?Zo$a!3INKb>mXS%~EA$?Z#Hr@IGh^Ftht2enUmqTNhZZztsk4Uj?l)~ANFNl}AG zfL{TbjtBYtE1|r`j}$ZQ5_pdyWC_g6F^8ny5Cm9?uIKc-sV*dccMh#U(v&SW!!WG#$X&DI$xjEg8jsF0P z4tO;`_I0S!()JJ(74r<42oL~C#&7@x5%sHg`aR$FY-SsjW*}|dFu^@GmdWS0*16?L zoN}$Mgond=UEQ3K+}onCk9D+xwv>M}=lMra$S?;OU=OW)&HGCHHA_8W?su{M+^mzx zPTio$0l>jLhHP`+J+WU&*xYI{+9kcN@>RE(UwiZ1VKRCX_ka5J%Y0(+WrnR{_xg0= z;yajeEP^npoVOUsVZs51&$$FwnT(;&1EURDwtOdfpnqZC7<{}P-!IME+t#*pbR_`W z^C%n&DTL$i%|T23ddoRm*5v+|gW{OTWCQA29D#9XTtG=A5q8+hqTMk%o$n`s;X07-aGxiei-N_?R*oX-s^KHIGNDfLDPZ@jqT1j z+CH@<9`9J5GWd_+PlvXG`^LU3vD0H?g!@&%R&(g9_n7+tYvWHI{@Z^V{9+!~(_Mo@ zw_%SfMvSDG!2bZ2tV@H}?vd8KlTp`hwJX^*9YW?yi-{Ptmp2j_B#@r$&60l;O)lbh zKDGFZ{{RIK@J5o4XYkj;_jI`gzzp zZUDtuw6ZcdgeK=b6-H0#S`q2dTc9_W*6?Hk1HM}s{^;lVRE;*sEi4oQah`e+SL|)0 zSyz8^&<^z2uC(YzA%<&{#!C+=dLOCl{OZhFjnLipXri~=a(tM=ll497S}54Du$`l3 z*r*3A&cR1-UbT8Sbhs2O*Tz=ID{P&8K4t^?RyCqYITGDDk%7o9&OgGmZOR47A6k;4 z%dc^17|pJq5|jLMpD_Mh0ab2w3(3wWxoi*NQ-S#oDU#fwKPalNayK8;&}qy~xfFE( z3SqlwBwL7_2aUr<-Ecw3Kb=#O@eW4tiIgd_wT`&Y7oN>bh5lr_`=u zjF`08E@OqR8?fId0uFLdJZGumy%$>XS<~Yd_Az&DC9?ZBn#yo?Oi7AddOx1KeYHW|naq!33P2<={NaqybM!(orZ z-w|pW5)x0?VVCU|MTsnbaW+B%Pe__Stri=oxou;e_>u6_;lIRD197Ag2U%Qc!oR2}(Z#-|MNYLy49E$EG=k3}Yo3b<2t>husjBt%FL+w~gu4$U)`1HH9 zmE-1UMpjtA-;J>8{{R94wSsp!X3rXn!`?XfaRK-<`zQX++E;_L)++jsi~LhOLd{A4 z0G7fiWs>7loPcm;Z~@vFfn1D!B=}$O-{J_1K-Bz2@z>)LM9I3wXyh7JKnIm?vFP^u zu%!Ib0K^h&=u6n+m>A`W9ZzRK!2Sn=T;-%b8}N0d&xiaa;rkmHp6RYGwCxX1hS?rw z3Jj7gVN@{+zccbe@tW#e9L?O|F8&92yW<2>Y9F;Pi^biw(+2+lg@55aTJ8-d73T?c zKbRi*{^JrBHQc8Kl-G4@d*S~84Cyd&S)R;{F0H}$G9e;_23x0t58m%UFgi(MxDBusE?McZY5o&slp>#Z}sZ^;4 z_faz}U=fTFpP#?pNhTtGs;V=M=e{0+hDs!;n8Jq_9J6dmY2T zBv|HFc!|dK1QNOJk;Z-NPT&r9oK-o|hf|VzQ&N)HnMF0J=6@T%XYbk<;tk>P&%)1% z+J>9q_ld2MA6vXgt*=%!CO|>pmXQJbPS z2}Ta25y0(LHHh_XdUw>deL_iHj!Vw@$4(VT3NelV1B%);CeC+8lGeu^ZzNiK8119l zgMbLZ!0AqXamx@JXj6=u)W5dVY>9h&e>z3Z9nZ_#wln(IHR3M}c+15>2A`@$XsmK( znj+;_Jrw~1w{i#8wu(}Eob@U==@ePH_=TZq3$pU|E&i_{P&xG{o|xj2-^NgD(3G>j zjnojVfyPNa20sp!4~ISicq2%ibsrEzF28!Gcb}}{NR_ZbD+k;ie~2;nt-V9wH^Pq@ zScz`@CvRhNue#q;(4$K$m``FJAOZR?VeLefIFU|OX37!W&Cs#n`qh-a2ZFz?Vd@_Z zJ~#Y7XOl{vFB|DKD}YBmWtX7t9jyWw-$Hy<{6=H z?z*=l>(JI*@wwKaD;{h6Y0acf@Pk^HRI^LCZ1m-xx-yWP&~whTwz8@#~r!-EAKD(DwoDd^^FD}gSrl)-`Q}OZuNBIflG zzV6@;KJ|qdbJR%ca(TLYdkRxIt27iI=eQbk{fPiYfs z!NB8=wP7?&$F+e2+Pfh|2~}%kP&z`$nPJCza_K5#D~$gDcOtZnxsQNH1CI4Iw2?0o zFHVHk-pk0|51XNkbdu;{2y>1`D;E1pnmdM1DDZG{E4wca&E$*`*0ZnUw!9_V0|Nm2 zS2apd+}BiLX_l`fzcO^=rEge66cP>NjOMCA3{bHuc@-hMKzSqZsD(6&NwcugX14Pb z++CC}BB(6PRA7!uuWS-C+dZqOO&Z-T=DwQZ))%&1J-f`s<_)z&D&Y4dlei2LKsc`~ z8rwh>L-2Y7S8Y68A%t5-m}Dc%b(&9;lbk4RyyW!;wo$PYq~+A>W>}J9eC*`)C%tQF z7T#+E9Ot1MLE!Y~9<}Gm;x-SyX^+g@oYv-p;WUYkUcZjo0751DiY{= zevE|`C5lbGm}9S8^IJnsy1R|7?Jd00q!v}=ZR$?|=YUVXD~#~}0E*zbvc<*3QF&O) zGXPX%6USEhcVpib>VFO`d^M@*;`_ueB&p8(c%%Rr!xA5yIN*VW9Z1ebYmTgvXB??b zbTDo739T>Vj!h;>qs|rW)COX}0hMAsdXPp(IO|;2yP`ImGh6FWJdsLrBa#+O5s-Ht zI`D8iAA0t!f5CcpllHF;!)-N;YO5r$+&#jmJHk0r9)E);8R`x_cuy60Zu3ylrn&Ie znQ8r{V8x}k3$$ECkO)*eS8(Kj5EGN0YnD%#x>8VQ$ltUlhEw}iWlMNaLhNB!*B>G1 zI4Af(Jx^0#Jb0!lv`g%=Wn?^&Us-%&@a^`YeJ-hWY{1JjizI8iVr?S|19C8hI46qv z!{Yw{hguscuVc4kB4%OKErrCf&oU7TS2m7u0nX^2dkorAvUSN3hRY^*;k@%pG=~MmGX_ ziuq~9CuVvPyj{=f1L2qa6(hpB-^1Go$Ajg()?v0-Cw0|hXr^^g1lxvKtK)Z0dBHW# z`1AJU_|4-9WP?rBA<%7j+a8Xf$bPc8C;s`{^{>uv*ni^mJ~;6GrkklT{@BvvTT7!e zF4>}77^MVq2~@!VbwYXOzNNLD-9pGPan*8E{v;3OUT!0nJ0AWQ-;S)+)VxKh>bKHr zT8+$?7c#bFxt+_%{{U7eCaKGNJ7g9h6Trs1*wpqe*ew=BdT!mP(^3vJjl^rqj-^~WIRwPb6a92Rf(+a$u1nWIs_{{U!zQAx_ks~Is~YH$0oaM2+@G;py% zc*h`PKaEdsXBZ!F4Ej{CTZ4`=O=#)5e3ud!qJ^Yk*%Y=vE|r^i)M~|hOBZ9gV;Je0 zy$+nCf(Kspb~_}s$hf+N7-K2C7C%5gt}00-vy2f9yUcUOUtm9wCZ*hDP)FsBpjCvo zxOF>YI307vM-|n_-q{*+#>D=oH0P2@4rGy=(268}R8YC;fzql;egHT*IrYs$ad6D+p!cY}iD#qESe%-AoOYq%xD01FI2_lVc<)2D!BhwdJw1QV z^{-p;UE0GGxKou}EZ@FiOJ`M14`l84tRVUj5-; z*xv5?CA;y*h)teXi#;_}*me8Pz^|tPPu7{@zu3=Egn8Z#@l12BPGHm{^4Jd8bObT_ zs{L!G5N0x*c0OO!JR@~($L!uCzw$B661p>I+Fib9r&iCsW8G+tVF0#@*-|ym)r@h; z$v)>Nl6kLh@z207h`tVm=hb{YB(NySxwRf@0q$3)r#S6iZK`RlZ7E3*f!MWe$uk?o z;bwu6in8GSD!hP>wbWl&B9r^Ef;t+?yV2ugn`tmlRbjW?43kz-NKeJdaPW6*Zjq zGJ<44!ACF953N1!Y*mYWqA*9^Y#u)$&*7TNQk!Q)Ax$E+hP!y!j{e8yQUhlyduIn6 zk9>3MM!R9*{eH^&^Im=N+i9|}@@+$0gSQA3`hk{{RIh_^1B> z3j^a;zoz(k47y&5@K_0&@Z1pV5G4x+DIN~vwSS1eTyye{qOvk!IrYVTq5E@uGVm9} zPlw}0@RpXc#c6uh_j=5h;SAS*B%V+`3xZrSpimV~bBx!=6CyEU69o0+r8gY}tYR{< zo=+atr{Od&sz%YrxQ7@3_3KpcBaSz0aslmIUk&YA_ghG!i*e80ALr{^;GxY~FEViw z{nLI&(LWAjctZf*afsFMvrE6i904EviO}C6}$j9YUU2Aq)Vgqw>s7b&T?DHs~ggKF; z7RzYDw_l|O>LHPiD+=qznnY+`d+5Ojpd^#}aaGsH8Z@p|ZzBtzzR!SaKDACSb9m9V ztlpkvEt7yMoz?77vH8Y*>lXLMx+h{=ppcG}OI^Q5Db*EJ6l z20mnUZ{h@p?>=A)OyapNj-eHOWwz6T`8zSyYSQH22}Y@ceEh=N)RnH>z?AVwtl zxFe|arVkK>2WygjeQS`^HN*%+EDt@6W$GR{7V&X|>yuoSaomMPx6t%u@nWoblIUa( zq;#lmJ}N_^kugFT4i4;Bhijh_^)_}(QbtJ%7r*0JGhbe6Gd1P&67GI%{#EAH%_fej zbfqqb(Jk@nOSS^i^f3fs6r3siee+$9!mrv3#~Nm_1d-~AC96w`tnc#Bx|Q3UE(jxn z2c;_HzIIjNy!k-XQ$(T#NR&AijBy6VD zBN%4dROE6w~~9EY|=lqhZR-U0u3w1cA;KN8w%r@n69! zcc9(P90Zq*(XyH3jE?;02EF4|zg=bn9osg-#~s3C_8o>zb2^WPn&QHHNp?t7{G>ln zJ;xuFRw|TdMWakK`DJE&H>U1_^%0kx^~Xx|j|h2?;z(a}6P^un-w^yKci{g3iF&7p zToLw7K#OxU)ATEn zK^-~giuhCZCGdFhE~NUtk*YqKtLe8E^Zl0HU0=x&ljgcOK5Q)H;DeAIfH)vm++H7! zchjSm=FOp*)HIQq3n)GCPf?uXzppjoVkD1y2Nt4@2lCVI$-H+U8jQ-^?HK$i&GP)X zpd&Kiuj7j1)b44rEsnsQ`8n=r5FB*PPaFY`+|`(@usKohlUBKiX%tp7oE52-4Z{QS ztBGX@Y#wSwgpc)c3cf_iy^7IUGcH1YwLQIxt7cXM9fvhxB9+e|ocaoy-pWU8Dw-8A z=41eM=O9$kL5>7Ew-oqiyAj02~5O7N)%GfbXZaDTkqXRiXi2gBd7ABpZ!PQ9$y z*(oD>qcqMx3<3WDk9yPONIB1+tYbD89(}W5fr2x^9)`MIBIXT3J?H|k`^b8O{cGH{ zf7ouy9Wmt4{9e=DDBK{pv=OAIjyEa!Nyl6t>t0c-_$>HWP@78Bbho#;g^Eg&edRrW zF5uF!q-0i(A&!+YS}en34tpO;Y+ho1?Yp0qjbF2cfZTD-Nq4z{spzq3tZwbBVJLsr ztEphVhXn1%;l)BFxVVf*HN%tx0zKGJJ7Gs3rFDh@B9&}&-1MxyL&Ij;Uoz1%8y-|2 zyZ->zq|nT}OElmr00&`K@?hWsc8{-mw=8Ib->|Ba;F1Zb0;G~8d1zpbNI3^?Nc>J}mCTKGmAP{3kGkh0 z^667fSjf?UNbAKw@sM)DfImW@f*V!Y0suagE-W%1tLwELFD^HSlCj=nidy~*tvfub~Ow{f?`_yOWB?Dj|%bK@oX=z~(+3am& zg+IFz1s|nn?AvC_sz~!c41Uh`+t%~N*W0`OlGx+^`fu>BMbY#f8^iWu!$i|!wTOQV zNsRqZQ~1@oD`b>*GnCwdj8R2029yV<>s%kipV`mhm&BOlp8G}?H_ynw)A1Yb^=137 z?~$K+>^wu_Zx47&OMPp^`qj0CqczGJ2nGro0p4{{ZdTr0D_lkA*r&y`1HL zwY3!~3UopAv+#%@yqsD@lV1{9$yqgu2^cCYD%icJi~B+{{Rz4#DX|H zt7qE0Pf@*s)R3;bfgdUK{{Zz?m&9L*elqxvt3I>iFA>~o6K>2)GklS8kC6w;pMcM~ zu2NID?tflSb5!iQf^C;tTYKaSG^)oOs|*a|(yCrq+sIDjAB9!8l*jiw`_)#}E+QpM z1{vr@MbO05G}#q*TQdC}us<*jWL?K9pP7I9)vVgQa+0o_anqdUnoKe;7&)h82R|b7 z$fOFRp#5uNZ8q9Nkbn|-#WAe@%sGMdUSvEw6_@y|{ADQde zQkAudcESsv@36<|PMX%{M>0&z%zBn=llapb0=&5AwE=cTB-2V28Oc>YC?|pRrj-Qb z)U6NqO)5mpaHFLmUi*+b6g8dVA1~|-CLpJEW+8s054;Cmy$JwT!MAxch3Qo_T{a2r z@pC!GK{3RjvysSBaBwr$oNs+Z&&|Kv!%epFSHyVqSGQ>VH{kmjq{70<=S@3@azJ0c z<#vn%g+_1U#e7+=TK$=xV;;t4KOpU2q<^*l0D$~C4x<&cx>ScwiDlGvYq^jCcEVi! zmJ9)zW|6>l84<>+I2<2};CJ_~ z_x5|y+f&vqCQf{vxnErW0Q#$mySDS>XU;L40xQ;kWKA`1XVztC$uYgS;B*Jf&+--1 zmr}keE6kj1zu9EZdhn*2VYb6Aa@?NP(Ll{{ZXP8F}N)crjQn*$z%|+PY0oMDfO| zyY%0M{w*<(36k?h7RirhmPPjM-m))#5`0dXy!%gwj7xGw&bg<=N8#s__*acmv|HTk zqe5S8ekkYl4;Ofp=6Q8{hGKZkhmXRgu<@6OrYdKcg+Aw+(VO8v#W`^u$Axs580Tuw z;@cdYdIfV)NAUju;ysMJFMK(sA_o5eSs#lm2_w`8m2>&jM!JjEUzyPG^lh^H*ZGqt zi8Uv1ti%E8Pc_o$+UDCpB#>trIW^Bo;Qs&|`CIHf394U}19;OO*6SJef_EfmzAHZS z#7W^>k*4_G$5PQIb<9v|x@^%i0oNZX&*8;(Q^nFtS*7ct%RD2K_apaf`5npeBs*BF zs(m@>S(=}TT|n6(IP352TxHk94+Q*@i^HEhL@$ZIN371(JUV&kApZs>Z zUM`GP+}GZTjtaAX3;T|;ZF*VTYra>gAO5PZERx-v1{m}rxm^>*8rO|=`1~>8eHCQ5 zmn2+W$`Uw{MqWufA}9owCxAM3uJ=IjZ-daF*E~n5c#d79O192){XdoER44D}T#`32 ziz5dF8sU~UjY(P>of5)(1$n!EXDz8FkEGm@t7;bZ%zC8LD1ZCsujyJk7lw5&5k>Zo z4|pqI)Z@<*+33@l@t(WgRX;K-&@?;UJHsJY!TuW3G>1`vKAon(+O&MiR!*hKaZM9PW|utHui;xPJu25}pI!_>#&3 zxz8nHdDvj%BW`-u#ixOMV3UV~T=12QAwec-ukWNM=#W4^TGkq>Z3&T&T8?c>+9&0) zo}AXpFRZoau$C?o`zH2};mv(f5cuOkC2(73g)UqMz|INO)Z^a(*Jt712zct?ps?}Z zhWy1pD#_scfKTVEir_SV5F~BGdJJb7uE$C7TUjDa6s?iYdSm>4l-3%gHmJ=Vbk>ny zaC}78ziQ8iw*LTa@aKhm3F0eb3p_UIVW`_($`BJEjSbtyAsEipl)29fo-53JE&l)o z6!8;EEqq1rS4O&AmCl{4Tv@O=#xW|)20ahyUftrajK2-^FNgAL-aEL|w^+_4)8o^v z)6IL5jEE7~FkV|NoN%YDeChFr;LeS!e$jf)rD1&5nr^A1!{RX%3%ScqLP!Q!fEwe> za(N590Jz0)V(~eJ4Iw+Pk+le6>ilp?{LcI1_k}dy9r%aCpAfWrQ)vf^JT+@HX+6&J zlO&Ffxs+glrX{X6e2TeJjN<+iEDbW-GL`)Bz#Z-f+S>IRFM-;F0XYy%*t@ zpQLuB;HtstpejDESynkn2 z>2k-dICvKNC5XS945s1%AYZ)lMANBeA%Aj&3;<8hVsSO9>od`#g{5@S?qBdv-wHL> zrFEy?TckJoHSiV-DkC_wkSM#iSKXIT{{T9vP*q(SPs~93PAv)uU}m3c<1cL;9E^1J3kX?7SC%X%EY>rt;A&vH&LjC!H*v&+zLn_lY&97e4f(c87Ich_tpNXcS&1N=JH zaZ2UNNi9rB?OQmFF`r7AH2F{bvnIRW4SWsp&xp#$qWE^=;Nx*C8)F|_SEu-2_ABwd z=nt$LJ2g1}09`33A4ShUl>q-h0Karu7)nX(eESZGGYkaD^cAUN;QOgclLkZZxgccz zb@jJ}e`Bu!X-JZIhWdNyR|G0y6dYr|N&O9X`VYdthn^ZL`bUIpqjkn5ctgHNe6~nG zN;D?y`2PUH-vB&k;$jAm;mfHLb_{|alpn7_`PZX(SN0?E71J!fBh+ne6L2h>x3)Xr zFB!+F>MQAxp+*43EgK5#^6w1($zKgLPn%VHokjD`_7Sh-y#BS_=w1TwXNDD1LGaz3 zw!@WlfNvl0BhRmT)~N2T?JQtxtJ|pIiGK8wxK$rgXuASH0O%;L8^ph~f5FcTZ;pQ$ z!+9zxK2Dg8a9EDpkQE2&!o26jpSJ=bk`Dy<6p@f4y4CK2cIWp|?$1B%iZ=t_>&$;? z9}4&{S@5);A=EXi8x2aq3AdVgLiyllFt>A_ap--CuLALZ?LF~t#o?{4{8(&YZOYdA zL|#I$BN#1~fBbs9`sU#-?#X57r~BEw@fdfFHyjQNNd zbRn0q?O3`Vu^yooBpW19H!rWa_N}WU869~&L7__MX&CyxirQnFi*ig1cpcN&`+6Vp zY6G4{byGx>!qKrDj2w)Lz|^$$)1*5{(M46-csZs^8y*0_^(KiXL>VMi zcGMRqC-5evtpIG$p<-B^k4mREmIhb~o@;{n0N_{yRty&^johy3R17 ziYNf0u)JgOC&69=w`sgfuEPt3%G;^kD|%r^BkFKD>s}r4EB40MZ#>%%0O{$cKnYQO zb%&Y9s;?@aj_<7id(Vpeap6A$*o{ZUTJ^n@O^}{*{L&vqQOh4-4R~k7@7r;s-=_RB z(Uk@W{?pXcC%DQ)59C<=R=gL)zAx4ML#RutYWl_1)y%w0J;b}6`d|`yz{gIN%<5P2 zGm*TEj=r@?#SKNXXUG2l6Z~7_ZC$lb5qO5?`s0w2Paz^T&UUJgl?HjjfIW?Ix3{I8 zpMF`7%zbHY?#dsRucc?pKbf425_?i|DMfV>S$AZLuJU)!;Zlqi!iwd7!dHnrMJ`F!7;{20G#?$x?)Pj)r#79@>NYkK9LN7jNFdP zPm1<%0rK*`nWllJRedqxC7L{sUbPI2mgfr}C)&2+x`s|BU8MBL%{=Lrw;f^!xaOHQ zw&yh?&f_`2J%v=gh29nsJ{uey;<}0aJV`AN%aQj;;;3HeS5U^@YynUAkmOQs!)p5< zEPmSBN42`!40X%|O@OpGX-5k{-?tXN= zfs*P=Xw(82j!$gY(BJS+zXNJsAlH0Jqgm zJU3%)@bdov#m3d7xwzM%vbM(pH4w=o{dX3Rw;O%y-v0n#zlfe5_%rc=HQy81+)rqh z&-USFGR82D3xTwUWmy~rI3F?O4A-HClA|>xxzAC`QRRCacf>#2XHU|urqVnE@Yu}J zkR#MJ`?3{>axLH>;EspR_ad%*B43RE035WY@pq4YBj0G+HNke%^uG*wHWJ)MkG0*V zRW7jy8$c!9@Olgu@=KqFtKyk;y<*a9nxU_z6$aC5T%onf%pls#U~!1#|P~o^k6^#$$04 zwB*t`r3^hNHwdf!wmUfv!1MFxGvzIVh6QNf352} zq(&RfTH)i*F`1ih<(yQIW^@wBIU^^Eg6P}C#NZ5cuWptKlUHYvQxj3WWKok(wr3JN zVTkBR=}frW0QnClqQ2K7h;C|a`pxTy8aixY%xyU&{vk*8t}4~=5tX@>&YE~EWkq!cm!6-Q)!o3V{{SlQ zUD*JPlMR7E%6}m?47YK~I zn6fz~vH&Z94o!O=xA52De7+uz;=|#eg<(>gF&~HR_W%c7`mSwcL63uvk;Z=cMhmPdusN`1IOs6lE z6xV6q!h6o##F<)A|ss~-W7jYdh8;lCA zr|J_!@@>lJpK6oh4~w+xFA?clj<0A$Fr;Gj!w>9qV&P@aB^7 zUFdp#n)dSO_tMziK`fh@WKs!WOBQ5p*;Y8n&jS^Mqel%@#+tFMYLcr(N_YOhq+)o7 z;tjWj?c-~rUP(dn<6IUv?tQ)Lt-r?zA+-B##*I3~oNkUl-1>8h=rxapx_60!{kjzr zMll-@M-`8G@HP~;Ybf;xfm^Xn)=Emy?Z z1c8Wc53f#GWA*-(%TE=X%2seXXNSs?_hw0^d|mLPNw(KgX#xKLrVc-t72Eh%#Wx!H zA7@rE1At9#cn9`t_-Wz0K{VDMZ<&+_dz12mk3o-qe@gDOKZbT!7l3KDQ6g{S%TdSa zUZpBnx{>$Qk2JQ=w4$Tq!9PIz3ssy4^aa3ImKmH z1361pZ%-5Mo`K>20EfO9(*6_O>w12iA-vEY9a75mRBw#Mxujv~h_`Xy74@!-@RvdO zhjXTUN$_=ziHlIRhCN106agiLq74&(hXA0N*Pf}k9+mT7fl+RJIdP!Q5XEq^0@p>|=k`vEJo4Pjyo8Oi%2hMC4F3QUlk3T^X7I1utUi+$;kW$Pw8Jx>Gn1nWun^Yc2L{K2l}`p3J2gSVy783^6o9YPj}j@Xpa=| z-|S)GYdJ;7i1pbgJF?MQ#1wzuMtgvpJ02C-0ru3j5`J3_00$tf4F$>humjWCJ7dtc38@uEdV(P`#aF`-=B$pmgI2w>>-N zw7fOor@NNqcss%3X>H&#-F<@D6sioIyKo0X)bolgin}l!(&^cB`0gi0&z9odfMNde z0e@N|(Y0Bh1_+=`ed%W0+5Z4_K_B?_Q1Lg#JD(5hcKQ zWD1DHklluQ*P;0H;pdJ%8EaPBZ;Eu=H-h#zdu!_p(;^+1+!-MPHy)rgMUDrl3td)|@dLoR=+2Mh4Kn25l967aVUD?6Ope<%#Nj$@S}8 z#-*wt2PY>y4AFn8O2oC!pK}gR8>8Mo@2K|xJtS1&{Fn;~2 z2^2GA)};0ix6E)6ah=X_pUh- zbs&u6?vP6!anrZsij}S=!BiU*j1Z$4{{R||EgSDD=BR-K#DEBG@_V!M-_nMO?pPTB zU=BdX0M*M&0^sC+U8_pNL3@A-#uan-*w6+#SeX>$esyLoB0@e@IP7cG{vLkJ{{Rwv zd?TAc@SWVS$N?8p#pOZ)IL`JU9C{9G-Toba!9R5SHjeY+ABoO3jrKZMQ|b(?2k5_# zdIWrlW#LP^&82PlB!zENkJh~#z+bY5#qS#!t~4(QT`Vp~`eo{fVcY5%kInd3+x`al zCGfl9;YmC#;OkiK69?_Hr<*=UeeIGD(-qYm!H0RNL zTjBdnM%BU07jOpvk&KM}(}H;zBA+n1QTcJGX=7_!&l0fcRhK`QuL=FDJ_O(VU+{I$ zg5i&Rca38l_W_hX4xpD4l?({amjF9JIozWa`X&2Q{?1_0V%tU3giS4< zhxKX1;(Qg#CeUVH3CG^&74p8dcWY&1ERPvj=2EvCA8827hB@Hyx%BB(8Ec?8CVn_* zzX`4z;Z>%ItLe83aNaMpTd%XmQ|ya9%u3P`BC4(+bWpfsxcYUM_D;}kyiM``9Y0)M zwv*cG&wpy5N4-oE0T?mkVDFXmz^}MGd;2r^dtCTO;%ko>YQNcc8n=n#)bB3kMTFQx z1&T5(j$H1Ee|MZ<@ZOd27r-AGX;(kA?w@C&*)5%+vD9I7J&& zyuO#Unz`lT-y+cT3(tif4}#9?!tm*0&d&DAZ9e7Tm5U^D#?dnda!x>EMthExkMJwN z9v1PB!80$3ygvlqDDcPjeVw(-h7wyOQ{P%$paAW`@-6enR$p55U1HtM!?xd;u_vCr z>x=Mdm%?8f{72#0-6FQu_UiVVgB|hR1Y3YHzzchBod+IyC#kQijs_63iRAre@M)BF z%`oXZqT7JHa4U)N72d3<&t(ZGo`W^)ekakI@N*v-=ZfX0@LGAelzgY1_|104okbfa zd373Y==s0KQ+!yxmDbYk<`}^s3m{RLeOI5>x#8fy9%?#s>32RIxp6b(O)x6i_1sT2 z^)=6g?JeRWMh(VyFs^%4)8e$`0gl)e$yY9^UHj5HDP{`~6up|z@NW%%%o_fp{{U+7 z7QJg{8FBlF_dM9=Ip8QgJD#=a{tWmv@aw|k%uO|J=L#3?H`sRR$paW%^V6PdUVD{? zEC|W$Di7@@kCVcEyAp700U_0#y_QSo+Z#F z&~*|jJh7Lqu#?f`%a(xmWnlCB~z8%xP!D4xZ@<_7_JN9 z=9wOyrmVB6-6E+u`hWVXzVOu2eW==7!i;B$kZ+iv&NI|0&rXLQQC_AO3kcJ)J8vnz zX+2M$KWHC>dM>Eac!XQALnd#aQU+K4dM_E=Iv;PL&3}aYmV*_POXACRpHcAehRaoZ zbFk_*WeV9{a;Kr&1D;4K0XZWc$>NxI8pQ%`!0%D#k zr;IUNk-j!?+jGTe!SFxh4dLCUd_TRs833CJp|}~wdc^EHRxzzc$C*-$qdQ4h#kapi zeZw4e&1u{Cg`yy?D@HHb$K#{K_Y?dt)NP|qT1)$jYeXOLD~VBmTBrX23f}WixHg_B z@wb7rLZkLCR(r3| z_gynjo5c~`YI=Uvwy?Ho^$WS!M-{Y62`?+L+JFJv{WDyT!pjJJNSfco*kE*v#G0!A z0A(2^VqZ z8gx%MQr=1iP&<|8x!?FF_wASQAN~pH`$JfG#?IX)(KUUMYc{gT#tVyMHZw&&dGbNx~7&1hD)op79^; z-yBNN_+R1iIosvUsNaG0%0>_2^K)Mxe$IM;@z=ml26+C;cv-cd3hCE#M+)H*-w7&cVKBz&$favZ@?z z&TBPMl<6Y->lY5Y6}SYFDnGYeNH+O|gWEMz?L6Qp$9&P|4ZNHRu5jgOwdOfp?AYzr zk~V<}FDWGV1N>^5%%pN@1jGB)cOzo?yNO8%y}FZ4{?L(5Qv;5osSBYa`7lQEN!bx{ zYIrO)n~}LJ8Zn%H_=F?efuSGlh>odAI}dG+X#a?&S&8 zb+wN;%3FeS-1G94KZ&c>J`3>tHv;xscAjJyS*CDV0nY)j2psy*49{J9#gw!+UT@4- zFrjb=>{&qruX9q{U3ilDe9bGvtmsOCCDi2x4tX09!R^(TuUfq~ihdqwlYgY@x@u2v z{nuG0UvrGN;%g&O{h@pdYK8RJH4EhmOUn(g2%G{ly@L*;_VF%n1|x@~C4=c*C!PfZWwuZYmLvEmV@M#vbzZ$w)gk%W@lEO}fa2v_U( zkv7KNPgU!Vy=pP+CH>voB9R^EFs}{LsTX(*NK#|G7Kv9@v^c?jgitnJlfw?RI z_pWP7O(#c%t+b09Ybc!M8qf!dNt6waT|jPj@Qt*-=pOxAuL z-CW#glG{37#IfF6UBYCFRT;)WAo01o_ci9%9x}AI02{deig#o1tbY*vQ?SvryNymk zHPTx~Si@ux%HRzAp_y`V^ry;SIz7@4+80sKrk3l&eh=`bm2)8`ORF6d%aykrw>$aC z>yT@S@n6JkW5pViYaS-oWV^Uwv`aIAwST&*Fsd`o6akv~vsnGDHT%$i;S>01kb{pd z<5|>M`)4L7P=Dyo)#kqu{{U!@+Dds=T^GgHIy^FN4IY`{_z5SEyCuMth5_tzNx&6E zeSLGUn}Ew_6HT;p@{_EI%6M=4Q5KIk$BkDzu(%>;uL*ttlW^>M99s4`t04 z11*6WC$ZwHUum{Fi!7JcQOZ%bBRYc0eL?CE(zWEV-PLNm)=n~^aw**b&R%$a9jENq z(?kH_9QljiuJ4%t0N-7!E`1+RK+a-{RSl2a%Z5C4+Q1IK?N?hZp5uZD^#-fSr>`U~ zXyyZtmeHefvjUhn%Zvl~o((hX(r1XzJuzKr)6tL2xy4tL!}@4;Xl)i2W0q(?cewlQ z#_ofzdQr@T&UD$sA2$~SWB4N(C-Lb`X~F<4ZIV5_?{A&+&pACh_5!x9G*#V*p-nTpj@Zt{{c%Iur*8Fp#_-@)@%`T;`T={Xv7Y744Qsif7 zEHjR^aczoLIT*C9=Wt(_)bt;XcApJC27EyHnnCb)g)Xn-$PIB40SXh242(i|>`i@v z@Q?N{_z~c%du?)SRq;*U1IMUpY_h;x`_aU|y916hxQ|-)C?JN`1h%$?V~#Wl9B7~_ zs2BhN&;i=DS|b*Gwea))3GJvl$9eGw#Fq9zb+gk~&Tuk#-oOPo$3VipufU(PSHZuB zeZUpoQA|Naa^5)j+wh~|z$@b~9avgQ8*kZ!zGT_X zG3BOPzomHBj{gAQp*jtkHNV4;0o~rnRBgJ}U+mF?>*cQJVUJy>ns#7)9;XL5u7AfL z7JeIiH-)ZzZR2e}PAiPVHNY~QjEqJy$B#i@6!`D=SfoR*UqGBXxq$>fqrC!Vy_MRV)Vh@bFL9|dUsWv|1}24Cuu z;ey_3EG=Lp90H)`M+cwbTJUd)AGS}&-yexBWbvTVEaWT=o`n&&!k#ha?lK-d@m^sp zj_!AHnvA0#y1z;^LnFAmjjkT$!Fgpll2;|2&#N)y{xzSf!5*UnTiiw+TdJOi)E`hm zBk`-RZ-8CqRp;)WrmN2^F(Y|V?l?Fnr|Cqyxn^AD6#7`HZm*2n??06b&8eo_9-J}fRYOJZ(=Zk@suB&(2AX(Bas>2|93a>5O z*{G3NhF(GRuh8j7o|>`p)ij$U(fmW;?}%C|YhMq%Q*W*+$GYMRbBnuje}-sD-y3Hm zk%B?NtWADf%S78fgpsyzRz)gD=ULu2(tHi$8;LHwVc?w~RGH8tUES&EZZ?jXm;orq zY%s-g(rI27(ybcLLxWh;VqPPT%f>piYJ<=yy4pUNtN#FKr?gY~lBm*_u1$Q4n%uh8 z+4Aiy=8%!X!y7U0*aKL%UKR1>+LwpHdgRAA20b3(hvpL%OHfnEi^X0k!0N5zO-O_P z0Fmn#Skk;Ztio+|Z9e|(7-5CaiZwX_{2Jtn#(0cH{ss5{0KgNYhyHi>f5A3xejNDn zJ7&DpJU(op7%eWXe{Eo(V>$l-N|rqS6`B747XHHK8($IpZScLj%B8-^qCEQ5;On(S zc9Ho-iNMF6F`VbMWJBQZhx&0cS^PiIhI;w-332+&7}cSx$!BOZ+Z9+X*X~=up(9c3 zqX1T1__=gT@fWhgMQbN7mA}mBbng}D_E8AD3-Gs8)b6(J8n=(;O*YCI04=;}@HCUi zy#NmEq@Hn4@aKladX)Nxr>jY-YI=p&+BHpHc)~r*xC)>sCuC@#Dj+9l&#htT*UdcJ zNg#LTy3Y>D6gQ~5`mhz%hN9&(=I(77!rZY|JF6JQyeYZ1jEr+#Plp~4?R$7#Grmxx z=iABPe}}I;XQgw{+eXl)`BdNlyzoV6*v+Tg>K1ZpDDuM<+)q4lHXV^&S%RF55&_2} zp5nfO5mAYyv@Ce9Ow58s2LNX|9=RD-f}C{=T=_>{)U>OaLhD*Ro$QefiZAS=n8pTp8`R^e z=~=Pc_!jgPy6`@Z2|Xdw;!phrMk`C>&xNo2Bd;fjZQzltbr)qbd3advM=qJb`@n`7 z0Gzj6S1Y03MKh^+2PfvwV_!921wvEzqOa&`zOfklvvxZT8$tMf4(NOhqBaIUd!)lB zfA-YY{+nr~=~8)`9*1FI$DP(TF~WcG#TA3$`!<>PMx>tnbgt7&@a_D&U&zQkFnUx& z1%`*i6m!b8X=vpB@}<_JtK9teH!{k9>7<1J06M70Qpngd&*5E<{2^M5Xk5ZNbjEo6 zsn-4(WJX!yRq9lpgpS;PRes6GWH>@oGW;~th73tpR^X1+>pu=PJB`h6E^t6#Nj-Q6 z>Dc4k*9oR*@WnP{9mX-*y6*_HL8_vw0JuEnwv42frMf-OZt(o`J(rlPk`r;`j+LGJ zPy9Sz4C+1{@rBitx4Is!I#_B-E?FKTt0T!6+Q<(0pJm`2N`IpK4(0sc(jja zE~oDv_xl~0JT>rRNAQlIg5T`+aZPOo09eF|1c<(i=PaxSPs<|nUaP1GE|X&gBfWX2 z!A&y%08{vB;qMSGmScPW01wzoRK~F=4Q_{lz`-Gp9DLQj;E(=kh~oM#?y{PXG(mmnFvt6r=@D%SzDP1n)-P@Zkx7_zwGn+ znq+a&jb6dSRe_3KcqiZku^T%eZPCXr7^jR{}Oa4Nvj^+_WkqmDC?#Ip{b z+jo9P6>?2X1D(Ku>s9B~6K)=0Gw5mEA{q$%JOC{{>#!^^BS5{!89TGbx8+T{9u@HP zVqI2CcoeTMe>ck5^$d3YmCN|kO8)?ak~J27D8JLBjEqZZG1%PnWXKKpn&sf|Cx$fX z{?UD@%`~JFBSMJ^$&!BZ;fd|ef1PU=b15qw{rAQ%0ch%M;l6h}cSi-Cp$g+T$R}!k zwTpN0@ZPz!@TY{Xu5K4Q;hb%C9AJf9haG>6ezk{d7lO2VVP~g!X4Rus;U!(`^$NhK z_23GzFN~)U3u{;vBUK8KuL_`a01h$vR+b{=*}PHl!&aTmtTy^&EC-P(P#t}q8Hpo< zoTK*XQBB}2dtOiYto(K6{NR{WHN-A)%LS8fmUEtj;;5ey>(>MrrBws2BOli^#JSh5 z$n$k;lmPwMrYZjbppofKCL^NLz8Lrt(F9jE*H^Kp`lPzJ;RZ?hN`TAPvv#hJPKU!9 zRI77g;matePq}mURcV0#0IrRf{cD);v6|KkpzQ2itBuZ1P6#KT!|RHtsrbHYOQ*AV z9OI{9?bLHtEe}RMC6U;fZW+k#&6tPuKEK{&C z;CfUB#xucD`BX@_m_tuMc{L(f$DFEkt#hYFI=`wK`Bh*k$na#_mf==EI zK-yw~ot4qGl7{7b@+uju6p}!oM>jT>z>=fzs2;$CB*)*du9fUYP6bz%$Y%vIJ!k`) zdj$t`4r#4uq!G5a%tDwo?eJe!5+7fs_$A1()8>T!H;|cAf3|!mV+_k)H-lifX zh1mL)TJLl}+mqu@hgcsFwY}sh+hjVPl%$?I`IfE~N4o>`uQ_P5+MDHtIL;5XYZtFCt-x=N5hvS8)xF8;e;TbV)P(%4ocA@MbD~JHWl%bS#v26w2andO$!m8P3udW<)zd$z z;QkbI66}i3CXsMQ9m(RO5y2VD%k>B{Xt+z(eU2EM_3KbHGLmw<_Y_^Q9W3w$+Z;+q ztN#G?swrhJk}y4h0;CpCw&vJpnnPbo+~plw9N5oK@sZxsmWs{1wx|cN)BY2+||A{{Tj{H*;K0?7Nz2 zcmn_oZI0GMpK_6KF_GZ8Mv8Q-i=HAX(JdYB__l7AvqxN=ZQlOA?^2)~;B$8|1zhaO0Cr66BUGRam z9Z$oe+SgoyNv;jrd22VF5=K)4ZtxZ)1-QuvC!E){fNC?o$JT2loGMAcN+}2mN@&X)56PTD}bDXYv^{*oF#hYpR zg~hJY6)vS%$6|`*LF#(}-oF0;30f`+$Awlen(X2=c6U|~-t zm~h;Wn>gmPzQ|(vT{2I6bguikBO4=?yVDqhmBxEj2{f=6j33IoNp!<<*%5u=&P6sK z3&l3(kPMF8b6L7A>`${t1#@C!`50sx&%Cq|Az+-2dGxPGzVPjwP_r-tBZKK&w}`a# zjxw>RBpOQ(P>De!jyk{CryE8AI4$X3hv1zi=H|xRQI;>3?N(LEAcQ}3^zJ@yp%uX{ zfOTzR9XjPP9mT@NO0Zlj5DCw)HSOB2rKj6M*9i=0p+JpPVNn3!40Z#7^scHj{hq9- zL2q)*+P#&8L43Tj_FmPWdE(&{iF}L<_chB&;!C@QcZoqz*(5G-KBlN^UM2HjzzV*j zHP!W~M@Dq>D4o3D5_H>(PxOUo-5cfkbCKNj{{T6v@cdM_ichjzTw*q0c9!9fxb6P{ z)~_SgyjA4~#Dh5R&~>hFQTU5*qT9Xpp>nZ;_>TbQM)Ux6{+X;NkEapGo^H`sK8d`w z@TZS-YrQu2PLAfr_bYQ_HZVE)SxEb=4=Tfue=7OE#$OLFJ{$PfUkts;p52jUvbla8 z;bK7CJ1{EBeRk)e718)3;*{Eq0$XX=sbSO+gV@&hi?q9+AK1gLDm0I1Ol8keoH0^; zxId4*V=9!ZE7*S4aZW7_@I|yH-5lVbymEWjp=tN__Hn3&5J(?;*WSGI!-)0*G+;qf zhF@Cht#u5>19TlKsY02~r5l}%zOrs&{o?_Vk4j%M8K27qbL?xBI-3+Fm?k@eR&2E; zS(a9pIO=nZ){~7p8!D3Mbi+@0r%52#z~H#fJMup+e;Uxz;uiO+N`Z$2V~+KmqTi+K zU>x8Mb6ZhB8equ7IKaE?x<1#YwfDS-EnXjL|5JfaT8@85s$o=3Pt}+G> z^{=M<1vZkN3$(q{bh~(`yR(W@CA26V*r+Ub0h5vl>t7X~b0gl%oLe?L8Sx*+>)`Dl zMew(QBe#OjOt-dzYk?%`h~o)@Kt*1Fm)ZLJr6`(%6Y)* zxc97mZ^l+y6{_6$n^v{31Rb*Kcc}n4$3r0*0CH=L)qiPUhE`3RUlcB&dHHm!DXvwB z>?Bq4{{Zp)SH(*0p7qi_TJKli^X^=pywy4NW7o_8cR8;Q)jw(pZd)E5@CKtl9KNTh zMQeubg^6bjKBa4!@h`_;jQ2K+Hj=t7m|EsI!$+pP?gO|`3riy@!6T5XPBi4nb4dC! z=URzZEifb4)_vBkB>7u$`I_T&+kX+wD$jYZ-p!NqE6apG@C5-t^uWz^S|yR+x==~S zQh3d3sU^9Ss8*dXCnU==08efzvC`auxlgThuVEXE`FY1vP5#YR7!dETl&&)W@YNBT5V?m{;!F9(yD%=(bc}Q|=T0JT? z>bcM9R$#DI07jjCDwGK4xdx4B@k;qo%x4(S1Q2_BX1RY7=}Nk>aJUQ!$G%N>`eliZ zaO?&!LHw%|#aeQu-txR>xcq7I*iKhRGihK7Ws~Vs#bgKH1MsaIYcVM}7z3{rDAR~J zTz)l3!b(l0TVa*5~^skEY3UA#4PNGtVD~di1{s{>L8_yj2pgrBi@!4^%4;cIX|>)C&xtS238XqGG-hMn|oFk@%1H5cp53z+$)2ElAH1yb1#G+m22^uPgEQ{1e+lw~Niv z?B#%N+!hH42k&w6_3AkGq@g0yf;y2jSv-nN#&Ws9?OqY3{?)qGfGgvlggTTl#~06c zq2EV#9r8F4N#&3ZPw^5fq|(1??}Jy~Tvy&Mmr0e^A{}o}n%f?udoPwq_G8w#tj^AR zo~>szHrH_6%V`wr6sqk6!zmyH9j)wfgH-j;1AI5vd~X-TTYY=R`bES~m+<9=wH&%c z<7po>ET~r{v&M0OS$Zdnw0(XLw`e-mo%|>MTG-tr$avu82_OEdxSFavk&)K~XOTw4 zH*(e0rJRzhT3dN2s1&c5&A5)OlhB_|m0n9-C&#WvAYsS;wm7@c;bN>vss*xx9L@+wN)fz2DRi0-3K*Zc()Cq zd7uo5Ek`AntyPu)GTxo5T1dcbGSxf9RZ>cir2uEVYxkRdt zta&{2sN|VYb*)n~cNplsa4H#EB^hEm_cX0_7*aO_k9w;;%q~v=^UYB=W2A=0bGvGm zJxD*{Rp!!SR^M*m6W1&KXpUH+a#Ul}H0HYmZ3JNYQ?QKb^sA#O4nrNsm5{c6xdWcH zR$V@IY?U~zkF*G%D!+|1${c;#ECW0-;YaZfyJw@%;telKj_TnfeM48d^5BFMg3LyL zE;H+2Tl^vYg}xeTHkSJLio90dC1(N9Sz;ST;|CiVnZ|R@;h#$RB^m`Jh{ELZ0IlB% zd`$7DfCv0hUMx3Ddo^PJX{kVgz+7?D*}VO2%|9)i9fU)yu`kJ2q9jt>^tUKZhA^GA)D zdh#|D2dF&frEuEM?JxU7c!u)kFA@A=)#10FbhDdz651G|9KXtlFrh&>@6B&UGUrBf zloWM5H}=Nx^gb8;seUEdSZUFNFN5Ku;*W2Y%lwy-SJW7O* z3%rP`f-pI#kVhfejGs|c-|pM0CQX2SmUWFIcQThO=Du(lf(~{rPnMMBn;paReWLb8dL_||X4e+((LYpAWxN8Td5n{vCJl&iwEl)8BtI)<%pB#hCpmvP7{LCtWU zB8K+!Q~PG2y@)tPY~dFty^70h-uC~kJq<1c4yMz@D%HycT zbJXRT)k?iAH&f00FXJifVNE{IOdUWZk52qo)Se1UJxAg8oUz6ggaxD@-gaz~d-TU% zm;<$WWIqlxxi8nr)8dUo4a9p_s(5Xd!%G(1@G-y#j%%w8Bw=2*9;UH5U1rSKYE1bc z79?V(v%1{43_lvy*X$v^UomiT>)yHYlH1Hv7{_Ytl(}|1**6!lp)JnQ^S(3bOC7*r z`?Jv2ZN$a7Cy;v6?JmNw$@$Wt>I`8RVAeYrnCJ&I;*{4HIP|L@1TAEbMDtYOMz69_Ap~SO z7~_s`I`=ixT4-pcV~!BG!1@aK+~T&jvGf=kJi4QY(*7Cgc2a$!JvI?3!nA<^BypU# zQfr{I@U5&TKWFWOo|V;G=_(udfN|+oVbf4I5&o6((n+4R_<9u?NU@HiicM3) z&`YK|+(I_S$u8skB^_LTt6gZ*kMPIMM}MWfx^2upSj*c;tHA11fkauKHQDGIPLFPE zE!?h4K^t&AP*%N$pS9G57|$Y)3PTm=hHNjwjLT?;k=P7>O4g3t2FO~`3E2(%Dvov> zQ$?DQltMu4D_LzzF9Q_uXsR+t;af&4a~Vk^B`nyGHub6E(}}@7D@AS7oC=ydRdM%m zR%Yak*tGR6k~pd2v{mRa&uY<%!3J~4$9kD8;|FjQ9P^V!J6lXR1vnrCk=>Y{%A}3DK6)=DlmVhafp8zIq-zSG(!N9q>29`&ENO(c<$IW6zNRZ^P2Mp&E*C0Cb|c+?zI0NGPI;l7N7Eie!+a zh*8uqJwptNeH7DZ56(Nk4Oy`#$X(rr!HUbg@I9QvFJ_O&BWOAN!OeHAW*BYY4`EQ9 zHU%W24trv_?_;XxoF~J*GSNcWX^>lm;0Rz;+s{0%FnK?nb-otWb*%;hv)|s{?qYF! zs5|ZYXE^El)|~ouA9a*<2CFrZP!XPf%){VYD;EOl0o&&SDGNhAXRcEPdVK|;;62WyccUA-Hf9GKQZ2%-XfHI z(K-{JLn;21=M&kZNF@n|2ZsZivEieB`j?c~Gc;(Wh-V~cpzHOg?1S1SdIhJ5rns1- zmca-gcrha%ko2pobu8a;K_|UqX^@#P+-KIdtfF9YdLH$gNfeu7n%KC>IX&x@__cFB zpW&5;+U4SVi^Pn{6P0kGSz2 zZ60NJ;tv);yDj`jbjqjh&nb`}#j<}|qyGR4C&gBSZR4ci9-v_UxzFiZ8il3_AXXjr zp0X0dzhWz<5Q{mbQb@P|01L0kY+kI89P-8>N9cc^D`P_O>DH6XvrC^Me*+juKU2@Gh6Q~(A~)0)-Njf|sOZP@HI<8^qU!Vy~n96NzMF)>vWmcBifhUq%cWiaz+OEUn$QuAiq~oa^n##G+NzMjyR43AvP7324 zF;~kMxr?h&Y;~#P*koeAXkWx)q+b!LzR@5#?U7tF+RqM55)secsDHFCt-fA3CyltO zRHD(F#Z7LHLjK)Oym9JiI?|kz_+q#N;#uPPkIDyJ)1vWuatz}tc^iiuW~ov{JXzhH zVHjbvS^g%mvhjC@wOg*;0(R(P2%`i+d5z*yrJed&Dwp2gh1H#m=8B zcF}$1>4Iyqy@JC`gxpuCj+gR9RD7&#BIIm{X{2-HQsc@_Vy6(ddewD#b<9`fTM0Hg}Q;)if$v@;) zPy95+<(2S?1VIqM3d}j<9N>Px&YWmLZtQJmRs1cUmv`ayw2;4+06lYA_t(pB^2XdL z#buw1`d^7{P1H9kjn(4M+&yvEpX*%KspC?z7W2VUd)9K~ru1N=-Z zG3Fi#>sWps)`jR-^FhuI0j+DxfXRSzJ!y0EA|JcCR^wrA1u`UH*`;C$=A4R22D6*8 z8h1KR3D1WC@s5@1eh8c_u(L>UxC4gklfeG~K9%Jj8$q{rdC2cxq43`~I<2joYq+$F zk@V-k(zxqYN(ZBak25~L_#dV`eh-e}h-Q0u_b+s2P{eVO#(itJw$h56upfnGd^591 zd?#sY5Cn`5Ek^)+pmYEa(z>XiCzh{>%){5G$&AoHpfoPxps-%f(+Z~_6@%HZn zX|C!&cWO(a zEEZ_dE0K(Wj%XH$r;bVB)!SHiTO$$MjP<819OsJFGm@n2%5htTI0F?jTm0M#upvRo z6)bk_#Bq;vRAlDaTtuU&29zR>)oEPKj>-#Y-n%pTFBWn&16)$sYO<3ae*cE{U5Ir$g1(E}k$?s0Fh?|#O z4h}f0tpNvxrxQA>Q#jjg7*c9Wdqf8ul6`8)fajck6?;U`q`#a6LxOtss&ToRY&<{V zdyQi4ZQun#U>U3EKY||zET9q1Bny@0o6@m96nr~`%MnO-Icx^bKhHJv4~KM1Z4$+8 zZQ}r(7bCf>-iJ*uc(-F=Z)I+_wy^|78~`fXF40Je0LT>T=A4|F=t3$eD58pj!ip%M z0*WZ04~AOM1F#eIsM-b$R4#GrT1Evt{{Tvj;R7UBDc55%SOFw=s?ytmkOgVY2;N8; z&%a8mG84f78Ww~!%-JCaJZC=DO70~OmFMeQFA}Idv)-vm410+Hel?_bA+}{n9#oVW zJ#p(-{4-?UbhCxeDxjao{{XE}&kF`81Mscy3E3*y2|T$dd<*gBl`gsAZ;5udHW88})DD+@9lBuP=4l{Q82Z+*oKxKAof?m1MG9)B z@5}payH5oJf0JDulG<3<+-n-np#`0towM9uUfswND`-(mJg&!uPzFgg;GY;j;Gv(g zx53phL*kh{Q>n21&Yz+K5;4fZX=MWnbN7)Pdy4q0_V51yf|mSH{h%~6@O#4+_Ff(E zw2UOxEOd$FXVe=xNT-$XWJJbFfU3-Ta4M%>oEGHK!B?q0td5uV;Qs)Er0bs*z92*3 zkAZrWns%X22+O2ePIA6$ILk^uU{OZ}jJX>yG7R8PBA?)!CKe<2uR=^f4GEN{2Lh9^K-*yECa>%>YJy$vQ%a1UCysozC%na*0Vr=M(vM<7?R@T9r7&jU1~Gzv z#-cwA{C#qwSFv%t^bQU=^cC#(LdH9vw8*iluQ_Juf2B=x;w>I1%&j^V9A!;STomOU zWNRGH4M*UC;UC$aH1O5Yj5}aA%%O<{)VI37jEqaWPLQcN3{dl4&;6<4%~DOVSi<&o&V9y{czDH96Iu$6ugM(YZoS z(m6PTJ`?JXr0Y@XQH0QjwPeymOMb-I9n zoe(oO3=|L*MSN~9s+{hRrKYs8`arR$IaTJCON(1yl6#oY<2ZK$zGd(S{1s>6J&n9E z{AT@|F4d%*Eyew&t$i4g4<(WrM9>ny?OdonqqouD20w2P*f-)$u$RJ~Bev2eS;QqZ zKMyRs0Kiv!iz9OqFU^d}BI5**1`Tm17u2?-wKQ!D>I_#*w4Uha7__!|x&Huw16ojc zC&xE3m50ICs1%Q$;i8AHw2r6ruU_!RwWIj!L|+j2BgEDk_L_QL=(>z|aF44*%oO_^ z8lA27kDWg{+AzOU8B}QGej0cyRPe5!JX)!QHN^gJl@yzdXTDf)dY+l+Ij)FWgk#6! zRw86+S{03fP!34o=RH3oPbvt&tx{{Li<6LBK(7`CaJ3>^Ddz;#mP$Of4cOI);sc7+ zY;#pethUS7Z$C+RfD$r=>n9;~cX6GgmC_4B?RzB&i~zX(nkM z9*3W-9!8@w?7-e}{(m~UElaNMytcm~} z<$3&nI@w0b=4$&LXTy&R#i!Z}rjG;-s68vOi3Vy53uU*3VO0tM;0m~lj!kjap0+&< zJv}bPqKYe+>k25MfC?y}kUE+GD6S0t(4GxGJs%IFu)Y@`+CO4zsa7K2DN0Ck}vY|N%W+%T&0K%ksfoyE6uIrXZON4JIpG}B}>jQQeK z1(*$>a%-i~?2HgaZ?xr52KwXtYY}Zc`Bn^%or0Y9$;Ea$RkIV3-_nUY3Mnm-drye5 z3g|j=D@G_u0YJc}S=*HW6~XRnO4`s9lhU#^TNG!ELm8Sz!l)&Q^c`!(XFh&zq(H4P zGD(h`k0!mB$1b*h71W+X*43j!{?m=1eq>jX-NPFpUAW_ncCG0n8m$i>TA(78&a_#*ei?h z)w5h*J351g0ddczdM1l)g;EG04(79|qArqVrK~Jt+P;;KtDtMC2^{2u_;Fn&j3CBX zjB{iM0f4Ml-1*e~v%2hr=I%g|xkAP+db=123f5 zgDb!YI5O?w4{(I3KBB%%_`myY9~Rq4b^ibb%Xw`ayP|_o)Ph^8hTPxi@yD~Fz$KZw zWY>dyZT+CUGvRAnt#8CS%x`f#=3lZzS(-*C<|UZr+dP)*>x@^&Um5=ZXx|Y0Lb>}j zqdldn@#QSPGxg=M)2=wLI;Ck#W7elaFs` z$!z9L{QTWVryiBypA>&=Z;ZbaomW=zZPG;>F^)KxZ(~B&RJ)qt^_%ONC7qbJnIjU+-`*sgnx}buW@6-$Ny#U@7k4C& zEdT&<#Z-~A-ixrXjN6Y&>pltmN1Ne?#7iF(7H_hWZS@pUlJ?RKvS50F^AB|u$x^4@ zt?>0FO0twiQW2?5#q7_yMzj0Dbmf%5x>2fcRI`i|tNnYALhxd{k;-tGG9@wf6PS z2*IeX=aHmVieZ38Yc;OpUzwkutukBK$=n#`y%g+V>NdA7YC4#XCRSn7v942CoZddf zeDhZ|oBR#y^u}u-O6AET89k~eE162F=xXSCL=Z+~c-Jq~`ukRdvFX<1h>?8&TF$e% z5yiMM$JUv3cH|ieB-4vY5f>?L$LboOjYx%6a(Mp$8sq$9sp`oKO%>TiBw#7QtsO?@ zbp}T{1l9+LXM42}DH-co&k<5D-DhSV5q7zYXQ}FMnB}=p3OO0? zSl4k$r`wm=k=q^W=Z3ECFH|r)Pkf%Wo2gbybJUe6^4%jv57{qvN9r+(=xpyp#tfZ6 zh;m0#MP2^RyI^737mlRXEz0Kv)L!Ch`q+*wk+CH8BC`I`B(d*NjMk#) zQ{=Sc80p_NR`$?ae2d$qM4M)5L!m{rGZ_iN$53kak#y3^B_L%;;<7H6_s8YI2eoNw zYvqmEA3iW^o~*2nnsM?wuMJ#DG|3cA%aOHDsjmqAp}s3W#UC82>GuV+ttJ6yrKl_x zKnXHUg2ZM=B;;e{5rRHi>b@`hMw`Mu7d{-)rrUq3M9Cz8{LowUVm%A;p!x^)uNbxY zpCj@W@>!lI-sMdCoUack)8~D5FW5@ZzkD91x;+ELcUpbaaz!aZgb>PbMRV5Z6-P|^ z)u{I?2P=XP7_S9XZJv~)*zWvs;y)1S(8KXB!CLLroROeI)kDzc~`I`(WHnHWEfOyZuUQk0g5vivdqw7xt1CD*OIN#K8p znw7onsUA%CH&V39I&BvS>u`e^7+F_>K;pjV{h7bu;NOVaTfyPq+8<1{)@{SWpKQER zM!?}tE}>sOGqjdwoi4Mt?+$bMW9LTWcJb>^hftCR+>+pDv8Ym%b~Th^Ez$ir{?EU) zFTno*+ET*HS@><@aTVU9Vv<{FI)fmVa5ok(N{nN;11E%S;18V>rFvwR_&ZuG5!4Zb zU(83rPud^HzXkPw?N0@3Z47cqB)Zclk-p1v*wgXU9%&M{xFKk!d)_$+Rb z@q15C2>fWfxVVzl2ivBQ8FdXYNKhrn=K9zWNql+9lbzrIIw{w_jOCpRY<_@RD9HqH zItsFpob6K!J0NNKOl|wfJ^rx&UMo6h*jAv>Ny*R5u zsOT;CwsFAfD|^B=OD?Sp8%89`kbZ`&mCMaph$^c#kMN*r8} z(@5t$bKv%}*HU2_0hoeF>-he4r{T>AN{SeC#z5`uUW4&7!Yc87tSH)!2pH?rBmDYR zKM!aYu*45iFfrPkA!aI*Rv+QN4n)C79Zv;?dT)d@xNV?PiU}tz!RP$+tPKlE`G(=w zy>^-m3miaW9@TXkQ8S{PrfNi{r>LPBH7$8n9prm-)uI$pML}Uj2R*2u0+G6OrJ#U% z&;~xY;SCb{#^y_H3ea9V3F4SSs>XF8(aQmxhgCWDt%IC#MHB(@?~kV!{x#Qi0&;FO zi-uCY01i}R*oDvISW`qu!yzZPHP!fw!}CKRaGTkfw48qyfBkjO-rJQWkOAvhG?s|# zTNx5Ujmbfptt>%Fz{U^hT5?1IIbLcBBT^5)rBX?QGUi>`+sPiaMtB{$arCVznF+}ztCz8xA<->bZ9xeiD9I=AuGdSn+BX5$fn48*AuT+PSE7IpJ#+p7yDb{u zF{bcI9jhs(n9?oU+5EXA@$FY_t+wQjezi5FnULXAk4n+D(-@KR9QsyfmN+kq5*WNN zAU`kKF5^y~nScF~yvptog2NfFPx$DsZ8n>xvSD3il<|TH*azrZyw>4PdE&b0rgB$k z%$5_ofzEw8Rz|uEa4=E_9V?-Dw-Vj^Ru74z{m~$fzc8-Eta*}~Qn1ek*@k~Ks3hc^ z9AHPg9_j0UAFbOAfkU9c? z3c|CqJ1FXnXyXyWc8=LKiF*>Oo;b~M-ZuTR{{UuR1MaiB__L?#cR=kno*vGi%gzqw zgcMGHyu!RM;y?Tp^Gvn5n$O|S!m}V&0vqoU>Pm$1*X;1*9&m7G869z1!nHVjOxAdM zl~tmTrLH0esHo%9uC57KEu?((3Wu8f{{Zpt?ZNv+_>LlPJ}KO3u=#|ow}&kuvRrYD zvhI-Zf9Iuq@%vGJ+J6-EKZegFUlDcNom%eX+Ub|NmaR3?*(lm)mlLxfK3-9HKQo5o z8LImI9in2gs_R)Z>o52y-|hF|--R)2e+~4n75@Nccy~cWhsN6dix#@nZrld9nt{;*2rN&2VgEn0sY}5 z24h^8fV>$egS5*}h~E`;9YT05WICRU;jL14VKw_JD&Nl>gpZX1nD+qe&DlmziTr!` zv#5CI#5XsyNswh?81;4}<&W2s_}4W`vYR@oQiU~SbAJ?mBVYK-TbAlc*|NtQjzSEc z1#$$IIVU9bG_1_*S&m6Ono7v&CbkNMJ5-ZgvvfH8Y7j^pL8M`kiUqijBR3i1n?)21 zDO2wXN>FffRR?LHJ!|2W^INnxNCwjo$p_eGy++Sg7cq%E(ULMN#{LyfWweME%L2)d z^X-q$yRAP`mcr~>yKMyV#&KVyWtBOw@o4xg=7aX^?2e)We)A*iOC|h!GrvBSoGun* z46X=04Mt@^aB;Q1?4u)h%zFx7 z6D>B047*5xDCx9++z_BE_wpt+IHUt8QxHX!r~suvo0X-Pma@7j}txve_xFLRWiN=ul`4-q4w2DH30;fTYM z@NGfB$gQN)5V$ffM{a8Dax5$k(Zy70oi7ymY?$b@c&*|BI7U8{8+&BoBOLW6tUjj} z0E#oxs?T_V$#w%j!#|D4y61sZwJ#FEqgczR%yJ?^RS6?`#|k~qN=w_rad0Ap z;hDN-vA#2D!$z>vEQ!pnl042c$@y?U4F0v_W3e92lW6)31vpijjE_6k^?S{8Q=eA9 zaMN5!S@F<%0iM8cJ%u+;bwW!XdsTUtY=nMPM1E{n=k=#4&D{Gn6rz$gVvw@~fsb0W zE)e{?PEBW{5CG0S>Ubn(V5|pT^$D4@uc>_=NN_>?jb1(xZys5gbm>6V?brPt86N`e zI{9m!jt)rv_Hox0N;rT3=BKf~y0N%h%R82eNZ1r~I3S9zW^^~4T ztKJ~6k#A(ZjxZ8eEJ6$gC!AxjsO-Eye}5641O-9ITFI*#sV0cwx?~_4>ihxY-E+Y{ zBeL-~hjnSJZ|r6gTHV0-D18sAp5v$Ut~z*Uw3x#>5JzKDTU?mmJ$-2m{hnRP zO{|wn9vAWL!^fcsw)lrmQ@rStNJcdabsYVf-2V13FbOWBA(Z~2MdaK;9p#;ytHfyBR#SP923x} z>`i{={{X=)zi9UHzlN_rXWtNN23OIn7g6wZv#AnIrk5)=M~EwmsJo-^xOx_DUKO5hR5Bi5+eL4oEIpGwoy;zKAd58+nTktwEoX1}CI zuK0N_qg7)h0oOe_0E*^xJrqWvUNAiut}C?gRm57CgRC3_x9q|*{{R8`5Av!|X_3Qn z(XxP5h&ZJQ>!?(PmB=jZys!d{Vz;#1AnR1p+9b&<`qcLM5^e^SR+l>L{YKH2^XB(M1#hQAGp;!Jr1K4>6M`I0y6p0QFOj z4;0cdAZ^@Z826`82b%bc!$_A7e4s!Zax?yWn&Es!;b=f<5+DfejqCXj<1~2f=9MByLywm~El{|F%VN8FSAXIS2_$Cu03hUX*10`LODGwY zcpXh87ZSOXIoqhW0;Bb+az_N{b`cZG<+vye1khiK6g7$ra1nG z^RCNGwos|Lc+VA!;k!1D+9=8ls%3!x06z8E=o&ot(<%slMIf<0mCZKWE+wrKNVvP5 zV~RY2-AAQ&T0esFislm7Jb}`!ct67N$F^Cbzym4|YRmnhKWXoP-?EQ`PmR7e{6ezO z?HlE_f<`i2-M3_h70bwSI}8rwRHP1l5#qnJxP?9@y@V*BS!vM5;0}&Ux&HviSu4!1 z6tUWaIXK2E=O2zA@K#+@;)jm)j~4tZ_+@LRSzTO)j_bt6NoI6Nl^6FhvMhWmo?ZGL zIl%e%;z#ZI`$YJ{2{fHQ;(gAQZz;sT*p_fvzoAu?6vze#s5w1FY_T+{Ell1Ly?%$? zpAfzyd^-3^rnax~Q^(pzhhPb~e`{YXayb70VlHHp{sN}HY52$g00lJoH>TVjJK;Zq zwVxK;tbtnc^-h^&tAcj}BDB&B{cdFGyecDGVhq4gL1O;=rdkfu6X`m66z1Gc*9)2*DsuATb*+HTe%qHuIX8he;UEn z^=PAwj2z^8bgoNL)TD$w^2vo9k`4uNOBGh5)t-!SR4FYYdVF6KE?yyP9DyJ!wIYSK zfy(0}+XtpP_oDN~6G;-wCC);ga&z9iJ5cz=rD?K=aPvM$5XL@d`g;EWTGxZ(XN|6G zmE!n0sBHOIyZC~|U4}Y&Mog*arb!-^F6pjI~H%Lu88b#G_FTVgC`_X0h5Z53=C5fVqgQGT1O|P zI-2wXcN;|%P%xs3C|WQ(KZP2f*{{5et~}7(`|y94>t2hkrAw~eB4*irhL^*GMcQ?0YF77AD3Jgo@#d~whA|gOFhJ>=wI>#N@{FSF&6`<^Mi^u8t4Sj9)84te zJxoGzBbCP>lh&_)Y^=-snN**xbjGTCk?h+ymUSa&N`iKXu0r$Qipxz}P`$m$HCE?Y z-b`;G$DpeAknV3vnz5+!q+CeAeN9xKRYRS)A5&cRr>)E7wisvq>dQLv;O=GJo`C-V zN|%VT(B2qX&7EAD^1$Cah4;--yYVHy?a3;U-<+S)xhwAx&Sdh*1y{atlUY}q+ixaz z`eM0fT2HCjPc3rX?vIS3*i2EV+CPlvclcK^uK2P`*@_$%=x_-9Yn{2*=9z*)+qo4c zk8anuL8c^~+;i0X*Bt9B+UImI6zE5qM_u53F|Mx``c)YF%1>PL&0v1ex25$P3nB*O zjz=fgaZG>cHRwJVwzsx{RwMvmbrt5{v~1Cj7umrYjHZ}{_~#}`Kc*|m%;dd;Hp=Fw zk5OJ{o?Sx4M1g*_3{A2?*y&nH63Z7gLgojCLP+Dad_3Le&#_xrw+!3xIL%l|A0QBY z_^MVbxE5jbtMTpKmONCaVQg7Trd%q=&{VB-fB>VO{8dvTt7bFXngp3UmB7biPnnS7 zfv-;Dl3|CvZFpiRUd_Cx=Xc#dO2L%@`H9YJU&8o+5?dL`0R9zG)QKjxD0tUT5vp8> z@WHmX9YL;nP7Z6a@qABtrdo){;JUm2HW)NGd{n6I0+uJJ*#cDVZFFSdw zu`d|>tF9`?Eajmj5T<_U#c65j89#J&>zbt$XM%kzLr(xMG2X4EV;I><9>4IG?XG+v zkTQTRt{yN)evkhEvsSgt0d5?pB%Jj1u4CY>*=t+t7H^duBvGGGLF4`cE3mxSBn$u< z9erzxO~zM8cPenXM+{pearLQf&~D3dO^^)kUX(;m;4{TrZN}zG#*L^|QWW*8Nt}$D zqiX60-ux=+I6T)KRL??-RwSU4o&`aFdbT!l-R<4w#?QCc130Ssebl~CdzJ=PP+uK0 z=sl}0R?deci~I^IF*I%}KtTYGovB%%O)#R0C>b5YGAg)D*pWsDp*YXsocn z>l*nwf;v`_MX22zZnLB=Nx(e(rnwDkN>waEft-dOwdgv;)^JCQnUPrZ3~Qa$t>T?L z=!jr?GMs}{(qfBuJkM0q-6dkH-0@i^GVTHll0X^tHQZ}@YP5~=^NzKFYo!@=h@)u9 z8;NhjCpDa+k~Q4ud@Z9(bbtlnyPgGg-X!s-!|#Hg3A*@+@iWBsdOne-plh4k#|Wb& z1q0NQa1?S$;-&DejRu=;*E1rj#JiokU;&!^a{mB=mww)wukAekS;~a!JNO$8Nk?%7WYRN2*M)QZ1Au+2GCgF=AsHKgm2;Omvon@GN#cn0L_xnK z9Q0b|X}!+K&Nk56*0n@b3+8m{YYJUfK-o^6vMMc8U$-%~_T%2X=f@uz^v@67{{UrM zx1Vz;#4*Cbx3)4AW9iA~AEh+}M5@U<9)YN8iwq5MadCwMB$lry_|5TlJ1l7W9-=(L zGX7D|e^6_m*L-X7PsDbAWs)`zp;M{r(>N-8{p{v{gtr}n42p}plTMG*-z5Tx z1K}%eW6!<1%j-I&tMc-m3PeHS6?k0r<&P|DcK6~>f-Y@SPlnNK8Aim4-NMC;91Wyo zcIQ0f-nbtY{6n^|n43A5Y3f4fKHS!jgNoG3b$PZq{{W1MZKrrYRPth2B6~)P2zrE4 zHi6fZ&NJ)l(!PI-P5V-Xjy$z`hsCcKP2wFbbmhx=t{W$e0CWBym16i;!q7<=mSMDi zd(_ol#3;FJaW|e8)a>E=S%9*7sLnpMoIwW$y<+wS@}EwgB`C^Jk~<$t;5<>`xpa$y z@vi8cJ&4HtE5kv@BD?|wH=5&| zgDGR#LE@>;td$H20OziG6<*?GP)=(;R=_UCvYk~Gsp(R~#Ujn#tnKp0`PO~S)UN*k zIqTAx*B~CBtwoaUhF-lZ&8dlUc1-W5Nk^e(*_1E{aqFJd)%ZRHNAnovh{(@wmCb4J zg>_w{B#iDEuB%IMfn9JtMr%q5w{w#hX9khm>5{Q1n8!@wyo=+Ou$r&Li^qt3kR&js zamLt`H&6Dr8uXiOP+QxXr*IY|EX+#cz(O8O|5G;TD`#~?rt7N&uzqVhCqJhAY|YkF+l}78bA*24M<>-qbEF5O5z9+t|bVAJo0N^ zHAoj?ae>mawD2J$v8#zX9zQzPD#lINbMom(ZMx<5ho>w*0%u8y5}E(>-g3ZlSf53^Sd+kNB#+Y`(gYx_;c_Lz7PCQzSQj-P4Qje z({(8H*=Mwl)^v__jf`d42$AIACf}TUn)_S9K0NR@#9cURe-Hd&rR#RP6`oBp^(HX_ zI1Z|JMt|902=uSTpND=fxA637XKZJTz44Xg^8hFcCe|1Lj#rRL1Y@3}y&u6}6m_o; z_=*n`=(^qYhO2J*w$${?lW%gpa;4Qy>^@rc|DNx{CMk_^Mcl-Yoh2P7b~rR+2R#z+alJ+LZ}_ zbM0CFaEqO#v5%E{)!S(!&J^Hhf@`UxgO%Lxz71Un{6Rgo?j^K19;7h-nXf~=A1b%L zE6P3^Ud3nQ3pbWbE4xR>a>`T>%!>7!&Q^PPHPio3gvAs8LrK|Ehg2ZKdJ_c|P z8UFx1vsJAinlXlLz#hh}MKIe;I!t8Z)K@Jp%T-~qtJV>u_Wv}0lPQAK80 zg+p-M)m<&)`#al!0fJ|bX#NlmRDa(ke>%5W_Gie}?=8ylB1bSeJdz5Z{RL^DA94u< z6NB2Z^%wHP5;8~YTK5bH{#BK!4dCG8o(*dqioTXGri2{IPD^r4VcpvgwMg*+weVO0 z{9N<=tA66v=v(_A!|+NAh69Ob$NH#&Jx(`t z9mtuqmCL7oYZX7>ub;H4e$BtJmZzg=8uM9rm&TH&i=&7Fw5pPy^qFu@Kv)F7FzCfO z8Lz`_V_7Q~mkvTifn#0SDxhEweg%3r?M?ehd`JDJd|@BNuZnuvzt!%iotLyW&}2s( zFed>JEN8an-I94VTZ@o+I{_cN2OtJ)p159yt?7Op(6j(X ziKe71%ZVn*X(S)*Im;iWa617-#;+?}x|}v!mnW(3RqijPjuP9-fzal;U0JtinkYus zVX99fe&$Hj5!SrV#@i&+9%WTfP5~TOQ>bfe1dNGrGBc9RUVq}vNiJ>~|L& z+q*KJn2!(XxD10NFbLd}{uSy$w2wBbQkKV}c$$4)ZDZ{buGpmk(c^B1)9Y2WTU(2`{P&TW zfX7;gN7s{I@W>Ij@9p_3>CZo&Ra|xF0=DdR zNbI88q+=rk7_6OdWE!-dSma|oanhk%;Cg|a^I5c-)ZQ9yZ)!JCUPcNNka!uat!67r z%{lF^p9P1@j=Akn{kcQuwLyJ7yEmB`~pxrxN zDamH}t26>m0IgQXI8j%8L80GxZ&i~<)T1dpA$-I=RFww@^Qu(9D58o0D%O#y+-W!Q z-`h9M8)pZj4&eJ5t3_!_q^V6wbQGec7Mbk69q|R0xu>n=v-BT0CnZn4Uz$~7OrM#r z9`NUguQWTMBoFd2`O~qlM$$Y>W352DWW(c?Ez|2?pkO0oO*i~*gZr=49H_Ns~6%Nenr&YD7kkQDX<$3hYSCly$8^674$b&o%K9y4LB*-E# z53OY=v$mZ`T+5a=Rx6zG)}VFZt8_Jf?g>d75FGWvs*b023iDjGDY+d`kxENu^Du*h z(yT#lshJy-Q;6MHbEX9&s}PI1m_7RC$^ z#POQgwvjC2HxnO~K{>9)%LtscmpZZ+;x4|rM~7swgyw6-F@xxz#D5XT<6d4#E(g78 z_`6vt{)lusNyA z6<#WuJMtAB{Gs6)0 zGr>Ang>Bsb0K~q*BPE6jbC-TU-)6_QE6%@Xj{q-+bo*&_8%WmTY)vuR-3Z7Ba)JmL z80nhzvlpJNA$$b~Zyjrjb*}7=>QvNK*!b_oqr|}f02W8#U3QP+DOS`wWk?uO8yLXr zUU8`0`B!kN?HrQaa(aJ-YTN71ic_3++gz2Rq7yqX@PqpB(V%Orl?{>ZQ zT1HLfs^etpr)icl2^a?fmpl{bYuaOFi>l|)*W(xL+wtd9_&f1OM)--K+{F}7Uq;vP zyB(%BB}pfY3_09*%IDg@UA`22Sn!v|4+*D=d@XaGu3^5kbNkCV#y3Rcu^o>>2qUe1 zP6rz5D@p2neq(`DrFbn4@56WNVXInd4gnC{qwW6yb%C#QyH#sh0}T9xiuwNC)l~0n z6VT$l<3PL`mV;+@_$F&u*|X|YX1gkT&gYv?L{p8FM!}Cb;;Tz2Ooi*|QhB=(m4;1J znnfoh3fi1*MC6ksj&?cS!0pXhw!Bbwk=LbV`RW*uNxYL2v-Ze=5PXyaBUX5M6E@oO}A$9ZF|iIX;HOb1MJ|&%H@mw)X*eWAv+WT$Uf< zTylepI^yn$=%hyv$fc+l5j-6u840?QBKGirJg&)GbT#OEe zhSXKr5sQpuxzu%CR^jK=H7lpxB=R1l`VPTI0C9@)Ul8igbE)}aKz?i-p7rNfug#)8JU$&o zU6=JOMdg(N&UW=9tw(nwJ-_b=_o{c(Ihj>XZ~&%Baz(pG-v{%rK2mL+msZ^J{{Rqb za@*^7K;V{;;YV(Gs5Je0RE@C!$;c-)kK(OXNIXMwRj@qf!nbjnqid`?PvjGw?l1>R zT&_rqUG8@t9lSELUfqDp8~*7JPpxTcTI}Wm@gj_zbN&^~rnb;qC7MD2Uf|Q;P@Z`H zX8}OzT=gl~(mFFjT}-lvLIL#8TB&z*_Xl)@j0&eNp&AgtgU>wG4Nq5g$c{xB9RaMN zNw=}ms!`?lnNM830I&-^uWxa%Oseznq$ z2JX$D2kUa^+Nh0&Rn8kH71oVG()L)x0TX1Zis3a#4Yk5uAv~U*gjY|aT*-N-$8f_Z z7$nfpiaPz~?LmOxamo5tVY_JD;P88jpT!19?@sm{s619`v0;*alq83CTsny(<^5{B z*OHKOcr^>Mt7IBuv18Vqkch5vB9(07y#w}5_(b0kej-ca9ahN6qWD??sOm-3?2*G_ z2nhp??lX?)kLg?lmheXNr$o@Is(V0kKGHHiUidVpwJax@A^$24>coUwPtsIb}PD$)B z;E;b09r01iZ5$x7fDU=)q`1^qcEunL<26R=@Jt9(&U)0gj+m#>1p5deza!G2M=IQa zYB!Zsa{T&KV(AIMY*rJgPCK0ujG8np=L(08odsq1o5WKTI(!X<$L|O|eW{n)skVrO z7$@$W{Cne5uSM!0uP#|Ly=!0IXTMg z^$RXnA1LQFB+fq0#Gm1+O#J~hW_AMDo}(2ZVuF3{wPxI^DQ3l02M0Ahx6asM#RFxi zAIuyM^`oc4zw2CZI%cWbtZ|$XRt?z;vv(bZ26i8JaIDzcJ*uNh0mgq?Nu?z5Q7CpN zJmm3#Lt{~ILFQItv=09Ooq8X@kA@dMFxE!5eFOc5%0O|qiDc}(dJd=Qj^`45D)<+B z;<;`0J!&RfC&?&|6`LKsM_#zEraTwmJu|}^Yzc2qJY0-fI;@WbYjuad) z=cgw>h&9zltm*28@bv0N(mzu^3;zJYK|URL+SWTSiB?C$m!*Om*o)6$BWD2ln?psD zo*V!%_p9yigPthTJW=rXPt>$+UfS{>D5_0sGRTghj?x)P1Y;c6;7*tE23;-2*<6?o zc9}>Xy)r*K^e=%wxBmc&z5{$lhyE4Lx2S2iH!~|qXKqy3-USQ1Ttd>3hQkvgg=HNx zUe+Hla?(eUiON)c=pVQjaxz^^hX8qpk8JT&F77sDDX%2`n?G&egMYO=BG?sCNLW0BZbzlW4%9S@wuQ=K{4p{7|Gw~jqU zGC7LAcX#Ha5*5hjie!6~=DHDrHSMJ*jE+0i*e)5m_N-fZSqLnrpGwfTlrZ^QpG?+O zA#`<8k+o|uez?wR^|Yy-wTo*ymIRKSt4`WvW0f`M)q&R;+|!7I&P6_}K_*T?1XYl7 zGh9tso2PKB?-JX6w?e$PT#eT3R|f|mWPYNwX_Bh8RE&Z!ML6yTdmNrcQ@L`W)aoRP;S-KC#v~5Ldb)>Ch zlK%jLiGJSx4gHJ$97xvEL8*AtR)N>US_bTr+>f+M2i=JeB=MYJSK-&iUy7b5_?6=w zPsctq*WXgsHH*f$)bHi%Gm?6LbyR$+qlE(lzH~omui6vhKgWNGnzzMYidyuSy0)t) zAjnEu!U@>~L-$$g*2izUc zt$EM(w3?rY)-+|no08r6&*591BGv8|B6f}tf&k=-;WQmtSeM0odck*=@sfEXx7nnwJJ!>0R)mqx;Yo<@8aYd%9bkMYroN@AwqNO^Q*c2|V zc&CnTq>scmaTerG*(y)1SJ3YacX7^GHXoePB=u`;tpX0xf= zv^Xc`-J0hvr7}odcdZRxRw0Wn2|X(z+>^=c0s9UF@m-LOm5xcY%T}`p?PV@UBLcB6 zWhQb-ty{g2+9y1f$*f73Jf(-NS&`IhBuQ(z8zFE(9s7S;x8Y4o%C~q)=yGyurIP)- zN(^u_4sv7eu?=pxfL= zajIX&au^QrLfB&68Pq2@a5^vAAL2}tS>NhX-YYGDS*0=@i6>%wn6aOmb9}^g*o=Bt zSMe9dp-rE|zlWM6V8?E@x<-|1aF+0>!sMQc2h7fT@=biV@vGt$zQ1^$6wq&t#-C#` zlH&7s8im;ydBDKJ0rDX1qdXTNewR8}eizB5PWP!T-=AgH%g^w+`F0gzxW_(@GNfE+ z!{A+`e~GQRrM91sD`yLHJl8Y4_YyO^v1fKUEKekpQPDuhabK9!lboAp>j@;R6j9XB zK?eq)VMP>B0Ywy00Z)o|i1Enurcq5v#oYmN8~*^|CmxwRRjXUKM!}GPdiSiFRFTt^ zVk@$iI<+pQa-|7$H%6xG@~iG1q*Iqvk^A)N&0?kNsT+_SdT~;JXbCl4&<&5sPe>Pqe+&^%!hyEnZotkz$4z zhFV8r08l%UNUw7ETl+fPXpA+V8buS`tDh>$Cs`IS2*VZtjoAn8lfkY30D|8Jd^O;! zR=L$J;=R^hMQ<`&bDL7EKX$6a0k^J0sU-Zk$4d771Hus4h14}-Rz$&q-7rb_e?kc0 zetwna;<0UM6Vk(Bd7atM_;bS+`ddeNc@RWZ%Eyi|*jGt=;(a?&jcxwY%p;5}VcYJg z=m((os$M75CAvme!pV)J9RRLtMbPeT<&ou>F=NILL0(d7TFZ0NNmEuxv*H~o&8r=Z%)j-#AF z-@Ve>-W^WcX(YZOaUv@=Ps{?a$vNv)emh!4dE$GEX;n<|Y%EjV7y4qn@>^Z4nfRuj-x|@gIg`(QYD@p4U%>q}dcq#e`$bc44#-2RPf0 zO6j$2)|Zja#ftO5_UT_Xcz*j-@b;k|tz=1Pj#~_Q9-LRVcx&Q*iQYR;Ukq12j3vUs0dj>;#EC0)ol zJwUD-!}_y6t9h+QjLRuSk&tDRJGeZMGuzs;_3wxhUg=EpPUb@%-cCu+9<>jKW@)U{ zZRLhY^fk7q+AT||@BaV?zA<>qz#843jC=#EOQ-8L6RfruFvwF3IKvPQRDwYSVCKJY zKW8tFS|{xl@GHZ=7_>OdYphrXy0>iR-sK67XpTVTWLF(I#%uZe(l0*C2nquX45{y5 zsQ&=)La&IiYd;74eemXcqVnk8EsFUf@{SfeyIA?%oFASS_w~+r_43;CjMQ#aKi+wb0zQnRx}XR_*0f zZchfWEhgK>@6NAV&ZCw;jZD)zDYT8aBpb8qSL~)cun%6k}@%z(JN(eD+RenkN(!b zwNJwj*%#p*_r-6Cnx5F8UoTIviGiC?x*+**M7_y9PhpaJSK!a>S^HJ^`}Ualp{e{> z_?4(M+KtquEUgwz(COB>%y2?OVO2(Rz%0a)YiIWS{k6U!{@8yTF1&Bz%f^F7)8~>8 z3urLSnCxx096129Va##V^ z-nh*U_{FNnzaa#Jpy)C=tuGqt5;cdI&PERcx!o4>AGaqYH*S0TRI7wy%=VPZ3D0N0@-^T#O!`)fI-J8rf}Vzz42R6+696y_$@7 zJmMF7l+r!IF&P;<-xe^{5p5m!PAD=qH2UE%Pr%x$%Bj1{zMS#n4 zWFv$gzlB!DZsmP-3}mVvHutPX&Q5D{U1pH7;C!bam0`D2^`mhecY|3jG@%<{l*rqj zahlK5o5;Imb=pQjsXiZE#rC-@PhR4)f~jds>*?R4%yFcYI=ZPI=rNW$35w& zrTGibwK>yy&r@Ez`#%24`q#v3apS)pO(u`wR0PCN%X6wQ!Py8uay%YpJa$~3otQix zBOQp18Zo?|^{*5qvwsw91_-UcU1W2~pW|^l%7AQte6amM5%+1L;B=t4n9~AyEL*PSk z;r{>uYwLI73y9i1XT)~S8Et_lb-k;A2;kwR9GqcD75ZKi1A^gv8>>;LQ>*^~+hhKJ zHhx!LzGKGN=&nZ^3s}MR{`~E-^4GGytefM1#Ta}ErCxkD@V2&>dhVpGo-WoPec~l2 zn;4(C82#ZLPs^SN9u`R_CX}&mw3Ye(ZJO52F&y*JEthZWtLlECmSwbZyfUQ?Usv7! zi=tf?fl8w%6qKq!IW^@Th^)YH1tVmDO&k(E&ot&-j0yl{6cK}r(LeRYFna23I}meBNE)2 zlHjhu06z2z)*+&bC>W|4$WStS3iPjpb69v@>1Jyv;Nf$?>Ge4yIIagq zhWv7bYP(oOOLFfg1$)x;4)Zl(^S<5zlW;s8NdUt?6BSU>4f@bGtP8X+Y;FTz+ zsype`lwOCYn^wG#OCV4)ny;wY$!{;62E)AM=B@Z|QiAp~kgb*ZbI2q7YVFC2Rb^qc z5s#O@wQ|awQ#<2PG+^ox$32qd&12N~@i24sq_pcyO?Qn9xHsg`+ zUrGE{(^FWzwO_LCXMn<87v?!6s^D^YEI|JNXxGkAD~r9~#9yDScGI2oXC%}f=H`cF zE}`7ejC3IJ&0Es^IduBEE}bUFcEIO@^{MnAqT2;p)iE8^0Sm4`+^#aLG1W-#>ygwET|vGl?=daYt#d0Rej?LS;coU{ z>Cv-WmvRJ=^2R?;Qa$}LYL=Vg)|prV^XI8Q=hnCyZQjR9Pn7HB*FJT!-HfmuI@fjK zw~b?uVLvbg#;r5yFqR+c+Gmwiz^tF!}7I!_Ex#A9#qcHPn%>r&IS%o zJ*(-@_$K%5l_%_n@dHxUHCSW1@Xv^z&fCN`h`+vvVUQ)vXZVWwrzzYXITi9Onz_IV z{X1th(D+MIFQ;6nbG@XDsK6s`8+Yf$bYbf{a#A&~LN%b`e?vYR@qdRrdEv`H7x+(C zg8u+czky}6ySIJIB9Z=h?NPX`^22?UO7 z>hPG@RgIHAI~kW$!_Mhwckr?5$C|SQ=OAb4Sr+$?zvgTYdbe+MyMrE{wc6(FaYb5M zokowQ>UYSp!DAyU50$pyAH?xn_I@4I7;cy%k^Ck90K&dY{iFUU_?Cb8C|B&~@GHZ< zG}J8YzRj!aej(GWZ={JXqKXgP2?88QzGPBxMlrkAy^r?p_^_W0{{Uk@iT*aXy=bPi z@MZcy;~@F6!eWnU?03kZ9>%$+DYv259!p&ID0H)GrLJxjRYxR_2j@?;yRf@2{hz4A zIgEiIhEUs2z7G}iFYH9pcz5;;_-$>f>Wy)8ap4UTpb7^xUpZWPam0nUwz*Ne3p>}N&=vu005|u3V7cDhy$RZ{wx1U=>G~V%zqLN z78V8;9u6MN|F=Lv!@$D9BYeO>`RLH}`2#)- z%m-+=55yn6eLkK8U@_n@zp{$Le^E3Rs-~`?sby?pYG!U>Y32OO#nsK-!!sy2Bs45M zA~G>4IVCkMJtOl^L19sGNoiSmeM4hYb4zPmd;h@T(D2CU*!cXy;?nZU>e@PJ54?YH zc=Y%9?SGj4zatj-|BKoGMeP6PwGKdq zf%+Ic7z}_gV6J)Y><;p_R5l8n#-ZY|dA=U8ihXIOj-%|{UK|=taDt0YwrCMsH zCoL{uQ}X_}Li1Fwb?-ig5^+uwbjK<~)A;PbzFi!_9n=%}=|@7oZb_EsEKU^tZ!wk6 zz0b&=+Dt-z@+oZ9GoT@4sNGpX3{+MR52IXvtUEFI3lSQgA%Q?%n)^J~`zh%5&);a8 zeJrN@LrAiJseDzQ4xNr7J%jAWg znwc3dgO!BRCbHbBtBnyltGkxB6>eZpjG!^fQrQHOohbNNX|-}lAsr-IX57NKxKLFk zi$-{=w%dfrca*6Ww@n_prRtdDtUU6W2xg{8BXqHcknW&474PN~2ac(>my~m~FQ*+n zfCZ8Au<@)>Q|D8~P99O_&g=`mj~|<;t!SfdUZq=j zIdNc!1I>LR84vnN7vZTsfqR%}TYW}>MY=8J=hHxR2Osp7CX2!hCNADIxj|??6^0It zIL{78n0y*eCFud8v?G$HtnA@Nx@lYOQjpq9H--i!n3oVTIfEQawFA-K@q!)FX>sWHm9RHkYFLv*|{u~Ht{O=EQHF3f%5R&SWWG^CL&M>bZX zjB!8Ag+=8wcomgU@Xc+=9e613uuXGD7gnNRD(_n4v+K;EP;=12Q%Z=TYW153N}Oq?Mm&&dCN zgUrtcu5Lk-Nc0+1ue%4u*+L>dX<7Ft&Jgv2^)+qH{^o~TO2xc>DFXj;K>#t`Pr$LJ zOpUShg0$85@O)JffC1Ec7J&HMpL*K{kw1~NfM{-1vu=;q>UV%Cp0~N7%QXdPDzLZ; z)l5!SK7^-7V!uA%9l$6;dc~CO`HC(Hbt=aX^~7GTMgKLC&9OBQc{dQ9ENC_s++;EZ za2atNt!e17uUQKN1`Vu-jr4>)T(56x8!2EMkA=h@vWZxS5Etqk)IIvslpcXmDmJ{F z!;(#!0SH;kk!KO#iq#WFNi->f6s1q#*;SdF0^0t-#SWK2uTU%8wwO54drQt}4nx0m7fL8$32QcQn)R^y`|d97|-8c6v*BIQ~&!^A$34!bM%fwiI?L{>HIioIVB!ygtKb0YSk9& zJc9_$N}8dhRhaxbN8=7Fc+|?vi#ox3Ep~K7$ur?xDaf?MX%P5rSdtB@+)cejU9KI- zGwmQ~S%H|{M6dmeb?v+J)<&07j(U#R4J+ki{_X0kdm&0&U8Gf?S?CD7HZP^8@}P}2 zOk^SlGM{okyAvE)qx3k2LNqHLMHdiDG#r*_DLhX}1d!$OSU5HhwzZvRn;5ZKYR%tw zRMPI9>D4h=u1@*W)i;wWuiz-%SgqVt>mfb*O7AQ)yPuuR@V!j1qVx)(KMuovKq*ds zuF>-1AfZ(usBM9T9Yb^HIO@dZ4_T2}vbZA4y_7p9Q=ol3?(8 zS8l!Xj4XFG3~b}f3ec8Rr-8PpQTSa(E_Q#IZ{`#}XU+kj0u<@8V^oyrEi)y57id!F z7HLS>!W!>~BKDWQz-a=|0wd|UHokrP6DfkFC;`AyVu!2w3YmDe^d^BQGOTkp7p_0l zp?%LZi#^%HAudkOPB3nz?0M!?j7nfjj9k2LyD)4Pr>w?SF^%|3-`~yWyCsY!L?|a5 z+R5zd5@X0s-&azaHfEpheI6e!N{n|wy2*L7GW-tMpxN6Q0#k)NwExOxyn&DTBRyB9 z4=e#4{QFeyRps7wQAAnyn!!~lUZ_~T1hatMXoz>=G+qTfCPtTf%@ekci|QdxXw1cQ z4`Ad7S)Ir~jtWl?iZ_dQrhR~A5_xj3A?@t+z_sci)$?4+08-$UD-BPi2sQFjsu(Q) zi^n$Oosu(mrmDDc3VxY*!~PP;+eftEMyeHSrWbnNcr_ldXA{W7LvhE+!oypsjk3~g zpM@jlK?>65s+Zu9rE5O0OUGtBu_Q!8KbIfAKbCEX=kvw7YSn>}`CCCjuQneY_3+z) zJFc?;5(aq(@ZH$2pCx@P2>GYFxUkF>`+p9ZT|?wsB*Vnk<2^Q23|eoa?*MGOKP^DK z7lGv)kv`;KPXWRq+_ja}E;GGq2(hXICLg^K(t0wrm-HMBuREywXnNO)N=3nK^i(KawI-33YaJC$Q~M zggINIvpkW%#}C-$_Oq+o+#R(#V0b-XSNw4oJNlV`gQuC^3{asF7D3>=Gw;n^6&@ks z*5I7M9(au@t{byXpUI|s2h?Yg$^&6eCFUH9*FYrLS2$&rTT+&WB~t>4TsS-hV>6(a zisQ?Go?7abvLX1oYXZpy#y(V=2Q#;kQURJh_A~2a<`6$9UxF8^##m+)3#5k-9nRNY zbar3iffYO*#}&@C(x0n}%MH#JTN2-oI+3m>`uxy14i>z><_%bMK#zUHPgHOs%B0PBz=bqS z<}E3f?{;o|PjI!m!lEw?!-~BPb?o$nTwA7^Qb)Y4^fU@IS5WjmN!Eg5a`X3b$Jnz6 z0($T({~Pl8)ubigO8AFi3$vxIE#XDn5_Xn)!PVYj&+HvTZvHJOkO-a#oTN#@_YMeL z@J77a{%vpkNBCj5j6+hk?oS`X-1?_o1}jZ$llW@zEnY80)*T;%p!say-qrQC)cT$J z5!E~31-JhbvsOpu&MsEkIv-w0#pcPe`7d9^&iVj0r$O)`5wpB?=N0J-F3m1;lr44J zHM&11I+}lxZQ&9pPiL9wk(E6R44F9v4c_j)^1mk2S)sPjH{HZAj>XUJt1`V};tO30^o||O zO1e}nYQN|~apwhBa(bpEN3-AX!M zY>{qEIvvMMWPXjE@JBA0l{QigP7T;cCv+y^Y!}QLThcO@622)$-r8?)3WL$#=x-N5)g2pe`L`=Y0QQ^Q z`Ock(X-U$$%ONA@cL3#z?mJ+?`)=z@X>+S9@lec|Dn;BNZ*<>t$(Rt@FWbc}mFrP9 z!w43Pf2q;ZE>K&?+6>A`KWvd}$S5{bRGP3G9|1fsaCv4j4cWp6Bt<$6BMqN8;Ng{# zeK!up`cjU`Q{QVWa96SX5UD|zKPCvrm|ZYFUiTeHgPiA5qYS}#W_wY9tdzoD<%XGX zg-flw@MlTcqf=BQ+;R)MIISMRB70^^a5-q1hnaT9!%0$JVN3a4Kh*q!pg&{1NJH{! zPZBK)fb)-`+>d`Huj6(V_Jq@Cl<1G&0Rj58mjmb_7}{1j6rqBC8qx4yHv3^&xpn>! z9i42s@2WQyS`vgPe$)@6OtVd6NrJ@r%K1SZqJHJOO`k0+Ll9dSHC^PJzoqbuGKWyi z`&c6*A;Jdds89691F_yk@Gpjh?8OkO^)!a+Gv>`zc0NU{US?+?SRgui^zL6F)lB)V z7rdd=?b%~nuCxpH5mJD*cp0*b7b((#P6x?0B)(k3zNY*}r~|oKB;R6qC#Q=%e?6KX za}P1E%kHB088i4{`?5o{2Ns4t$FH4|kTo}FCuc#|je=qon(6oLBX+K|bD`Wx)w>sd z5wrIZjBlW>PZU93?S)oujgiR$nu(m;;`yQFe3`u^UyFpkz5uU3jYM+l`qFCgXV398 zOHxZEWQg2yk5Oc0C2GX;8#TPpS8kp}8ZCB;y9t8Q4jY?A8K$y3TmwS(>kx#0 zH})GJ+Um60N{_|w^UG&Qf}161q2-iPlX40BIU~qxItF-&13-4+#L4%#JC+Mfu+N7(!r0d z*IPI38`NZx9~SVtEULUkYMu1UJHUoHT>rDTwIwKy)O|r`@$14Q>w2FHL8*HB0C~o0 zJ1b&kVXT9C-IRylFzGs}-pY%)M^%iRjh=P}rK~QOc_hF0s7!gvx)av769;%6BK2sC z9!#bS)2Uei8~>)>Zd~ zT7r|b1utUDCaU(Vwl!Q^;5H?Er_+|ji$_80-o|$Tu55W}pvr-~RBGGKlQBuxNQ-A3 zO(a}lfZkIy16OhaP!$}=!iJ8w*Q84R$iCk&`>#gswZ`|`Wa@E+rROhzC{k z6gbqPzw4zOYBPo?nBKe4AlfU|+LKXl`C*tgWWQEkb#4!e63EMAfad~3^z&HET3kc5 zOzy;x2n2#Vu{*47)fJlAB4@uZEE}R4z<5+8`Q>&@+$D6Fq zNsB|u=&p^_>VRN41?;W^{RuMwayT>iMjEBp;qg_ou1RfPF82z)kEsNIMqa{kDgWDv zCkHD=#vB%<6Ybo38oqJB40UjK!1aU6%*TZGUZbQ;6I#T$Mi(55}d4d zy~*=!Vwap0M;55dahB*U*{{PFkuFAz;vVNCXf-64>%HDoPW{^9K$I|6c4#q`f{8#$ zWK3P7xg~3HGMAfH05cn@Kz~?-VQ?6{K}WsSSi4D<$vsNldHXPn@P>D}H!S=&(|YHh zeNG1k>gIYNtE!Jo`2Yn0`dK>-m*-K}Zo3S%7S|`}H4qO(wK*5yn0wM& z`VXg3k-t@K?!$0C`Bza7gAm;7%<<`s0U?gYDD5^ibWlY{u3Bbot#7#efp^$fBQID8Z^&|B;kA{Y3j)Lykd^*7_%OXd58KPT=i=pi zFAXq_NtHFKDTZczfzK89XF~EGrZ+CXz8~F;-paAEC_9mF4A+94llbe8s;%`4vw`q9 zJ60XgZIlkYFf`5a{Zkzcsl|qpe2fYU=n%%Rk+_IVgx=ygUp)8XBhi-n6~^-yajz1q zG)LX=gOty3&jOMxMe~WH?n#&N;-P)$APEJ00LB}!gLC35dV$kB)AdLgE^*G^&Du?XEOQV%uA6aJ zMswAkc-|_lCY#UR^K@!E6PG5GBu@y?LJu9r=evc{@IC=e)p+(3W;~BOMIFs++~@Hb z6TT?i8b#t6|AZm;XU!>bMVi3$wYnBm7`){l;6UYKLhPFctJS>txK;Mo>et&S6|wjm zBYtVACDm*C4eY`%)Yi^P@!BI3ko6Jz{cBzdzJPg+Dv?UL$%G$KF&-CS;Azx=`*WT- zq!B|WIqmGse3a)FHZEXVILQ3Rtxjyj9@!(U?J9`|+LF2MV%6D8N0gGdNh;4>alY+X zR!v=(TlGkBvvGVo+UaPq=II|xadQM-$$QSRjnfDhnBg<_9qJN-N-nhud@(W zMrLxt%E@}ix|p3&%#uE1?|$@>9QD5$#f3|%oU_YFYbSkGL~{5?U#N}KiZX;9i!5*vBl3Huw(ZN6l`QxdxqHmZ#;nDm zLl=)_-{iCN+@8U(_B)J+VTZt2wPt79_?BPI3+s<;L#WoHD+ zRx8WUH`{yL;4@hAwN0k^Yp%0%(*f^7n4P%kE>e*B@C-y8YzVRyHE8?tvWz>2Z}|Iw z?xdI&`s!(vlBml2xX69{_Ipd{&HNJ>sy2~!JkW`CMUdWVXE=hS4J%=@66lLxO+nuX zWa2hHz%w`ynL$Ob(OMegG*h8mY&8F?(BBh@qyL$qe}h$a^&IT=TfZ*7`C^nx;Wznc zNAjIbEE}9#{J{$2u|AYH3Z%giRD(x%yuP2hCUMg_Iv6kA$u)+NPAi_UC6jVGOn=FY zY{gB`9fOw7m1BrnkYb?Ng*YM_?HMO#9oUGuL^4fM!q;FHC<%nleeljfKUVwNVu@wU zX~xK;gaR#$yzAs9h>f>8^GyHmEqTFiVidm$$Vd?!$E9Oj9>`ltnM0-YH7xfMLr%9| zhdi=w?Z+;A^^)M~&$*57?5%CY{KyGIlaO1aVIHgslMw{cY^y{`M*8@tTOve%{UVQ} z^B_k7(t6S%Q-Lsub#(>IJHX)SsYX6>!VZPBw1)4sfh^j0qz5~8JNHx5Lhf_ej9eFd ziy&11{)knmb#jES8_cQd<-HSn8XA@xS)c+*LF7nhhX)!8skd8o6h*?=9mjOF_-+>3 zuFAFEkONy)uJW)_}2T zo*98?XZq|4qF156xqe%gMKq~N zMtaqsvRCl*sf;Iw2h5hDvY|P6-1unkp~e?&^#os}t`&yAmfx`eDZ)RaIhX*eY3F7Pm&tfhth|xGNVK-66m&4cD&|Gbk4!P{=Uo5= z>h|kSfHlGjm|GJSbef42u$R2kzD?8Hr?{TcmABKH6Bm@ZdX~#hR*26AF%bq1u5V35 zQ)kx5m{E^0a>mM$nxEQvDT#J}mHMvmY2hiyZ&^MNaLhAjuzenBo8iniElkCu8=%2M z_Ef7KP%C|4vddD7t}%6FNIgak%R81KOX3GkD-_vTZj(xd17p1moUHo)ZmTnP@E+|C zTesu;IVY?{o*1u-I-8LKbp#h@zMt>@K&d;NUB52`8!WvEGa9`E^fk^ z^yj?w$g~-xG-3{lHsmyJVRbu>9ah_?iVW`45+V1H1fP-^A0VBm)o8gpGJ8cVCYOPJQo)CVXAFC~t9Y4Tm&`fO_#xp;$0tkZ&VO)gU) zaeBmcHW4r{kus+~U{gE1NbzR0BM8m?g&t`)*_AWKUGBtL5Bqw(lHG!!AmGqICb4uk z5Roh=jO^E&6hhHlr=le-pDx%0{r(47Aa;AuwOV}G?^BbthW4PE%%mZ23Kmhy+tow0 z(Slw_Q+$O^1NB*%poGUg#po;e565Q8+#Pd(w|?QKPNm_ReH9x;tBM+33B{q9N-J#8 z08GHs^JPEtdeUGHtV@uxqcbW?NHmfjw*=s-p5EjgfIhylX!~5;jenIE&0Mey?)v#T zHYPeqZ=?XyxQY0-{PLNbEqeEro-3a!-=TtzZShqOqIw-91_=YLHdUdq^M#PuQH$5L zj@lUfyKO-T{N!R;x}{q^q*RgPztZbhpF31h1Axp=@1I!xnuw?9VulAH_W;pY`kY4G zct)l+a%YJND08-Xv7oE-%G6NtNP;oqB|MhOzIEhWkbW*7G*K&j-IWq7S8Y^kU3a|H zT3%Obp?rg`lqfX${Dnv0S|@GswBBM6hq(ip&f;z?*S{nuWp3TwZcnMhzzFFGCby)m zx}#4Yrc)n`5@4VI7nd8o17RX0mggQ2pf&u!njOd0GN;=ru#)|@-VR&mJFJg$$ePds z3hmraiWP3S;C-dP^n-fqeIxH#a|X+45%aM>f+9NC5QXItjx=|!6w%j=LFgZOObE5x z`KPkgzlpkfS}!QqCbK$QlL~2ce_KrW%0Z$t0zpCBRcA7rkc3Tc&nmKQH)HH?n;qgj z`@ims$J=@tZ(Xsw<|a(Un>Yh7N2NLQ^d!~{EXe* zB^|GO@vHdTjeE6p(N#5J_qDFcqlCSIjZ86KrUEr9V5Cav2Zs>PNBA-GZN6dq`24D) zKkdTC<^pM%$%rY(XVm8pn@mg}a#F~Xla!88H`dY%kYIx`*>BhhazHRur@nKFnqiw%X`&0$2lQqwT8)SwF-QzaS;9_T0|EKt>MD$WZm)TQCs7WPPCY+ zbwBvydVu_80M?&9&Un4HnkLhgjo%l#*&C&BqSC4iU#HmDKCiTdM$J`nI+<4N?61IA z&~wx=$~0c;z6rr4hdnYm4-@;X6SQlUFbc$pQ1%xJp4!H+giEGbe5sIu^G>Xsj~N2f zqjKGCYo|;0A46@3+7bmn)-dph*b4sYpCrDb^ik=hZolO&6RJ5y{)kNZx)lPQG4{DQ zAoVDP;rsq0uh%Dz-rr)FUWs%Q8qF|pN1JN<|HQ~+$~}tYSj7TI(FCnk10{u)%_O?w z*O8)+x}+RUq9G^{3|(jq3Tm;^JG}B096;8MV5z(GY7uSvL^0wlgB9Z4T@|CS0-V?% z2fifb4ef6>qdlTpsmsA3bZ7`oCbgbtzoas?xPX5w=49y#$`B9^p({^(NmFpyq*{Yg zg#I-BlHN)ui)PPx3v8}tq)c2f76Zcg!?_HgW6xS;F*!E>gV`aIAOa^uuFrOITkkh@ z)J(PD4_W^7iR^|B|ox_m>z{uE%v#ia@41bwH& zwPs$f*wh|0AyhB2m>`jyMHgCJW%!YZ&f_3R-_4Pb=sCGg^vyB2x_$)|U#2Fq;b5KP-A1?$c<#DUvtaBCZVXoXf@W7}t&0ui)iUt4zz_ z*KH&)d3`n#Q^>cm3nNX9Hr^4=22;Z>mU8#UVhs_%M(utMy_Z5g6mBg0)DKJD)Rd6f zU&pB`?!#O;Kw_V^>hT2`AQ%^OC{PsnfLBlo|6HY!&?3no;%A+K({4QA++XVHQr9Oo z+t1Pdfd@yKVeO_s1Hbcz8zb7}MvBNe^El*NzKnP2L2P)p>yctx91Kqt`We6WqeNSa zlu0}rKWd6V^jlL|g=M{_+W7X2P z)uR+wYlxc^uFT?}$nWk8=L$9xExh}!$9;X%K(Z^3YMDkb zB_F3C7~B)RjY8ma1|p{=9*jO-4U~7kK;W&RZ*C*dJzBja$43bJs{q#5d2zb3%lc*P zR6oX%#@am}o+qhJ@^musmv3dfn|E$|UYYWWbn8p&`M#I>xEY?Fu8mi+6)!z8T95!{ z3Tr|u#!8nD!ZW3HrfSRJC${CspP9=ZO@!`e<9V!4G33?wVc(>U#D6_W3wv?i#D#J0 z5>vz~55%+zMBe*BSzqa3wY2g_5m$=Ykv$k7I5@tX9+~5~h#g<}X$XJfEL`zMDmlb*so8{&sHHa7sJo+GKPe> ziAzf;&Eu+I&_Ti46fqH4;KK&e)C02j!Nw)i9#t7m`B07|I-cukKHHAYJQH~9jJ*Rg zjcY!Xa=Ry?8f^9qy*|>5)^*kJpsWw_AQ!>mQ|DNmz*!`FUoWY9&7B}l+7;%?SR@uC zZqKw!bwVHMJbWj%TU$(W^R~qeyxoQNiQJL}n+2gtK2uhUrz6&>8n9VtLTZ1c+fZ5Q z@vFAMUU{_176Gg<@SW|n9n-x77@g{)FBWIJNk6v5Shf#t6BB_ct;iv~_6rlxw0jgH zT_*oM?vo_81~j&plA`lQ3i;hD1b1yRpx1V_ zsdOR@)D;^=WQxh^Xpqbx4&36GhW7%TInLBUD>;iatpd7m~@ zd5wUSD<{G)SX%;uR}CQ4W|FUqwwFxBi&aJojGsH}`+u1II9J!0yS+)H^VNmyIz9>S z(I*$o)a72q3XF1C#A4*7anG2H&xt>VOnACG^r|X3{&;S%9Ej2y-?YC2bI$mwJ>m1F!sLhm!J{sQ zVeI7hAO_r|%vTu7{vlCzaD$F`inUHt(FVIzn&MyfmlIIf7!Jx9D+izbP5j%Fioq4D zdcra#%0g^^y~zq}O!g{FQqJAV@*l^+Tt&@qg?*A6*`IPsmpj7*-TV5mtNuXNy%3kz z`5!_V63gR5R~3|4RBmVRM@p-q(69l8 z)2Ar#sqIjMvo0uTVDANTn#?7yDJ{A1`{00|dh$n4`2MY=_w5DcGJKY*_Ed@3d-meq zVq8g8kC!!%oK^*q6bcA)jXu_(yT?ugALN0ytxBE7JDckEAdc2$=7I%7l(y_lcG~rr zW(l36Kl>)Pi>`N1z8hePlypoj9r#p%PbUrtd;A}o!4jhVP_}eO{8L8*D@PN3>Tq;? z>L$ToilRk~e}z~_l_~l#2VT42>#G|G+iB5`#qpoGJ_EiL%r zdY-Cp=ws#V=th(**~D8hVn7`<$KwY{HHHczK@FJa1YzHX4Wc75PE70%=cj1guqNoV zmLnGl#=fxIRw*RgmiTc0^l}(s9aoRdn5Lig#;E2=q12RVcGmG5w555*9d>i5^io~r z8Royu5%gSc2_^x;{)l!BdhA#kH2ONGSgA?2=NNQuTGKeHTa;X;Qz2b~kn_71>doZ|ctwKmvgJEGA+acz zQ{6K68yKO3o=)U{AZo{TPIGw68u=;!VRiATfpE$jV(@}&f9PHO*!P>d>|RLD0Jw}yk*`n zV(~K;j_ME8xFb8tgjuK-68*{UN^D%mHICg)NJt< z-2+lLbQ6DwauWS1YU>~US>;OV2f+j`iq+t70A#mTzzh6hnW(EX6Y3!^CBIs=$z)VC zZXs8qHLB#5OADA@NrS4}AszHX&M&uW*UPY3QLIP_w`00cbl?^E#;|sWN1bo`9F(-%zW8z0OMXOQLr!-e>2drMrI9))pApEn`xd#&x^;*uMk)S4uom11@V=??!8)vdehTh;vOUGbdiYA-Xo zEk!wTmPrL`mFw2nKPJV-K{v1zg? zpBR^V!S2UFBNp+A5i`y->dpqaXlRKj2(4ajJdvj_jo;%9r zx=EGMWUG;1p0Mqei2$~pA1c%jI=igHeq9=*8wLg*(R58m;W%W2LI7gmkp2o&3wwvT zxN~Wx`$Q}s9H$5*5qr}tDStQfz|LDk!-WzIYj>=<;#o0?v&}eG>sC+I>OOW|rJyr|vn7JlvKlr`-S#W7oU7jFm6EnrDZ&RZLi9(-_cW%V%( zntxn!zQ~8X=0>mu6c)$CL5q;#BLGOat;|9t+Kmm1dk1LLsLcv7Te-y{Wgb!mO={v# z6*_ZRiNg9*8X+mao<--d4|yMeDirWWK5N&6l28R%g6!S_4ZFq(!>}u*3I`+j)e~Y# zL*W?0Annt6g9BG90%nBk#ft7wp=b^#-g1Kj&X&D6@Ahle)CP+jow*-e_v+&nj-!3O z!urQLdSwMY58;d?kbPdMVaGQ|oylBGmrF#;9jnD|H20H(&;F+cYsc-uK?3Fz%{>X% zCyoI*Yt=?G59hDBrXALTKOoH`6Rw&#rvr0uC-R_F-nHa^FI^RL|K8Akw(#*92M#W{ zDGF>nR9-2&d+FCL&2J*sq-wbNyStCtV0tE2v%Vdl>$nA7P>K?qlO4r(J=OR@`f9wH zAqT4oq(JtyjeBbM(G6u4S~F?|agP z%6Jy5NaVHyPKhjinyy(SC{X$|8D2C(7UM@HK$$Th`yIZSq-^2ZP(_U~UyPR*rTTlZ z)qdt>kO8fOvUjZ;Qsm8_^`$Wdr|7NZW2Dmbhf?d#CG?5w**3KD~Hd#~mq$FZOLH^^~ z4uav+BJe#tAHVg9k$!%WSo*Ux_|P10m1g(I^$y@@!Jrx_;Oi{!i?ShQ9i7O68v4~& z+{BU-Hb&6Zn7ZHZd;4V}QXhJaW1D}T;WybtnOMe5MSzwsLqm?BtjnaYHVe;B)*;~4 z#*fUSy|6G0Lo>_!3F!iu4vta4%ao-I(y|=Z35{G0#VINLF+7jr8W74I9K9k<{!_}T zY%dq_<*R^@^X}vs%~II0iGg43uBP&rW44c`IK3HWh(g_(=Zi%r&W!X`a8&J#YFoZ+N>0MfVi z{Rj8*j_;1C1aWE~xushn%MUb`eW8q+CdLaB5v#eyI0bQPvz7Wjll8-RFI7}od8AX; z$JRU8)|X$tUZdr;!J6@};XV-zEWU_;1R80h^%xcx&z}??f`j8mT&+k5v59SBy1T@m z^g(Y@(QDRvM5#MY)@sOk(6DKB1q80xX!Z}vb#ZAlBCxOEht!i(Q?dP(?LVPW0 zkKGJC*`m`Eze`elJbB40G_2Zjdgv|RSg%OK?lov^WJsk#*A)}x)wEq=W}o-(j^z|E zB=l2Qy>tZC&0QX`s`nR-g}fpFBzeofG8=EXQ=yJ7c3n8dhkF`&qri+ML7f;CjRZ_p zMb%}N&hBr94bA*1V4spBmjoH8ti-WIHaSny&>myb(6nZy<~lGlroKG<->KXLt8|n^ zY18!k$6b{HmO%ySS=)aF1t;kmYwZ>K6w@w(em~|yU3^5pQoi;(?L3Yi-BsjZHD0U7 z*i6@fUU5)tSxs(+o2vB~tLhxH%F*;(cMptFw|MqdnLl>8hKs0OZSe|-)}x}Ag{JQU z@hL^Cm1pw_zz`TFhnRvqPDAv97Ff@y2&n;-*Hs@r1ndUf7(E77o+=qgkJhD%E(m93 zxs3s_v}XQod9@**`UC2rO7oy6CH%ts!D8AA1h|8)W8}P=eM%HkmD1xOxf}JRao3}j zYs~C4DBCwkc#1p@C5dt?z3{+hb#Fe0v;XcH8nMUUMX)nAXDY|X#v3IY!1(hW&})P& zEMxmn=jQXZt-U8vO#mllf^_oLIv{AzKA7v^Mb;>tXE04hIHLjy+y#9hunLJC{w}=P z9i0F%=UmJW(8b8iAzw*(2YhK=;8cXoWmugsIp=|WUNHvEe8zg(OOGazse|>QA7OME zimvRjmi)QNVyNA&5M#^u4*1oA{Bg{sH+NLYPyKH~dD&!>`JCS8YuDU8F%CJC0Rd-< z@5c_OqrzJ|a~*-a;K-+mhaHGwQ8x0z9(+{A@xRojKUS=kLe#l(X;U7l(xSnWzWUpP zrw2r|G}AD`)CjtHTRT>4f3#T{nE>NKaSorXy&Ydu(sp~!IEx@F(%0GB`7YNa)9(QF zj^?%qqu60DV#y&@m4Mb}60u3oECb|Q*4ZK@F6q<$79_oYL}6zxpp0J#*Kz$lL?^6k zdhT(3Y4nA|A;sc;c$for!z^MQpe1=}nuGl;b&mpfoTXo!bKde($h}Ec?W*&}hUAI2ZhShZ)j;MnzQ6#o-UB3=;5C4bW54U%EWk5c&M|@>qF+|GD zai>14x9#GnqrR1vY9y>vWPSvTo!zH+-oW9y{N=QRb(EiJh-b<-2%2zToAzWi;@j(v zoqZ$K-%M#-xLcFiPl>^(WpfTV*ArBqy+0lv-K#l2Vsmm*$SYlt&lrU#XWv|DwiK?P z8I19jUS~!f!)%!}X&tnVt1!O%I7QgMQ}=~>tW$1}rvPt4!WQ54-(8 zdQDfa`(e~LBlVfPJ+?D2r(b;g{RnCn!EEf+JIoyFubHf=`oNi0rnMue;S|=C2KZ*cDevvvkLKj0eu0uJY}K#-dh$h z^5H4Fd;B47^BLJRD%-TIj%$|QLNC)37D_oG(C@z_u*&p2;d=YLn6p_%eqgg>hTy$d zcJhX}cvoxG(O@zcL7dDf`gAlJ8Bz=%+Q0`LC;(LgT0#eMg2qeTRg zW)OFR7=ghZ>xTHV;ZdmgYf*>FaxQI6zEhIMW)KBXF|+|AdgQr1t4K=PGbzUVABleu z{uobj@tPlo(cOT{s4cAb4Zu|g_mXpr00TBU@sE0=@Z#Fm-^KcFwQIK;eys(?w5)zo z@k*{Tant4IzJU0X@OxU({{U2chQr+hb2hzo|FFo1t_)f z?}$8E@bNqutyo?Cr{U$CO>YFjUfx))CRQ?|0MT#W7#0I|806P0`xyK+y@SSD_M5EO zrM{?U()8%e*HNfQu8fi}-drcm<-^YG_Udt7yW=0(&rQ0MMe%;Ccotjl4r$jW#w$)D zl)?)GF7KS=lfcGJbG{q+MQ7r#j(X?8?ORg&9-HI49SB?9!w`|6jLJ0m8)J|QEYb!X z^eTJTrArM_$x25%t?smq-E+iN`u44K`gO+mR%TQo!vFyz83c|ojtLc=ab|!CH=LTA zMfhWH@aIWS4%rg%Sr>(5F@@i?m=+*^dmFzRqpoTu)lYsifnQOEQBl5lctc;Dh|+Cmh!(j}fk4&R?@=ih^x^Z9-+_^$6zA8U>)I9DLY zX&Kx-$#PD9n5(Ib!_o5!ba55c;CV$>y1#w;>_|f4j zDW$cy)g!rdIL)y#D}5P8-rlw4TAq#LPa5l9R-0?6>d!2{Ayj!-Wd8sW=V;Gzab0hM z{{Uu>7iwy<_>Ss5HaQ5)e|~Ipk+g6RxjpO1shriRK1x*EJvilbDbwe#SMJmN&A$(L zlTGpE#L1*xhL$A_EK(s-7dQt8sL96}$9|%3-Lxq_1)Y)wq^Vn5h^b;{ykSjCCH=&x(3xucG*RYi%ZFOPk1yR?-qU zEC?r_hZ(NeM-wW1(~XZVtHXPKT2i_)V%F{TFA(^DS4iGJGr?0B#GovLcB8_a9>O;` z`q!v@JiM@q^(5By7J}WPB1a3Hanym%KcTN8)O<0k%khkOdfMR{)54l9j)x@C6Si5R ziC%2*GJM$_l55{S9QY$nvbwRn)B?UGj!A^d3Xhl)JAyDhJ!`iwjM{pCTN+i0i%CA8 zp1-N%{{R)WJu6kxuQa>cwv8sWktUNLb0Y-fuf8$bxcwp_<3+LYR-v!NX4JIQ0?DFO zk?tV^DdgRe<`U7ggaMEx1pE8{0PQ#MGS2f=zh4h6nYmeAq88T*VVN8TF@m{X4pbji z>5y~MhYg|6_+{*D5zBBdUy- zv1!X){{XMU?ir|fLgw#IpG<~XBWdF(9S#W3`N!j2j6Vl_L!@09AtGJ~+ah2Q>t8_Y zItGJnq*~utY6)?1J-SOG#10}Xx!6g;+&Bk}XFTy(Qe7*=VqiOtmCG!;RpWNfXl7L~ z?$)|I4^sF+lbS_r+EdWBMi^x2RP@Cmp+}ceQ{p7 zpnlF;CxulS()#MIN=9410OzkgeSK@vG`|mMIwEY*v}beC z!aoSeVb{EUr$-?Uh4t;}P*$ha zwez3+6@$i}5Yhht;F@2wMwhC1p27>M{s(xn7;R*_K_kfeJ<_U$&PgPJ(!6KIAG9CE zFBQ8kz2m$2QGpKxGZ^)Sw@IIg#_J0L_&YuT70~~FlcrxBu;{*LF z{{S<{Nd7OMDyQ8*uG*Y_VZ{WEMOe^95(Q8&ss;cam51Xmh8_g*<&W6>RpGmPk({iX zcF3omL#`Nl^{KpL@dv=Z0n^T><8K#f+Egl~gI`^wWx(sS6P7-}6J9Iv6aESv@V~>p zWv77j9Ye%ZplnZpYi*JK+=Fra7oS>c;B%iAf8d|mlf0UT!p{)LbePH0^>^~+2Lpwb z7i)bPN7lYy_<`U}bHN@ZxbUZow2ADmwEK)tZ90rG1mTs34y292l=cFg;r*?q(&-Q}&58>~NAG9xn{=uWd@yCIx+{d%bj?y@;z>U1d%LbIl+zfy?>0bi= z)SnKoJ{al(FBsh;-Q4-p=zl6SKL4gfKcj+OeQ;#f|JYjv(eYxbL% zQb|LStF=}ak06{J1!p+tmppS{lHc%B-xcb|_K&~Ob*ujXJ5#o`v^Pq!7h71~-Z>+; zQov&h!Oj2#%1>O^rGk_lMRSi62{`C|2Q~9+UJmfx>tiRwT6q{8VA{lS{(WoCz9vI) zqIi?SUO3X(qM99IO)6=Tc}BWblGXE(fR}c#oSvJ{88z2@E!6FGzk?nSy0<5f3|K`X zlpw5;Tcl3B`Z6%2@ppwSd~x9|Pr;W``Aex8iU`}v8TZEm zxh+#%xVUyuoq7@~<%6a6k&m>gABIgBu~}N!D2mn3IK3YXjHcMzxtefa7{Q=7rlcsPBx;&+KO9|=e0 zq=7s`ti-o0tNN7Ew18{GrulZ0P%`dF%f?1+}jU?lb18wzxC92!L1unzK%Q1YTZ)$^5RSVRkmQY z#PS(mce?Hg{{R55Yttfz-4u_yqoy0>$3qfy>6x2^vG zM9k*CfsX$GwZ;#raZ7KlX|Ffg#=B@=I4Ulbkbar2lT7%{@meVsNPZ_q3ZIpt@OFk7 zf8bwYCbe}Bj6WK+V4{E8H{u*<4ont4Adb#6?Y7n!us)TC)^Rd=Q-6o~k@ae6d~5Ol z03p5<_(So7#VrT?Bi{>rO?e&5fd$IwQ^#)E=-zyau`2%nv|KN}bgke7@Iu^P{7(46 z@b|)hVU#V!j;G@&Zm)+=yKSe7mt)V};P85NuR7Q5tvppSUHHO%Q(K)fR()^8H`iyJ z=jE1mUgY%ZX_|ZKx(jab_J?I)LXb^`lyDRECg)R^bXV$q7k6s;{QAN9*18Mgba@yU<@u6E+ zAxtx7Ktg`-C?!BYFL7NLgl~lDvB4@jgVP`9HM!$23twv=4{!WYr^FcO(yY@ErP?^Q z?U}-T*8&M8EUndYM<7=QYVAWtb>L}UrP<&A0Kpq|-9ujZd*h!5&AxB!e-hf=8)=nH zVmpgz5P%Ou=G(D7J9?V?N^9xtqWdliV~vV7kH~iZb@31U5}V7>ejsa}Ftyd%b@4Tf zP-@T;QElZ9HqVr^5W;9!eA`AYlK=zH-nTaPw~*rEFvMpV?0u{AY)s!d_B3G_#O5yV z?jP^ALF_87_9rB9?^+tJl+cX8z~`c#4P>@J8P7e9b156y6PY3yB-fVy+>#@H#a|do z=bwe1AnX4CVB3oHp@YFS<=?j)(XZ@X@qR7qlkm619A}^T2HaJ1GI>?c(9axy!9czq z=|$~)1L3RfW-vVNbl3Wo^w(D|etVm#46-&) zKQm;Gp0z?*9zt2%l6_5ClHMdxWOW(rrziBNPmmY)VafjhYXkHj<3o_jlSJ|`NYIjf zJJd}9QJGG_J07)aLd-C{eJZrJu6Zq=TAPaK=e%e3DeVjwGsuuDqs;5a%B&opQU=~f za1DMPd{psfqw)LW&x-ykY7t3|cVD^G5;>$SW4C7_2+2K?6^%UrO8uh!qc3l~JMeSG z-YB%VF|~(=Z(i6U?q;2#c;isJPIB&}>U}d`l%KQT!ef8q_#aUP;)Y=?$f{YSRabtB z3u6(p9iZ?z12yPi;}Vrn%V4^{n~9$SBeb{aL(NR!x4a}<%txF8wb)b;dmJ9Mtl zx0X*FW2rS)L-2*~g8Wab_+sMB!z4FKWrc%$jAKLmLn9#Ppw4<#y+{jpXwN4#`Yr*f zQdd4_5f{#Lo+RnfJwi5!~WhqV)JaXe}FQcy$1GUEg1jg9~rz{PX= zjmM2`FQk|L7VHmk#<4RhYMvF41IL@;i^bje4Md8}m&E=hD$8+m;P{wuHuwY2 z&)3bpIs8GXZ|!C>5?JRs#bsSs%*~QdHOD#~IiKFd>$Ub*+=$@Ue0^nhZ)|=g+gdjK zpwYYurdhIjVaiCrgWok@U)6QL5v;Iy!{T3zwaaOgES6fYiRSV+>4@$8rToFECA5}4 zNaCp6*|Rq-!K}WkO}}}!>e#)!lJ{blqFh$ah^T!KN{@A z(}W&~pKB>Ud7i7`XqoizV@!tOTOIk$ZRzmI3`RC%*Eu!M_(OHRotL=U7@Ptzf&Oz> zZahJ0ZxKbi+(vp=&{Ii7>5i!M71FiV_+M?}du>9_^42@KV7#|Ulw4aMHxchpOBE_| z2>@ULz~tas=+|1!(pXyo9PBqn%rX2q894OE>0JJm;{7Ejh_vwe=_q@4nH1rH;QZWi zp1r9e@#5*4fYl#UFDQ_b%_${`=O+i(pROpDsCH=b&)QGHdZvYGCa)E%A+SH`M1nU) z!~o!th65nv9*j>Sykgr^7gGgO!u1vPuCb_T{xhHLw`~>7(nj&zTip%*Y+H7aaz0^# zR=#ie&+uwrhB~rqULP|{q25cj4aanra-5$f$m*m6wY!0X&tD@Ghn4P)VF*cijM7#@ z5s}E_J$qMOrNcCl50#rI(z$N|TN~CMXCYf7u4~qOEvDMT4*6RixW_%~nlz;@ha}@^ zSs8YkB-6$jAT95TmOl>zC|O`-2d?48cRFp>mXUp)C_(f%sbz-I+`7V}Jp!*3<%E;g z#} zXzHv1$RPGP#bxZ=4H|~Y9;xu=cDQ)Mrb~t3j_00h=%0a_V7a%rjpB*cT}~J$Ntgv_ zq(xT*9PUyW0y*H<&OZqeZmtEp269t?gOYRdj1%?mUsn7E&}ygm&o|vx-IH_uOJscDlK8WT&;Gf*VdLAwfT%k6mncAIVz0URbZ9i_ z>|tw_jyP=rJ6S_2jq)DiyXZbU=y$jA>B*yNX}bVCkgM`e1{OAAN7ExOIa60I`?F$iC5?{{Rei@qmBo9XO|UOM0HCEy6}I6c`-* z&T@aHSCZywMsn4K>P+~dT*lW-w56$J1`JRHR&m8-He4oaFSrw(WXukBSSROz*?dmwDI@l}F_OD6!Px~x(gNZhJ_c;g`STy&uctE0jGD0p*I z@h^k*4Gz>5N3eEs5MwCux{jGSEBx!^uh?VuVeww2;vEg;6APPEnt752kyS~GdlXhe z2IefKvJXJVoY(DlgFoP(9tE+5WbxmKrqm>OHq8y3LL}UJ{LQ$q>)3TQ+k7wmk-h@_ z7u4Hb@Hc^@iv6MT+V<*ao=ka;`5Va!a_5x;fIl9}72!@=oVBp?sI)&8KWlG*TJOUD z0NOdMHEl9@zqb56ZK$krt_Uh#1_LCL2b719I+NTJ;~x_=Bck0wwDUSY$jAXgm;`kv z_=jO%tKaZiZvg3+S3eFscp+7|NwqCDc>?lcXychjt^r5m{kr_u{h%~>6GA%0t(%)$ zS(e&Ke5o=TPK*SJG3wk>}dZ#y!=HQYJvpx$Y{AngdSZRZl03*HZ?cZb@fR z>}kzvs6hvz;yiP*(1Fx-ey6xZv zfo{CxHKM{r>P1UM9)GV}1b@16TN%a$cfSODEn{urTa8}jw_IM`?N;oN#xN9T)ytFX zh4ij+OHa035Xf=UrEch6Cx=DRj+QQWwY!xu?)#wpz+jJhrA{>UCY<8Vi&@vLwE0%f zHe!Hu0~M6|^`pe>avPpH*NpsC_|M{dO<(NZ7D&MdFLNwg$j9)2c>3qkulNt*R zdwgeW1T*Im-9QQnMmn-`0rwal)z2(%EcsE~=~VVgYTtR;>Ruxe$VxfLKc#cm{x&Oe zBNNC0JweDdkK#R5{N0Oi3g@UG=D3d-c#itk6AqU*?_?a#c`=Xnef|4=c^Fm3)krAN zsajUOk6F;ZD2okAVvgW>k@Xw8clEBD#GWQkA9yQ6KH`!)r&cT+ z@_GunR*78Q&g)9mcgBd)@^Q$`ZAS|{Iq#8zYtM9DMgG#hY^NFSe=77%C6?;lTqzmn z6~|VmF{B!M9sdBp^(R~MUNgdi3HIdw09yKs;J=6TZxCFWbs6PJEJ$P#2*!NPS`AXE%>EH)Gbo&8mp^UkrF(z`h?drKW=eZEb<>S?Bo_0HYETGk_04 zTZyfC5F1T877@qND|qmO=of+CwS3h-#b1sZ+qaYAm~^<^a1%??VO(*H@0?2@BzFuk z+Z96lL-7ZSj{g7^_?uJI$1CM(ck@jjUU3_-QPZdu`TbgQQfJdfYRAw%A^6GQPY$y| ztN7DPwV4zawvzrfpXeb%WMk|UpK9dwFWQ5^(La}@rm?BF_pG$D66dfc=)`@vR>gU( zhk-QfNW@mQ(V`E#8lX}63ekhZHu2yHK)~ycDq~GO#VUts;O~vP{{WBl*>xQ+!RJqo zJC}oQqj+X#D~>|O6amy6n&-c3>&-&<_Br^kCDJMr@Y7x_5RyOSA3p;UGN7sMSt=zO;*IqBuLM{Hz@yKmynK3IdS#DbucyPtk5M;2$z9_IAZ zZW%9u=}dENAs;B|S!2XDtfOcoX9p&i`(^-l3}fp`&7t!m`o|n?n4~M}2SO{n_+k4( z{8{)`@xkHW8BaBmas8R8vADO!K_NpO(f9kT2R$pzf3@x3klm;{q&UE0J!$f?T+%+F z(SP8gdab-sCyKrpMR3_3blPR{i@#NlK-~vo{MKKMKj5a%*2t~5izfnem3}8OYetw$L*U}$+o(O=8UTR=*KJx z>KLv77{j%R9{Hl1BAC4IkKg zjn9Mitp-R@X42B=!*M0IA$FNrK3KQy;hW_Ik&bc2eO_A+W|K#iUZay|$~w46?pY%s zf-}WrBt~g*zW{Zvo5pruWYnZ2?%w3&k9z0g#Bwmteg%Do9#=<=Q8gj#y9O7vQ@*(< z3WhoEYD=59G7!H?%G9n83JDoGCpG9txs#ej4MS0s0+F1P{8i3sEi|ppNhg}t)Lgl3 zgw|xi@}**C`M-o_w^F&yQ{H9W7eyk)uVlvW;RII|;(H6}ucW!PxpkK~Br*B8#t-RU zy9S<-={rPV7LPb5zAJ~+G{rX#uNNhW$Q>)5vvvq5#PVy;2l#_f)PuZn^8C9FI*&@% z)chVT^nWThK44sy$KEyDrG!QHxI7-Xrs}pTEg6t!1E$>9lRa6}3jGn`h&5Ez7fnlt zC}hBoJP&H<=kOetiyRMX#fapU!KP|9F9(U*b&Reg$WSqnUbW#322Ez#JB5e?<%e(O zSUAo{TgFNWa-+%{;I5w>D?F~^L;L`A73qHjd@ejB8R9~wU%ik`x z?Jb{ERWFL&@t=C_brVM%+L2IQv5y(YzG^5g2yBznp`zgeu0h5-RZ>_sb6oP11aw+N zu)KlTXOWy&r1(PMNg5DI!Nv(SF} zF4KOjq0o^oRD6WxvbY?7UwZc4Q%OscZ*8$eF+!~xgvMEbCC{sL9>GB3yodI6ihIpj ze$Ii6K?^E!RI@fX>UmRM`ucyFIaCCNAY_iX0=`=~tkSj5putm1TNt*wD(oM)1+P7+ZHwg`Oce$NfWYD^23U_GO!$6t+u8 zROHjAjGd0l=rh2s#^X$71c9GoDuvyEb;i;=XB{ha+BjsFQ=8wYKnB@~$2g@PAiad` za`?gHcY4&h()Rt(PvKNAbn(%XIO+{tT5nUHPEmR>(Ri;5%eM!isbld{F~;m?)YdiK ziHsHlipSLAo)9F4M^YObNR9Uh7wt*= zQhYZ3kiHoYh<_2CuWzplMd8m5K`2@ENt9&u&d8G>yqF+l0g^zk9Q~5NY%7o2OW_u+ zt$4EfICYIHSu1;MWf1bBx1TQoRoDgqS=XUIFH&pL!PJtKlQdG4qjq3?cG6CVW<90N0(!s9drzuT=e{{6hzed_kw{Xi=q0Ic+YkL`7QQ z#Q2UzJs9k4XM#eEfnGy>I>b-Sj%)2Ol6;8sYx1XYw{rP8WjQsOJci`(D%6)zym(`p zr!<6Q#ya<}N-~kk`58u7fpfTYI5lHOvj*TFEMZRJ$LUJ37UjFu>nPSJOK!$`5nV8! zQz|Bg}d(;|$wXwA=ctWWM4WCZ6jpM(JS_g$Jo)wi|ZV!uh(?#Z9tbvI6xaPSkW)vQq8&4_4L(KMVKg6-z++ri&*0*B0-vE)1 zUbWzU6ZnsDE%8KV9?#yrN5dW}y40ECod(c=s{{Qgr(QJ`(>N>Pt5AOOH)egr^VHO1 zBcY}(#BRg`PgV#s+OASoIo0}?^mS&rPpBs~-}pjTiN@k^G5qV#G`o`=>mu~euUhT= zJ#tyqQzVn}Z5-DPN}RDfu!+h?*B`Q8n*+jc49=6X751;iLF$d|cNgu!~>4dq^%V;4&?$q7Bo?2hFfE#tzU(-JEe>R9Qm= z_V8WV-$8S2a{|w4cWEe+D~On7Bu8EuSYU!W=Dt5PsO2lO>afwYE=DcM832BC^|#66 z^{ZytGB8iQNfb)G2NmF*R*EY@X_K6ADaOkuKK*LiqJi>{pcLDii(5qBb8?Z4;29h) ze>$aLcCmlq+#=h@R^`dW_L9fffrTtTUOyVE`*y+?_96JlcIW;rSBQE40Jv?%T<{z> zI**KOFLbz`;us5yhJkklRveOg4xXd6JNEOnX#W6V&y1`(4}|_A&mZ*+xUE)+nY(i% zs+z`C87sy)s&iT^3}fqEEY^SznSUCibElvmD)sIwqR8|4qRwXKz^+K?R4#0lj!60w zT{N~1<+ltf0?fqVDD@=t72{tO{{U+bg#HM+Z6izZR-G;0(i-MvmUW4PU6jR{TYb(dOP^0`PLX%F{Na!qFHUKZ9$k^PT%lgJ-tZ}6{=K0kid+Fyw5 zW^GUQjPb>^A--#U9pSLFZL)ASZBvb^PbzbflV26^M(dAS&+Cv+V%}XjE$n`wYgz@>gfic1u$xQ7nJy};z@bpEXdH(={C%Ir025;g`_!&K` z^3&qy?T_)F<0aSG^=}hR1O?k<7LH?788}q{?Ti3%@&)(Ja5~3`?=Ebk(vjm+b`U=fl2vM zM_%knW67?s_6YdjfAH7i44xUe)ZRM}71*6NL}&fjx!fAr*mohpKzn(nydrtaoNhlr zXt2Jz)2|`FvYn%z306pCUZ~1J1bqmlhsMekl#fg5(Dq!3AEX-2vo5Ia_fxTx?)=}w z>^&=(y^~{?W+$9-YoG8}#Q44;ctcL{t-Ijgz&_TS^X1$i+bW;<7FcxoSxYt*^m zzfQuxO~F-FC`M5}9}?7SIK9y~oTTp0N@Lt)5Ua`ds13wQ#Y^<0lHiDoBJwNIgJ|Y_ zy~{F4Ba3@BJ?aT{g^CiPiypvqs>!Gpw;pnl>MIXi)Y%oIiNGF!^sQx8q+srHpAx)j zbp);UeDE?z>0C{p#Sa#01+6XZBw|SjV?+K$cL|}#tX<~i2?d7i^P1VV@J5FT^P;!d zPw=VYxgR{;?rlo877Eji+2!`W0@S=wFxEU%dg3!C78PEj(>deQjQ*9;*?cANv?ZCe z$W^%aY)>tfm>ZLP~3;9%C&<4!N$J0qFS+_ct)70<)32}Z&+ z(-8B>!O!!py+6ZR2AO1#+u9<9OcF<9&JX$RTxH*nH9xl>+^A4aK>q;i)Uj(?#-k~@ z7p@eJ6E&ozgf*5c8zp<4HmTu{3Tkl(?!qdm=@|p`tjInZctvE{9jdq|=4m<4)6%nL zhT_?T@?5hL*(Y(W%^y(np;VRnbYg4Is<6|07|R!piqb_LSK#-D3JZ-88+nv{Lw}xX z9V*uMM!5St&&r$<2^G^D;S5Bx3<1|Qg?p$&cW_)DM?s#|hb=fQ4tI*hR92fh3meo` z-gzW?)8^C_vZ7wSvs}D-lf$2wfGP26OEikA>`r*iM5UoIjO2Fu3&$gf$>ef#&TG&- z4Q(vigfPOJoty+u?>88)F7W;4Hb35B_k~>eukmrd7l&&xj+9jV(T7}3 zHw*~b87c_Q9z;E>%En?;Alp5B1vfb;oG0y5@%C?upBZGALB0>8=n$@(r5LahP=uML z7$gxSrHDPzW6w(ZU;YWn{{RIUyZA2!zrpW{P~K}k5xH_S*de(^xY90I@#MUuFOwlS zXx)OV9l)>58}s_k;o>7{zy`W44_a#%Sy9*?2-<7o@ipaEN7KeC3dil&gTHQn*>}bM zBt9C{z94FT9+)v)Ug#0uKJ0L%ENQ*sai)o z+uaBJFu%rw>F}GxfBI~=u8-jd?FaB*_J`9J@8M64puD^?2mZ#pRf6?ZCBrfyEVHQE zb0jSy5AP0@hx>fM2ka^Ft8gk;;V+2tKkgZET^Ed_q0XZwJB zone9)%#%$cVPjF$lS}bW;wOTB4EPUG_@D6;Qfpl&OjYwdn9IvNuEAr1B>p)ahyZjP zlYj{yoBsf{_wD}x@mJ#4h$j7?d@ZXkiF>ZvJ?_7!*=j8x{34n(TOKu;(;M!t7@%;( zl}6eXcZ$}nSiu~ad_1P^)`xxjUH;bhzYz5~{0rbMUU+;vYcWaVwUDCTk=9Ay<=na8 zMyF`%#Mi?=8h>d|3iuKk>@@r6X1@T1wuUfp+>9J_7#)6<$Nth^v?Q8z58?j+4(hA| z$K{!elG{hiyC;&z2cNDh<;_=Gywz@A;^KE^k;^-~Wtg6%n)4?&HhVPSptL$~h@Tn! zVetm#n^x5r#k(s6Y84lZb^^Hq^G^LqG}K+qin$xd1XxfqMM0?Rc%!mH@*KIU^U7sn z=80}gADf@0LRg;k3voKpMHJTKJ&*QR@tD)*zVLpdD~K-7pJ>B7W1Uy#2h(znzNiO! z_S51-PE zaSmx6b6qox2E`3_;Wn(Ftzssq{{V5^=iJaQ3D3=(n)+zTOH_RFsyuO6UdT_BjrBE1!-LK_shvRPl(sHucMOe{AanWE>GcQMv0EPEvn>L| z43CkHDeWiO>`sJeWygYH4BTkS-74%zHQXkEy|EsW>dv2LuVxKgT0 zg52a*bsLe@Mo~=Wrh-PhY28U1vywWRb%v=LU45Njl{o^oPMQ=HEuX07soD5h7f>@V zC7Xecl`0(%S~Y3%YRv{&FChx*SHHDgvV-i=frc3ATRK;Uf-1`+XB{##SH_hSFU;5g z_Y}RHp2r1R&`joMj`C;n-574^k=CL*LtAD-xZ@pbtrn1=z!}d>nxTJb8-|R2m7Jj@ zVyh`T9G0MqjAV*UHCd!n=-mA(&anxCPbJfwoEoPE*tgEc!6yeb&r#W2?WG4Lq10(t zP{En*=U8ElOV2Z$Dk6-tA7BALg?Nv}kBF1}NAYXwaI2+_vVEUTh5D=@leqr?w8WM_ zTyz4qek^=Lx=Tah4KCr6%v|aW7X+!nSo7BhsmE*&QC@WmF_-{**T-g<#m~r(s>?8b z&Y!fF?9#Q2Ha?YhFO&rt1e&P}qAwq%T()#6^EN)U;3+oldUCP3;eQd_Xm@d5K_OR( z_bUOMAE%{d`0Guz)3p(+=~n(#jrLv?Qn&!oZ7GPZr{STzalu%bdnc^Tl=ef^fB zqF+m;>Q=H_+(6|ehCzl?=tVJZT=jF4SRD&v*FFP&(|;5`1!{?V;13abFnP-)+Ev%j zYcna_7!SP@gOVhStAcZy{Tk4};IUAAfBlPoD*PJwpA47U-S5KPdeRAQq*(8wchaXt zVCM^a5PW2uOsY#Ukd3wZ8x7M&dYaHpQJTV7o<={qaHKKF%8}QuFmOk3Nbgjn(K3pW z`UU$*{{X>CziLm~gW{H(pm;{>PSv!34qr+)dYB7nPgs1mYHJM z&3MO;d_&>yfSv}p@V1BI7u7sPs>*JBQ{pC@%$HQWKQof-H+e|Rc7xYD&PmO678)*% z@PooqX?ir?W!=TTHGO78Q6<}flNw`~;8Varery(OlgG^87Cb?Bt6yAdH!`*h5g5*R z&mYKsRGi%R4n+rOtqwcI8s*ltsL4IV?&P^F%-JN?WdxQap7c^Id_<`xoLHJ@QU(F$ zl$;FE0~H3q|DoU(EvW>uhI`KaW z-F=f4Z{5x|S;)E(atWk8@S;bkvSNk#Yy=TM(=SeDsq+Zz1Eb&(@oYV}#tcIn$)1 zfHT9-V~V?Bq}tm7BgPBof=5cW;Supnmf|Re(%7nvHEqt1Z8WTCT1jq@l4QrIH5JV8 zz6@iY_^hYY;zDvyH5JaW7nkz5U!mmEbBs*hx|eTmHh>YiJ*uU|;HYE4$8PmR>y~Qa zrk@S`DtemE*L+uN3`HW`uaCUn=hC?<)=y(vH039;S6{pyVOD;6;MP#LxVh3VwQvk^ z+FHAbHs>q>!2If@m-6cOVIz^4Gjr>T={!MiZ=-xSzqgTa4U~kj>R6$`{OifZPF~H} z_OPkbnoRJWVp%RO-r`p!osQy9Q&kl0IjdJHX5ID8RIksmO}eeK?kVX6jSD9w31gbI z9N)s@=~S&GK$}Nevm35CADwfp!K>_O+V5n-o+^0Bgo3#TJP>+SJ6n*EoVft>6=f%m zPoH<)9<`!uhP#KvJwoTiaoK7YF@FBi+wAg4Io^Phg!jnF9G-zk7_M0(k=qEQp1@a0 zJ=!nIMnUVEZi{09)luzK4CjONscP=yjO?s)(nmB05}_IO6y=zR*;MdFb^asK;=8qV z^1yJpLyq;uo()S)8YY?cFU1{2uk@tT(bzr1XDj?5a(|c~jeOJbbS;*(9+e!sw#B|s z1~!sT0sIH+Ur2bO%IZtGZ>}Ul%=;~^;~(mx1MfFKd5JuF0be(KQi*SVAZllE!pN$i zka2`xLVM)n-m^}|l6Pk#PDSoTSeHz>!E}j;9Zo6|rFbH&hp-{U}vI^X_+&i95aZSq&%(@*Ov1InLmw*g6I0B;5wW+N~lOtef01;aE_TuW?#t7U8 z%GJ$X!091fqr9C8$uS?YJ?p*Jelj~Y(5J zw7(Xs0Sk=iqaJvdYCLcnbyavrf}H@A2%woeh2R-W|^Tf}AvUlgWVgUT>7VB3+ytm3aWY%TYuEhvk zj(-~Esa`SM^r+xs`Wv(OghmXHHcmLf{{T6x+r46KNy6au;FH#|{MVVcZ{xVFEg~nl zxj?IcI-28_Bc0kOXVu|GH?i3G7eyO|%*~uI917a_uN-jvG}NZt!^?^=xbK-!f0I-m z9F7}EfI-LulisTQZPem};e$f%Jj<;{7}at!v=+0Gf&`Y{J zX4nY{#aF$yF&)5l^c7=IAoGs(Vt9PiAoQ<+uJ1GM)`-l3iC~$n7?Un*i* zdLC-@Z|G|fWsrem$Rp`WToLjQ!k`R&O)t&&s1W&=%u$6rb*Je*WOwNCw@me@_wkZX z;%erXYx4Q$>4R4tNR_N~7mSiy6f2g;7#$6H_2fo7hf=s9jdo)7)Zn&$qPgvM-3-#Q zjxmsb4An_13Yu||^pA*qd8Z3GRYIr$?)kwgf6wx-2KyY|A=mD2q-H*C!!RUrc{m@I zD}PzPyoDYa8$M?QwH_OWD{YqrGFbZi;<=uOToQYeTWApJagVjY8*=bKu2aUo8Wz_L zs942|c0Cn-=N<9tYtSw(Ew3Od7!o)Do`$j=1jzQ&5XwOWW2mg-IXM>L8)(llDo0vt zjyl$liS*N@YEJ@zx2j{%)?p;|t<$-UtR)mtOah81paQxthdSue^`U7o9#zp*Iqbmv zr}>Y^+PT_vZpguukU`@W(}b?@_0-XwT57E~7u5H?K0)M_l1$|ADYy1k?w)6sIUJGR zxvv5EragB|2{fQwN5rY`>OGGij%%WMi^LI_pF^7cFAH8Z=_xL!z+$M?p;^V4w^lLd z37)k?i7nqdk6u0NdPw6!aJe3}R_4Y#l_D{N-!;9iRXUnlMN55Nc-S!;vDU4_t|ZZ& z>yJ;Htx=l7TYduZRLOjmRblKZ9n&`UH0QCadvuHdSvc*3RT}Bra)3hXRV-GZ(`r%jkH|Jdzn8V2PU*!WNmNn(RI@cFn@h#2tPE0|zL!a)i1L>Z> zjdJGo)jU1BocUf6PZ{kWPxxY%pUy^m)|@NmCkxPX&1Px1+n)I~ucx|$uz|?yUk@jF zA5hF|{{Y?G?E^XQQd_xUxtqNvw1F?SsN>d|044jJ3XrjIF(V*T(6JcVnvD<3+N@iW zqa&!MmC0_zQO4~s1x_>GwUN{yKzJRiJy}{nbAz60cOF;_#GKZO$q?1cWQK2)^{lO6 zFcNM(Q2zibw$~~bAoT52bt{1^PFwzYkSJ^-ntHRp@rAJRgu6oFz`;LS$+o&k)FQDS z^{L{^#Fo@Fhxow@>A|jMTcV{~oM)h}ZO*l5>})OZM9Ro{Jt&^x<+m>!#2)_jkS~yf zk_Vv8M>eDv?g}|dbqc;GhwTuq!SgR9_r-IaD|+(jr6lK%O2)j4%aok;=B_E3w{|pJ z%x%rkjQMKeOM9ASdk@Ahg|^=b{s?$~K-F#Ji(k9FOU+dscKJqFoQS#SDuN(;2Hjpf zMh+`_v?@`zGO>jWMI1~y=}PMDY29uVQAJ{G6j4P0UC}k0y&Cy1Z6qO-@-x(WSEcxK z#kQK|w(a3$JhG9{*OS$~FH@evVDYgSJmA;6m1dH{%a&Unem4UQRBzPv^)6fQK2CcK;WT7WK zR5CbofQR2ArN-x6DoGjBLIg)3@l>QCyZtLxW!OkuD zbCFi0)!@@@+G!hs+Z|0;GK6&#yxo!|@t=tXlcAkH-e2C%Hva&+z0dUgYtH0i?T+Nt z&2v?kRK07dcn9vN>?)i?FPvA#X1Kp?R?B327(6hTc0>=ooY#ol=27k0H9$ zw(dwHJ?q9gY*y7Ao1yfk!z(8s^`>eKo1@P_DIpt}1H}X7E!)a={M^;3CHZ=vVO3XR zuwT-wTcMG*j`Y(dq{|RQ9rFJGrAcu%2E)Mjr@BRL5F3u{bH!4cOq>?Ts=6gdxaOI0 zg>GsKjD4O$dHE0F#Rfz}O_7=4kdB)V@~Lt(io4M4yhQ&1=ot!5(mrEc*`3(!$vpQp z(fEepX405O*yJ87mr_B`KaEN#dlCjg#WkfndFGMWh z+3H%(n9}H;93R?x#IBi-C<(WPvZObeFhwcUppf)ZN1th0KC7>4*18slr_FbJdvK6h z+S{h-CY6X)MFXiM;=al7?}D^%*_Yu$cqpV}S#?{V6<$XBg!hAX5qZH#m5ghS3EbGr zSHHu#OtVaKPvDNS^zHLLXNt4OlI6FiuU4bwg4cJ~PTQU#`)qioO?z8~Czw3HYH4O= z;1(c`ojZQD;D?i%?|wb_p6^!iLDFu)^KFYsbV&#I(g1enKf;1F$7T=fToq3c)TKPi zYM#qaxai@WH1N4CC{5k9cK5yA@AKR!qKfd3cqpQZ04So00G`_H!ow$_>sxj@`@(ld z>_Hsl*E>&&cZ~3O^sh$=m{!BR%qwBxRcemn&&5k5YO=n0z|W;<$E{hkcv%K98{SAFCA3Kbfym?h}xIJQbNq(;m^GK=P7 zImxHRfl<_odK&r3Hz#&?lL=f5W~H@uWh9){R&4aE7Gwy?q%AM0TI_>6VCIOVA%@e< zHd0K4p5}S2sKP-NjRuQp^Ac z6xl9ACKR0gD_g3^Mh$JnLM<=H_>F-^~!v6q+ z8fSzQJ&bK7+hj{QB%B`HV0Xt#^lyk38g`ZNJH?4CaXj*PX7mPg${(}8OdNh-*Oy-x zCp8#%Jt{b5$lE?X)F)$R!##1HYaFoz{{ULOdm{ar6fhhN0aQQ@)STCiQ+!o>p<3;Bq`0#A0RSlHO0UU0HMXYxpz&016+&p&+$7FS(x%kJ+KGpnCwOmhH|Bc!~9S0 zlj`4+>GyX(JIXK^-Y3nTJ0H`hNJpes_nOu9OIzKeo78Xa^*iac3;UOvdF5#)mPX4v zu_UoQ$tN`h6j$ZdCn}P1XX^wI zsla|c4Kj*pwDbbXUk~F_K9wroLPksTRA{ZEh^Zc=@}_95{6mu|&!%cQZ_$nfgpWg1 zsH=FoqU4Ef?~@n=pK69nxg2d$RC^kVipo{0OLjFFprVQ^B7&5$J?SVNcoYETI0cPb zv}G}ony*vaF%h@7B7t11C*MC>N>@2zed#C}A~!>ytv#gel4<~PTAmfq(_7S13#r-| zGyB<9az`Bod!PQlJt;S2IL7YBNAQ#3F0=7JSXiJf2A>SUZ|}lx@)V5y-nl#gPXMsV zucZ~*ihk7XW$xj%&(R*`*cZJ_va(IBa|M*vTho`jPKm$)sxfE|qG!U4}_0JlS#qm9fhnPjE0h3iB~Ct34umSbB8g z^%ZoDH$bvBA~ZK7W=W9ooc89t&*MejsV{=OK(^|}1EJmTAaRc+>(ccZ}O)qBc*!a3lZqd*nj!p+~KgOe7TG?AW zB>G@~jTBeWqvsD){hmHB{0sO|e0*`^FAZyYpNQa}{v{$SI3Ci#5BY2Z$_$fw5&%x4 zCk!|IfBRx+UOd!R8;G^IEasRs<-m$3oUTSl223%=dXdc(SKeh@6I_J*hlGa^(1K-Ikpd?en$S=3f@RGG2T`Hu?sOV%leiwALq1(!`sKIs4ZW zH~h4jyPkk>JCnqdo=p^2$YZfJ@i>W2tgh~T<_ix)3xgHCEa6P$NvBy{{TGKS)_i~{t&itCZnTj>_cbwQAU59lu=yrjBanwBc!tZ zxc(JefF=52(Kheidcz> Y#z@WqKGacJI&kLL>Wx~S&FX*u*<*vQfdBvi literal 0 HcmV?d00001 diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index b1d380b4a..be2509220 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -11,6 +11,7 @@ import rospkg import lasr_vision_torch from os import path +# import matplotlib.pyplot as plt def load_face_classifier_model(): @@ -122,8 +123,9 @@ def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilatio if head_frame is not None: # try: + # r = rospkg.RosPack() # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) - # cv2.imshow('Head Frame', _head_frame_bgr) + # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) # except Exception as ignore: # pass @@ -228,6 +230,17 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, mo head_frame = pad_image_to_even_dims(head_frame) torso_frame = pad_image_to_even_dims(torso_frame) + + try: + r = rospkg.RosPack() + _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) + cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) + _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) + cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) + _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) + cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) + except Exception as ignore: + pass # Process head and cloth separately for the single frame head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) diff --git a/common/vision/lasr_vision_torch/torso_frame.jpg b/common/vision/lasr_vision_torch/torso_frame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a49c8711f1a99d3f3a8db5693a26f03794732a6 GIT binary patch literal 20771 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%0A7pmb443hVF;bhF?Sz{&o*F7$?pcfP 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

&2%CPudufs9cP^tfY?kwL} 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 literal 0 HcmV?d00001 diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 29a37c1ae..24170f61f 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -167,8 +167,8 @@ def execute(self, userdata): full_frame = cv2_img.cv2_img_to_msg(img) features.extend(self.torch_face_features( full_frame, - torso_mask_data, torso_mask_shape, torso_mask_dtype, head_mask_data, head_mask_shape, head_mask_dtype, + torso_mask_data, torso_mask_shape, torso_mask_dtype, ).detected_features) # # process part masks From 2d88e7864c3dd4afed66f7b1b6a2ef38175312b4 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 11:05:03 +0000 Subject: [PATCH 09/69] Changed colour format from BGR to RGB within the detection process. --- .../vision/lasr_vision_torch/full_frame.jpg | Bin 70408 -> 0 bytes .../vision/lasr_vision_torch/head_frame.jpg | Bin 34700 -> 0 bytes .../src/lasr_vision_torch/__init__.py | 24 ++++++++++-------- .../vision/lasr_vision_torch/torso_frame.jpg | Bin 20771 -> 0 bytes 4 files changed, 14 insertions(+), 10 deletions(-) delete mode 100644 common/vision/lasr_vision_torch/full_frame.jpg delete mode 100644 common/vision/lasr_vision_torch/head_frame.jpg delete mode 100644 common/vision/lasr_vision_torch/torso_frame.jpg diff --git a/common/vision/lasr_vision_torch/full_frame.jpg b/common/vision/lasr_vision_torch/full_frame.jpg deleted file mode 100644 index 7f307b546a1e7c72a4ed67d640560ffa3c628900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70408 zcmbTcWl$VX)IPefI0S;bF1on8I|=TR1P$))u2~i*uy}9}1Sf(o5+FFiVUghO_UHG$ zRrh|mAMU+ps?W^S^z=MWch%H6r=REf=QY4

Lg01^@afb?_3nE zpP>N%^Qb5&Kom4oG_?O|=$II2=$PneXc*WSm{|YW%M}hb7S4Y+{|)lLuOg!Yfv8yM zXz2gb<^Pj=?gHRrAgv*X0g)I0$oNP=e5B_-0PPD-)c=9^0``9m2^oljiiZ9I1N)^z z^XnJ*K;R2#)EC4ry@Ow#15of$3Fvuc(FnCI&>7r`_`*|)FhFt*-NZT*Cye}-9ub&W zB&1~I6im!4tZZNbK_OugQ89T1MI~hwRW)5beFH-yV-qWDn~%13_70w2-afv5{sECu z(J`@c@d>GE=^2@yv$A1dic3n%$}1|X8oxC)x3spkcl7l3^$)-YhlVGore|j7=Kn6N zZy+|ews-#R?wy{UUtC^Y-`w8)#|sGn{9jrx{{N8|{tGYU|JDHgKVC@4zAp`kkAh0i zi$)-;jc(yi$iNqlK_r(_)X7e@86h{};3Wi`f6o zYXN`*M0!~~AU;4EP`q_MTVh1Mgld)=s8eE{YsGkh+*IpKGC-2=isn*(DY8*#RM13RZ>x zQcITEiC`11+uWazdiW)DJXvoKV_(T^`~EJue3fx6LIm zKW?EfnCM)Osba<3TaYPny{CH3a*L;y*h0`Q)Licpdm!f6q1fukV~HIA<%QSZj)AOk zl}+4MG%!ofhFoOJN`{=5Y+gl6JOjXGN5qMoKYj5*|rqI17?05sxjS8(jGb&p>)(${{z!^?1Yn?KuCP|{JY7@yY0*E z8cO@GkL#2$!n{xda^1(o2`?&Ky&XGm->7UdYYa|5R9_H56FhyUzxh@xF$gUL(dfOy zWZ{^}|7~`}oVN4_&90I2Yu81|f+XwE7#7S2mtR);b(jw_gz95n(}|)aq3_Cr8!Oi= znI(aeUY&>Nc7A6pLoRVvav@f#$V|w+EfHa$i$e8MLJ+I(CeFDohwDw0XX%~ zbYtFSer5G(Sq5g=@9X;GZsHVET1K|Cc@~PUjH6L+A02hr<2lzf#k9zNB6+WcPvd6a zJp;tdDhw02Y#O>Ac55gZU)v9N$0$nB4S1>zk>pL_E}cWuQxzHqCPrwsEMic+iMb|4 zv^Ch0d8FFQvL?p%0#uuwiiT-Bf+Z8R&w46{H@7?5Yco}TdjN)&>1Mf#$|+U(+O4I% zQj&VIa#NQ^GRWP^f%%?tl@_he8rmOkjc98z!ZERAr6R&T>!O&bXnu%oXApferwW|f zM7OhSvvltl)SfO-rueUTOfC#iu=r@DYa^%&P+8) zrrq$c>wK_+@O-F>{G2jIgjZQzPhFde*Ua}V|L>aj&T1=_KIO8Dp_G2EBLz2BZ~YAx zfs6@^TBwKV-heteqA1N*(vRkcn`+Jd;rqZCHnN4<>mQo8)K%!2sySXzqq~MNdos_w zCSzcNqaIHm*(P4C1YOtS&1AI2pulBxMCRWl6CZ`MFVfsph&?;Iv%iZMf~@gZF5~Mu zaF^1rXqrDzE0(O;!myZC_kzKitOR7?mz9&8--*#mRBmotAZht*oK}=v31q z_*x!{qQ&5%UtqVyhB5!kk{qk1z*j~ZJ_*^JD?;;n-j|h52iqB6Q!-h;KrgW!4LCin z!~|h4vMzd5k@FF}~{a z+Du2wv6Y4j8Zoq<9OdA}cwGWfHMp>Lq`A=auGesX`OU^eu8rgUNh%|Pwwp+pc<5l)1Hs;Mp^5V+&oi027X5O0ca5+l_`E_l2IQo0Z z-Qh4dG=3e_o=1DnSF-d~VS&MHr-|7(QYBbH+L7l4@7aczeF1!a*QGw<^gIwGy)iMJ z%yHC^>>?Q*w_fzZavS%wNf=TmdD3ih5xiD}Z5*8@{jhDTDo!GGtlw!v*iZyVQd9Ox zQ0MCMXj6nzi#Egat{@!#usxXWA_+ur-YOcw9L$2+yZtMjHo-`t-J1=4U(JtSEFDmo_3_3BYkevk|$ zF6Hb#=|in5`|cBE6tAq{2tX(k9$M7(sBZCLkJNA~yN;Qo?^*)STwK>>Q%zgG*;yl4 zP3AypMl_N1%jwGul>F{{=<{4D#o~=r7vapHRZ~*4bJffUxSxD&m^eeX@~emcfUSfL z1%EQaEcI`qQ!>VO3;?&FR@?yrtQGv?=2lk4H5jWS`+#Dh3J1W1DyVQKZ~Wr&Ty3WF-QyV$<*FC3>JK$zs|%4dPOM{L z+Z>6J+~M_B?(Ax&j{< z<-wmw#UQ*%T>Z-T^N9W9n;8~9b^4U7R88hw?XXR(_e)s7y3%EC?Nq^g$tmRGBi_RU z$9J-e$?Um0=w`Ff&(;3Q2d%WeH%9sS@P&vel_@44#19l9QDO!KGZ!t9L)ZtltIedI zPYlyJ^yYG#INOEo&8i6A;jqfRS7u;kj$e7a$ux?915e*O&%dhQM9FVWr}b@=bmWo- zI!rsQ+meRe&k90fXTNee+cvcco#UikW6=5qYB5e=$id0VOSt(ligkVm0Qe1bhF+7j z2bn`E29!l4145-8Vx9r|;dFtfWP0cWJJ{h2SL}suY8rhCymCYvz zF}h?0c5C9YgTmncWLlblIwn!@3EMqo1#<3d-*P}6=5~qjyi5+%U56ophft8Iv}Vp& zg;3-r?n18%)PZ{=1FtZo=4Fw}2>gBa{%(@1h$p>&EevWFH#7V;ow|Zqm#xFvO5hIB zlBXCTyw8UsqYwdW5iMlp|G>6HYtLze45S7~siJq3d_x#m5WMePIe za#IG}*pA&f_CP*JM3y2ca$oQiwZqW==$r6P+pk)*`c#M1lC+1oSV*7aHNHY^!Po@> zw>4K|=vAI5QUkv)D3g=-!7tDX3D}j5C_3TOu64biy#P zz&}2`ONIp|K7W>8kM4E~fYk(~atYHg$rY=w@ktQP|*g(iF$yQHpDITa-Q%AW4q-m-O z%llh6)Ur}c?4CCwJ9M8XS*4^Yt4d`pB(#|p#!As)!ds2aGlIz>3vZP?Z@ zftjS4Xj4G>e*G5sIPnxpQ7qV()(-o~q3QXS1&E%OzmdtC5;+;s4DCUHB9+OzKJweFA+j5Dw|NVJkJkwfzq}v-CMmJEcYh74*~Wlr%hV=^F7cmHx0Y99Fg+8 zJsw=Jo?8_eQrih$Da!6NRNNAdGM&=>6_GNIR-)dU3;mhFknh&JM1iuT(&ukZWgQAm z6=C%KOZ9fyjo2gLW39<9pGw)D-ERleyk49xU%-=bWy#NoQHg5SM!yk4_%p!l4`)&8{q^WjDUhZyplXyhPdK%^D+2^3U}?5h z5a*_P1n$h{f)quu*pMteM^z~{gO+wKDxDJr1S%ve6@Z1rAK7*087)hN{H0kCY6!c^ zD|00u+FD6x#?r2IyNi}OM^Ua?V|e$QIS)$CM|k24s4c7cvKUP8TFQxT@vPq z*=jRWQXQg0mfM+uBs)+MXy}w%pOf=02UQI^!H_NolMqb4z!qxaT{;%P8Lz zix^xf1Gv1At}G*;fDZGl?%=qq2_=C6Sd0&+g;zDQ)$N}{Uj;c2#!j7mn}QilMAXsy zO>yC5R)FnM!sih~(d8jY`yrRY%~p*JK76vMdT38c)qpt<1mK`$cGdc$r( zC_-*EkEi=ja!>1z5-!o(u63h!6=m}K`H{;ffRf)5nC%#ttRvYaVnYDXqt(hox)znX z#J6X%9NUq4+&i???PTmo6(78MPus*Qimys$q$J6J67vt&to=@#V{%D#TWt%2O410oAP(^in9*;-&S+~nTS~PgLrk?e1fv}XH@bp& z*Qt)4UW*8R(D^F%zTxVh=FyIeAvIa5QQ%Jfj$XFnCF+2lZ@)T~tiL&CSyeS^D(?U~ zS{VelhOOKOz+<%LWo>$j^r3Cax`%gHxfO zVyx1Q(~dqLIs4_`glulqpM&)*&nG?uk8HIyGMMCoosDR%RI2d|mQ)^GkwTx2r7&c_ zhYGN=L(VWt(1;0%3E_8Xhac}!BD<_2R@E@vTr1^9G&+8zD>~9_XiD`oCEG8MjuT=Y z`Rm96l&1qO5trrf_Ous^zD?+C7>CsJsza>%|;{@+_fI#ugD%bi$SQHf!RKhEr*-cNs;}QEcrM+^uZ#wF+bW ztu`2t^9MN)*^OUq?Lt9Efw5ZxU(<-ZT}Px`87L7BKuLqw+9_J0*1UH?e+nk9h;BtPx%KM`w3<+KLm76hPL zw=jPH)zL(lpJ@WIk4Au}Ch=FDmczT}9q9ez(Vs-^ z2oJT_oL|+t39>o04YPth17sFE{1`3I=e>tms>|I1Ajtv9Z~Fh~lrmMG{pfFqq%;Il z0|vlCOG*?SoK{My)9G$_-k`~^M;7xc13Y&2csl7dSbQ`qGbjm*A%~`ZPjce0@HqD9 z3XcPEUv^Pya9OGK=i~z_p8Hxu+GCs9yv)VHPI^ zhI%Z*W&fhUmuIMR81WX&1b;-Ou=!o zesSAT_`W*UEWT$l_+8Dau$oMX5ZmpgfRI5ZUa6#&q)Lf`&z6IJbSxv%KJ-!;R~sK7 zN*AaXAqeCqdCAZde)EnH7C3y(EZV~Z-NF=REZ0lQ`cu%i$2=kR~2sFKZ0-ma29Ia zZ5_CQ@GgPdKGb;Bzd%|)J45t~z9op;WkG6yC~HVV52*Tp)|GK$p#}q`sE)bN_2txD!OiyIM(p zcf!z?Vmk*kf9K!a_wF7l4u2z5P4y`F2$O`?#v1IExG8V5%RAJ|YdiX+ESkYn>O<{DfdM7UvQ$ckt3mL-6{tUHIU}l`rQn6pe~tcx8O$+vJ>8SudYRl z&|1WtrLM+~?I4MV*V-Kg<+Uc6^F+5wc(d&)>vUv;D8ef^e6Jk-I?lZ=;PRkMLbza# z*YQbHT^#Bj*E>2`Yln18&`(KJN)KM5FL|2$8MO&md8?Dea}ghh6B7Ar zT2I&LaEvrkcl0Akhsa^bsC0Wdx1&4|CgK3-KpYxLeBt)2E$vIL%qi6OFEDITLh@~eRJlNwya=N zj{+!G4V9Ry)VQ{L08b6ld%npc)m+XLLkji?)blVE!#Uhl`&Z3qd+QXCG?wKYv(Xm} zsII3K7$U-r1nz45(;O`3pbP3PRU(d+zpOsQ5a|Axm!5A&oWmA|L6@(31oq=_ak0k# zlIhar3BMKen39DZ6Y`u{jPnhpr0hwC`~dscGc?54dNnWLy#jftBX1fmDKs@rOjvg) zrUpHvgioz5R5}=5-$j*{ft3Il6-0Q2L;`AKX5pzG8e%YyI@1J`$WQEz0-s{3CI#Es z!u*d7s5QiN%6fQ^%GeoR7e~DQSPCX{htHPGiM#Q9y#m=)8cOaaCO%PngF?=I|{W4XEqFs)g3VEg#uvNB2t z=JC11?MN9P>hNQwRIqEIx;eBHhRN~c@MnIhQ_P3^XTZ+Gxt>j`W6L>9dIL3*1YS>A z(coaev;_db_Kt$J&*3Gi&QNKn5hR-(X##&=AsG;7(^!xx5M8%sBnzr z4Toe`yPLN7^)oo#eG#eogOhPLQ&AgF%YYEHT<9KJTC-}lU)Y80brJ$4bQ@HOoG-2< z4PletCb3Umlwn1lhSFu8EX~}}*eyKF&QP?IL`8T#8b19<~XjalD z>d0@|=GaRS!Twdo5d1YK1u_=M_6IxzdT9Sj53ERLa9K>g6$4rX8;Q zOuu<^Pwz+D)zDwzmmoOps;{I4QHlyt{3Uz%{+FYzvn}$XsZ7d1Bqo&ua>WI}t1^9B z+aY85@76N_TiQlCwg7J(x}(#Or1Jwn$~S;Q-*HmVKkhUB$FNcvOCdr)tEw2QiU&|W zVKnTbvfzMz4ENF{$!mTo6^aQey*GFoWV0ZK_u<9BECOXa)aBpA z3k$aDSjXX3F4emfLkpN4DdbICR0ky@*e`=qjHn>nKb0Swe%X)<#O>TPob<}ubIfN8 zF29svT$jcPaI1&7ip#ZEDcD-#-KC`RiIoQMcJ!B&RP|AW{5P5f-*_n#D(O|@R0ETh zn{Af{I^Ratk}}NN*js^p1my;07Gasn-6O!X{gvVo@z>}GwF8bAQ6x8wU|xMLjtyU7 zo-Q|vR7Be0`UXqiNOhr)?4CLk zh>V~c2BfYh{JF(_V-&HUGw(gsBMiui=*4K%rAK;!`9JK}c0f?J!9qy0+FR$MP9@KT zfXF`ySf2f270KnSEa6E5$yOjxLIVoZ7=wm`%dngRc@BziHBXr`d+IAGagmJ=LU%SY zcwkY1ojFeP$CW$>`OtAgiR<0ld%dQ=s$Z5Ug8I<26~M}?pCJhbKPR0rRdf$EFqTy5 z{b?r~x4wVxG@m2nPxc#H3!w%ZaSoAN-RS*z#buiRbat4%m5yqaoRU~2JwBV2g5xF) zRyiEkaqw;(_k81KXr)_*CKXYlLcM3i*(D9$u9L@t1bs;*wpsMQ&+J(n-Zh^v~v61D-LJl(wJJ{JlS}PH$G1TaPvS}y01J1 z?!IfBsl8;X$`n11Y)4g-HHKG=6W&b*nx9!F7~7?qA87YjJXASAG{8RsA`K+olrt#f z#XA?x;}RSYceCfR(|SwLS{=%znr|d18ZzS01^~Lc$}xI2U-KW>;TLGJ>rE6e#he#7 zV2qRZizs2-R?zF6HJMQ ze=dY}N29q_-!-SAI;A@e;xp9mvOJi;jxB?}vR%?TnW?+2S->rczGC$c{kGq(yDSa~ z_QWM}hTx3wT)IQLz1Qc|xDOq{$}4mp*N_ApfL+ZS-WX?M_PNz|I7j!&MSFlO3bJgg zJwjZTtHug8>^Br6ZpaD4C_!!y?&FBt8FcUQ-y-F*uC8uAnA5^GEGUnXcH7w0#NSNz zz&5Sv{LVvf&(PaS96!QkVcT2hoHl5};9)u5V~o3KC^V z-;+R&AnW0KuRL3yP`{Ge>i+SWH{0Q>qURZ%UQfo4e42dHpN4bh-DPt!zk(LG-9cxl zlEZusX)Ya{2_|jXsYq49fA=y!*yd$%e31ILEq%bV_K1tu8jyXFEz5fPTDBX-;Nfb7 z(HU4_w|ES~iMdOlKT~kD^`&ew4{IDi&x(}Tkq)wIpnC>1fnE9sp*s6-ds0bVf3iz$ zAcr04pgA^wpCaqsJ_Xa@#LwSDt8bpjYd#gcdK1!b31jU^exs&BcGV>+sQuZ4S_&>r z#0iRFzIYXd_%Dy>g$15)mGdLMtXT^oBG zQ9%}#yNn-Ep;fq|c+tFi+W^{sNhkV6xwdYb03DS@gX-6`%zjPOjQ*~b_$X?#i)X<8 zbgG%@F2bg@}+GimCpPtM4=51lNr|@o5}=aPBh9jik7Fr zQwyj=rHjv6cknCp$HkK>D~)hcX!WJi|75B}^_5sc%NanE;W9hADT3Y4P&ZfJ1?{xsGbOoO}>1k+sFx`&xz_*sup*+D?PTSCucF(nhW}NJXzV z#p>TgioILnmbQ#~s0w%(U2W^SpyjRip7eUhE#IgvtUR^R+zPQ^h(-<{5cj>V_M?s_ zPOnmhF(w1hWfh6^a9F=209e1Ij`)!Hp{2aPK3gMZo zAS;Pck3B8e5Tk(Pri8iq43OT@cd<1J!P*$tJ=SC9I5O^>F=18H&D=cM z^KT<~8+J)Kz5?9eJv333(j)2~+&2o;y`TBmbF)yu8MDcf+ah!il~z;lYs&tLyFOUD zmGUuxem`4vJSHvXse~(xHw?q( z&oBx)-c7c2e4WlY$n+UBIde1O(kCQmd3cm+ z8c8&C<272uFr@YyLe$TlS1k$)orz7&;EE8vXEkuL;Qzg?n)Quvgm=3nVUIXL4GwdYHUUBKG90YqNOluUK3Amlj|J~7|ENEY z5FyL?3_#Km**C5YWLIfLlJ=_(XU{tj>F$=`en8}+HpZp1qTxyNq;hb8K)x&Tef(poU=JE`a6$CDVH;ydP1tzt1vVk1ZNOGbjimpEfAWMw*&Oyjct z6(qo;_V*~IiYPB(pVc&?a`$Yiwzz3xgT~%4O`-!578pHl7H~hq&or}7z09ABv(e%z zM=)j45j{QU@>|%MGe010&mm_qEw_A*p=omVtrfPa1O}-`9sjOzJ8#x!k}vu_tQ(bP zyQA0d`1oP}DCS>>Xy5Ab$pG%do`~Ax-JP?_Fh6j>S*E8nEZ-QCJnkyf& z-nOmqvd7c9mEhC%zQ5#S;wNq$o?v*X_RPf)cae3%S|6n-Mlsn1y!0J`GB`Fd9L1;X zO&ebFX8zy8JPoxS`Hm)l6J-Dwy6djqCT=WQ-LOpTR*ENVcv`@yJbeg7R&~F*^AYd% zs=ARW_ZB5LMMXwZ@k7THb7YJT#${DKR-H_lVhRbHo^7f~r9>JeV_&5*nni&82ieSm zhGxB*Q1ai60vwLRYyWEe-SHI0gNjJTBZ(=st#|V^U$f1?IB9?MGn<;Hrr-G7&u@M~ znoULMB$5s{$P|XRpUzfF?J&hN=9j>HzUIZ(U6OO5XGU5Euswn+$RyPzl%W?WWOR3v zsFrlGjNuTd{b`w!hS<~H>FIc)M50ySAFhyZjhm7b#v)}WFbI^kRTZ+5buGLo$)F;R4?}U3`j0P1%?1MzEX*9KuVu1$# zv_wm5mj2o^(rJn5Oeo6qB(N4DC$KW&sso4!(3!ulZaf1HHBWNZo&h=KdjXw$0Zl=n zmb+NYd76&`qSzSEfZ%jQq2O84fa_xMMtvV+n#N=^_l>f^fW%+B^VS7Mvx~r7;3a-E zbv#2IPkLO2BH`XDgtl3;hdc7^olk3B&Z7}tn!=QA30j7A4?}Tu{v^1yLej(kqaMh+AVv9o1O{j@d zxC$*NRnL}ni`XYq9;jK?(9TRqMl&HtWd|SDB@UiRPr{^Xo8q{n!)5w$xst+J-PA-t zM(LlX1A7K&iEc!U#dv@dA7dOur5EYXcFh-tyl&R%M$y{T4NfR7UQst~qK)G$sr~(Y z2{V-^*%RUZv1yyZCYB}>lTIx(7usy7(CnGuCT~Twl{nPpFf-G{-8ksNiCD&$l)aDr zGb0dLkgb7khQ*c2@9s;E@=*?{TC0nQz@Pl0G-1*1R!LGLV0uD6a<+6&&&t9IaH0WL zoX0a!)SiOO#5pmhyU^<^a~NIFGz%#j<0L`#UR0wDt(n^Guam`67837*E9q6!!{KD; z4^INA4!R>}N=2`|fE5p+y+p%YM==ZBD?c?>({ZEj3!WOvxGJok0ot@u?I5aqigCF~ zm3Q%sxv3he)ml9tAP8WZjEgGvu`CThUjht4y78&TqzIoZZVjU!>K3VXSI#A9yR6w^ zc0`FOk!PqgH6_^-`LeM1JDJc5!M|rhOc#lcW`*(Zz-#=k1Go?%Oq!`gqhcV*D zMoS=Ii_;I%fmL=Xs;-Q_!n0UhPUTuYOKk5A(;ghu2m;SF#KU(uU+Y4Zn+3{C?e>M- zI6eiM^E-R|wCTjt*bAQC3?Ww6Z6~jt&LK|09k?jA3efBK-@P2A>&cBC1Gi^+WNF2= zedh9)bktZuO_U4QvTxZDvEDy4Nm)?AeQUe8(v%h_ zvs+)|SC8vYq2r~xxz4vfr}{7F@LO%4Ym!*Gw;p9%q80fp(q3-t1S@A76W2;R`GvF5 zWi6?IR_vzy5-(!y9~Ugk9Ax^9jm)xpue3W)E_5Q9>QO>5B||Bu3{=tdA}@-HZIB|Z zBzf#RTc{G?+}@4?+|39ZI2l7+?Hjyou{mW=f@Q9uFbQAcg5XlKtb_#~5d?X6S&c30 zH!=Ie8r*rGPG})bhDKm^9j;B#c^5URl%qj>!e9xl9GF@C$L=!z*9F=9ize@484DS5 z5u&v=TAoS*-al+ZS0$WiV9)NmnJni>bEw}=Lh2+MN~$z?da7xN3uD+#1%Nagqobxs z#u><9Fp#l6QVj>l;n7*=;^c?HE@>k^G}iZpe!6CV(T2}PSTrg3EhJ8V6w&>sa+?&w z7n~TJcw%}5zA-)N9i9d}}i!B?_w8btwN85YZ=U%bZr zr7m|rQ81t;%4qSRzr{j4@jis!sGbnYQ|$EPkuTa;bCYDY@tM67a&HkyCJpf$BqQHU z_|)1^-bv&G#L7a>jRnCT_8$vF*E&~G#uB~11abcPNx$pM!-H=6j`9sWJ1q*^-Ag|` zOv61tYXCRIbS`wQ=~vU`#f0X1K?22vJp~f~yWX<;9C`_%`3-i8GqmOL@qkH@fK;A* zt|;mpX=mnC5&Tk^OhRGiOClWr+q%R{e3>tSU*E8goJZGw_87{=Wk4uWYwn#!w5tez-{2k4nWr$muA4Mh-z?|=QvNqjsEz; zhdAjI-SMy|;!~!%nD1#XM5uw!^>2_r%!)R#AX31`M>bH<{n zl|dla{+#czG-xMP79{@F?Y+o=dzbvU)wXXaAu}Ocj7O2tYy6+G7gw}u|Dd$5Xydjr z`H3YnlBO4*0XLlRI45s$O7m7RXj0jNBL3MI5<^%?Rdt6kOvb00$0BYxU$$Q0boGIx z^9p*3GS^CBbCpy)vOmmoS)Hhy z<&dk)Yz~HP1Zi@h=aI-%nJI(e+qoK z;V3_>T|1@+-Spa2{3Ro_pYbv^meGzZ;MF%3R}Q)>Fu52Bz2T@&lH#^Qtnb7Nu3L!7 zj0RTQ&AFS%dQQ;|mjBj62g^mH;Hsi0jhrHK66IK(Y<{_OV>fRie3z-+00ZdjZ=2>; z4-w*N+W-x3D|=5wY~!*;>4$ahi5i z5tP>^;r(wpc<&`L{BB(17pSlPruRK(foj{?OPyM!p*@>1ML~m9oTm=cxt#@+maJso z!5fGxlF+cKdwk!C0LY5RjpQ;kbi3s7&s99^b(&QRjUryYl`4ULI%RTFdYx0{@L4P| zuS=m5D&8wm<<_2pGs%mN)vmL2mv9vtyV_LVv+V!*4gdSyGb$8kIo25_Cj?SowCoTS zFLgk^Bj!Z9Mu%V4h;q^HHqUAzOFEwt?!NpF~vWnY!BSj?2G6 zX*GhGgkv(mWvQ3#@1cv%xdk-hj)aRY1SdHh0_qV7F?)Z8OKAjcSc+L0@*%iB7^T?>{p3#GaEEVKb{3H4 z(JrM!8a~af$+8)SAB|EfbTUey1s+M2yG>Zp=FyJGm%%)3(e@ZYTAMiF_=GUKk~t9ivv=18~5P zxn7>4u$%0vtCf;i|M}+H~dJc95C0?hyg%OQ4s3za%Wu#503WvfalF@ zx2T*l^2Rya*@N#rHv&Ry6$5-=&ownp*yKhopBg=kp7x!ElGss6_)EgA4wTX7VOUC^ zKYa&tUSifbe>I;LerI3as8P(Qp$Fzfu-OV?jg1fS~@Z(bXcgM&AVlJvbVGCA< zonAA9Qyh-@S7HgvwO^DqA`NXcza{SfIyngPFz7SD%f%Qqo^0y3IVbB*P9QRSzWh*f=a(qsGjv&>asAxB{I}&cq&epdx6nRxKWi{;5|U z5I(-wZYr0e|0JIQbPhlE*|b_FzC`avlhJByUT&U`I=o-}F~X~vVYCU^Y@NOqlyg+l zkW0C&Wtf~G7qA|28j~0M_$74-p4!uF9SaTAH;prDSxPARi}O3hL*1YQB0Wq>b5lKs z6wVIKZ#FR+!PNj~Zaa;_BzVoHabmw#pD&UO>89=Kzh{<*W*D}?+RX-PAEZm^;ysgJ znIufwhueHe_qLj>RdjYmq71QG&hom`Rc)kBp~*w-Q})cOhQ`z>i?BE*l`0u)dfw<9 zzo>6TV~1LAH0;TcCXJC{%vn;j539PoK0FdjQgi7lFZKEi^CAUhbT20MRy+elYd-y8*dQ?0ST86-&gSIH zLYL65AW9!116E3Z#p(Cmu7k6eU)>$# zbpQ5Kt4(WmGQ(=-h_|>3Rfzz6K(H7en2zmw-ThI1e zEw9a#{F$rIUD7u!Ns-@)G8c~fKMh{yDe@pRTTnR*o$|4RcLPJcY(Y3Yjw=u7YXv|* z?B1_8q3he>R%N?YzVKI3<{-kc4dqpq`@XbeQyUqpaBa3lE5DLB4zI;m;9*H&^@f;* z72?HL-|?dqKFFX0^q}`jfGQg1(}E}oYP*G`PeIz{_L=|qrar7Ng3%>X`;h)T>97AH zc?PVNhBmDB?wgKEts=(K0;}b5Z)ycTi6<%u@wj&^laqqz_=S)}=^L6V`p4vQ5vV@n zubu%BCC`9vwI`0Jp?rE*j39|qyr|*?tF3V7V4Q{T>YM0HYd#i4foDHI_Q)b!w{_0em-^TEAZ1mm)Yx&5eTo(gjItd%q@kK68=F=BV;z$JQ4E!B-^SK zwgaylGuEtW3dTz*eB*!q^++|<&|~2ahX5CH(jn=^!Pg^v> z2n=*tfzn(cOR2(H)t|<$rDjj+vnrzyGB0<(2Hz7d^j-L|H(hGxi7G1diVn9fnYP?E%gY z4l8LJj;vnxk;Rx_GTy2c2G62PJjx(ezF#5Ux4#K@Z9@&wi*Qs{o5>p59APNNZ_e(p znuRKHI|q+-_R}y=UD7*OEE>Zd-M=b(#KCd(0QGYb${)%C=cMkImql8OZs@v5|!Ko!o^J|P#=8J^%C%NAhoVrr!cf7uILh1eHmZ5+#4B4+Vvk;Z!HzVRId+ zb6USlP1$K1%$nxo7Pmp|9m&c-7TB32VIRSQ=BC+KFKRVN8r;RPT0LZF-gwlnQOU^P zd0Yaw&)syu$#D9Pbe-i86OqTF(=s7pia69c8W1%$p;oeG%{C_!>f<6Zzn~%+*C^2S z3mq_^sLk~a(2?apl`&px=imv|Yh$kY)C;-0+16ruR;R?t43QO&4Bj`}FaUyj@>{BU=|Y;5L|Yqen8K9ss6OUa z@TT4Bf3riU3u$^K_0e4FpX6c!VLNU{M}~qG)l@2j2EM0(iMWxJPSC)(_GH%C;BORj zx@UlGLR+|e4!T7CN`UUO)VE!?>zn#ljUkH! zQqcJ?*d8*E)hRU4F8NqFupEZYP#SM(jYo-GUPR2MII#4{FGJ+wb#qK-$2_F_&pmSA z?D8m2sz5YC|JvZ7cedjhz;QQCy5MCJ-5%low2xaAtO)Rs<9|_nvxxgVf_v?KQ_OOF zUgEQ)bZc7oL){#*+O$V5FWr1%Q+MeMdSXOa+fdhab>@|aN)F=F7JLF?VLJA~j3x@+px9K6%E1=zxZH_gF{W11nMVBIPec|}L8 zzQU8P&D?NSh%Q~r(3rHz z4@Va~MlZp%>B*y>1rrcevZEY^-s?hLx~Rf6%li3&l7}^b*tv1zZ0V@fJSrKrqshRO z$NE(6w1J7uaAl@~N`}cP64BOPm=c!>vaHL4-SCUzQT zoUQ{(hu4bJYedJ&IjQvRJ&^`f5C?YaS02PL2oo&F3KVirrA(V3#JJOuhfE)8t~93( zzH{wIY(_#BXF0|dMp=-Y`Ndf-=RO2Y8JsTf*_u4%@2PdyuNr9DiB848^EhBZ1f@5MG0qkG?dN9er`+)QZ8LWHT zdx<4!=8>70<(fvxHPDSbfwuqvIKb&uF0BCvC^82Co+^Onq<{gz>s4+o!weBy7uJe{ zcZ_VKWxy-LrrNRGu;k1ad1{^$PG$IjrgOTPKohRdXpNV>0R%4Y_|#)lP6a z{&l5x3nALQ`c-GKBzdxes(nXZam89mn7b50Za*Sqo;VcNvr;$8pq%sv`PG@7VI?44 zqaM9#h32CiQh7ibCfZ8F85^J9u+n2!ySWSI z5+YRv-b3h!xo1AW8l|h~zA@GA?Jo5H02oE5K@`kxtp=VZ4!ce;<&?3`IKW&J*Bq92 zFlqiIeH%s7ZzR-S(7ndDt3=s&_hbl0M&;a32o(n%YgC#sa#t={>Ni%_k9p!a1)Oaz z+hvinD=s>+u0Ugtx-v(8Yf2GsaHZmu5E}$wf)Akwk@(hoS=i{)8_inwSuZC{#~3^A zBtQVdsK&+i8&{l@%{txvg+|ytGtFg3tocXgwnhieBQI}cp@=Cschc71GwL6P>8<G_4n7*ner?_$e-*@qbp-bt^v&>pmqSOXfciy&K=RC2k1ZT7jEJ7a}a!VdMHX{bqOr%5dHmuGy1&1Wfh zH>FL>p{uRy!5J;|*%Yzm&N_Q@)}3Xo&8OTXYW%nuDo0+q{cD|B<+_*7bOWB%Fox;w z5>ie97QX=jV)jMT8{ zb2-bW9_F`(9;;?oiPiXj#7bacJE3xNRgO5UtzTRza`HysDSV7{$7-g!bm2VR%)3ue zDuj?sWGf<^lgGVOs7^bI(0xvV4Q30lvdfkOu6hb>?}@H$7sQthiMqgUKfpo(iHVPMa?2 zTE)e_t@c}+;>xlE8J7#VcH<-i(~SNmy2$)br^h5NZhDXy1~~jiYm3xu?rvl9ni6n0 zIO$aNVR)KqO%s0l*ylOGWdj&K^_!t6YQuexTC(vq#+9orwZb5dcz4EKPnR+rj+ymR zGuI=Iaaw*K@jcDFb7^Y?f>)W0Ei3L>6tBoKF}rI9QhMQsTJfzL;tY4XaE5l-BxmIX zx_b}v+PXVG9)`179EP424Y)ox4^ilU!lKWh)0A2EckFfXUdGQ?j^9zg8f=aXEj#bo zF$ostRw;zyQt$ z0q^QLt5N1hrG&*<*`Intr*8zZoAdV)H*K@Zu=E|Fk)b?XFC7?XWfQx99Ww|)UY8g`Eclp~M z^?fZcqX<5@sZzwT!!PAYO2U$6T3DR(`P7SKpp5r9HK`tyNXZpy-$FBd!E=h$JD9a& z87;O9DsfNyGoCirO=;m-resBg{LR!Zc<)_5g+2iMNb#G5@Xvy8?{Ws`f&sA)To)t( z*F2hb5$85H6IscEq{heQT>hipwa_f8Btig4qHKE{FB zoSb&7PF(&usnR7=kSbZNrnZ%!nli4345pPMKaEa^TEu9HjY|w2u~uz#+2#bSWB>sy z!wb*9PSs)t(k)3@ZrWE|Zd-NEGmhtj)YLa(;-6AGJ5!Phk&jx_wbSO=zsm}s51sfJ zKU$zQiPiCEYaCxTcM-hx&r|&cF;e2`w_IFFAqP2;vxD4$(0&yUQ&f#*ywh#Q!y`>5 zLE9SO55)DUmsYrivtp6JKZT=Qu=V8Db-k!j)~-PY@&~_4mtyRT7T#^_zJ1(}BL*Zh zws23TdRD!Z0oW-OO2*sE88x}4TB!k#AB9NPg!b0xgK1G#R^6E7FKV>}Ff2iwsN?T8 zIIGs$UG=~Z1)CMdcRK7`dgS9H=|Q4M%8u2fC!AKlh3}U})UiC6wz$N17#Z9B*ZQgF zKAEW2(@ul_KJ^{MxB8nD4aYq1Z65vUWw*#VdV&Iu}gj!kg?01*5wE|Vi+NhuFC6M7))1O~q%|)teaOv_jwv{2s z8(vgj5A^I&eFEc_+E54W|Nev=60AFf*DLo?Y@C z*cefdx;+5wJ*neQU@_$N>sqntj4x7qR?WqMjOO5Bhg9x8ja8a3NsUwzcnT|YjAbJhR0!t)9>Dghmn*sQ zTP(x@lh&~QCj4mdCxCVMdlfCOX`UC> z{>`Yj$g)Rfvn&ULnHiWWb?Js~cojof)^zU#Y0*O^rOo5ZJaEWuVU|diR^xQe0}wsP zC#M3hcy;w%cTNolhi)`$XqrVf7ZLrR$qL-Nw;9hT3NU-MO>cQ^7)U%m!sLUpJBYy% z01npj(SGpHamPHr6}HI5-HnnfuO!{-cLK`af#=GfJ2z!W$T&Xi3vu^pVKd0>28|4{ z`Je0OavFE^+)v#A7W>@uz!eq$0EM*CuiE&J#1h@fs9OgXu*Y`Aw!a4|4#XVx#y`Az zRF+oWF4i?k7F&A@Eg>RNXe{S*B#d%f%q0d#`=lw)Q&XeagHFX8JqJMWwdSRN5SLKB zyP0LWNw1mFSPTVeTowZy?IiW#M-?WIq4=}KR!eo`OK2<<$Vk)SIYj{AV+SwCJD(Wf zgsz6uO4785R#p*@EDzqxfD^V?vi2Nv?rOfJ;z;ewM{0nPk-kr$=%b$f@zcE*W_-Hp zJ`Fog(4a1-1%?_~Uo8ILr$NWHXW#2F4Z;DplY&N1<=gYmwP#;ylU+-_*|UsgpC=!X z1MmW>HNum$HczD{?ovwH4!XOM$#!CM)RU5Gi^xk8im@)|A1KCp)C{A)G=*V+f^yWM z&mmg?cA@h=9{0sh7uqgh+a0U{_6C)kAAf5AKn&Q%aJ1Ev2hC&WfA}Z|?L(?~H(HzF%Inu= z@T@XRYX!;(<5I+gApl{V0z-B_{QObkFN%7Ixt3i;)_0TwB30UmIN*2u`_+Gr{{RxT z9}|2@zt(lVWM16QGfQdp4t=Q~HAzPf(i>EP@D1_tMx>gQHGsVf7M@o;%V7cd}dJ4;Z4NsPA*G+#r zdL~C;M@re#w6g8c7V1W7BZPM~m3hr*X4!aqeX&xU`VQ3x_5_V1AXAWgn(wsT32v=C zxf5#^%CM@pngq7jK(b?;5G%SEC2dSxDmAIb+h}q{DT(4IcLJxG6`0StLz z7~p%>ex>l}Lvba%(2?_%+(t*!jt_eG9RtEJiB{zjFk@_zK;-0O`HIu=AAz)MjW*hL zxsH2<$e6TC6115t6+kB-D=5k2n&zpOIU}MIj2`F5KNCJ1P2pEMjfJ~4q~qsPoW|eb zT&z09+$ym}aLRLl+2||nEpOpIo#GDzJN=1>nI95K8!%(?ZQFt9$DI0C${!Ja9A9`_ zT6p8P#2bzoMtIG9_A>)ki@Z-pm1s^jW~ak%5X+~(mo>>;44fVhr}_7118Vw^iqh`o6HSqsibFh&fdj5^p}&Fp1C{g@_AZ}fWK0;({{UXUB>os{w|1Jf zwe60vai`p@nM<2#SzS7Eq;tUlo@FWqj>A%N5gF@_TNst)vu(s%gb+UTu1=M z@r45gv(5m>JPcPBB9nU_#s?6Zvu4yfL6Se+!QaxZ+4ySa;y@M?jyrYd7#{WXhr@5! zbH)0kab9@BYkf8{L3ELK$%CBX0V6#3BE7S~{{XVj!aoH@uKG9jjl$zH-hJGRau9LY zb#yatV_!D1F+S*!J+pVRAq)CGiY@Q}K_XHlq91wdEKp&Y9X{D~Nqtz~TBJlA9tz`nmD`4`V zNxfI6Bol_|#Vlw;m}SDS>5hy&MRwmC{0SezPl&pQg4^~~%!g0XjsOtI> zU#XtZD4j<`(ob)%y%r^_vzeIBcP8tpT2s3t%wlkTv(v3U3v;;qywu-ib(DufrFw=K z_N#W#CQAYMR6PnrFu)&>dLK%;3_&=+rHUR%LCHM@UxQ7NKY4WV+os%?oxpO-8KtW!THDUB***AIsB@_ zo13-G<;;_0^pWyEE|mtIW~es|6WrE>ac&p{3{YyeDw{x0%DBm;TSZgA@6R1--;&BQ zP6+Kzg3{vP;wyG=@)6J!l0P*y$Qf{{v|(A`r!7iqsIDur-=MAy8Wys zbuiF_~M zeF}dQ_|wFievhWwE^aUNJG6!Si&^-7M)K~y zDR{Elduvu*${+hO)k@8J_}l}ZEdfuwD@ZqT8Ncyc;#Yuv5$J2;Z;8Gux6&--kR_T( z43`&@9042K+mOjJ_TJ0K#qK7G<~b7mXWZ+gj&ocD~gKjTw$Nc`zI^Dfx0KyApJoMYqKt9!02l zr{hP1ygT6E14pMn{8QTe=I2s$<%P}V!pe|XZBVDm21Xw+Y#OKG9~|f(6f{ZT_yMZU zx^9%-R~$54%aR*u%{L5T`&U|1^w#ttxQ%s;alc-vNs#NV|Cj-~jAcWXbJ zrucEK1)qm>_Ua1Rq5l9%ah4urN2u{kFv0CG=k@kx8)3uGU;D&(98cEaPHM|SP# zJ?kG^)UGa0-0s`YqJ!)*e>0O=O)SjcIc8(iCnl=OTB9jTmva67sdYK|rDh=H6OKNB zbpC$zmp$w;ITA`Y9=SDv;!S78kzBR5oukUu`}UiGGzvc_ky``U8paxitgyA^>=Fo& z{PH-;uRYijKU$>;nEQHHwa&V0;^*WajTX`8_l(D{YRJ*`6uD4C1CfwH>MLz0jZ=a; zbg5~g<2cJinsp#5p1ox%q@{jh#JN%4E)maDC4wlZ32LUOu%GhDQiN}!NulP7AkpPOm` zs=G!wr70+)qZvr@tzS|}?^<%h48-;1@@qExP-}uBjFnJNezgU}?KAGqYBDykB-b43 zHqN+0$WVo(3Y|%>S@=!iU@Vg2LP}WUd-tuY zD;JFcJfB=w-q6D+#b|tts<}Iv*BWe$m}KYMwLuP?U9ic}^X*&G3=9#^YJwOElOcQd z71*f~mG@>N=_Mu0M}galaIkFQ5T9Ju?C_ZzEx;bt9JYl(0e?Dv#f?S?$C}YL@DJrw z<+M=8Xu+-dwD)z~st3L+J+%2e+{vDMR&u6Vw?Zo$a!3INKb>mXS%~EA$?Z#Hr@IGh^Ftht2enUmqTNhZZztsk4Uj?l)~ANFNl}AG zfL{TbjtBYtE1|r`j}$ZQ5_pdyWC_g6F^8ny5Cm9?uIKc-sV*dccMh#U(v&SW!!WG#$X&DI$xjEg8jsF0P z4tO;`_I0S!()JJ(74r<42oL~C#&7@x5%sHg`aR$FY-SsjW*}|dFu^@GmdWS0*16?L zoN}$Mgond=UEQ3K+}onCk9D+xwv>M}=lMra$S?;OU=OW)&HGCHHA_8W?su{M+^mzx zPTio$0l>jLhHP`+J+WU&*xYI{+9kcN@>RE(UwiZ1VKRCX_ka5J%Y0(+WrnR{_xg0= z;yajeEP^npoVOUsVZs51&$$FwnT(;&1EURDwtOdfpnqZC7<{}P-!IME+t#*pbR_`W z^C%n&DTL$i%|T23ddoRm*5v+|gW{OTWCQA29D#9XTtG=A5q8+hqTMk%o$n`s;X07-aGxiei-N_?R*oX-s^KHIGNDfLDPZ@jqT1j z+CH@<9`9J5GWd_+PlvXG`^LU3vD0H?g!@&%R&(g9_n7+tYvWHI{@Z^V{9+!~(_Mo@ zw_%SfMvSDG!2bZ2tV@H}?vd8KlTp`hwJX^*9YW?yi-{Ptmp2j_B#@r$&60l;O)lbh zKDGFZ{{RIK@J5o4XYkj;_jI`gzzp zZUDtuw6ZcdgeK=b6-H0#S`q2dTc9_W*6?Hk1HM}s{^;lVRE;*sEi4oQah`e+SL|)0 zSyz8^&<^z2uC(YzA%<&{#!C+=dLOCl{OZhFjnLipXri~=a(tM=ll497S}54Du$`l3 z*r*3A&cR1-UbT8Sbhs2O*Tz=ID{P&8K4t^?RyCqYITGDDk%7o9&OgGmZOR47A6k;4 z%dc^17|pJq5|jLMpD_Mh0ab2w3(3wWxoi*NQ-S#oDU#fwKPalNayK8;&}qy~xfFE( z3SqlwBwL7_2aUr<-Ecw3Kb=#O@eW4tiIgd_wT`&Y7oN>bh5lr_`=u zjF`08E@OqR8?fId0uFLdJZGumy%$>XS<~Yd_Az&DC9?ZBn#yo?Oi7AddOx1KeYHW|naq!33P2<={NaqybM!(orZ z-w|pW5)x0?VVCU|MTsnbaW+B%Pe__Stri=oxou;e_>u6_;lIRD197Ag2U%Qc!oR2}(Z#-|MNYLy49E$EG=k3}Yo3b<2t>husjBt%FL+w~gu4$U)`1HH9 zmE-1UMpjtA-;J>8{{R94wSsp!X3rXn!`?XfaRK-<`zQX++E;_L)++jsi~LhOLd{A4 z0G7fiWs>7loPcm;Z~@vFfn1D!B=}$O-{J_1K-Bz2@z>)LM9I3wXyh7JKnIm?vFP^u zu%!Ib0K^h&=u6n+m>A`W9ZzRK!2Sn=T;-%b8}N0d&xiaa;rkmHp6RYGwCxX1hS?rw z3Jj7gVN@{+zccbe@tW#e9L?O|F8&92yW<2>Y9F;Pi^biw(+2+lg@55aTJ8-d73T?c zKbRi*{^JrBHQc8Kl-G4@d*S~84Cyd&S)R;{F0H}$G9e;_23x0t58m%UFgi(MxDBusE?McZY5o&slp>#Z}sZ^;4 z_faz}U=fTFpP#?pNhTtGs;V=M=e{0+hDs!;n8Jq_9J6dmY2T zBv|HFc!|dK1QNOJk;Z-NPT&r9oK-o|hf|VzQ&N)HnMF0J=6@T%XYbk<;tk>P&%)1% z+J>9q_ld2MA6vXgt*=%!CO|>pmXQJbPS z2}Ta25y0(LHHh_XdUw>deL_iHj!Vw@$4(VT3NelV1B%);CeC+8lGeu^ZzNiK8119l zgMbLZ!0AqXamx@JXj6=u)W5dVY>9h&e>z3Z9nZ_#wln(IHR3M}c+15>2A`@$XsmK( znj+;_Jrw~1w{i#8wu(}Eob@U==@ePH_=TZq3$pU|E&i_{P&xG{o|xj2-^NgD(3G>j zjnojVfyPNa20sp!4~ISicq2%ibsrEzF28!Gcb}}{NR_ZbD+k;ie~2;nt-V9wH^Pq@ zScz`@CvRhNue#q;(4$K$m``FJAOZR?VeLefIFU|OX37!W&Cs#n`qh-a2ZFz?Vd@_Z zJ~#Y7XOl{vFB|DKD}YBmWtX7t9jyWw-$Hy<{6=H z?z*=l>(JI*@wwKaD;{h6Y0acf@Pk^HRI^LCZ1m-xx-yWP&~whTwz8@#~r!-EAKD(DwoDd^^FD}gSrl)-`Q}OZuNBIflG zzV6@;KJ|qdbJR%ca(TLYdkRxIt27iI=eQbk{fPiYfs z!NB8=wP7?&$F+e2+Pfh|2~}%kP&z`$nPJCza_K5#D~$gDcOtZnxsQNH1CI4Iw2?0o zFHVHk-pk0|51XNkbdu;{2y>1`D;E1pnmdM1DDZG{E4wca&E$*`*0ZnUw!9_V0|Nm2 zS2apd+}BiLX_l`fzcO^=rEge66cP>NjOMCA3{bHuc@-hMKzSqZsD(6&NwcugX14Pb z++CC}BB(6PRA7!uuWS-C+dZqOO&Z-T=DwQZ))%&1J-f`s<_)z&D&Y4dlei2LKsc`~ z8rwh>L-2Y7S8Y68A%t5-m}Dc%b(&9;lbk4RyyW!;wo$PYq~+A>W>}J9eC*`)C%tQF z7T#+E9Ot1MLE!Y~9<}Gm;x-SyX^+g@oYv-p;WUYkUcZjo0751DiY{= zevE|`C5lbGm}9S8^IJnsy1R|7?Jd00q!v}=ZR$?|=YUVXD~#~}0E*zbvc<*3QF&O) zGXPX%6USEhcVpib>VFO`d^M@*;`_ueB&p8(c%%Rr!xA5yIN*VW9Z1ebYmTgvXB??b zbTDo739T>Vj!h;>qs|rW)COX}0hMAsdXPp(IO|;2yP`ImGh6FWJdsLrBa#+O5s-Ht zI`D8iAA0t!f5CcpllHF;!)-N;YO5r$+&#jmJHk0r9)E);8R`x_cuy60Zu3ylrn&Ie znQ8r{V8x}k3$$ECkO)*eS8(Kj5EGN0YnD%#x>8VQ$ltUlhEw}iWlMNaLhNB!*B>G1 zI4Af(Jx^0#Jb0!lv`g%=Wn?^&Us-%&@a^`YeJ-hWY{1JjizI8iVr?S|19C8hI46qv z!{Yw{hguscuVc4kB4%OKErrCf&oU7TS2m7u0nX^2dkorAvUSN3hRY^*;k@%pG=~MmGX_ ziuq~9CuVvPyj{=f1L2qa6(hpB-^1Go$Ajg()?v0-Cw0|hXr^^g1lxvKtK)Z0dBHW# z`1AJU_|4-9WP?rBA<%7j+a8Xf$bPc8C;s`{^{>uv*ni^mJ~;6GrkklT{@BvvTT7!e zF4>}77^MVq2~@!VbwYXOzNNLD-9pGPan*8E{v;3OUT!0nJ0AWQ-;S)+)VxKh>bKHr zT8+$?7c#bFxt+_%{{U7eCaKGNJ7g9h6Trs1*wpqe*ew=BdT!mP(^3vJjl^rqj-^~WIRwPb6a92Rf(+a$u1nWIs_{{U!zQAx_ks~Is~YH$0oaM2+@G;py% zc*h`PKaEdsXBZ!F4Ej{CTZ4`=O=#)5e3ud!qJ^Yk*%Y=vE|r^i)M~|hOBZ9gV;Je0 zy$+nCf(Kspb~_}s$hf+N7-K2C7C%5gt}00-vy2f9yUcUOUtm9wCZ*hDP)FsBpjCvo zxOF>YI307vM-|n_-q{*+#>D=oH0P2@4rGy=(268}R8YC;fzql;egHT*IrYs$ad6D+p!cY}iD#qESe%-AoOYq%xD01FI2_lVc<)2D!BhwdJw1QV z^{-p;UE0GGxKou}EZ@FiOJ`M14`l84tRVUj5-; z*xv5?CA;y*h)teXi#;_}*me8Pz^|tPPu7{@zu3=Egn8Z#@l12BPGHm{^4Jd8bObT_ zs{L!G5N0x*c0OO!JR@~($L!uCzw$B661p>I+Fib9r&iCsW8G+tVF0#@*-|ym)r@h; z$v)>Nl6kLh@z207h`tVm=hb{YB(NySxwRf@0q$3)r#S6iZK`RlZ7E3*f!MWe$uk?o z;bwu6in8GSD!hP>wbWl&B9r^Ef;t+?yV2ugn`tmlRbjW?43kz-NKeJdaPW6*Zjq zGJ<44!ACF953N1!Y*mYWqA*9^Y#u)$&*7TNQk!Q)Ax$E+hP!y!j{e8yQUhlyduIn6 zk9>3MM!R9*{eH^&^Im=N+i9|}@@+$0gSQA3`hk{{RIh_^1B> z3j^a;zoz(k47y&5@K_0&@Z1pV5G4x+DIN~vwSS1eTyye{qOvk!IrYVTq5E@uGVm9} zPlw}0@RpXc#c6uh_j=5h;SAS*B%V+`3xZrSpimV~bBx!=6CyEU69o0+r8gY}tYR{< zo=+atr{Od&sz%YrxQ7@3_3KpcBaSz0aslmIUk&YA_ghG!i*e80ALr{^;GxY~FEViw z{nLI&(LWAjctZf*afsFMvrE6i904EviO}C6}$j9YUU2Aq)Vgqw>s7b&T?DHs~ggKF; z7RzYDw_l|O>LHPiD+=qznnY+`d+5Ojpd^#}aaGsH8Z@p|ZzBtzzR!SaKDACSb9m9V ztlpkvEt7yMoz?77vH8Y*>lXLMx+h{=ppcG}OI^Q5Db*EJ6l z20mnUZ{h@p?>=A)OyapNj-eHOWwz6T`8zSyYSQH22}Y@ceEh=N)RnH>z?AVwtl zxFe|arVkK>2WygjeQS`^HN*%+EDt@6W$GR{7V&X|>yuoSaomMPx6t%u@nWoblIUa( zq;#lmJ}N_^kugFT4i4;Bhijh_^)_}(QbtJ%7r*0JGhbe6Gd1P&67GI%{#EAH%_fej zbfqqb(Jk@nOSS^i^f3fs6r3siee+$9!mrv3#~Nm_1d-~AC96w`tnc#Bx|Q3UE(jxn z2c;_HzIIjNy!k-XQ$(T#NR&AijBy6VD zBN%4dROE6w~~9EY|=lqhZR-U0u3w1cA;KN8w%r@n69! zcc9(P90Zq*(XyH3jE?;02EF4|zg=bn9osg-#~s3C_8o>zb2^WPn&QHHNp?t7{G>ln zJ;xuFRw|TdMWakK`DJE&H>U1_^%0kx^~Xx|j|h2?;z(a}6P^un-w^yKci{g3iF&7p zToLw7K#OxU)ATEn zK^-~giuhCZCGdFhE~NUtk*YqKtLe8E^Zl0HU0=x&ljgcOK5Q)H;DeAIfH)vm++H7! zchjSm=FOp*)HIQq3n)GCPf?uXzppjoVkD1y2Nt4@2lCVI$-H+U8jQ-^?HK$i&GP)X zpd&Kiuj7j1)b44rEsnsQ`8n=r5FB*PPaFY`+|`(@usKohlUBKiX%tp7oE52-4Z{QS ztBGX@Y#wSwgpc)c3cf_iy^7IUGcH1YwLQIxt7cXM9fvhxB9+e|ocaoy-pWU8Dw-8A z=41eM=O9$kL5>7Ew-oqiyAj02~5O7N)%GfbXZaDTkqXRiXi2gBd7ABpZ!PQ9$y z*(oD>qcqMx3<3WDk9yPONIB1+tYbD89(}W5fr2x^9)`MIBIXT3J?H|k`^b8O{cGH{ zf7ouy9Wmt4{9e=DDBK{pv=OAIjyEa!Nyl6t>t0c-_$>HWP@78Bbho#;g^Eg&edRrW zF5uF!q-0i(A&!+YS}en34tpO;Y+ho1?Yp0qjbF2cfZTD-Nq4z{spzq3tZwbBVJLsr ztEphVhXn1%;l)BFxVVf*HN%tx0zKGJJ7Gs3rFDh@B9&}&-1MxyL&Ij;Uoz1%8y-|2 zyZ->zq|nT}OElmr00&`K@?hWsc8{-mw=8Ib->|Ba;F1Zb0;G~8d1zpbNI3^?Nc>J}mCTKGmAP{3kGkh0 z^667fSjf?UNbAKw@sM)DfImW@f*V!Y0suagE-W%1tLwELFD^HSlCj=nidy~*tvfub~Ow{f?`_yOWB?Dj|%bK@oX=z~(+3am& zg+IFz1s|nn?AvC_sz~!c41Uh`+t%~N*W0`OlGx+^`fu>BMbY#f8^iWu!$i|!wTOQV zNsRqZQ~1@oD`b>*GnCwdj8R2029yV<>s%kipV`mhm&BOlp8G}?H_ynw)A1Yb^=137 z?~$K+>^wu_Zx47&OMPp^`qj0CqczGJ2nGro0p4{{ZdTr0D_lkA*r&y`1HL zwY3!~3UopAv+#%@yqsD@lV1{9$yqgu2^cCYD%icJi~B+{{Rz4#DX|H zt7qE0Pf@*s)R3;bfgdUK{{Zz?m&9L*elqxvt3I>iFA>~o6K>2)GklS8kC6w;pMcM~ zu2NID?tflSb5!iQf^C;tTYKaSG^)oOs|*a|(yCrq+sIDjAB9!8l*jiw`_)#}E+QpM z1{vr@MbO05G}#q*TQdC}us<*jWL?K9pP7I9)vVgQa+0o_anqdUnoKe;7&)h82R|b7 z$fOFRp#5uNZ8q9Nkbn|-#WAe@%sGMdUSvEw6_@y|{ADQde zQkAudcESsv@36<|PMX%{M>0&z%zBn=llapb0=&5AwE=cTB-2V28Oc>YC?|pRrj-Qb z)U6NqO)5mpaHFLmUi*+b6g8dVA1~|-CLpJEW+8s054;Cmy$JwT!MAxch3Qo_T{a2r z@pC!GK{3RjvysSBaBwr$oNs+Z&&|Kv!%epFSHyVqSGQ>VH{kmjq{70<=S@3@azJ0c z<#vn%g+_1U#e7+=TK$=xV;;t4KOpU2q<^*l0D$~C4x<&cx>ScwiDlGvYq^jCcEVi! zmJ9)zW|6>l84<>+I2<2};CJ_~ z_x5|y+f&vqCQf{vxnErW0Q#$mySDS>XU;L40xQ;kWKA`1XVztC$uYgS;B*Jf&+--1 zmr}keE6kj1zu9EZdhn*2VYb6Aa@?NP(Ll{{ZXP8F}N)crjQn*$z%|+PY0oMDfO| zyY%0M{w*<(36k?h7RirhmPPjM-m))#5`0dXy!%gwj7xGw&bg<=N8#s__*acmv|HTk zqe5S8ekkYl4;Ofp=6Q8{hGKZkhmXRgu<@6OrYdKcg+Aw+(VO8v#W`^u$Axs580Tuw z;@cdYdIfV)NAUju;ysMJFMK(sA_o5eSs#lm2_w`8m2>&jM!JjEUzyPG^lh^H*ZGqt zi8Uv1ti%E8Pc_o$+UDCpB#>trIW^Bo;Qs&|`CIHf394U}19;OO*6SJef_EfmzAHZS z#7W^>k*4_G$5PQIb<9v|x@^%i0oNZX&*8;(Q^nFtS*7ct%RD2K_apaf`5npeBs*BF zs(m@>S(=}TT|n6(IP352TxHk94+Q*@i^HEhL@$ZIN371(JUV&kApZs>Z zUM`GP+}GZTjtaAX3;T|;ZF*VTYra>gAO5PZERx-v1{m}rxm^>*8rO|=`1~>8eHCQ5 zmn2+W$`Uw{MqWufA}9owCxAM3uJ=IjZ-daF*E~n5c#d79O192){XdoER44D}T#`32 ziz5dF8sU~UjY(P>of5)(1$n!EXDz8FkEGm@t7;bZ%zC8LD1ZCsujyJk7lw5&5k>Zo z4|pqI)Z@<*+33@l@t(WgRX;K-&@?;UJHsJY!TuW3G>1`vKAon(+O&MiR!*hKaZM9PW|utHui;xPJu25}pI!_>#&3 zxz8nHdDvj%BW`-u#ixOMV3UV~T=12QAwec-ukWNM=#W4^TGkq>Z3&T&T8?c>+9&0) zo}AXpFRZoau$C?o`zH2};mv(f5cuOkC2(73g)UqMz|INO)Z^a(*Jt712zct?ps?}Z zhWy1pD#_scfKTVEir_SV5F~BGdJJb7uE$C7TUjDa6s?iYdSm>4l-3%gHmJ=Vbk>ny zaC}78ziQ8iw*LTa@aKhm3F0eb3p_UIVW`_($`BJEjSbtyAsEipl)29fo-53JE&l)o z6!8;EEqq1rS4O&AmCl{4Tv@O=#xW|)20ahyUftrajK2-^FNgAL-aEL|w^+_4)8o^v z)6IL5jEE7~FkV|NoN%YDeChFr;LeS!e$jf)rD1&5nr^A1!{RX%3%ScqLP!Q!fEwe> za(N590Jz0)V(~eJ4Iw+Pk+le6>ilp?{LcI1_k}dy9r%aCpAfWrQ)vf^JT+@HX+6&J zlO&Ffxs+glrX{X6e2TeJjN<+iEDbW-GL`)Bz#Z-f+S>IRFM-;F0XYy%*t@ zpQLuB;HtstpejDESynkn2 z>2k-dICvKNC5XS945s1%AYZ)lMANBeA%Aj&3;<8hVsSO9>od`#g{5@S?qBdv-wHL> zrFEy?TckJoHSiV-DkC_wkSM#iSKXIT{{T9vP*q(SPs~93PAv)uU}m3c<1cL;9E^1J3kX?7SC%X%EY>rt;A&vH&LjC!H*v&+zLn_lY&97e4f(c87Ich_tpNXcS&1N=JH zaZ2UNNi9rB?OQmFF`r7AH2F{bvnIRW4SWsp&xp#$qWE^=;Nx*C8)F|_SEu-2_ABwd z=nt$LJ2g1}09`33A4ShUl>q-h0Karu7)nX(eESZGGYkaD^cAUN;QOgclLkZZxgccz zb@jJ}e`Bu!X-JZIhWdNyR|G0y6dYr|N&O9X`VYdthn^ZL`bUIpqjkn5ctgHNe6~nG zN;D?y`2PUH-vB&k;$jAm;mfHLb_{|alpn7_`PZX(SN0?E71J!fBh+ne6L2h>x3)Xr zFB!+F>MQAxp+*43EgK5#^6w1($zKgLPn%VHokjD`_7Sh-y#BS_=w1TwXNDD1LGaz3 zw!@WlfNvl0BhRmT)~N2T?JQtxtJ|pIiGK8wxK$rgXuASH0O%;L8^ph~f5FcTZ;pQ$ z!+9zxK2Dg8a9EDpkQE2&!o26jpSJ=bk`Dy<6p@f4y4CK2cIWp|?$1B%iZ=t_>&$;? z9}4&{S@5);A=EXi8x2aq3AdVgLiyllFt>A_ap--CuLALZ?LF~t#o?{4{8(&YZOYdA zL|#I$BN#1~fBbs9`sU#-?#X57r~BEw@fdfFHyjQNNd zbRn0q?O3`Vu^yooBpW19H!rWa_N}WU869~&L7__MX&CyxirQnFi*ig1cpcN&`+6Vp zY6G4{byGx>!qKrDj2w)Lz|^$$)1*5{(M46-csZs^8y*0_^(KiXL>VMi zcGMRqC-5evtpIG$p<-B^k4mREmIhb~o@;{n0N_{yRty&^johy3R17 ziYNf0u)JgOC&69=w`sgfuEPt3%G;^kD|%r^BkFKD>s}r4EB40MZ#>%%0O{$cKnYQO zb%&Y9s;?@aj_<7id(Vpeap6A$*o{ZUTJ^n@O^}{*{L&vqQOh4-4R~k7@7r;s-=_RB z(Uk@W{?pXcC%DQ)59C<=R=gL)zAx4ML#RutYWl_1)y%w0J;b}6`d|`yz{gIN%<5P2 zGm*TEj=r@?#SKNXXUG2l6Z~7_ZC$lb5qO5?`s0w2Paz^T&UUJgl?HjjfIW?Ix3{I8 zpMF`7%zbHY?#dsRucc?pKbf425_?i|DMfV>S$AZLuJU)!;Zlqi!iwd7!dHnrMJ`F!7;{20G#?$x?)Pj)r#79@>NYkK9LN7jNFdP zPm1<%0rK*`nWllJRedqxC7L{sUbPI2mgfr}C)&2+x`s|BU8MBL%{=Lrw;f^!xaOHQ zw&yh?&f_`2J%v=gh29nsJ{uey;<}0aJV`AN%aQj;;;3HeS5U^@YynUAkmOQs!)p5< zEPmSBN42`!40X%|O@OpGX-5k{-?tXN= zfs*P=Xw(82j!$gY(BJS+zXNJsAlH0Jqgm zJU3%)@bdov#m3d7xwzM%vbM(pH4w=o{dX3Rw;O%y-v0n#zlfe5_%rc=HQy81+)rqh z&-USFGR82D3xTwUWmy~rI3F?O4A-HClA|>xxzAC`QRRCacf>#2XHU|urqVnE@Yu}J zkR#MJ`?3{>axLH>;EspR_ad%*B43RE035WY@pq4YBj0G+HNke%^uG*wHWJ)MkG0*V zRW7jy8$c!9@Olgu@=KqFtKyk;y<*a9nxU_z6$aC5T%onf%pls#U~!1#|P~o^k6^#$$04 zwB*t`r3^hNHwdf!wmUfv!1MFxGvzIVh6QNf352} zq(&RfTH)i*F`1ih<(yQIW^@wBIU^^Eg6P}C#NZ5cuWptKlUHYvQxj3WWKok(wr3JN zVTkBR=}frW0QnClqQ2K7h;C|a`pxTy8aixY%xyU&{vk*8t}4~=5tX@>&YE~EWkq!cm!6-Q)!o3V{{SlQ zUD*JPlMR7E%6}m?47YK~I zn6fz~vH&Z94o!O=xA52De7+uz;=|#eg<(>gF&~HR_W%c7`mSwcL63uvk;Z=cMhmPdusN`1IOs6lE z6xV6q!h6o##F<)A|ss~-W7jYdh8;lCA zr|J_!@@>lJpK6oh4~w+xFA?clj<0A$Fr;Gj!w>9qV&P@aB^7 zUFdp#n)dSO_tMziK`fh@WKs!WOBQ5p*;Y8n&jS^Mqel%@#+tFMYLcr(N_YOhq+)o7 z;tjWj?c-~rUP(dn<6IUv?tQ)Lt-r?zA+-B##*I3~oNkUl-1>8h=rxapx_60!{kjzr zMll-@M-`8G@HP~;Ybf;xfm^Xn)=Emy?Z z1c8Wc53f#GWA*-(%TE=X%2seXXNSs?_hw0^d|mLPNw(KgX#xKLrVc-t72Eh%#Wx!H zA7@rE1At9#cn9`t_-Wz0K{VDMZ<&+_dz12mk3o-qe@gDOKZbT!7l3KDQ6g{S%TdSa zUZpBnx{>$Qk2JQ=w4$Tq!9PIz3ssy4^aa3ImKmH z1361pZ%-5Mo`K>20EfO9(*6_O>w12iA-vEY9a75mRBw#Mxujv~h_`Xy74@!-@RvdO zhjXTUN$_=ziHlIRhCN106agiLq74&(hXA0N*Pf}k9+mT7fl+RJIdP!Q5XEq^0@p>|=k`vEJo4Pjyo8Oi%2hMC4F3QUlk3T^X7I1utUi+$;kW$Pw8Jx>Gn1nWun^Yc2L{K2l}`p3J2gSVy783^6o9YPj}j@Xpa=| z-|S)GYdJ;7i1pbgJF?MQ#1wzuMtgvpJ02C-0ru3j5`J3_00$tf4F$>humjWCJ7dtc38@uEdV(P`#aF`-=B$pmgI2w>>-N zw7fOor@NNqcss%3X>H&#-F<@D6sioIyKo0X)bolgin}l!(&^cB`0gi0&z9odfMNde z0e@N|(Y0Bh1_+=`ed%W0+5Z4_K_B?_Q1Lg#JD(5hcKQ zWD1DHklluQ*P;0H;pdJ%8EaPBZ;Eu=H-h#zdu!_p(;^+1+!-MPHy)rgMUDrl3td)|@dLoR=+2Mh4Kn25l967aVUD?6Ope<%#Nj$@S}8 z#-*wt2PY>y4AFn8O2oC!pK}gR8>8Mo@2K|xJtS1&{Fn;~2 z2^2GA)};0ix6E)6ah=X_pUh- zbs&u6?vP6!anrZsij}S=!BiU*j1Z$4{{R||EgSDD=BR-K#DEBG@_V!M-_nMO?pPTB zU=BdX0M*M&0^sC+U8_pNL3@A-#uan-*w6+#SeX>$esyLoB0@e@IP7cG{vLkJ{{Rwv zd?TAc@SWVS$N?8p#pOZ)IL`JU9C{9G-Toba!9R5SHjeY+ABoO3jrKZMQ|b(?2k5_# zdIWrlW#LP^&82PlB!zENkJh~#z+bY5#qS#!t~4(QT`Vp~`eo{fVcY5%kInd3+x`al zCGfl9;YmC#;OkiK69?_Hr<*=UeeIGD(-qYm!H0RNL zTjBdnM%BU07jOpvk&KM}(}H;zBA+n1QTcJGX=7_!&l0fcRhK`QuL=FDJ_O(VU+{I$ zg5i&Rca38l_W_hX4xpD4l?({amjF9JIozWa`X&2Q{?1_0V%tU3giS4< zhxKX1;(Qg#CeUVH3CG^&74p8dcWY&1ERPvj=2EvCA8827hB@Hyx%BB(8Ec?8CVn_* zzX`4z;Z>%ItLe83aNaMpTd%XmQ|ya9%u3P`BC4(+bWpfsxcYUM_D;}kyiM``9Y0)M zwv*cG&wpy5N4-oE0T?mkVDFXmz^}MGd;2r^dtCTO;%ko>YQNcc8n=n#)bB3kMTFQx z1&T5(j$H1Ee|MZ<@ZOd27r-AGX;(kA?w@C&*)5%+vD9I7J&& zyuO#Unz`lT-y+cT3(tif4}#9?!tm*0&d&DAZ9e7Tm5U^D#?dnda!x>EMthExkMJwN z9v1PB!80$3ygvlqDDcPjeVw(-h7wyOQ{P%$paAW`@-6enR$p55U1HtM!?xd;u_vCr z>x=Mdm%?8f{72#0-6FQu_UiVVgB|hR1Y3YHzzchBod+IyC#kQijs_63iRAre@M)BF z%`oXZqT7JHa4U)N72d3<&t(ZGo`W^)ekakI@N*v-=ZfX0@LGAelzgY1_|104okbfa zd373Y==s0KQ+!yxmDbYk<`}^s3m{RLeOI5>x#8fy9%?#s>32RIxp6b(O)x6i_1sT2 z^)=6g?JeRWMh(VyFs^%4)8e$`0gl)e$yY9^UHj5HDP{`~6up|z@NW%%%o_fp{{U+7 z7QJg{8FBlF_dM9=Ip8QgJD#=a{tWmv@aw|k%uO|J=L#3?H`sRR$paW%^V6PdUVD{? zEC|W$Di7@@kCVcEyAp700U_0#y_QSo+Z#F z&~*|jJh7Lqu#?f`%a(xmWnlCB~z8%xP!D4xZ@<_7_JN9 z=9wOyrmVB6-6E+u`hWVXzVOu2eW==7!i;B$kZ+iv&NI|0&rXLQQC_AO3kcJ)J8vnz zX+2M$KWHC>dM>Eac!XQALnd#aQU+K4dM_E=Iv;PL&3}aYmV*_POXACRpHcAehRaoZ zbFk_*WeV9{a;Kr&1D;4K0XZWc$>NxI8pQ%`!0%D#k zr;IUNk-j!?+jGTe!SFxh4dLCUd_TRs833CJp|}~wdc^EHRxzzc$C*-$qdQ4h#kapi zeZw4e&1u{Cg`yy?D@HHb$K#{K_Y?dt)NP|qT1)$jYeXOLD~VBmTBrX23f}WixHg_B z@wb7rLZkLCR(r3| z_gynjo5c~`YI=Uvwy?Ho^$WS!M-{Y62`?+L+JFJv{WDyT!pjJJNSfco*kE*v#G0!A z0A(2^VqZ z8gx%MQr=1iP&<|8x!?FF_wASQAN~pH`$JfG#?IX)(KUUMYc{gT#tVyMHZw&&dGbNx~7&1hD)op79^; z-yBNN_+R1iIosvUsNaG0%0>_2^K)Mxe$IM;@z=ml26+C;cv-cd3hCE#M+)H*-w7&cVKBz&$favZ@?z z&TBPMl<6Y->lY5Y6}SYFDnGYeNH+O|gWEMz?L6Qp$9&P|4ZNHRu5jgOwdOfp?AYzr zk~V<}FDWGV1N>^5%%pN@1jGB)cOzo?yNO8%y}FZ4{?L(5Qv;5osSBYa`7lQEN!bx{ zYIrO)n~}LJ8Zn%H_=F?efuSGlh>odAI}dG+X#a?&S&8 zb+wN;%3FeS-1G94KZ&c>J`3>tHv;xscAjJyS*CDV0nY)j2psy*49{J9#gw!+UT@4- zFrjb=>{&qruX9q{U3ilDe9bGvtmsOCCDi2x4tX09!R^(TuUfq~ihdqwlYgY@x@u2v z{nuG0UvrGN;%g&O{h@pdYK8RJH4EhmOUn(g2%G{ly@L*;_VF%n1|x@~C4=c*C!PfZWwuZYmLvEmV@M#vbzZ$w)gk%W@lEO}fa2v_U( zkv7KNPgU!Vy=pP+CH>voB9R^EFs}{LsTX(*NK#|G7Kv9@v^c?jgitnJlfw?RI z_pWP7O(#c%t+b09Ybc!M8qf!dNt6waT|jPj@Qt*-=pOxAuL z-CW#glG{37#IfF6UBYCFRT;)WAo01o_ci9%9x}AI02{deig#o1tbY*vQ?SvryNymk zHPTx~Si@ux%HRzAp_y`V^ry;SIz7@4+80sKrk3l&eh=`bm2)8`ORF6d%aykrw>$aC z>yT@S@n6JkW5pViYaS-oWV^Uwv`aIAwST&*Fsd`o6akv~vsnGDHT%$i;S>01kb{pd z<5|>M`)4L7P=Dyo)#kqu{{U!@+Dds=T^GgHIy^FN4IY`{_z5SEyCuMth5_tzNx&6E zeSLGUn}Ew_6HT;p@{_EI%6M=4Q5KIk$BkDzu(%>;uL*ttlW^>M99s4`t04 z11*6WC$ZwHUum{Fi!7JcQOZ%bBRYc0eL?CE(zWEV-PLNm)=n~^aw**b&R%$a9jENq z(?kH_9QljiuJ4%t0N-7!E`1+RK+a-{RSl2a%Z5C4+Q1IK?N?hZp5uZD^#-fSr>`U~ zXyyZtmeHefvjUhn%Zvl~o((hX(r1XzJuzKr)6tL2xy4tL!}@4;Xl)i2W0q(?cewlQ z#_ofzdQr@T&UD$sA2$~SWB4N(C-Lb`X~F<4ZIV5_?{A&+&pACh_5!x9G*#V*p-nTpj@Zt{{c%Iur*8Fp#_-@)@%`T;`T={Xv7Y744Qsif7 zEHjR^aczoLIT*C9=Wt(_)bt;XcApJC27EyHnnCb)g)Xn-$PIB40SXh242(i|>`i@v z@Q?N{_z~c%du?)SRq;*U1IMUpY_h;x`_aU|y916hxQ|-)C?JN`1h%$?V~#Wl9B7~_ zs2BhN&;i=DS|b*Gwea))3GJvl$9eGw#Fq9zb+gk~&Tuk#-oOPo$3VipufU(PSHZuB zeZUpoQA|Naa^5)j+wh~|z$@b~9avgQ8*kZ!zGT_X zG3BOPzomHBj{gAQp*jtkHNV4;0o~rnRBgJ}U+mF?>*cQJVUJy>ns#7)9;XL5u7AfL z7JeIiH-)ZzZR2e}PAiPVHNY~QjEqJy$B#i@6!`D=SfoR*UqGBXxq$>fqrC!Vy_MRV)Vh@bFL9|dUsWv|1}24Cuu z;ey_3EG=Lp90H)`M+cwbTJUd)AGS}&-yexBWbvTVEaWT=o`n&&!k#ha?lK-d@m^sp zj_!AHnvA0#y1z;^LnFAmjjkT$!Fgpll2;|2&#N)y{xzSf!5*UnTiiw+TdJOi)E`hm zBk`-RZ-8CqRp;)WrmN2^F(Y|V?l?Fnr|Cqyxn^AD6#7`HZm*2n??06b&8eo_9-J}fRYOJZ(=Zk@suB&(2AX(Bas>2|93a>5O z*{G3NhF(GRuh8j7o|>`p)ij$U(fmW;?}%C|YhMq%Q*W*+$GYMRbBnuje}-sD-y3Hm zk%B?NtWADf%S78fgpsyzRz)gD=ULu2(tHi$8;LHwVc?w~RGH8tUES&EZZ?jXm;orq zY%s-g(rI27(ybcLLxWh;VqPPT%f>piYJ<=yy4pUNtN#FKr?gY~lBm*_u1$Q4n%uh8 z+4Aiy=8%!X!y7U0*aKL%UKR1>+LwpHdgRAA20b3(hvpL%OHfnEi^X0k!0N5zO-O_P z0Fmn#Skk;Ztio+|Z9e|(7-5CaiZwX_{2Jtn#(0cH{ss5{0KgNYhyHi>f5A3xejNDn zJ7&DpJU(op7%eWXe{Eo(V>$l-N|rqS6`B747XHHK8($IpZScLj%B8-^qCEQ5;On(S zc9Ho-iNMF6F`VbMWJBQZhx&0cS^PiIhI;w-332+&7}cSx$!BOZ+Z9+X*X~=up(9c3 zqX1T1__=gT@fWhgMQbN7mA}mBbng}D_E8AD3-Gs8)b6(J8n=(;O*YCI04=;}@HCUi zy#NmEq@Hn4@aKladX)Nxr>jY-YI=p&+BHpHc)~r*xC)>sCuC@#Dj+9l&#htT*UdcJ zNg#LTy3Y>D6gQ~5`mhz%hN9&(=I(77!rZY|JF6JQyeYZ1jEr+#Plp~4?R$7#Grmxx z=iABPe}}I;XQgw{+eXl)`BdNlyzoV6*v+Tg>K1ZpDDuM<+)q4lHXV^&S%RF55&_2} zp5nfO5mAYyv@Ce9Ow58s2LNX|9=RD-f}C{=T=_>{)U>OaLhD*Ro$QefiZAS=n8pTp8`R^e z=~=Pc_!jgPy6`@Z2|Xdw;!phrMk`C>&xNo2Bd;fjZQzltbr)qbd3advM=qJb`@n`7 z0Gzj6S1Y03MKh^+2PfvwV_!921wvEzqOa&`zOfklvvxZT8$tMf4(NOhqBaIUd!)lB zfA-YY{+nr~=~8)`9*1FI$DP(TF~WcG#TA3$`!<>PMx>tnbgt7&@a_D&U&zQkFnUx& z1%`*i6m!b8X=vpB@}<_JtK9teH!{k9>7<1J06M70Qpngd&*5E<{2^M5Xk5ZNbjEo6 zsn-4(WJX!yRq9lpgpS;PRes6GWH>@oGW;~th73tpR^X1+>pu=PJB`h6E^t6#Nj-Q6 z>Dc4k*9oR*@WnP{9mX-*y6*_HL8_vw0JuEnwv42frMf-OZt(o`J(rlPk`r;`j+LGJ zPy9Sz4C+1{@rBitx4Is!I#_B-E?FKTt0T!6+Q<(0pJm`2N`IpK4(0sc(jja zE~oDv_xl~0JT>rRNAQlIg5T`+aZPOo09eF|1c<(i=PaxSPs<|nUaP1GE|X&gBfWX2 z!A&y%08{vB;qMSGmScPW01wzoRK~F=4Q_{lz`-Gp9DLQj;E(=kh~oM#?y{PXG(mmnFvt6r=@D%SzDP1n)-P@Zkx7_zwGn+ znq+a&jb6dSRe_3KcqiZku^T%eZPCXr7^jR{}Oa4Nvj^+_WkqmDC?#Ip{b z+jo9P6>?2X1D(Ku>s9B~6K)=0Gw5mEA{q$%JOC{{>#!^^BS5{!89TGbx8+T{9u@HP zVqI2CcoeTMe>ck5^$d3YmCN|kO8)?ak~J27D8JLBjEqZZG1%PnWXKKpn&sf|Cx$fX z{?UD@%`~JFBSMJ^$&!BZ;fd|ef1PU=b15qw{rAQ%0ch%M;l6h}cSi-Cp$g+T$R}!k zwTpN0@ZPz!@TY{Xu5K4Q;hb%C9AJf9haG>6ezk{d7lO2VVP~g!X4Rus;U!(`^$NhK z_23GzFN~)U3u{;vBUK8KuL_`a01h$vR+b{=*}PHl!&aTmtTy^&EC-P(P#t}q8Hpo< zoTK*XQBB}2dtOiYto(K6{NR{WHN-A)%LS8fmUEtj;;5ey>(>MrrBws2BOli^#JSh5 z$n$k;lmPwMrYZjbppofKCL^NLz8Lrt(F9jE*H^Kp`lPzJ;RZ?hN`TAPvv#hJPKU!9 zRI77g;matePq}mURcV0#0IrRf{cD);v6|KkpzQ2itBuZ1P6#KT!|RHtsrbHYOQ*AV z9OI{9?bLHtEe}RMC6U;fZW+k#&6tPuKEK{&C z;CfUB#xucD`BX@_m_tuMc{L(f$DFEkt#hYFI=`wK`Bh*k$na#_mf==EI zK-yw~ot4qGl7{7b@+uju6p}!oM>jT>z>=fzs2;$CB*)*du9fUYP6bz%$Y%vIJ!k`) zdj$t`4r#4uq!G5a%tDwo?eJe!5+7fs_$A1()8>T!H;|cAf3|!mV+_k)H-lifX zh1mL)TJLl}+mqu@hgcsFwY}sh+hjVPl%$?I`IfE~N4o>`uQ_P5+MDHtIL;5XYZtFCt-x=N5hvS8)xF8;e;TbV)P(%4ocA@MbD~JHWl%bS#v26w2andO$!m8P3udW<)zd$z z;QkbI66}i3CXsMQ9m(RO5y2VD%k>B{Xt+z(eU2EM_3KbHGLmw<_Y_^Q9W3w$+Z;+q ztN#G?swrhJk}y4h0;CpCw&vJpnnPbo+~plw9N5oK@sZxsmWs{1wx|cN)BY2+||A{{Tj{H*;K0?7Nz2 zcmn_oZI0GMpK_6KF_GZ8Mv8Q-i=HAX(JdYB__l7AvqxN=ZQlOA?^2)~;B$8|1zhaO0Cr66BUGRam z9Z$oe+SgoyNv;jrd22VF5=K)4ZtxZ)1-QuvC!E){fNC?o$JT2loGMAcN+}2mN@&X)56PTD}bDXYv^{*oF#hYpR zg~hJY6)vS%$6|`*LF#(}-oF0;30f`+$Awlen(X2=c6U|~-t zm~h;Wn>gmPzQ|(vT{2I6bguikBO4=?yVDqhmBxEj2{f=6j33IoNp!<<*%5u=&P6sK z3&l3(kPMF8b6L7A>`${t1#@C!`50sx&%Cq|Az+-2dGxPGzVPjwP_r-tBZKK&w}`a# zjxw>RBpOQ(P>De!jyk{CryE8AI4$X3hv1zi=H|xRQI;>3?N(LEAcQ}3^zJ@yp%uX{ zfOTzR9XjPP9mT@NO0Zlj5DCw)HSOB2rKj6M*9i=0p+JpPVNn3!40Z#7^scHj{hq9- zL2q)*+P#&8L43Tj_FmPWdE(&{iF}L<_chB&;!C@QcZoqz*(5G-KBlN^UM2HjzzV*j zHP!W~M@Dq>D4o3D5_H>(PxOUo-5cfkbCKNj{{T6v@cdM_ichjzTw*q0c9!9fxb6P{ z)~_SgyjA4~#Dh5R&~>hFQTU5*qT9Xpp>nZ;_>TbQM)Ux6{+X;NkEapGo^H`sK8d`w z@TZS-YrQu2PLAfr_bYQ_HZVE)SxEb=4=Tfue=7OE#$OLFJ{$PfUkts;p52jUvbla8 z;bK7CJ1{EBeRk)e718)3;*{Eq0$XX=sbSO+gV@&hi?q9+AK1gLDm0I1Ol8keoH0^; zxId4*V=9!ZE7*S4aZW7_@I|yH-5lVbymEWjp=tN__Hn3&5J(?;*WSGI!-)0*G+;qf zhF@Cht#u5>19TlKsY02~r5l}%zOrs&{o?_Vk4j%M8K27qbL?xBI-3+Fm?k@eR&2E; zS(a9pIO=nZ){~7p8!D3Mbi+@0r%52#z~H#fJMup+e;Uxz;uiO+N`Z$2V~+KmqTi+K zU>x8Mb6ZhB8equ7IKaE?x<1#YwfDS-EnXjL|5JfaT8@85s$o=3Pt}+G> z^{=M<1vZkN3$(q{bh~(`yR(W@CA26V*r+Ub0h5vl>t7X~b0gl%oLe?L8Sx*+>)`Dl zMew(QBe#OjOt-dzYk?%`h~o)@Kt*1Fm)ZLJr6`(%6Y)* zxc97mZ^l+y6{_6$n^v{31Rb*Kcc}n4$3r0*0CH=L)qiPUhE`3RUlcB&dHHm!DXvwB z>?Bq4{{Zp)SH(*0p7qi_TJKli^X^=pywy4NW7o_8cR8;Q)jw(pZd)E5@CKtl9KNTh zMQeubg^6bjKBa4!@h`_;jQ2K+Hj=t7m|EsI!$+pP?gO|`3riy@!6T5XPBi4nb4dC! z=URzZEifb4)_vBkB>7u$`I_T&+kX+wD$jYZ-p!NqE6apG@C5-t^uWz^S|yR+x==~S zQh3d3sU^9Ss8*dXCnU==08efzvC`auxlgThuVEXE`FY1vP5#YR7!dETl&&)W@YNBT5V?m{;!F9(yD%=(bc}Q|=T0JT? z>bcM9R$#DI07jjCDwGK4xdx4B@k;qo%x4(S1Q2_BX1RY7=}Nk>aJUQ!$G%N>`eliZ zaO?&!LHw%|#aeQu-txR>xcq7I*iKhRGihK7Ws~Vs#bgKH1MsaIYcVM}7z3{rDAR~J zTz)l3!b(l0TVa*5~^skEY3UA#4PNGtVD~di1{s{>L8_yj2pgrBi@!4^%4;cIX|>)C&xtS238XqGG-hMn|oFk@%1H5cp53z+$)2ElAH1yb1#G+m22^uPgEQ{1e+lw~Niv z?B#%N+!hH42k&w6_3AkGq@g0yf;y2jSv-nN#&Ws9?OqY3{?)qGfGgvlggTTl#~06c zq2EV#9r8F4N#&3ZPw^5fq|(1??}Jy~Tvy&Mmr0e^A{}o}n%f?udoPwq_G8w#tj^AR zo~>szHrH_6%V`wr6sqk6!zmyH9j)wfgH-j;1AI5vd~X-TTYY=R`bES~m+<9=wH&%c z<7po>ET~r{v&M0OS$Zdnw0(XLw`e-mo%|>MTG-tr$avu82_OEdxSFavk&)K~XOTw4 zH*(e0rJRzhT3dN2s1&c5&A5)OlhB_|m0n9-C&#WvAYsS;wm7@c;bN>vss*xx9L@+wN)fz2DRi0-3K*Zc()Cq zd7uo5Ek`AntyPu)GTxo5T1dcbGSxf9RZ>cir2uEVYxkRdt zta&{2sN|VYb*)n~cNplsa4H#EB^hEm_cX0_7*aO_k9w;;%q~v=^UYB=W2A=0bGvGm zJxD*{Rp!!SR^M*m6W1&KXpUH+a#Ul}H0HYmZ3JNYQ?QKb^sA#O4nrNsm5{c6xdWcH zR$V@IY?U~zkF*G%D!+|1${c;#ECW0-;YaZfyJw@%;telKj_TnfeM48d^5BFMg3LyL zE;H+2Tl^vYg}xeTHkSJLio90dC1(N9Sz;ST;|CiVnZ|R@;h#$RB^m`Jh{ELZ0IlB% zd`$7DfCv0hUMx3Ddo^PJX{kVgz+7?D*}VO2%|9)i9fU)yu`kJ2q9jt>^tUKZhA^GA)D zdh#|D2dF&frEuEM?JxU7c!u)kFA@A=)#10FbhDdz651G|9KXtlFrh&>@6B&UGUrBf zloWM5H}=Nx^gb8;seUEdSZUFNFN5Ku;*W2Y%lwy-SJW7O* z3%rP`f-pI#kVhfejGs|c-|pM0CQX2SmUWFIcQThO=Du(lf(~{rPnMMBn;paReWLb8dL_||X4e+((LYpAWxN8Td5n{vCJl&iwEl)8BtI)<%pB#hCpmvP7{LCtWU zB8K+!Q~PG2y@)tPY~dFty^70h-uC~kJq<1c4yMz@D%HycT zbJXRT)k?iAH&f00FXJifVNE{IOdUWZk52qo)Se1UJxAg8oUz6ggaxD@-gaz~d-TU% zm;<$WWIqlxxi8nr)8dUo4a9p_s(5Xd!%G(1@G-y#j%%w8Bw=2*9;UH5U1rSKYE1bc z79?V(v%1{43_lvy*X$v^UomiT>)yHYlH1Hv7{_Ytl(}|1**6!lp)JnQ^S(3bOC7*r z`?Jv2ZN$a7Cy;v6?JmNw$@$Wt>I`8RVAeYrnCJ&I;*{4HIP|L@1TAEbMDtYOMz69_Ap~SO z7~_s`I`=ixT4-pcV~!BG!1@aK+~T&jvGf=kJi4QY(*7Cgc2a$!JvI?3!nA<^BypU# zQfr{I@U5&TKWFWOo|V;G=_(udfN|+oVbf4I5&o6((n+4R_<9u?NU@HiicM3) z&`YK|+(I_S$u8skB^_LTt6gZ*kMPIMM}MWfx^2upSj*c;tHA11fkauKHQDGIPLFPE zE!?h4K^t&AP*%N$pS9G57|$Y)3PTm=hHNjwjLT?;k=P7>O4g3t2FO~`3E2(%Dvov> zQ$?DQltMu4D_LzzF9Q_uXsR+t;af&4a~Vk^B`nyGHub6E(}}@7D@AS7oC=ydRdM%m zR%Yak*tGR6k~pd2v{mRa&uY<%!3J~4$9kD8;|FjQ9P^V!J6lXR1vnrCk=>Y{%A}3DK6)=DlmVhafp8zIq-zSG(!N9q>29`&ENO(c<$IW6zNRZ^P2Mp&E*C0Cb|c+?zI0NGPI;l7N7Eie!+a zh*8uqJwptNeH7DZ56(Nk4Oy`#$X(rr!HUbg@I9QvFJ_O&BWOAN!OeHAW*BYY4`EQ9 zHU%W24trv_?_;XxoF~J*GSNcWX^>lm;0Rz;+s{0%FnK?nb-otWb*%;hv)|s{?qYF! zs5|ZYXE^El)|~ouA9a*<2CFrZP!XPf%){VYD;EOl0o&&SDGNhAXRcEPdVK|;;62WyccUA-Hf9GKQZ2%-XfHI z(K-{JLn;21=M&kZNF@n|2ZsZivEieB`j?c~Gc;(Wh-V~cpzHOg?1S1SdIhJ5rns1- zmca-gcrha%ko2pobu8a;K_|UqX^@#P+-KIdtfF9YdLH$gNfeu7n%KC>IX&x@__cFB zpW&5;+U4SVi^Pn{6P0kGSz2 zZ60NJ;tv);yDj`jbjqjh&nb`}#j<}|qyGR4C&gBSZR4ci9-v_UxzFiZ8il3_AXXjr zp0X0dzhWz<5Q{mbQb@P|01L0kY+kI89P-8>N9cc^D`P_O>DH6XvrC^Me*+juKU2@Gh6Q~(A~)0)-Njf|sOZP@HI<8^qU!Vy~n96NzMF)>vWmcBifhUq%cWiaz+OEUn$QuAiq~oa^n##G+NzMjyR43AvP7324 zF;~kMxr?h&Y;~#P*koeAXkWx)q+b!LzR@5#?U7tF+RqM55)secsDHFCt-fA3CyltO zRHD(F#Z7LHLjK)Oym9JiI?|kz_+q#N;#uPPkIDyJ)1vWuatz}tc^iiuW~ov{JXzhH zVHjbvS^g%mvhjC@wOg*;0(R(P2%`i+d5z*yrJed&Dwp2gh1H#m=8B zcF}$1>4Iyqy@JC`gxpuCj+gR9RD7&#BIIm{X{2-HQsc@_Vy6(ddewD#b<9`fTM0Hg}Q;)if$v@;) zPy95+<(2S?1VIqM3d}j<9N>Px&YWmLZtQJmRs1cUmv`ayw2;4+06lYA_t(pB^2XdL z#buw1`d^7{P1H9kjn(4M+&yvEpX*%KspC?z7W2VUd)9K~ru1N=-Z zG3Fi#>sWps)`jR-^FhuI0j+DxfXRSzJ!y0EA|JcCR^wrA1u`UH*`;C$=A4R22D6*8 z8h1KR3D1WC@s5@1eh8c_u(L>UxC4gklfeG~K9%Jj8$q{rdC2cxq43`~I<2joYq+$F zk@V-k(zxqYN(ZBak25~L_#dV`eh-e}h-Q0u_b+s2P{eVO#(itJw$h56upfnGd^591 zd?#sY5Cn`5Ek^)+pmYEa(z>XiCzh{>%){5G$&AoHpfoPxps-%f(+Z~_6@%HZn zX|C!&cWO(a zEEZ_dE0K(Wj%XH$r;bVB)!SHiTO$$MjP<819OsJFGm@n2%5htTI0F?jTm0M#upvRo z6)bk_#Bq;vRAlDaTtuU&29zR>)oEPKj>-#Y-n%pTFBWn&16)$sYO<3ae*cE{U5Ir$g1(E}k$?s0Fh?|#O z4h}f0tpNvxrxQA>Q#jjg7*c9Wdqf8ul6`8)fajck6?;U`q`#a6LxOtss&ToRY&<{V zdyQi4ZQun#U>U3EKY||zET9q1Bny@0o6@m96nr~`%MnO-Icx^bKhHJv4~KM1Z4$+8 zZQ}r(7bCf>-iJ*uc(-F=Z)I+_wy^|78~`fXF40Je0LT>T=A4|F=t3$eD58pj!ip%M z0*WZ04~AOM1F#eIsM-b$R4#GrT1Evt{{Tvj;R7UBDc55%SOFw=s?ytmkOgVY2;N8; z&%a8mG84f78Ww~!%-JCaJZC=DO70~OmFMeQFA}Idv)-vm410+Hel?_bA+}{n9#oVW zJ#p(-{4-?UbhCxeDxjao{{XE}&kF`81Mscy3E3*y2|T$dd<*gBl`gsAZ;5udHW88})DD+@9lBuP=4l{Q82Z+*oKxKAof?m1MG9)B z@5}payH5oJf0JDulG<3<+-n-np#`0towM9uUfswND`-(mJg&!uPzFgg;GY;j;Gv(g zx53phL*kh{Q>n21&Yz+K5;4fZX=MWnbN7)Pdy4q0_V51yf|mSH{h%~6@O#4+_Ff(E zw2UOxEOd$FXVe=xNT-$XWJJbFfU3-Ta4M%>oEGHK!B?q0td5uV;Qs)Er0bs*z92*3 zkAZrWns%X22+O2ePIA6$ILk^uU{OZ}jJX>yG7R8PBA?)!CKe<2uR=^f4GEN{2Lh9^K-*yECa>%>YJy$vQ%a1UCysozC%na*0Vr=M(vM<7?R@T9r7&jU1~Gzv z#-cwA{C#qwSFv%t^bQU=^cC#(LdH9vw8*iluQ_Juf2B=x;w>I1%&j^V9A!;STomOU zWNRGH4M*UC;UC$aH1O5Yj5}aA%%O<{)VI37jEqaWPLQcN3{dl4&;6<4%~DOVSi<&o&V9y{czDH96Iu$6ugM(YZoS z(m6PTJ`?JXr0Y@XQH0QjwPeymOMb-I9n zoe(oO3=|L*MSN~9s+{hRrKYs8`arR$IaTJCON(1yl6#oY<2ZK$zGd(S{1s>6J&n9E z{AT@|F4d%*Eyew&t$i4g4<(WrM9>ny?OdonqqouD20w2P*f-)$u$RJ~Bev2eS;QqZ zKMyRs0Kiv!iz9OqFU^d}BI5**1`Tm17u2?-wKQ!D>I_#*w4Uha7__!|x&Huw16ojc zC&xE3m50ICs1%Q$;i8AHw2r6ruU_!RwWIj!L|+j2BgEDk_L_QL=(>z|aF44*%oO_^ z8lA27kDWg{+AzOU8B}QGej0cyRPe5!JX)!QHN^gJl@yzdXTDf)dY+l+Ij)FWgk#6! zRw86+S{03fP!34o=RH3oPbvt&tx{{Li<6LBK(7`CaJ3>^Ddz;#mP$Of4cOI);sc7+ zY;#pethUS7Z$C+RfD$r=>n9;~cX6GgmC_4B?RzB&i~zX(nkM z9*3W-9!8@w?7-e}{(m~UElaNMytcm~} z<$3&nI@w0b=4$&LXTy&R#i!Z}rjG;-s68vOi3Vy53uU*3VO0tM;0m~lj!kjap0+&< zJv}bPqKYe+>k25MfC?y}kUE+GD6S0t(4GxGJs%IFu)Y@`+CO4zsa7K2DN0Ck}vY|N%W+%T&0K%ksfoyE6uIrXZON4JIpG}B}>jQQeK z1(*$>a%-i~?2HgaZ?xr52KwXtYY}Zc`Bn^%or0Y9$;Ea$RkIV3-_nUY3Mnm-drye5 z3g|j=D@G_u0YJc}S=*HW6~XRnO4`s9lhU#^TNG!ELm8Sz!l)&Q^c`!(XFh&zq(H4P zGD(h`k0!mB$1b*h71W+X*43j!{?m=1eq>jX-NPFpUAW_ncCG0n8m$i>TA(78&a_#*ei?h z)w5h*J351g0ddczdM1l)g;EG04(79|qArqVrK~Jt+P;;KtDtMC2^{2u_;Fn&j3CBX zjB{iM0f4Ml-1*e~v%2hr=I%g|xkAP+db=123f5 zgDb!YI5O?w4{(I3KBB%%_`myY9~Rq4b^ibb%Xw`ayP|_o)Ph^8hTPxi@yD~Fz$KZw zWY>dyZT+CUGvRAnt#8CS%x`f#=3lZzS(-*C<|UZr+dP)*>x@^&Um5=ZXx|Y0Lb>}j zqdldn@#QSPGxg=M)2=wLI;Ck#W7elaFs` z$!z9L{QTWVryiBypA>&=Z;ZbaomW=zZPG;>F^)KxZ(~B&RJ)qt^_%ONC7qbJnIjU+-`*sgnx}buW@6-$Ny#U@7k4C& zEdT&<#Z-~A-ixrXjN6Y&>pltmN1Ne?#7iF(7H_hWZS@pUlJ?RKvS50F^AB|u$x^4@ zt?>0FO0twiQW2?5#q7_yMzj0Dbmf%5x>2fcRI`i|tNnYALhxd{k;-tGG9@wf6PS z2*IeX=aHmVieZ38Yc;OpUzwkutukBK$=n#`y%g+V>NdA7YC4#XCRSn7v942CoZddf zeDhZ|oBR#y^u}u-O6AET89k~eE162F=xXSCL=Z+~c-Jq~`ukRdvFX<1h>?8&TF$e% z5yiMM$JUv3cH|ieB-4vY5f>?L$LboOjYx%6a(Mp$8sq$9sp`oKO%>TiBw#7QtsO?@ zbp}T{1l9+LXM42}DH-co&k<5D-DhSV5q7zYXQ}FMnB}=p3OO0? zSl4k$r`wm=k=q^W=Z3ECFH|r)Pkf%Wo2gbybJUe6^4%jv57{qvN9r+(=xpyp#tfZ6 zh;m0#MP2^RyI^737mlRXEz0Kv)L!Ch`q+*wk+CH8BC`I`B(d*NjMk#) zQ{=Sc80p_NR`$?ae2d$qM4M)5L!m{rGZ_iN$53kak#y3^B_L%;;<7H6_s8YI2eoNw zYvqmEA3iW^o~*2nnsM?wuMJ#DG|3cA%aOHDsjmqAp}s3W#UC82>GuV+ttJ6yrKl_x zKnXHUg2ZM=B;;e{5rRHi>b@`hMw`Mu7d{-)rrUq3M9Cz8{LowUVm%A;p!x^)uNbxY zpCj@W@>!lI-sMdCoUack)8~D5FW5@ZzkD91x;+ELcUpbaaz!aZgb>PbMRV5Z6-P|^ z)u{I?2P=XP7_S9XZJv~)*zWvs;y)1S(8KXB!CLLroROeI)kDzc~`I`(WHnHWEfOyZuUQk0g5vivdqw7xt1CD*OIN#K8p znw7onsUA%CH&V39I&BvS>u`e^7+F_>K;pjV{h7bu;NOVaTfyPq+8<1{)@{SWpKQER zM!?}tE}>sOGqjdwoi4Mt?+$bMW9LTWcJb>^hftCR+>+pDv8Ym%b~Th^Ez$ir{?EU) zFTno*+ET*HS@><@aTVU9Vv<{FI)fmVa5ok(N{nN;11E%S;18V>rFvwR_&ZuG5!4Zb zU(83rPud^HzXkPw?N0@3Z47cqB)Zclk-p1v*wgXU9%&M{xFKk!d)_$+Rb z@q15C2>fWfxVVzl2ivBQ8FdXYNKhrn=K9zWNql+9lbzrIIw{w_jOCpRY<_@RD9HqH zItsFpob6K!J0NNKOl|wfJ^rx&UMo6h*jAv>Ny*R5u zsOT;CwsFAfD|^B=OD?Sp8%89`kbZ`&mCMaph$^c#kMN*r8} z(@5t$bKv%}*HU2_0hoeF>-he4r{T>AN{SeC#z5`uUW4&7!Yc87tSH)!2pH?rBmDYR zKM!aYu*45iFfrPkA!aI*Rv+QN4n)C79Zv;?dT)d@xNV?PiU}tz!RP$+tPKlE`G(=w zy>^-m3miaW9@TXkQ8S{PrfNi{r>LPBH7$8n9prm-)uI$pML}Uj2R*2u0+G6OrJ#U% z&;~xY;SCb{#^y_H3ea9V3F4SSs>XF8(aQmxhgCWDt%IC#MHB(@?~kV!{x#Qi0&;FO zi-uCY01i}R*oDvISW`qu!yzZPHP!fw!}CKRaGTkfw48qyfBkjO-rJQWkOAvhG?s|# zTNx5Ujmbfptt>%Fz{U^hT5?1IIbLcBBT^5)rBX?QGUi>`+sPiaMtB{$arCVznF+}ztCz8xA<->bZ9xeiD9I=AuGdSn+BX5$fn48*AuT+PSE7IpJ#+p7yDb{u zF{bcI9jhs(n9?oU+5EXA@$FY_t+wQjezi5FnULXAk4n+D(-@KR9QsyfmN+kq5*WNN zAU`kKF5^y~nScF~yvptog2NfFPx$DsZ8n>xvSD3il<|TH*azrZyw>4PdE&b0rgB$k z%$5_ofzEw8Rz|uEa4=E_9V?-Dw-Vj^Ru74z{m~$fzc8-Eta*}~Qn1ek*@k~Ks3hc^ z9AHPg9_j0UAFbOAfkU9c? z3c|CqJ1FXnXyXyWc8=LKiF*>Oo;b~M-ZuTR{{UuR1MaiB__L?#cR=kno*vGi%gzqw zgcMGHyu!RM;y?Tp^Gvn5n$O|S!m}V&0vqoU>Pm$1*X;1*9&m7G869z1!nHVjOxAdM zl~tmTrLH0esHo%9uC57KEu?((3Wu8f{{Zpt?ZNv+_>LlPJ}KO3u=#|ow}&kuvRrYD zvhI-Zf9Iuq@%vGJ+J6-EKZegFUlDcNom%eX+Ub|NmaR3?*(lm)mlLxfK3-9HKQo5o z8LImI9in2gs_R)Z>o52y-|hF|--R)2e+~4n75@Nccy~cWhsN6dix#@nZrld9nt{;*2rN&2VgEn0sY}5 z24h^8fV>$egS5*}h~E`;9YT05WICRU;jL14VKw_JD&Nl>gpZX1nD+qe&DlmziTr!` zv#5CI#5XsyNswh?81;4}<&W2s_}4W`vYR@oQiU~SbAJ?mBVYK-TbAlc*|NtQjzSEc z1#$$IIVU9bG_1_*S&m6Ono7v&CbkNMJ5-ZgvvfH8Y7j^pL8M`kiUqijBR3i1n?)21 zDO2wXN>FffRR?LHJ!|2W^INnxNCwjo$p_eGy++Sg7cq%E(ULMN#{LyfWweME%L2)d z^X-q$yRAP`mcr~>yKMyV#&KVyWtBOw@o4xg=7aX^?2e)We)A*iOC|h!GrvBSoGun* z46X=04Mt@^aB;Q1?4u)h%zFx7 z6D>B047*5xDCx9++z_BE_wpt+IHUt8QxHX!r~suvo0X-Pma@7j}txve_xFLRWiN=ul`4-q4w2DH30;fTYM z@NGfB$gQN)5V$ffM{a8Dax5$k(Zy70oi7ymY?$b@c&*|BI7U8{8+&BoBOLW6tUjj} z0E#oxs?T_V$#w%j!#|D4y61sZwJ#FEqgczR%yJ?^RS6?`#|k~qN=w_rad0Ap z;hDN-vA#2D!$z>vEQ!pnl042c$@y?U4F0v_W3e92lW6)31vpijjE_6k^?S{8Q=eA9 zaMN5!S@F<%0iM8cJ%u+;bwW!XdsTUtY=nMPM1E{n=k=#4&D{Gn6rz$gVvw@~fsb0W zE)e{?PEBW{5CG0S>Ubn(V5|pT^$D4@uc>_=NN_>?jb1(xZys5gbm>6V?brPt86N`e zI{9m!jt)rv_Hox0N;rT3=BKf~y0N%h%R82eNZ1r~I3S9zW^^~4T ztKJ~6k#A(ZjxZ8eEJ6$gC!AxjsO-Eye}5641O-9ITFI*#sV0cwx?~_4>ihxY-E+Y{ zBeL-~hjnSJZ|r6gTHV0-D18sAp5v$Ut~z*Uw3x#>5JzKDTU?mmJ$-2m{hnRP zO{|wn9vAWL!^fcsw)lrmQ@rStNJcdabsYVf-2V13FbOWBA(Z~2MdaK;9p#;ytHfyBR#SP923x} z>`i{={{X=)zi9UHzlN_rXWtNN23OIn7g6wZv#AnIrk5)=M~EwmsJo-^xOx_DUKO5hR5Bi5+eL4oEIpGwoy;zKAd58+nTktwEoX1}CI zuK0N_qg7)h0oOe_0E*^xJrqWvUNAiut}C?gRm57CgRC3_x9q|*{{R8`5Av!|X_3Qn z(XxP5h&ZJQ>!?(PmB=jZys!d{Vz;#1AnR1p+9b&<`qcLM5^e^SR+l>L{YKH2^XB(M1#hQAGp;!Jr1K4>6M`I0y6p0QFOj z4;0cdAZ^@Z826`82b%bc!$_A7e4s!Zax?yWn&Es!;b=f<5+DfejqCXj<1~2f=9MByLywm~El{|F%VN8FSAXIS2_$Cu03hUX*10`LODGwY zcpXh87ZSOXIoqhW0;Bb+az_N{b`cZG<+vye1khiK6g7$ra1nG z^RCNGwos|Lc+VA!;k!1D+9=8ls%3!x06z8E=o&ot(<%slMIf<0mCZKWE+wrKNVvP5 zV~RY2-AAQ&T0esFislm7Jb}`!ct67N$F^Cbzym4|YRmnhKWXoP-?EQ`PmR7e{6ezO z?HlE_f<`i2-M3_h70bwSI}8rwRHP1l5#qnJxP?9@y@V*BS!vM5;0}&Ux&HviSu4!1 z6tUWaIXK2E=O2zA@K#+@;)jm)j~4tZ_+@LRSzTO)j_bt6NoI6Nl^6FhvMhWmo?ZGL zIl%e%;z#ZI`$YJ{2{fHQ;(gAQZz;sT*p_fvzoAu?6vze#s5w1FY_T+{Ell1Ly?%$? zpAfzyd^-3^rnax~Q^(pzhhPb~e`{YXayb70VlHHp{sN}HY52$g00lJoH>TVjJK;Zq zwVxK;tbtnc^-h^&tAcj}BDB&B{cdFGyecDGVhq4gL1O;=rdkfu6X`m66z1Gc*9)2*DsuATb*+HTe%qHuIX8he;UEn z^=PAwj2z^8bgoNL)TD$w^2vo9k`4uNOBGh5)t-!SR4FYYdVF6KE?yyP9DyJ!wIYSK zfy(0}+XtpP_oDN~6G;-wCC);ga&z9iJ5cz=rD?K=aPvM$5XL@d`g;EWTGxZ(XN|6G zmE!n0sBHOIyZC~|U4}Y&Mog*arb!-^F6pjI~H%Lu88b#G_FTVgC`_X0h5Z53=C5fVqgQGT1O|P zI-2wXcN;|%P%xs3C|WQ(KZP2f*{{5et~}7(`|y94>t2hkrAw~eB4*irhL^*GMcQ?0YF77AD3Jgo@#d~whA|gOFhJ>=wI>#N@{FSF&6`<^Mi^u8t4Sj9)84te zJxoGzBbCP>lh&_)Y^=-snN**xbjGTCk?h+ymUSa&N`iKXu0r$Qipxz}P`$m$HCE?Y z-b`;G$DpeAknV3vnz5+!q+CeAeN9xKRYRS)A5&cRr>)E7wisvq>dQLv;O=GJo`C-V zN|%VT(B2qX&7EAD^1$Cah4;--yYVHy?a3;U-<+S)xhwAx&Sdh*1y{atlUY}q+ixaz z`eM0fT2HCjPc3rX?vIS3*i2EV+CPlvclcK^uK2P`*@_$%=x_-9Yn{2*=9z*)+qo4c zk8anuL8c^~+;i0X*Bt9B+UImI6zE5qM_u53F|Mx``c)YF%1>PL&0v1ex25$P3nB*O zjz=fgaZG>cHRwJVwzsx{RwMvmbrt5{v~1Cj7umrYjHZ}{_~#}`Kc*|m%;dd;Hp=Fw zk5OJ{o?Sx4M1g*_3{A2?*y&nH63Z7gLgojCLP+Dad_3Le&#_xrw+!3xIL%l|A0QBY z_^MVbxE5jbtMTpKmONCaVQg7Trd%q=&{VB-fB>VO{8dvTt7bFXngp3UmB7biPnnS7 zfv-;Dl3|CvZFpiRUd_Cx=Xc#dO2L%@`H9YJU&8o+5?dL`0R9zG)QKjxD0tUT5vp8> z@WHmX9YL;nP7Z6a@qABtrdo){;JUm2HW)NGd{n6I0+uJJ*#cDVZFFSdw zu`d|>tF9`?Eajmj5T<_U#c65j89#J&>zbt$XM%kzLr(xMG2X4EV;I><9>4IG?XG+v zkTQTRt{yN)evkhEvsSgt0d5?pB%Jj1u4CY>*=t+t7H^duBvGGGLF4`cE3mxSBn$u< z9erzxO~zM8cPenXM+{pearLQf&~D3dO^^)kUX(;m;4{TrZN}zG#*L^|QWW*8Nt}$D zqiX60-ux=+I6T)KRL??-RwSU4o&`aFdbT!l-R<4w#?QCc130Ssebl~CdzJ=PP+uK0 z=sl}0R?deci~I^IF*I%}KtTYGovB%%O)#R0C>b5YGAg)D*pWsDp*YXsocn z>l*nwf;v`_MX22zZnLB=Nx(e(rnwDkN>waEft-dOwdgv;)^JCQnUPrZ3~Qa$t>T?L z=!jr?GMs}{(qfBuJkM0q-6dkH-0@i^GVTHll0X^tHQZ}@YP5~=^NzKFYo!@=h@)u9 z8;NhjCpDa+k~Q4ud@Z9(bbtlnyPgGg-X!s-!|#Hg3A*@+@iWBsdOne-plh4k#|Wb& z1q0NQa1?S$;-&DejRu=;*E1rj#JiokU;&!^a{mB=mww)wukAekS;~a!JNO$8Nk?%7WYRN2*M)QZ1Au+2GCgF=AsHKgm2;Omvon@GN#cn0L_xnK z9Q0b|X}!+K&Nk56*0n@b3+8m{YYJUfK-o^6vMMc8U$-%~_T%2X=f@uz^v@67{{UrM zx1Vz;#4*Cbx3)4AW9iA~AEh+}M5@U<9)YN8iwq5MadCwMB$lry_|5TlJ1l7W9-=(L zGX7D|e^6_m*L-X7PsDbAWs)`zp;M{r(>N-8{p{v{gtr}n42p}plTMG*-z5Tx z1K}%eW6!<1%j-I&tMc-m3PeHS6?k0r<&P|DcK6~>f-Y@SPlnNK8Aim4-NMC;91Wyo zcIQ0f-nbtY{6n^|n43A5Y3f4fKHS!jgNoG3b$PZq{{W1MZKrrYRPth2B6~)P2zrE4 zHi6fZ&NJ)l(!PI-P5V-Xjy$z`hsCcKP2wFbbmhx=t{W$e0CWBym16i;!q7<=mSMDi zd(_ol#3;FJaW|e8)a>E=S%9*7sLnpMoIwW$y<+wS@}EwgB`C^Jk~<$t;5<>`xpa$y z@vi8cJ&4HtE5kv@BD?|wH=5&| zgDGR#LE@>;td$H20OziG6<*?GP)=(;R=_UCvYk~Gsp(R~#Ujn#tnKp0`PO~S)UN*k zIqTAx*B~CBtwoaUhF-lZ&8dlUc1-W5Nk^e(*_1E{aqFJd)%ZRHNAnovh{(@wmCb4J zg>_w{B#iDEuB%IMfn9JtMr%q5w{w#hX9khm>5{Q1n8!@wyo=+Ou$r&Li^qt3kR&js zamLt`H&6Dr8uXiOP+QxXr*IY|EX+#cz(O8O|5G;TD`#~?rt7N&uzqVhCqJhAY|YkF+l}78bA*24M<>-qbEF5O5z9+t|bVAJo0N^ zHAoj?ae>mawD2J$v8#zX9zQzPD#lINbMom(ZMx<5ho>w*0%u8y5}E(>-g3ZlSf53^Sd+kNB#+Y`(gYx_;c_Lz7PCQzSQj-P4Qje z({(8H*=Mwl)^v__jf`d42$AIACf}TUn)_S9K0NR@#9cURe-Hd&rR#RP6`oBp^(HX_ zI1Z|JMt|902=uSTpND=fxA637XKZJTz44Xg^8hFcCe|1Lj#rRL1Y@3}y&u6}6m_o; z_=*n`=(^qYhO2J*w$${?lW%gpa;4Qy>^@rc|DNx{CMk_^Mcl-Yoh2P7b~rR+2R#z+alJ+LZ}_ zbM0CFaEqO#v5%E{)!S(!&J^Hhf@`UxgO%Lxz71Un{6Rgo?j^K19;7h-nXf~=A1b%L zE6P3^Ud3nQ3pbWbE4xR>a>`T>%!>7!&Q^PPHPio3gvAs8LrK|Ehg2ZKdJ_c|P z8UFx1vsJAinlXlLz#hh}MKIe;I!t8Z)K@Jp%T-~qtJV>u_Wv}0lPQAK80 zg+p-M)m<&)`#al!0fJ|bX#NlmRDa(ke>%5W_Gie}?=8ylB1bSeJdz5Z{RL^DA94u< z6NB2Z^%wHP5;8~YTK5bH{#BK!4dCG8o(*dqioTXGri2{IPD^r4VcpvgwMg*+weVO0 z{9N<=tA66v=v(_A!|+NAh69Ob$NH#&Jx(`t z9mtuqmCL7oYZX7>ub;H4e$BtJmZzg=8uM9rm&TH&i=&7Fw5pPy^qFu@Kv)F7FzCfO z8Lz`_V_7Q~mkvTifn#0SDxhEweg%3r?M?ehd`JDJd|@BNuZnuvzt!%iotLyW&}2s( zFed>JEN8an-I94VTZ@o+I{_cN2OtJ)p159yt?7Op(6j(X ziKe71%ZVn*X(S)*Im;iWa617-#;+?}x|}v!mnW(3RqijPjuP9-fzal;U0JtinkYus zVX99fe&$Hj5!SrV#@i&+9%WTfP5~TOQ>bfe1dNGrGBc9RUVq}vNiJ>~|L& z+q*KJn2!(XxD10NFbLd}{uSy$w2wBbQkKV}c$$4)ZDZ{buGpmk(c^B1)9Y2WTU(2`{P&TW zfX7;gN7s{I@W>Ij@9p_3>CZo&Ra|xF0=DdR zNbI88q+=rk7_6OdWE!-dSma|oanhk%;Cg|a^I5c-)ZQ9yZ)!JCUPcNNka!uat!67r z%{lF^p9P1@j=Akn{kcQuwLyJ7yEmB`~pxrxN zDamH}t26>m0IgQXI8j%8L80GxZ&i~<)T1dpA$-I=RFww@^Qu(9D58o0D%O#y+-W!Q z-`h9M8)pZj4&eJ5t3_!_q^V6wbQGec7Mbk69q|R0xu>n=v-BT0CnZn4Uz$~7OrM#r z9`NUguQWTMBoFd2`O~qlM$$Y>W352DWW(c?Ez|2?pkO0oO*i~*gZr=49H_Ns~6%Nenr&YD7kkQDX<$3hYSCly$8^674$b&o%K9y4LB*-E# z53OY=v$mZ`T+5a=Rx6zG)}VFZt8_Jf?g>d75FGWvs*b023iDjGDY+d`kxENu^Du*h z(yT#lshJy-Q;6MHbEX9&s}PI1m_7RC$^ z#POQgwvjC2HxnO~K{>9)%LtscmpZZ+;x4|rM~7swgyw6-F@xxz#D5XT<6d4#E(g78 z_`6vt{)lusNyA z6<#WuJMtAB{Gs6)0 zGr>Ang>Bsb0K~q*BPE6jbC-TU-)6_QE6%@Xj{q-+bo*&_8%WmTY)vuR-3Z7Ba)JmL z80nhzvlpJNA$$b~Zyjrjb*}7=>QvNK*!b_oqr|}f02W8#U3QP+DOS`wWk?uO8yLXr zUU8`0`B!kN?HrQaa(aJ-YTN71ic_3++gz2Rq7yqX@PqpB(V%Orl?{>ZQ zT1HLfs^etpr)icl2^a?fmpl{bYuaOFi>l|)*W(xL+wtd9_&f1OM)--K+{F}7Uq;vP zyB(%BB}pfY3_09*%IDg@UA`22Sn!v|4+*D=d@XaGu3^5kbNkCV#y3Rcu^o>>2qUe1 zP6rz5D@p2neq(`DrFbn4@56WNVXInd4gnC{qwW6yb%C#QyH#sh0}T9xiuwNC)l~0n z6VT$l<3PL`mV;+@_$F&u*|X|YX1gkT&gYv?L{p8FM!}Cb;;Tz2Ooi*|QhB=(m4;1J znnfoh3fi1*MC6ksj&?cS!0pXhw!Bbwk=LbV`RW*uNxYL2v-Ze=5PXyaBUX5M6E@oO}A$9ZF|iIX;HOb1MJ|&%H@mw)X*eWAv+WT$Uf< zTylepI^yn$=%hyv$fc+l5j-6u840?QBKGirJg&)GbT#OEe zhSXKr5sQpuxzu%CR^jK=H7lpxB=R1l`VPTI0C9@)Ul8igbE)}aKz?i-p7rNfug#)8JU$&o zU6=JOMdg(N&UW=9tw(nwJ-_b=_o{c(Ihj>XZ~&%Baz(pG-v{%rK2mL+msZ^J{{Rqb za@*^7K;V{;;YV(Gs5Je0RE@C!$;c-)kK(OXNIXMwRj@qf!nbjnqid`?PvjGw?l1>R zT&_rqUG8@t9lSELUfqDp8~*7JPpxTcTI}Wm@gj_zbN&^~rnb;qC7MD2Uf|Q;P@Z`H zX8}OzT=gl~(mFFjT}-lvLIL#8TB&z*_Xl)@j0&eNp&AgtgU>wG4Nq5g$c{xB9RaMN zNw=}ms!`?lnNM830I&-^uWxa%Oseznq$ z2JX$D2kUa^+Nh0&Rn8kH71oVG()L)x0TX1Zis3a#4Yk5uAv~U*gjY|aT*-N-$8f_Z z7$nfpiaPz~?LmOxamo5tVY_JD;P88jpT!19?@sm{s619`v0;*alq83CTsny(<^5{B z*OHKOcr^>Mt7IBuv18Vqkch5vB9(07y#w}5_(b0kej-ca9ahN6qWD??sOm-3?2*G_ z2nhp??lX?)kLg?lmheXNr$o@Is(V0kKGHHiUidVpwJax@A^$24>coUwPtsIb}PD$)B z;E;b09r01iZ5$x7fDU=)q`1^qcEunL<26R=@Jt9(&U)0gj+m#>1p5deza!G2M=IQa zYB!Zsa{T&KV(AIMY*rJgPCK0ujG8np=L(08odsq1o5WKTI(!X<$L|O|eW{n)skVrO z7$@$W{Cne5uSM!0uP#|Ly=!0IXTMg z^$RXnA1LQFB+fq0#Gm1+O#J~hW_AMDo}(2ZVuF3{wPxI^DQ3l02M0Ahx6asM#RFxi zAIuyM^`oc4zw2CZI%cWbtZ|$XRt?z;vv(bZ26i8JaIDzcJ*uNh0mgq?Nu?z5Q7CpN zJmm3#Lt{~ILFQItv=09Ooq8X@kA@dMFxE!5eFOc5%0O|qiDc}(dJd=Qj^`45D)<+B z;<;`0J!&RfC&?&|6`LKsM_#zEraTwmJu|}^Yzc2qJY0-fI;@WbYjuad) z=cgw>h&9zltm*28@bv0N(mzu^3;zJYK|URL+SWTSiB?C$m!*Om*o)6$BWD2ln?psD zo*V!%_p9yigPthTJW=rXPt>$+UfS{>D5_0sGRTghj?x)P1Y;c6;7*tE23;-2*<6?o zc9}>Xy)r*K^e=%wxBmc&z5{$lhyE4Lx2S2iH!~|qXKqy3-USQ1Ttd>3hQkvgg=HNx zUe+Hla?(eUiON)c=pVQjaxz^^hX8qpk8JT&F77sDDX%2`n?G&egMYO=BG?sCNLW0BZbzlW4%9S@wuQ=K{4p{7|Gw~jqU zGC7LAcX#Ha5*5hjie!6~=DHDrHSMJ*jE+0i*e)5m_N-fZSqLnrpGwfTlrZ^QpG?+O zA#`<8k+o|uez?wR^|Yy-wTo*ymIRKSt4`WvW0f`M)q&R;+|!7I&P6_}K_*T?1XYl7 zGh9tso2PKB?-JX6w?e$PT#eT3R|f|mWPYNwX_Bh8RE&Z!ML6yTdmNrcQ@L`W)aoRP;S-KC#v~5Ldb)>Ch zlK%jLiGJSx4gHJ$97xvEL8*AtR)N>US_bTr+>f+M2i=JeB=MYJSK-&iUy7b5_?6=w zPsctq*WXgsHH*f$)bHi%Gm?6LbyR$+qlE(lzH~omui6vhKgWNGnzzMYidyuSy0)t) zAjnEu!U@>~L-$$g*2izUc zt$EM(w3?rY)-+|no08r6&*591BGv8|B6f}tf&k=-;WQmtSeM0odck*=@sfEXx7nnwJJ!>0R)mqx;Yo<@8aYd%9bkMYroN@AwqNO^Q*c2|V zc&CnTq>scmaTerG*(y)1SJ3YacX7^GHXoePB=u`;tpX0xf= zv^Xc`-J0hvr7}odcdZRxRw0Wn2|X(z+>^=c0s9UF@m-LOm5xcY%T}`p?PV@UBLcB6 zWhQb-ty{g2+9y1f$*f73Jf(-NS&`IhBuQ(z8zFE(9s7S;x8Y4o%C~q)=yGyurIP)- zN(^u_4sv7eu?=pxfL= zajIX&au^QrLfB&68Pq2@a5^vAAL2}tS>NhX-YYGDS*0=@i6>%wn6aOmb9}^g*o=Bt zSMe9dp-rE|zlWM6V8?E@x<-|1aF+0>!sMQc2h7fT@=biV@vGt$zQ1^$6wq&t#-C#` zlH&7s8im;ydBDKJ0rDX1qdXTNewR8}eizB5PWP!T-=AgH%g^w+`F0gzxW_(@GNfE+ z!{A+`e~GQRrM91sD`yLHJl8Y4_YyO^v1fKUEKekpQPDuhabK9!lboAp>j@;R6j9XB zK?eq)VMP>B0Ywy00Z)o|i1Enurcq5v#oYmN8~*^|CmxwRRjXUKM!}GPdiSiFRFTt^ zVk@$iI<+pQa-|7$H%6xG@~iG1q*Iqvk^A)N&0?kNsT+_SdT~;JXbCl4&<&5sPe>Pqe+&^%!hyEnZotkz$4z zhFV8r08l%UNUw7ETl+fPXpA+V8buS`tDh>$Cs`IS2*VZtjoAn8lfkY30D|8Jd^O;! zR=L$J;=R^hMQ<`&bDL7EKX$6a0k^J0sU-Zk$4d771Hus4h14}-Rz$&q-7rb_e?kc0 zetwna;<0UM6Vk(Bd7atM_;bS+`ddeNc@RWZ%Eyi|*jGt=;(a?&jcxwY%p;5}VcYJg z=m((os$M75CAvme!pV)J9RRLtMbPeT<&ou>F=NILL0(d7TFZ0NNmEuxv*H~o&8r=Z%)j-#AF z-@Ve>-W^WcX(YZOaUv@=Ps{?a$vNv)emh!4dE$GEX;n<|Y%EjV7y4qn@>^Z4nfRuj-x|@gIg`(QYD@p4U%>q}dcq#e`$bc44#-2RPf0 zO6j$2)|Zja#ftO5_UT_Xcz*j-@b;k|tz=1Pj#~_Q9-LRVcx&Q*iQYR;Ukq12j3vUs0dj>;#EC0)ol zJwUD-!}_y6t9h+QjLRuSk&tDRJGeZMGuzs;_3wxhUg=EpPUb@%-cCu+9<>jKW@)U{ zZRLhY^fk7q+AT||@BaV?zA<>qz#843jC=#EOQ-8L6RfruFvwF3IKvPQRDwYSVCKJY zKW8tFS|{xl@GHZ=7_>OdYphrXy0>iR-sK67XpTVTWLF(I#%uZe(l0*C2nquX45{y5 zsQ&=)La&IiYd;74eemXcqVnk8EsFUf@{SfeyIA?%oFASS_w~+r_43;CjMQ#aKi+wb0zQnRx}XR_*0f zZchfWEhgK>@6NAV&ZCw;jZD)zDYT8aBpb8qSL~)cun%6k}@%z(JN(eD+RenkN(!b zwNJwj*%#p*_r-6Cnx5F8UoTIviGiC?x*+**M7_y9PhpaJSK!a>S^HJ^`}Ualp{e{> z_?4(M+KtquEUgwz(COB>%y2?OVO2(Rz%0a)YiIWS{k6U!{@8yTF1&Bz%f^F7)8~>8 z3urLSnCxx096129Va##V^ z-nh*U_{FNnzaa#Jpy)C=tuGqt5;cdI&PERcx!o4>AGaqYH*S0TRI7wy%=VPZ3D0N0@-^T#O!`)fI-J8rf}Vzz42R6+696y_$@7 zJmMF7l+r!IF&P;<-xe^{5p5m!PAD=qH2UE%Pr%x$%Bj1{zMS#n4 zWFv$gzlB!DZsmP-3}mVvHutPX&Q5D{U1pH7;C!bam0`D2^`mhecY|3jG@%<{l*rqj zahlK5o5;Imb=pQjsXiZE#rC-@PhR4)f~jds>*?R4%yFcYI=ZPI=rNW$35w& zrTGibwK>yy&r@Ez`#%24`q#v3apS)pO(u`wR0PCN%X6wQ!Py8uay%YpJa$~3otQix zBOQp18Zo?|^{*5qvwsw91_-UcU1W2~pW|^l%7AQte6amM5%+1L;B=t4n9~AyEL*PSk z;r{>uYwLI73y9i1XT)~S8Et_lb-k;A2;kwR9GqcD75ZKi1A^gv8>>;LQ>*^~+hhKJ zHhx!LzGKGN=&nZ^3s}MR{`~E-^4GGytefM1#Ta}ErCxkD@V2&>dhVpGo-WoPec~l2 zn;4(C82#ZLPs^SN9u`R_CX}&mw3Ye(ZJO52F&y*JEthZWtLlECmSwbZyfUQ?Usv7! zi=tf?fl8w%6qKq!IW^@Th^)YH1tVmDO&k(E&ot&-j0yl{6cK}r(LeRYFna23I}meBNE)2 zlHjhu06z2z)*+&bC>W|4$WStS3iPjpb69v@>1Jyv;Nf$?>Ge4yIIagq zhWv7bYP(oOOLFfg1$)x;4)Zl(^S<5zlW;s8NdUt?6BSU>4f@bGtP8X+Y;FTz+ zsype`lwOCYn^wG#OCV4)ny;wY$!{;62E)AM=B@Z|QiAp~kgb*ZbI2q7YVFC2Rb^qc z5s#O@wQ|awQ#<2PG+^ox$32qd&12N~@i24sq_pcyO?Qn9xHsg`+ zUrGE{(^FWzwO_LCXMn<87v?!6s^D^YEI|JNXxGkAD~r9~#9yDScGI2oXC%}f=H`cF zE}`7ejC3IJ&0Es^IduBEE}bUFcEIO@^{MnAqT2;p)iE8^0Sm4`+^#aLG1W-#>ygwET|vGl?=daYt#d0Rej?LS;coU{ z>Cv-WmvRJ=^2R?;Qa$}LYL=Vg)|prV^XI8Q=hnCyZQjR9Pn7HB*FJT!-HfmuI@fjK zw~b?uVLvbg#;r5yFqR+c+Gmwiz^tF!}7I!_Ex#A9#qcHPn%>r&IS%o zJ*(-@_$K%5l_%_n@dHxUHCSW1@Xv^z&fCN`h`+vvVUQ)vXZVWwrzzYXITi9Onz_IV z{X1th(D+MIFQ;6nbG@XDsK6s`8+Yf$bYbf{a#A&~LN%b`e?vYR@qdRrdEv`H7x+(C zg8u+czky}6ySIJIB9Z=h?NPX`^22?UO7 z>hPG@RgIHAI~kW$!_Mhwckr?5$C|SQ=OAb4Sr+$?zvgTYdbe+MyMrE{wc6(FaYb5M zokowQ>UYSp!DAyU50$pyAH?xn_I@4I7;cy%k^Ck90K&dY{iFUU_?Cb8C|B&~@GHZ< zG}J8YzRj!aej(GWZ={JXqKXgP2?88QzGPBxMlrkAy^r?p_^_W0{{Uk@iT*aXy=bPi z@MZcy;~@F6!eWnU?03kZ9>%$+DYv259!p&ID0H)GrLJxjRYxR_2j@?;yRf@2{hz4A zIgEiIhEUs2z7G}iFYH9pcz5;;_-$>f>Wy)8ap4UTpb7^xUpZWPam0nUwz*Ne3p>}N&=vu005|u3V7cDhy$RZ{wx1U=>G~V%zqLN z78V8;9u6MN|F=Lv!@$D9BYeO>`RLH}`2#)- z%m-+=55yn6eLkK8U@_n@zp{$Le^E3Rs-~`?sby?pYG!U>Y32OO#nsK-!!sy2Bs45M zA~G>4IVCkMJtOl^L19sGNoiSmeM4hYb4zPmd;h@T(D2CU*!cXy;?nZU>e@PJ54?YH zc=Y%9?SGj4zatj-|BKoGMeP6PwGKdq zf%+Ic7z}_gV6J)Y><;p_R5l8n#-ZY|dA=U8ihXIOj-%|{UK|=taDt0YwrCMsH zCoL{uQ}X_}Li1Fwb?-ig5^+uwbjK<~)A;PbzFi!_9n=%}=|@7oZb_EsEKU^tZ!wk6 zz0b&=+Dt-z@+oZ9GoT@4sNGpX3{+MR52IXvtUEFI3lSQgA%Q?%n)^J~`zh%5&);a8 zeJrN@LrAiJseDzQ4xNr7J%jAWg znwc3dgO!BRCbHbBtBnyltGkxB6>eZpjG!^fQrQHOohbNNX|-}lAsr-IX57NKxKLFk zi$-{=w%dfrca*6Ww@n_prRtdDtUU6W2xg{8BXqHcknW&474PN~2ac(>my~m~FQ*+n zfCZ8Au<@)>Q|D8~P99O_&g=`mj~|<;t!SfdUZq=j zIdNc!1I>LR84vnN7vZTsfqR%}TYW}>MY=8J=hHxR2Osp7CX2!hCNADIxj|??6^0It zIL{78n0y*eCFud8v?G$HtnA@Nx@lYOQjpq9H--i!n3oVTIfEQawFA-K@q!)FX>sWHm9RHkYFLv*|{u~Ht{O=EQHF3f%5R&SWWG^CL&M>bZX zjB!8Ag+=8wcomgU@Xc+=9e613uuXGD7gnNRD(_n4v+K;EP;=12Q%Z=TYW153N}Oq?Mm&&dCN zgUrtcu5Lk-Nc0+1ue%4u*+L>dX<7Ft&Jgv2^)+qH{^o~TO2xc>DFXj;K>#t`Pr$LJ zOpUShg0$85@O)JffC1Ec7J&HMpL*K{kw1~NfM{-1vu=;q>UV%Cp0~N7%QXdPDzLZ; z)l5!SK7^-7V!uA%9l$6;dc~CO`HC(Hbt=aX^~7GTMgKLC&9OBQc{dQ9ENC_s++;EZ za2atNt!e17uUQKN1`Vu-jr4>)T(56x8!2EMkA=h@vWZxS5Etqk)IIvslpcXmDmJ{F z!;(#!0SH;kk!KO#iq#WFNi->f6s1q#*;SdF0^0t-#SWK2uTU%8wwO54drQt}4nx0m7fL8$32QcQn)R^y`|d97|-8c6v*BIQ~&!^A$34!bM%fwiI?L{>HIioIVB!ygtKb0YSk9& zJc9_$N}8dhRhaxbN8=7Fc+|?vi#ox3Ep~K7$ur?xDaf?MX%P5rSdtB@+)cejU9KI- zGwmQ~S%H|{M6dmeb?v+J)<&07j(U#R4J+ki{_X0kdm&0&U8Gf?S?CD7HZP^8@}P}2 zOk^SlGM{okyAvE)qx3k2LNqHLMHdiDG#r*_DLhX}1d!$OSU5HhwzZvRn;5ZKYR%tw zRMPI9>D4h=u1@*W)i;wWuiz-%SgqVt>mfb*O7AQ)yPuuR@V!j1qVx)(KMuovKq*ds zuF>-1AfZ(usBM9T9Yb^HIO@dZ4_T2}vbZA4y_7p9Q=ol3?(8 zS8l!Xj4XFG3~b}f3ec8Rr-8PpQTSa(E_Q#IZ{`#}XU+kj0u<@8V^oyrEi)y57id!F z7HLS>!W!>~BKDWQz-a=|0wd|UHokrP6DfkFC;`AyVu!2w3YmDe^d^BQGOTkp7p_0l zp?%LZi#^%HAudkOPB3nz?0M!?j7nfjj9k2LyD)4Pr>w?SF^%|3-`~yWyCsY!L?|a5 z+R5zd5@X0s-&azaHfEpheI6e!N{n|wy2*L7GW-tMpxN6Q0#k)NwExOxyn&DTBRyB9 z4=e#4{QFeyRps7wQAAnyn!!~lUZ_~T1hatMXoz>=G+qTfCPtTf%@ekci|QdxXw1cQ z4`Ad7S)Ir~jtWl?iZ_dQrhR~A5_xj3A?@t+z_sci)$?4+08-$UD-BPi2sQFjsu(Q) zi^n$Oosu(mrmDDc3VxY*!~PP;+eftEMyeHSrWbnNcr_ldXA{W7LvhE+!oypsjk3~g zpM@jlK?>65s+Zu9rE5O0OUGtBu_Q!8KbIfAKbCEX=kvw7YSn>}`CCCjuQneY_3+z) zJFc?;5(aq(@ZH$2pCx@P2>GYFxUkF>`+p9ZT|?wsB*Vnk<2^Q23|eoa?*MGOKP^DK z7lGv)kv`;KPXWRq+_ja}E;GGq2(hXICLg^K(t0wrm-HMBuREywXnNO)N=3nK^i(KawI-33YaJC$Q~M zggINIvpkW%#}C-$_Oq+o+#R(#V0b-XSNw4oJNlV`gQuC^3{asF7D3>=Gw;n^6&@ks z*5I7M9(au@t{byXpUI|s2h?Yg$^&6eCFUH9*FYrLS2$&rTT+&WB~t>4TsS-hV>6(a zisQ?Go?7abvLX1oYXZpy#y(V=2Q#;kQURJh_A~2a<`6$9UxF8^##m+)3#5k-9nRNY zbar3iffYO*#}&@C(x0n}%MH#JTN2-oI+3m>`uxy14i>z><_%bMK#zUHPgHOs%B0PBz=bqS z<}E3f?{;o|PjI!m!lEw?!-~BPb?o$nTwA7^Qb)Y4^fU@IS5WjmN!Eg5a`X3b$Jnz6 z0($T({~Pl8)ubigO8AFi3$vxIE#XDn5_Xn)!PVYj&+HvTZvHJOkO-a#oTN#@_YMeL z@J77a{%vpkNBCj5j6+hk?oS`X-1?_o1}jZ$llW@zEnY80)*T;%p!say-qrQC)cT$J z5!E~31-JhbvsOpu&MsEkIv-w0#pcPe`7d9^&iVj0r$O)`5wpB?=N0J-F3m1;lr44J zHM&11I+}lxZQ&9pPiL9wk(E6R44F9v4c_j)^1mk2S)sPjH{HZAj>XUJt1`V};tO30^o||O zO1e}nYQN|~apwhBa(bpEN3-AX!M zY>{qEIvvMMWPXjE@JBA0l{QigP7T;cCv+y^Y!}QLThcO@622)$-r8?)3WL$#=x-N5)g2pe`L`=Y0QQ^Q z`Ock(X-U$$%ONA@cL3#z?mJ+?`)=z@X>+S9@lec|Dn;BNZ*<>t$(Rt@FWbc}mFrP9 z!w43Pf2q;ZE>K&?+6>A`KWvd}$S5{bRGP3G9|1fsaCv4j4cWp6Bt<$6BMqN8;Ng{# zeK!up`cjU`Q{QVWa96SX5UD|zKPCvrm|ZYFUiTeHgPiA5qYS}#W_wY9tdzoD<%XGX zg-flw@MlTcqf=BQ+;R)MIISMRB70^^a5-q1hnaT9!%0$JVN3a4Kh*q!pg&{1NJH{! zPZBK)fb)-`+>d`Huj6(V_Jq@Cl<1G&0Rj58mjmb_7}{1j6rqBC8qx4yHv3^&xpn>! z9i42s@2WQyS`vgPe$)@6OtVd6NrJ@r%K1SZqJHJOO`k0+Ll9dSHC^PJzoqbuGKWyi z`&c6*A;Jdds89691F_yk@Gpjh?8OkO^)!a+Gv>`zc0NU{US?+?SRgui^zL6F)lB)V z7rdd=?b%~nuCxpH5mJD*cp0*b7b((#P6x?0B)(k3zNY*}r~|oKB;R6qC#Q=%e?6KX za}P1E%kHB088i4{`?5o{2Ns4t$FH4|kTo}FCuc#|je=qon(6oLBX+K|bD`Wx)w>sd z5wrIZjBlW>PZU93?S)oujgiR$nu(m;;`yQFe3`u^UyFpkz5uU3jYM+l`qFCgXV398 zOHxZEWQg2yk5Oc0C2GX;8#TPpS8kp}8ZCB;y9t8Q4jY?A8K$y3TmwS(>kx#0 zH})GJ+Um60N{_|w^UG&Qf}161q2-iPlX40BIU~qxItF-&13-4+#L4%#JC+Mfu+N7(!r0d z*IPI38`NZx9~SVtEULUkYMu1UJHUoHT>rDTwIwKy)O|r`@$14Q>w2FHL8*HB0C~o0 zJ1b&kVXT9C-IRylFzGs}-pY%)M^%iRjh=P}rK~QOc_hF0s7!gvx)av769;%6BK2sC z9!#bS)2Uei8~>)>Zd~ zT7r|b1utUDCaU(Vwl!Q^;5H?Er_+|ji$_80-o|$Tu55W}pvr-~RBGGKlQBuxNQ-A3 zO(a}lfZkIy16OhaP!$}=!iJ8w*Q84R$iCk&`>#gswZ`|`Wa@E+rROhzC{k z6gbqPzw4zOYBPo?nBKe4AlfU|+LKXl`C*tgWWQEkb#4!e63EMAfad~3^z&HET3kc5 zOzy;x2n2#Vu{*47)fJlAB4@uZEE}R4z<5+8`Q>&@+$D6Fq zNsB|u=&p^_>VRN41?;W^{RuMwayT>iMjEBp;qg_ou1RfPF82z)kEsNIMqa{kDgWDv zCkHD=#vB%<6Ybo38oqJB40UjK!1aU6%*TZGUZbQ;6I#T$Mi(55}d4d zy~*=!Vwap0M;55dahB*U*{{PFkuFAz;vVNCXf-64>%HDoPW{^9K$I|6c4#q`f{8#$ zWK3P7xg~3HGMAfH05cn@Kz~?-VQ?6{K}WsSSi4D<$vsNldHXPn@P>D}H!S=&(|YHh zeNG1k>gIYNtE!Jo`2Yn0`dK>-m*-K}Zo3S%7S|`}H4qO(wK*5yn0wM& z`VXg3k-t@K?!$0C`Bza7gAm;7%<<`s0U?gYDD5^ibWlY{u3Bbot#7#efp^$fBQID8Z^&|B;kA{Y3j)Lykd^*7_%OXd58KPT=i=pi zFAXq_NtHFKDTZczfzK89XF~EGrZ+CXz8~F;-paAEC_9mF4A+94llbe8s;%`4vw`q9 zJ60XgZIlkYFf`5a{Zkzcsl|qpe2fYU=n%%Rk+_IVgx=ygUp)8XBhi-n6~^-yajz1q zG)LX=gOty3&jOMxMe~WH?n#&N;-P)$APEJ00LB}!gLC35dV$kB)AdLgE^*G^&Du?XEOQV%uA6aJ zMswAkc-|_lCY#UR^K@!E6PG5GBu@y?LJu9r=evc{@IC=e)p+(3W;~BOMIFs++~@Hb z6TT?i8b#t6|AZm;XU!>bMVi3$wYnBm7`){l;6UYKLhPFctJS>txK;Mo>et&S6|wjm zBYtVACDm*C4eY`%)Yi^P@!BI3ko6Jz{cBzdzJPg+Dv?UL$%G$KF&-CS;Azx=`*WT- zq!B|WIqmGse3a)FHZEXVILQ3Rtxjyj9@!(U?J9`|+LF2MV%6D8N0gGdNh;4>alY+X zR!v=(TlGkBvvGVo+UaPq=II|xadQM-$$QSRjnfDhnBg<_9qJN-N-nhud@(W zMrLxt%E@}ix|p3&%#uE1?|$@>9QD5$#f3|%oU_YFYbSkGL~{5?U#N}KiZX;9i!5*vBl3Huw(ZN6l`QxdxqHmZ#;nDm zLl=)_-{iCN+@8U(_B)J+VTZt2wPt79_?BPI3+s<;L#WoHD+ zRx8WUH`{yL;4@hAwN0k^Yp%0%(*f^7n4P%kE>e*B@C-y8YzVRyHE8?tvWz>2Z}|Iw z?xdI&`s!(vlBml2xX69{_Ipd{&HNJ>sy2~!JkW`CMUdWVXE=hS4J%=@66lLxO+nuX zWa2hHz%w`ynL$Ob(OMegG*h8mY&8F?(BBh@qyL$qe}h$a^&IT=TfZ*7`C^nx;Wznc zNAjIbEE}9#{J{$2u|AYH3Z%giRD(x%yuP2hCUMg_Iv6kA$u)+NPAi_UC6jVGOn=FY zY{gB`9fOw7m1BrnkYb?Ng*YM_?HMO#9oUGuL^4fM!q;FHC<%nleeljfKUVwNVu@wU zX~xK;gaR#$yzAs9h>f>8^GyHmEqTFiVidm$$Vd?!$E9Oj9>`ltnM0-YH7xfMLr%9| zhdi=w?Z+;A^^)M~&$*57?5%CY{KyGIlaO1aVIHgslMw{cY^y{`M*8@tTOve%{UVQ} z^B_k7(t6S%Q-Lsub#(>IJHX)SsYX6>!VZPBw1)4sfh^j0qz5~8JNHx5Lhf_ej9eFd ziy&11{)knmb#jES8_cQd<-HSn8XA@xS)c+*LF7nhhX)!8skd8o6h*?=9mjOF_-+>3 zuFAFEkONy)uJW)_}2T zo*98?XZq|4qF156xqe%gMKq~N zMtaqsvRCl*sf;Iw2h5hDvY|P6-1unkp~e?&^#os}t`&yAmfx`eDZ)RaIhX*eY3F7Pm&tfhth|xGNVK-66m&4cD&|Gbk4!P{=Uo5= z>h|kSfHlGjm|GJSbef42u$R2kzD?8Hr?{TcmABKH6Bm@ZdX~#hR*26AF%bq1u5V35 zQ)kx5m{E^0a>mM$nxEQvDT#J}mHMvmY2hiyZ&^MNaLhAjuzenBo8iniElkCu8=%2M z_Ef7KP%C|4vddD7t}%6FNIgak%R81KOX3GkD-_vTZj(xd17p1moUHo)ZmTnP@E+|C zTesu;IVY?{o*1u-I-8LKbp#h@zMt>@K&d;NUB52`8!WvEGa9`E^fk^ z^yj?w$g~-xG-3{lHsmyJVRbu>9ah_?iVW`45+V1H1fP-^A0VBm)o8gpGJ8cVCYOPJQo)CVXAFC~t9Y4Tm&`fO_#xp;$0tkZ&VO)gU) zaeBmcHW4r{kus+~U{gE1NbzR0BM8m?g&t`)*_AWKUGBtL5Bqw(lHG!!AmGqICb4uk z5Roh=jO^E&6hhHlr=le-pDx%0{r(47Aa;AuwOV}G?^BbthW4PE%%mZ23Kmhy+tow0 z(Slw_Q+$O^1NB*%poGUg#po;e565Q8+#Pd(w|?QKPNm_ReH9x;tBM+33B{q9N-J#8 z08GHs^JPEtdeUGHtV@uxqcbW?NHmfjw*=s-p5EjgfIhylX!~5;jenIE&0Mey?)v#T zHYPeqZ=?XyxQY0-{PLNbEqeEro-3a!-=TtzZShqOqIw-91_=YLHdUdq^M#PuQH$5L zj@lUfyKO-T{N!R;x}{q^q*RgPztZbhpF31h1Axp=@1I!xnuw?9VulAH_W;pY`kY4G zct)l+a%YJND08-Xv7oE-%G6NtNP;oqB|MhOzIEhWkbW*7G*K&j-IWq7S8Y^kU3a|H zT3%Obp?rg`lqfX${Dnv0S|@GswBBM6hq(ip&f;z?*S{nuWp3TwZcnMhzzFFGCby)m zx}#4Yrc)n`5@4VI7nd8o17RX0mggQ2pf&u!njOd0GN;=ru#)|@-VR&mJFJg$$ePds z3hmraiWP3S;C-dP^n-fqeIxH#a|X+45%aM>f+9NC5QXItjx=|!6w%j=LFgZOObE5x z`KPkgzlpkfS}!QqCbK$QlL~2ce_KrW%0Z$t0zpCBRcA7rkc3Tc&nmKQH)HH?n;qgj z`@ims$J=@tZ(Xsw<|a(Un>Yh7N2NLQ^d!~{EXe* zB^|GO@vHdTjeE6p(N#5J_qDFcqlCSIjZ86KrUEr9V5Cav2Zs>PNBA-GZN6dq`24D) zKkdTC<^pM%$%rY(XVm8pn@mg}a#F~Xla!88H`dY%kYIx`*>BhhazHRur@nKFnqiw%X`&0$2lQqwT8)SwF-QzaS;9_T0|EKt>MD$WZm)TQCs7WPPCY+ zbwBvydVu_80M?&9&Un4HnkLhgjo%l#*&C&BqSC4iU#HmDKCiTdM$J`nI+<4N?61IA z&~wx=$~0c;z6rr4hdnYm4-@;X6SQlUFbc$pQ1%xJp4!H+giEGbe5sIu^G>Xsj~N2f zqjKGCYo|;0A46@3+7bmn)-dph*b4sYpCrDb^ik=hZolO&6RJ5y{)kNZx)lPQG4{DQ zAoVDP;rsq0uh%Dz-rr)FUWs%Q8qF|pN1JN<|HQ~+$~}tYSj7TI(FCnk10{u)%_O?w z*O8)+x}+RUq9G^{3|(jq3Tm;^JG}B096;8MV5z(GY7uSvL^0wlgB9Z4T@|CS0-V?% z2fifb4ef6>qdlTpsmsA3bZ7`oCbgbtzoas?xPX5w=49y#$`B9^p({^(NmFpyq*{Yg zg#I-BlHN)ui)PPx3v8}tq)c2f76Zcg!?_HgW6xS;F*!E>gV`aIAOa^uuFrOITkkh@ z)J(PD4_W^7iR^|B|ox_m>z{uE%v#ia@41bwH& zwPs$f*wh|0AyhB2m>`jyMHgCJW%!YZ&f_3R-_4Pb=sCGg^vyB2x_$)|U#2Fq;b5KP-A1?$c<#DUvtaBCZVXoXf@W7}t&0ui)iUt4zz_ z*KH&)d3`n#Q^>cm3nNX9Hr^4=22;Z>mU8#UVhs_%M(utMy_Z5g6mBg0)DKJD)Rd6f zU&pB`?!#O;Kw_V^>hT2`AQ%^OC{PsnfLBlo|6HY!&?3no;%A+K({4QA++XVHQr9Oo z+t1Pdfd@yKVeO_s1Hbcz8zb7}MvBNe^El*NzKnP2L2P)p>yctx91Kqt`We6WqeNSa zlu0}rKWd6V^jlL|g=M{_+W7X2P z)uR+wYlxc^uFT?}$nWk8=L$9xExh}!$9;X%K(Z^3YMDkb zB_F3C7~B)RjY8ma1|p{=9*jO-4U~7kK;W&RZ*C*dJzBja$43bJs{q#5d2zb3%lc*P zR6oX%#@am}o+qhJ@^musmv3dfn|E$|UYYWWbn8p&`M#I>xEY?Fu8mi+6)!z8T95!{ z3Tr|u#!8nD!ZW3HrfSRJC${CspP9=ZO@!`e<9V!4G33?wVc(>U#D6_W3wv?i#D#J0 z5>vz~55%+zMBe*BSzqa3wY2g_5m$=Ykv$k7I5@tX9+~5~h#g<}X$XJfEL`zMDmlb*so8{&sHHa7sJo+GKPe> ziAzf;&Eu+I&_Ti46fqH4;KK&e)C02j!Nw)i9#t7m`B07|I-cukKHHAYJQH~9jJ*Rg zjcY!Xa=Ry?8f^9qy*|>5)^*kJpsWw_AQ!>mQ|DNmz*!`FUoWY9&7B}l+7;%?SR@uC zZqKw!bwVHMJbWj%TU$(W^R~qeyxoQNiQJL}n+2gtK2uhUrz6&>8n9VtLTZ1c+fZ5Q z@vFAMUU{_176Gg<@SW|n9n-x77@g{)FBWIJNk6v5Shf#t6BB_ct;iv~_6rlxw0jgH zT_*oM?vo_81~j&plA`lQ3i;hD1b1yRpx1V_ zsdOR@)D;^=WQxh^Xpqbx4&36GhW7%TInLBUD>;iatpd7m~@ zd5wUSD<{G)SX%;uR}CQ4W|FUqwwFxBi&aJojGsH}`+u1II9J!0yS+)H^VNmyIz9>S z(I*$o)a72q3XF1C#A4*7anG2H&xt>VOnACG^r|X3{&;S%9Ej2y-?YC2bI$mwJ>m1F!sLhm!J{sQ zVeI7hAO_r|%vTu7{vlCzaD$F`inUHt(FVIzn&MyfmlIIf7!Jx9D+izbP5j%Fioq4D zdcra#%0g^^y~zq}O!g{FQqJAV@*l^+Tt&@qg?*A6*`IPsmpj7*-TV5mtNuXNy%3kz z`5!_V63gR5R~3|4RBmVRM@p-q(69l8 z)2Ar#sqIjMvo0uTVDANTn#?7yDJ{A1`{00|dh$n4`2MY=_w5DcGJKY*_Ed@3d-meq zVq8g8kC!!%oK^*q6bcA)jXu_(yT?ugALN0ytxBE7JDckEAdc2$=7I%7l(y_lcG~rr zW(l36Kl>)Pi>`N1z8hePlypoj9r#p%PbUrtd;A}o!4jhVP_}eO{8L8*D@PN3>Tq;? z>L$ToilRk~e}z~_l_~l#2VT42>#G|G+iB5`#qpoGJ_EiL%r zdY-Cp=ws#V=th(**~D8hVn7`<$KwY{HHHczK@FJa1YzHX4Wc75PE70%=cj1guqNoV zmLnGl#=fxIRw*RgmiTc0^l}(s9aoRdn5Lig#;E2=q12RVcGmG5w555*9d>i5^io~r z8Royu5%gSc2_^x;{)l!BdhA#kH2ONGSgA?2=NNQuTGKeHTa;X;Qz2b~kn_71>doZ|ctwKmvgJEGA+acz zQ{6K68yKO3o=)U{AZo{TPIGw68u=;!VRiATfpE$jV(@}&f9PHO*!P>d>|RLD0Jw}yk*`n zV(~K;j_ME8xFb8tgjuK-68*{UN^D%mHICg)NJt< z-2+lLbQ6DwauWS1YU>~US>;OV2f+j`iq+t70A#mTzzh6hnW(EX6Y3!^CBIs=$z)VC zZXs8qHLB#5OADA@NrS4}AszHX&M&uW*UPY3QLIP_w`00cbl?^E#;|sWN1bo`9F(-%zW8z0OMXOQLr!-e>2drMrI9))pApEn`xd#&x^;*uMk)S4uom11@V=??!8)vdehTh;vOUGbdiYA-Xo zEk!wTmPrL`mFw2nKPJV-K{v1zg? zpBR^V!S2UFBNp+A5i`y->dpqaXlRKj2(4ajJdvj_jo;%9r zx=EGMWUG;1p0Mqei2$~pA1c%jI=igHeq9=*8wLg*(R58m;W%W2LI7gmkp2o&3wwvT zxN~Wx`$Q}s9H$5*5qr}tDStQfz|LDk!-WzIYj>=<;#o0?v&}eG>sC+I>OOW|rJyr|vn7JlvKlr`-S#W7oU7jFm6EnrDZ&RZLi9(-_cW%V%( zntxn!zQ~8X=0>mu6c)$CL5q;#BLGOat;|9t+Kmm1dk1LLsLcv7Te-y{Wgb!mO={v# z6*_ZRiNg9*8X+mao<--d4|yMeDirWWK5N&6l28R%g6!S_4ZFq(!>}u*3I`+j)e~Y# zL*W?0Annt6g9BG90%nBk#ft7wp=b^#-g1Kj&X&D6@Ahle)CP+jow*-e_v+&nj-!3O z!urQLdSwMY58;d?kbPdMVaGQ|oylBGmrF#;9jnD|H20H(&;F+cYsc-uK?3Fz%{>X% zCyoI*Yt=?G59hDBrXALTKOoH`6Rw&#rvr0uC-R_F-nHa^FI^RL|K8Akw(#*92M#W{ zDGF>nR9-2&d+FCL&2J*sq-wbNyStCtV0tE2v%Vdl>$nA7P>K?qlO4r(J=OR@`f9wH zAqT4oq(JtyjeBbM(G6u4S~F?|agP z%6Jy5NaVHyPKhjinyy(SC{X$|8D2C(7UM@HK$$Th`yIZSq-^2ZP(_U~UyPR*rTTlZ z)qdt>kO8fOvUjZ;Qsm8_^`$Wdr|7NZW2Dmbhf?d#CG?5w**3KD~Hd#~mq$FZOLH^^~ z4uav+BJe#tAHVg9k$!%WSo*Ux_|P10m1g(I^$y@@!Jrx_;Oi{!i?ShQ9i7O68v4~& z+{BU-Hb&6Zn7ZHZd;4V}QXhJaW1D}T;WybtnOMe5MSzwsLqm?BtjnaYHVe;B)*;~4 z#*fUSy|6G0Lo>_!3F!iu4vta4%ao-I(y|=Z35{G0#VINLF+7jr8W74I9K9k<{!_}T zY%dq_<*R^@^X}vs%~II0iGg43uBP&rW44c`IK3HWh(g_(=Zi%r&W!X`a8&J#YFoZ+N>0MfVi z{Rj8*j_;1C1aWE~xushn%MUb`eW8q+CdLaB5v#eyI0bQPvz7Wjll8-RFI7}od8AX; z$JRU8)|X$tUZdr;!J6@};XV-zEWU_;1R80h^%xcx&z}??f`j8mT&+k5v59SBy1T@m z^g(Y@(QDRvM5#MY)@sOk(6DKB1q80xX!Z}vb#ZAlBCxOEht!i(Q?dP(?LVPW0 zkKGJC*`m`Eze`elJbB40G_2Zjdgv|RSg%OK?lov^WJsk#*A)}x)wEq=W}o-(j^z|E zB=l2Qy>tZC&0QX`s`nR-g}fpFBzeofG8=EXQ=yJ7c3n8dhkF`&qri+ML7f;CjRZ_p zMb%}N&hBr94bA*1V4spBmjoH8ti-WIHaSny&>myb(6nZy<~lGlroKG<->KXLt8|n^ zY18!k$6b{HmO%ySS=)aF1t;kmYwZ>K6w@w(em~|yU3^5pQoi;(?L3Yi-BsjZHD0U7 z*i6@fUU5)tSxs(+o2vB~tLhxH%F*;(cMptFw|MqdnLl>8hKs0OZSe|-)}x}Ag{JQU z@hL^Cm1pw_zz`TFhnRvqPDAv97Ff@y2&n;-*Hs@r1ndUf7(E77o+=qgkJhD%E(m93 zxs3s_v}XQod9@**`UC2rO7oy6CH%ts!D8AA1h|8)W8}P=eM%HkmD1xOxf}JRao3}j zYs~C4DBCwkc#1p@C5dt?z3{+hb#Fe0v;XcH8nMUUMX)nAXDY|X#v3IY!1(hW&})P& zEMxmn=jQXZt-U8vO#mllf^_oLIv{AzKA7v^Mb;>tXE04hIHLjy+y#9hunLJC{w}=P z9i0F%=UmJW(8b8iAzw*(2YhK=;8cXoWmugsIp=|WUNHvEe8zg(OOGazse|>QA7OME zimvRjmi)QNVyNA&5M#^u4*1oA{Bg{sH+NLYPyKH~dD&!>`JCS8YuDU8F%CJC0Rd-< z@5c_OqrzJ|a~*-a;K-+mhaHGwQ8x0z9(+{A@xRojKUS=kLe#l(X;U7l(xSnWzWUpP zrw2r|G}AD`)CjtHTRT>4f3#T{nE>NKaSorXy&Ydu(sp~!IEx@F(%0GB`7YNa)9(QF zj^?%qqu60DV#y&@m4Mb}60u3oECb|Q*4ZK@F6q<$79_oYL}6zxpp0J#*Kz$lL?^6k zdhT(3Y4nA|A;sc;c$for!z^MQpe1=}nuGl;b&mpfoTXo!bKde($h}Ec?W*&}hUAI2ZhShZ)j;MnzQ6#o-UB3=;5C4bW54U%EWk5c&M|@>qF+|GD zai>14x9#GnqrR1vY9y>vWPSvTo!zH+-oW9y{N=QRb(EiJh-b<-2%2zToAzWi;@j(v zoqZ$K-%M#-xLcFiPl>^(WpfTV*ArBqy+0lv-K#l2Vsmm*$SYlt&lrU#XWv|DwiK?P z8I19jUS~!f!)%!}X&tnVt1!O%I7QgMQ}=~>tW$1}rvPt4!WQ54-(8 zdQDfa`(e~LBlVfPJ+?D2r(b;g{RnCn!EEf+JIoyFubHf=`oNi0rnMue;S|=C2KZ*cDevvvkLKj0eu0uJY}K#-dh$h z^5H4Fd;B47^BLJRD%-TIj%$|QLNC)37D_oG(C@z_u*&p2;d=YLn6p_%eqgg>hTy$d zcJhX}cvoxG(O@zcL7dDf`gAlJ8Bz=%+Q0`LC;(LgT0#eMg2qeTRg zW)OFR7=ghZ>xTHV;ZdmgYf*>FaxQI6zEhIMW)KBXF|+|AdgQr1t4K=PGbzUVABleu z{uobj@tPlo(cOT{s4cAb4Zu|g_mXpr00TBU@sE0=@Z#Fm-^KcFwQIK;eys(?w5)zo z@k*{Tant4IzJU0X@OxU({{U2chQr+hb2hzo|FFo1t_)f z?}$8E@bNqutyo?Cr{U$CO>YFjUfx))CRQ?|0MT#W7#0I|806P0`xyK+y@SSD_M5EO zrM{?U()8%e*HNfQu8fi}-drcm<-^YG_Udt7yW=0(&rQ0MMe%;Ccotjl4r$jW#w$)D zl)?)GF7KS=lfcGJbG{q+MQ7r#j(X?8?ORg&9-HI49SB?9!w`|6jLJ0m8)J|QEYb!X z^eTJTrArM_$x25%t?smq-E+iN`u44K`gO+mR%TQo!vFyz83c|ojtLc=ab|!CH=LTA zMfhWH@aIWS4%rg%Sr>(5F@@i?m=+*^dmFzRqpoTu)lYsifnQOEQBl5lctc;Dh|+Cmh!(j}fk4&R?@=ih^x^Z9-+_^$6zA8U>)I9DLY zX&Kx-$#PD9n5(Ib!_o5!ba55c;CV$>y1#w;>_|f4j zDW$cy)g!rdIL)y#D}5P8-rlw4TAq#LPa5l9R-0?6>d!2{Ayj!-Wd8sW=V;Gzab0hM z{{Uu>7iwy<_>Ss5HaQ5)e|~Ipk+g6RxjpO1shriRK1x*EJvilbDbwe#SMJmN&A$(L zlTGpE#L1*xhL$A_EK(s-7dQt8sL96}$9|%3-Lxq_1)Y)wq^Vn5h^b;{ykSjCCH=&x(3xucG*RYi%ZFOPk1yR?-qU zEC?r_hZ(NeM-wW1(~XZVtHXPKT2i_)V%F{TFA(^DS4iGJGr?0B#GovLcB8_a9>O;` z`q!v@JiM@q^(5By7J}WPB1a3Hanym%KcTN8)O<0k%khkOdfMR{)54l9j)x@C6Si5R ziC%2*GJM$_l55{S9QY$nvbwRn)B?UGj!A^d3Xhl)JAyDhJ!`iwjM{pCTN+i0i%CA8 zp1-N%{{R)WJu6kxuQa>cwv8sWktUNLb0Y-fuf8$bxcwp_<3+LYR-v!NX4JIQ0?DFO zk?tV^DdgRe<`U7ggaMEx1pE8{0PQ#MGS2f=zh4h6nYmeAq88T*VVN8TF@m{X4pbji z>5y~MhYg|6_+{*D5zBBdUy- zv1!X){{XMU?ir|fLgw#IpG<~XBWdF(9S#W3`N!j2j6Vl_L!@09AtGJ~+ah2Q>t8_Y zItGJnq*~utY6)?1J-SOG#10}Xx!6g;+&Bk}XFTy(Qe7*=VqiOtmCG!;RpWNfXl7L~ z?$)|I4^sF+lbS_r+EdWBMi^x2RP@Cmp+}ceQ{p7 zpnlF;CxulS()#MIN=9410OzkgeSK@vG`|mMIwEY*v}beC z!aoSeVb{EUr$-?Uh4t;}P*$ha zwez3+6@$i}5Yhht;F@2wMwhC1p27>M{s(xn7;R*_K_kfeJ<_U$&PgPJ(!6KIAG9CE zFBQ8kz2m$2QGpKxGZ^)Sw@IIg#_J0L_&YuT70~~FlcrxBu;{*LF z{{S<{Nd7OMDyQ8*uG*Y_VZ{WEMOe^95(Q8&ss;cam51Xmh8_g*<&W6>RpGmPk({iX zcF3omL#`Nl^{KpL@dv=Z0n^T><8K#f+Egl~gI`^wWx(sS6P7-}6J9Iv6aESv@V~>p zWv77j9Ye%ZplnZpYi*JK+=Fra7oS>c;B%iAf8d|mlf0UT!p{)LbePH0^>^~+2Lpwb z7i)bPN7lYy_<`U}bHN@ZxbUZow2ADmwEK)tZ90rG1mTs34y292l=cFg;r*?q(&-Q}&58>~NAG9xn{=uWd@yCIx+{d%bj?y@;z>U1d%LbIl+zfy?>0bi= z)SnKoJ{al(FBsh;-Q4-p=zl6SKL4gfKcj+OeQ;#f|JYjv(eYxbL% zQb|LStF=}ak06{J1!p+tmppS{lHc%B-xcb|_K&~Ob*ujXJ5#o`v^Pq!7h71~-Z>+; zQov&h!Oj2#%1>O^rGk_lMRSi62{`C|2Q~9+UJmfx>tiRwT6q{8VA{lS{(WoCz9vI) zqIi?SUO3X(qM99IO)6=Tc}BWblGXE(fR}c#oSvJ{88z2@E!6FGzk?nSy0<5f3|K`X zlpw5;Tcl3B`Z6%2@ppwSd~x9|Pr;W``Aex8iU`}v8TZEm zxh+#%xVUyuoq7@~<%6a6k&m>gABIgBu~}N!D2mn3IK3YXjHcMzxtefa7{Q=7rlcsPBx;&+KO9|=e0 zq=7s`ti-o0tNN7Ew18{GrulZ0P%`dF%f?1+}jU?lb18wzxC92!L1unzK%Q1YTZ)$^5RSVRkmQY z#PS(mce?Hg{{R55Yttfz-4u_yqoy0>$3qfy>6x2^vG zM9k*CfsX$GwZ;#raZ7KlX|Ffg#=B@=I4Ulbkbar2lT7%{@meVsNPZ_q3ZIpt@OFk7 zf8bwYCbe}Bj6WK+V4{E8H{u*<4ont4Adb#6?Y7n!us)TC)^Rd=Q-6o~k@ae6d~5Ol z03p5<_(So7#VrT?Bi{>rO?e&5fd$IwQ^#)E=-zyau`2%nv|KN}bgke7@Iu^P{7(46 z@b|)hVU#V!j;G@&Zm)+=yKSe7mt)V};P85NuR7Q5tvppSUHHO%Q(K)fR()^8H`iyJ z=jE1mUgY%ZX_|ZKx(jab_J?I)LXb^`lyDRECg)R^bXV$q7k6s;{QAN9*18Mgba@yU<@u6E+ zAxtx7Ktg`-C?!BYFL7NLgl~lDvB4@jgVP`9HM!$23twv=4{!WYr^FcO(yY@ErP?^Q z?U}-T*8&M8EUndYM<7=QYVAWtb>L}UrP<&A0Kpq|-9ujZd*h!5&AxB!e-hf=8)=nH zVmpgz5P%Ou=G(D7J9?V?N^9xtqWdliV~vV7kH~iZb@31U5}V7>ejsa}Ftyd%b@4Tf zP-@T;QElZ9HqVr^5W;9!eA`AYlK=zH-nTaPw~*rEFvMpV?0u{AY)s!d_B3G_#O5yV z?jP^ALF_87_9rB9?^+tJl+cX8z~`c#4P>@J8P7e9b156y6PY3yB-fVy+>#@H#a|do z=bwe1AnX4CVB3oHp@YFS<=?j)(XZ@X@qR7qlkm619A}^T2HaJ1GI>?c(9axy!9czq z=|$~)1L3RfW-vVNbl3Wo^w(D|etVm#46-&) zKQm;Gp0z?*9zt2%l6_5ClHMdxWOW(rrziBNPmmY)VafjhYXkHj<3o_jlSJ|`NYIjf zJJd}9QJGG_J07)aLd-C{eJZrJu6Zq=TAPaK=e%e3DeVjwGsuuDqs;5a%B&opQU=~f za1DMPd{psfqw)LW&x-ykY7t3|cVD^G5;>$SW4C7_2+2K?6^%UrO8uh!qc3l~JMeSG z-YB%VF|~(=Z(i6U?q;2#c;isJPIB&}>U}d`l%KQT!ef8q_#aUP;)Y=?$f{YSRabtB z3u6(p9iZ?z12yPi;}Vrn%V4^{n~9$SBeb{aL(NR!x4a}<%txF8wb)b;dmJ9Mtl zx0X*FW2rS)L-2*~g8Wab_+sMB!z4FKWrc%$jAKLmLn9#Ppw4<#y+{jpXwN4#`Yr*f zQdd4_5f{#Lo+RnfJwi5!~WhqV)JaXe}FQcy$1GUEg1jg9~rz{PX= zjmM2`FQk|L7VHmk#<4RhYMvF41IL@;i^bje4Md8}m&E=hD$8+m;P{wuHuwY2 z&)3bpIs8GXZ|!C>5?JRs#bsSs%*~QdHOD#~IiKFd>$Ub*+=$@Ue0^nhZ)|=g+gdjK zpwYYurdhIjVaiCrgWok@U)6QL5v;Iy!{T3zwaaOgES6fYiRSV+>4@$8rToFECA5}4 zNaCp6*|Rq-!K}WkO}}}!>e#)!lJ{blqFh$ah^T!KN{@A z(}W&~pKB>Ud7i7`XqoizV@!tOTOIk$ZRzmI3`RC%*Eu!M_(OHRotL=U7@Ptzf&Oz> zZahJ0ZxKbi+(vp=&{Ii7>5i!M71FiV_+M?}du>9_^42@KV7#|Ulw4aMHxchpOBE_| z2>@ULz~tas=+|1!(pXyo9PBqn%rX2q894OE>0JJm;{7Ejh_vwe=_q@4nH1rH;QZWi zp1r9e@#5*4fYl#UFDQ_b%_${`=O+i(pROpDsCH=b&)QGHdZvYGCa)E%A+SH`M1nU) z!~o!th65nv9*j>Sykgr^7gGgO!u1vPuCb_T{xhHLw`~>7(nj&zTip%*Y+H7aaz0^# zR=#ie&+uwrhB~rqULP|{q25cj4aanra-5$f$m*m6wY!0X&tD@Ghn4P)VF*cijM7#@ z5s}E_J$qMOrNcCl50#rI(z$N|TN~CMXCYf7u4~qOEvDMT4*6RixW_%~nlz;@ha}@^ zSs8YkB-6$jAT95TmOl>zC|O`-2d?48cRFp>mXUp)C_(f%sbz-I+`7V}Jp!*3<%E;g z#} zXzHv1$RPGP#bxZ=4H|~Y9;xu=cDQ)Mrb~t3j_00h=%0a_V7a%rjpB*cT}~J$Ntgv_ zq(xT*9PUyW0y*H<&OZqeZmtEp269t?gOYRdj1%?mUsn7E&}ygm&o|vx-IH_uOJscDlK8WT&;Gf*VdLAwfT%k6mncAIVz0URbZ9i_ z>|tw_jyP=rJ6S_2jq)DiyXZbU=y$jA>B*yNX}bVCkgM`e1{OAAN7ExOIa60I`?F$iC5?{{Rei@qmBo9XO|UOM0HCEy6}I6c`-* z&T@aHSCZywMsn4K>P+~dT*lW-w56$J1`JRHR&m8-He4oaFSrw(WXukBSSROz*?dmwDI@l}F_OD6!Px~x(gNZhJ_c;g`STy&uctE0jGD0p*I z@h^k*4Gz>5N3eEs5MwCux{jGSEBx!^uh?VuVeww2;vEg;6APPEnt752kyS~GdlXhe z2IefKvJXJVoY(DlgFoP(9tE+5WbxmKrqm>OHq8y3LL}UJ{LQ$q>)3TQ+k7wmk-h@_ z7u4Hb@Hc^@iv6MT+V<*ao=ka;`5Va!a_5x;fIl9}72!@=oVBp?sI)&8KWlG*TJOUD z0NOdMHEl9@zqb56ZK$krt_Uh#1_LCL2b719I+NTJ;~x_=Bck0wwDUSY$jAXgm;`kv z_=jO%tKaZiZvg3+S3eFscp+7|NwqCDc>?lcXychjt^r5m{kr_u{h%~>6GA%0t(%)$ zS(e&Ke5o=TPK*SJG3wk>}dZ#y!=HQYJvpx$Y{AngdSZRZl03*HZ?cZb@fR z>}kzvs6hvz;yiP*(1Fx-ey6xZv zfo{CxHKM{r>P1UM9)GV}1b@16TN%a$cfSODEn{urTa8}jw_IM`?N;oN#xN9T)ytFX zh4ij+OHa035Xf=UrEch6Cx=DRj+QQWwY!xu?)#wpz+jJhrA{>UCY<8Vi&@vLwE0%f zHe!Hu0~M6|^`pe>avPpH*NpsC_|M{dO<(NZ7D&MdFLNwg$j9)2c>3qkulNt*R zdwgeW1T*Im-9QQnMmn-`0rwal)z2(%EcsE~=~VVgYTtR;>Ruxe$VxfLKc#cm{x&Oe zBNNC0JweDdkK#R5{N0Oi3g@UG=D3d-c#itk6AqU*?_?a#c`=Xnef|4=c^Fm3)krAN zsajUOk6F;ZD2okAVvgW>k@Xw8clEBD#GWQkA9yQ6KH`!)r&cT+ z@_GunR*78Q&g)9mcgBd)@^Q$`ZAS|{Iq#8zYtM9DMgG#hY^NFSe=77%C6?;lTqzmn z6~|VmF{B!M9sdBp^(R~MUNgdi3HIdw09yKs;J=6TZxCFWbs6PJEJ$P#2*!NPS`AXE%>EH)Gbo&8mp^UkrF(z`h?drKW=eZEb<>S?Bo_0HYETGk_04 zTZyfC5F1T877@qND|qmO=of+CwS3h-#b1sZ+qaYAm~^<^a1%??VO(*H@0?2@BzFuk z+Z96lL-7ZSj{g7^_?uJI$1CM(ck@jjUU3_-QPZdu`TbgQQfJdfYRAw%A^6GQPY$y| ztN7DPwV4zawvzrfpXeb%WMk|UpK9dwFWQ5^(La}@rm?BF_pG$D66dfc=)`@vR>gU( zhk-QfNW@mQ(V`E#8lX}63ekhZHu2yHK)~ycDq~GO#VUts;O~vP{{WBl*>xQ+!RJqo zJC}oQqj+X#D~>|O6amy6n&-c3>&-&<_Br^kCDJMr@Y7x_5RyOSA3p;UGN7sMSt=zO;*IqBuLM{Hz@yKmynK3IdS#DbucyPtk5M;2$z9_IAZ zZW%9u=}dENAs;B|S!2XDtfOcoX9p&i`(^-l3}fp`&7t!m`o|n?n4~M}2SO{n_+k4( z{8{)`@xkHW8BaBmas8R8vADO!K_NpO(f9kT2R$pzf3@x3klm;{q&UE0J!$f?T+%+F z(SP8gdab-sCyKrpMR3_3blPR{i@#NlK-~vo{MKKMKj5a%*2t~5izfnem3}8OYetw$L*U}$+o(O=8UTR=*KJx z>KLv77{j%R9{Hl1BAC4IkKg zjn9Mitp-R@X42B=!*M0IA$FNrK3KQy;hW_Ik&bc2eO_A+W|K#iUZay|$~w46?pY%s zf-}WrBt~g*zW{Zvo5pruWYnZ2?%w3&k9z0g#Bwmteg%Do9#=<=Q8gj#y9O7vQ@*(< z3WhoEYD=59G7!H?%G9n83JDoGCpG9txs#ej4MS0s0+F1P{8i3sEi|ppNhg}t)Lgl3 zgw|xi@}**C`M-o_w^F&yQ{H9W7eyk)uVlvW;RII|;(H6}ucW!PxpkK~Br*B8#t-RU zy9S<-={rPV7LPb5zAJ~+G{rX#uNNhW$Q>)5vvvq5#PVy;2l#_f)PuZn^8C9FI*&@% z)chVT^nWThK44sy$KEyDrG!QHxI7-Xrs}pTEg6t!1E$>9lRa6}3jGn`h&5Ez7fnlt zC}hBoJP&H<=kOetiyRMX#fapU!KP|9F9(U*b&Reg$WSqnUbW#322Ez#JB5e?<%e(O zSUAo{TgFNWa-+%{;I5w>D?F~^L;L`A73qHjd@ejB8R9~wU%ik`x z?Jb{ERWFL&@t=C_brVM%+L2IQv5y(YzG^5g2yBznp`zgeu0h5-RZ>_sb6oP11aw+N zu)KlTXOWy&r1(PMNg5DI!Nv(SF} zF4KOjq0o^oRD6WxvbY?7UwZc4Q%OscZ*8$eF+!~xgvMEbCC{sL9>GB3yodI6ihIpj ze$Ii6K?^E!RI@fX>UmRM`ucyFIaCCNAY_iX0=`=~tkSj5putm1TNt*wD(oM)1+P7+ZHwg`Oce$NfWYD^23U_GO!$6t+u8 zROHjAjGd0l=rh2s#^X$71c9GoDuvyEb;i;=XB{ha+BjsFQ=8wYKnB@~$2g@PAiad` za`?gHcY4&h()Rt(PvKNAbn(%XIO+{tT5nUHPEmR>(Ri;5%eM!isbld{F~;m?)YdiK ziHsHlipSLAo)9F4M^YObNR9Uh7wt*= zQhYZ3kiHoYh<_2CuWzplMd8m5K`2@ENt9&u&d8G>yqF+l0g^zk9Q~5NY%7o2OW_u+ zt$4EfICYIHSu1;MWf1bBx1TQoRoDgqS=XUIFH&pL!PJtKlQdG4qjq3?cG6CVW<90N0(!s9drzuT=e{{6hzed_kw{Xi=q0Ic+YkL`7QQ z#Q2UzJs9k4XM#eEfnGy>I>b-Sj%)2Ol6;8sYx1XYw{rP8WjQsOJci`(D%6)zym(`p zr!<6Q#ya<}N-~kk`58u7fpfTYI5lHOvj*TFEMZRJ$LUJ37UjFu>nPSJOK!$`5nV8! zQz|Bg}d(;|$wXwA=ctWWM4WCZ6jpM(JS_g$Jo)wi|ZV!uh(?#Z9tbvI6xaPSkW)vQq8&4_4L(KMVKg6-z++ri&*0*B0-vE)1 zUbWzU6ZnsDE%8KV9?#yrN5dW}y40ECod(c=s{{Qgr(QJ`(>N>Pt5AOOH)egr^VHO1 zBcY}(#BRg`PgV#s+OASoIo0}?^mS&rPpBs~-}pjTiN@k^G5qV#G`o`=>mu~euUhT= zJ#tyqQzVn}Z5-DPN}RDfu!+h?*B`Q8n*+jc49=6X751;iLF$d|cNgu!~>4dq^%V;4&?$q7Bo?2hFfE#tzU(-JEe>R9Qm= z_V8WV-$8S2a{|w4cWEe+D~On7Bu8EuSYU!W=Dt5PsO2lO>afwYE=DcM832BC^|#66 z^{ZytGB8iQNfb)G2NmF*R*EY@X_K6ADaOkuKK*LiqJi>{pcLDii(5qBb8?Z4;29h) ze>$aLcCmlq+#=h@R^`dW_L9fffrTtTUOyVE`*y+?_96JlcIW;rSBQE40Jv?%T<{z> zI**KOFLbz`;us5yhJkklRveOg4xXd6JNEOnX#W6V&y1`(4}|_A&mZ*+xUE)+nY(i% zs+z`C87sy)s&iT^3}fqEEY^SznSUCibElvmD)sIwqR8|4qRwXKz^+K?R4#0lj!60w zT{N~1<+ltf0?fqVDD@=t72{tO{{U+bg#HM+Z6izZR-G;0(i-MvmUW4PU6jR{TYb(dOP^0`PLX%F{Na!qFHUKZ9$k^PT%lgJ-tZ}6{=K0kid+Fyw5 zW^GUQjPb>^A--#U9pSLFZL)ASZBvb^PbzbflV26^M(dAS&+Cv+V%}XjE$n`wYgz@>gfic1u$xQ7nJy};z@bpEXdH(={C%Ir025;g`_!&K` z^3&qy?T_)F<0aSG^=}hR1O?k<7LH?788}q{?Ti3%@&)(Ja5~3`?=Ebk(vjm+b`U=fl2vM zM_%knW67?s_6YdjfAH7i44xUe)ZRM}71*6NL}&fjx!fAr*mohpKzn(nydrtaoNhlr zXt2Jz)2|`FvYn%z306pCUZ~1J1bqmlhsMekl#fg5(Dq!3AEX-2vo5Ia_fxTx?)=}w z>^&=(y^~{?W+$9-YoG8}#Q44;ctcL{t-Ijgz&_TS^X1$i+bW;<7FcxoSxYt*^m zzfQuxO~F-FC`M5}9}?7SIK9y~oTTp0N@Lt)5Ua`ds13wQ#Y^<0lHiDoBJwNIgJ|Y_ zy~{F4Ba3@BJ?aT{g^CiPiypvqs>!Gpw;pnl>MIXi)Y%oIiNGF!^sQx8q+srHpAx)j zbp);UeDE?z>0C{p#Sa#01+6XZBw|SjV?+K$cL|}#tX<~i2?d7i^P1VV@J5FT^P;!d zPw=VYxgR{;?rlo877Eji+2!`W0@S=wFxEU%dg3!C78PEj(>deQjQ*9;*?cANv?ZCe z$W^%aY)>tfm>ZLP~3;9%C&<4!N$J0qFS+_ct)70<)32}Z&+ z(-8B>!O!!py+6ZR2AO1#+u9<9OcF<9&JX$RTxH*nH9xl>+^A4aK>q;i)Uj(?#-k~@ z7p@eJ6E&ozgf*5c8zp<4HmTu{3Tkl(?!qdm=@|p`tjInZctvE{9jdq|=4m<4)6%nL zhT_?T@?5hL*(Y(W%^y(np;VRnbYg4Is<6|07|R!piqb_LSK#-D3JZ-88+nv{Lw}xX z9V*uMM!5St&&r$<2^G^D;S5Bx3<1|Qg?p$&cW_)DM?s#|hb=fQ4tI*hR92fh3meo` z-gzW?)8^C_vZ7wSvs}D-lf$2wfGP26OEikA>`r*iM5UoIjO2Fu3&$gf$>ef#&TG&- z4Q(vigfPOJoty+u?>88)F7W;4Hb35B_k~>eukmrd7l&&xj+9jV(T7}3 zHw*~b87c_Q9z;E>%En?;Alp5B1vfb;oG0y5@%C?upBZGALB0>8=n$@(r5LahP=uML z7$gxSrHDPzW6w(ZU;YWn{{RIUyZA2!zrpW{P~K}k5xH_S*de(^xY90I@#MUuFOwlS zXx)OV9l)>58}s_k;o>7{zy`W44_a#%Sy9*?2-<7o@ipaEN7KeC3dil&gTHQn*>}bM zBt9C{z94FT9+)v)Ug#0uKJ0L%ENQ*sai)o z+uaBJFu%rw>F}GxfBI~=u8-jd?FaB*_J`9J@8M64puD^?2mZ#pRf6?ZCBrfyEVHQE zb0jSy5AP0@hx>fM2ka^Ft8gk;;V+2tKkgZET^Ed_q0XZwJB zone9)%#%$cVPjF$lS}bW;wOTB4EPUG_@D6;Qfpl&OjYwdn9IvNuEAr1B>p)ahyZjP zlYj{yoBsf{_wD}x@mJ#4h$j7?d@ZXkiF>ZvJ?_7!*=j8x{34n(TOKu;(;M!t7@%;( zl}6eXcZ$}nSiu~ad_1P^)`xxjUH;bhzYz5~{0rbMUU+;vYcWaVwUDCTk=9Ay<=na8 zMyF`%#Mi?=8h>d|3iuKk>@@r6X1@T1wuUfp+>9J_7#)6<$Nth^v?Q8z58?j+4(hA| z$K{!elG{hiyC;&z2cNDh<;_=Gywz@A;^KE^k;^-~Wtg6%n)4?&HhVPSptL$~h@Tn! zVetm#n^x5r#k(s6Y84lZb^^Hq^G^LqG}K+qin$xd1XxfqMM0?Rc%!mH@*KIU^U7sn z=80}gADf@0LRg;k3voKpMHJTKJ&*QR@tD)*zVLpdD~K-7pJ>B7W1Uy#2h(znzNiO! z_S51-PE zaSmx6b6qox2E`3_;Wn(Ftzssq{{V5^=iJaQ3D3=(n)+zTOH_RFsyuO6UdT_BjrBE1!-LK_shvRPl(sHucMOe{AanWE>GcQMv0EPEvn>L| z43CkHDeWiO>`sJeWygYH4BTkS-74%zHQXkEy|EsW>dv2LuVxKgT0 zg52a*bsLe@Mo~=Wrh-PhY28U1vywWRb%v=LU45Njl{o^oPMQ=HEuX07soD5h7f>@V zC7Xecl`0(%S~Y3%YRv{&FChx*SHHDgvV-i=frc3ATRK;Uf-1`+XB{##SH_hSFU;5g z_Y}RHp2r1R&`joMj`C;n-574^k=CL*LtAD-xZ@pbtrn1=z!}d>nxTJb8-|R2m7Jj@ zVyh`T9G0MqjAV*UHCd!n=-mA(&anxCPbJfwoEoPE*tgEc!6yeb&r#W2?WG4Lq10(t zP{En*=U8ElOV2Z$Dk6-tA7BALg?Nv}kBF1}NAYXwaI2+_vVEUTh5D=@leqr?w8WM_ zTyz4qek^=Lx=Tah4KCr6%v|aW7X+!nSo7BhsmE*&QC@WmF_-{**T-g<#m~r(s>?8b z&Y!fF?9#Q2Ha?YhFO&rt1e&P}qAwq%T()#6^EN)U;3+oldUCP3;eQd_Xm@d5K_OR( z_bUOMAE%{d`0Guz)3p(+=~n(#jrLv?Qn&!oZ7GPZr{STzalu%bdnc^Tl=ef^fB zqF+m;>Q=H_+(6|ehCzl?=tVJZT=jF4SRD&v*FFP&(|;5`1!{?V;13abFnP-)+Ev%j zYcna_7!SP@gOVhStAcZy{Tk4};IUAAfBlPoD*PJwpA47U-S5KPdeRAQq*(8wchaXt zVCM^a5PW2uOsY#Ukd3wZ8x7M&dYaHpQJTV7o<={qaHKKF%8}QuFmOk3Nbgjn(K3pW z`UU$*{{X>CziLm~gW{H(pm;{>PSv!34qr+)dYB7nPgs1mYHJM z&3MO;d_&>yfSv}p@V1BI7u7sPs>*JBQ{pC@%$HQWKQof-H+e|Rc7xYD&PmO678)*% z@PooqX?ir?W!=TTHGO78Q6<}flNw`~;8Varery(OlgG^87Cb?Bt6yAdH!`*h5g5*R z&mYKsRGi%R4n+rOtqwcI8s*ltsL4IV?&P^F%-JN?WdxQap7c^Id_<`xoLHJ@QU(F$ zl$;FE0~H3q|DoU(EvW>uhI`KaW z-F=f4Z{5x|S;)E(atWk8@S;bkvSNk#Yy=TM(=SeDsq+Zz1Eb&(@oYV}#tcIn$)1 zfHT9-V~V?Bq}tm7BgPBof=5cW;Supnmf|Re(%7nvHEqt1Z8WTCT1jq@l4QrIH5JV8 zz6@iY_^hYY;zDvyH5JaW7nkz5U!mmEbBs*hx|eTmHh>YiJ*uU|;HYE4$8PmR>y~Qa zrk@S`DtemE*L+uN3`HW`uaCUn=hC?<)=y(vH039;S6{pyVOD;6;MP#LxVh3VwQvk^ z+FHAbHs>q>!2If@m-6cOVIz^4Gjr>T={!MiZ=-xSzqgTa4U~kj>R6$`{OifZPF~H} z_OPkbnoRJWVp%RO-r`p!osQy9Q&kl0IjdJHX5ID8RIksmO}eeK?kVX6jSD9w31gbI z9N)s@=~S&GK$}Nevm35CADwfp!K>_O+V5n-o+^0Bgo3#TJP>+SJ6n*EoVft>6=f%m zPoH<)9<`!uhP#KvJwoTiaoK7YF@FBi+wAg4Io^Phg!jnF9G-zk7_M0(k=qEQp1@a0 zJ=!nIMnUVEZi{09)luzK4CjONscP=yjO?s)(nmB05}_IO6y=zR*;MdFb^asK;=8qV z^1yJpLyq;uo()S)8YY?cFU1{2uk@tT(bzr1XDj?5a(|c~jeOJbbS;*(9+e!sw#B|s z1~!sT0sIH+Ur2bO%IZtGZ>}Ul%=;~^;~(mx1MfFKd5JuF0be(KQi*SVAZllE!pN$i zka2`xLVM)n-m^}|l6Pk#PDSoTSeHz>!E}j;9Zo6|rFbH&hp-{U}vI^X_+&i95aZSq&%(@*Ov1InLmw*g6I0B;5wW+N~lOtef01;aE_TuW?#t7U8 z%GJ$X!091fqr9C8$uS?YJ?p*Jelj~Y(5J zw7(Xs0Sk=iqaJvdYCLcnbyavrf}H@A2%woeh2R-W|^Tf}AvUlgWVgUT>7VB3+ytm3aWY%TYuEhvk zj(-~Esa`SM^r+xs`Wv(OghmXHHcmLf{{T6x+r46KNy6au;FH#|{MVVcZ{xVFEg~nl zxj?IcI-28_Bc0kOXVu|GH?i3G7eyO|%*~uI917a_uN-jvG}NZt!^?^=xbK-!f0I-m z9F7}EfI-LulisTQZPem};e$f%Jj<;{7}at!v=+0Gf&`Y{J zX4nY{#aF$yF&)5l^c7=IAoGs(Vt9PiAoQ<+uJ1GM)`-l3iC~$n7?Un*i* zdLC-@Z|G|fWsrem$Rp`WToLjQ!k`R&O)t&&s1W&=%u$6rb*Je*WOwNCw@me@_wkZX z;%erXYx4Q$>4R4tNR_N~7mSiy6f2g;7#$6H_2fo7hf=s9jdo)7)Zn&$qPgvM-3-#Q zjxmsb4An_13Yu||^pA*qd8Z3GRYIr$?)kwgf6wx-2KyY|A=mD2q-H*C!!RUrc{m@I zD}PzPyoDYa8$M?QwH_OWD{YqrGFbZi;<=uOToQYeTWApJagVjY8*=bKu2aUo8Wz_L zs942|c0Cn-=N<9tYtSw(Ew3Od7!o)Do`$j=1jzQ&5XwOWW2mg-IXM>L8)(llDo0vt zjyl$liS*N@YEJ@zx2j{%)?p;|t<$-UtR)mtOah81paQxthdSue^`U7o9#zp*Iqbmv zr}>Y^+PT_vZpguukU`@W(}b?@_0-XwT57E~7u5H?K0)M_l1$|ADYy1k?w)6sIUJGR zxvv5EragB|2{fQwN5rY`>OGGij%%WMi^LI_pF^7cFAH8Z=_xL!z+$M?p;^V4w^lLd z37)k?i7nqdk6u0NdPw6!aJe3}R_4Y#l_D{N-!;9iRXUnlMN55Nc-S!;vDU4_t|ZZ& z>yJ;Htx=l7TYduZRLOjmRblKZ9n&`UH0QCadvuHdSvc*3RT}Bra)3hXRV-GZ(`r%jkH|Jdzn8V2PU*!WNmNn(RI@cFn@h#2tPE0|zL!a)i1L>Z> zjdJGo)jU1BocUf6PZ{kWPxxY%pUy^m)|@NmCkxPX&1Px1+n)I~ucx|$uz|?yUk@jF zA5hF|{{Y?G?E^XQQd_xUxtqNvw1F?SsN>d|044jJ3XrjIF(V*T(6JcVnvD<3+N@iW zqa&!MmC0_zQO4~s1x_>GwUN{yKzJRiJy}{nbAz60cOF;_#GKZO$q?1cWQK2)^{lO6 zFcNM(Q2zibw$~~bAoT52bt{1^PFwzYkSJ^-ntHRp@rAJRgu6oFz`;LS$+o&k)FQDS z^{L{^#Fo@Fhxow@>A|jMTcV{~oM)h}ZO*l5>})OZM9Ro{Jt&^x<+m>!#2)_jkS~yf zk_Vv8M>eDv?g}|dbqc;GhwTuq!SgR9_r-IaD|+(jr6lK%O2)j4%aok;=B_E3w{|pJ z%x%rkjQMKeOM9ASdk@Ahg|^=b{s?$~K-F#Ji(k9FOU+dscKJqFoQS#SDuN(;2Hjpf zMh+`_v?@`zGO>jWMI1~y=}PMDY29uVQAJ{G6j4P0UC}k0y&Cy1Z6qO-@-x(WSEcxK z#kQK|w(a3$JhG9{*OS$~FH@evVDYgSJmA;6m1dH{%a&Unem4UQRBzPv^)6fQK2CcK;WT7WK zR5CbofQR2ArN-x6DoGjBLIg)3@l>QCyZtLxW!OkuD zbCFi0)!@@@+G!hs+Z|0;GK6&#yxo!|@t=tXlcAkH-e2C%Hva&+z0dUgYtH0i?T+Nt z&2v?kRK07dcn9vN>?)i?FPvA#X1Kp?R?B327(6hTc0>=ooY#ol=27k0H9$ zw(dwHJ?q9gY*y7Ao1yfk!z(8s^`>eKo1@P_DIpt}1H}X7E!)a={M^;3CHZ=vVO3XR zuwT-wTcMG*j`Y(dq{|RQ9rFJGrAcu%2E)Mjr@BRL5F3u{bH!4cOq>?Ts=6gdxaOI0 zg>GsKjD4O$dHE0F#Rfz}O_7=4kdB)V@~Lt(io4M4yhQ&1=ot!5(mrEc*`3(!$vpQp z(fEepX405O*yJ87mr_B`KaEN#dlCjg#WkfndFGMWh z+3H%(n9}H;93R?x#IBi-C<(WPvZObeFhwcUppf)ZN1th0KC7>4*18slr_FbJdvK6h z+S{h-CY6X)MFXiM;=al7?}D^%*_Yu$cqpV}S#?{V6<$XBg!hAX5qZH#m5ghS3EbGr zSHHu#OtVaKPvDNS^zHLLXNt4OlI6FiuU4bwg4cJ~PTQU#`)qioO?z8~Czw3HYH4O= z;1(c`ojZQD;D?i%?|wb_p6^!iLDFu)^KFYsbV&#I(g1enKf;1F$7T=fToq3c)TKPi zYM#qaxai@WH1N4CC{5k9cK5yA@AKR!qKfd3cqpQZ04So00G`_H!ow$_>sxj@`@(ld z>_Hsl*E>&&cZ~3O^sh$=m{!BR%qwBxRcemn&&5k5YO=n0z|W;<$E{hkcv%K98{SAFCA3Kbfym?h}xIJQbNq(;m^GK=P7 zImxHRfl<_odK&r3Hz#&?lL=f5W~H@uWh9){R&4aE7Gwy?q%AM0TI_>6VCIOVA%@e< zHd0K4p5}S2sKP-NjRuQp^Ac z6xl9ACKR0gD_g3^Mh$JnLM<=H_>F-^~!v6q+ z8fSzQJ&bK7+hj{QB%B`HV0Xt#^lyk38g`ZNJH?4CaXj*PX7mPg${(}8OdNh-*Oy-x zCp8#%Jt{b5$lE?X)F)$R!##1HYaFoz{{ULOdm{ar6fhhN0aQQ@)STCiQ+!o>p<3;Bq`0#A0RSlHO0UU0HMXYxpz&016+&p&+$7FS(x%kJ+KGpnCwOmhH|Bc!~9S0 zlj`4+>GyX(JIXK^-Y3nTJ0H`hNJpes_nOu9OIzKeo78Xa^*iac3;UOvdF5#)mPX4v zu_UoQ$tN`h6j$ZdCn}P1XX^wI zsla|c4Kj*pwDbbXUk~F_K9wroLPksTRA{ZEh^Zc=@}_95{6mu|&!%cQZ_$nfgpWg1 zsH=FoqU4Ef?~@n=pK69nxg2d$RC^kVipo{0OLjFFprVQ^B7&5$J?SVNcoYETI0cPb zv}G}ony*vaF%h@7B7t11C*MC>N>@2zed#C}A~!>ytv#gel4<~PTAmfq(_7S13#r-| zGyB<9az`Bod!PQlJt;S2IL7YBNAQ#3F0=7JSXiJf2A>SUZ|}lx@)V5y-nl#gPXMsV zucZ~*ihk7XW$xj%&(R*`*cZJ_va(IBa|M*vTho`jPKm$)sxfE|qG!U4}_0JlS#qm9fhnPjE0h3iB~Ct34umSbB8g z^%ZoDH$bvBA~ZK7W=W9ooc89t&*MejsV{=OK(^|}1EJmTAaRc+>(ccZ}O)qBc*!a3lZqd*nj!p+~KgOe7TG?AW zB>G@~jTBeWqvsD){hmHB{0sO|e0*`^FAZyYpNQa}{v{$SI3Ci#5BY2Z$_$fw5&%x4 zCk!|IfBRx+UOd!R8;G^IEasRs<-m$3oUTSl223%=dXdc(SKeh@6I_J*hlGa^(1K-Ikpd?en$S=3f@RGG2T`Hu?sOV%leiwALq1(!`sKIs4ZW zH~h4jyPkk>JCnqdo=p^2$YZfJ@i>W2tgh~T<_ix)3xgHCEa6P$NvBy{{TGKS)_i~{t&itCZnTj>_cbwQAU59lu=yrjBanwBc!tZ zxc(JefF=52(Kheidcz> Y#z@WqKGacJI&kLL>Wx~S&FX*u*<*vQfdBvi diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index be2509220..2f494b0f0 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -228,19 +228,23 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, mo 'cloth': {}, } + full_frame = cv2.cvtColor(full_frame, cv2.COLOR_BGR2RGB) + head_frame = cv2.cvtColor(head_frame, cv2.COLOR_BGR2RGB) + torso_frame = cv2.cvtColor(torso_frame, cv2.COLOR_BGR2RGB) + head_frame = pad_image_to_even_dims(head_frame) torso_frame = pad_image_to_even_dims(torso_frame) - try: - r = rospkg.RosPack() - _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) - cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) - _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) - cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) - _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) - cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) - except Exception as ignore: - pass + # try: + # r = rospkg.RosPack() + # _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) + # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) + # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) + # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) + # _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) + # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) + # except Exception as ignore: + # pass # Process head and cloth separately for the single frame head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) diff --git a/common/vision/lasr_vision_torch/torso_frame.jpg b/common/vision/lasr_vision_torch/torso_frame.jpg deleted file mode 100644 index 6a49c8711f1a99d3f3a8db5693a26f03794732a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20771 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%0A7pmb443hVF;bhF?Sz{&o*F7$?pcfP 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

&2%CPudufs9cP^tfY?kwL} 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 From d4ba82c37743f7b34d31044b2650f7e48ccf4549 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 11:55:28 +0000 Subject: [PATCH 10/69] keep the saved model --- common/vision/lasr_vision_torch/models/.gitkeep | 1 + 1 file changed, 1 insertion(+) diff --git a/common/vision/lasr_vision_torch/models/.gitkeep b/common/vision/lasr_vision_torch/models/.gitkeep index e69de29bb..25e597304 100644 --- a/common/vision/lasr_vision_torch/models/.gitkeep +++ b/common/vision/lasr_vision_torch/models/.gitkeep @@ -0,0 +1 @@ +model.pth \ No newline at end of file From 8f29414d91031878216c7e65be0c9cf215b16603 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 11:57:47 +0000 Subject: [PATCH 11/69] keep the model file --- common/vision/lasr_vision_torch/models/.gitkeep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/models/.gitkeep b/common/vision/lasr_vision_torch/models/.gitkeep index 25e597304..0c260a72e 100644 --- a/common/vision/lasr_vision_torch/models/.gitkeep +++ b/common/vision/lasr_vision_torch/models/.gitkeep @@ -1 +1 @@ -model.pth \ No newline at end of file +models/model.pth \ No newline at end of file From 82910075816144e767189c9d6479b90e0664c864 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 12:18:48 +0000 Subject: [PATCH 12/69] keep the saved model --- common/vision/lasr_vision_torch/models/.gitkeep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/models/.gitkeep b/common/vision/lasr_vision_torch/models/.gitkeep index 0c260a72e..a6f7acf7f 100644 --- a/common/vision/lasr_vision_torch/models/.gitkeep +++ b/common/vision/lasr_vision_torch/models/.gitkeep @@ -1 +1 @@ -models/model.pth \ No newline at end of file +# models/model.pth \ No newline at end of file From 5654c3c377857d7b58bf3aa72eed54ba20be88eb Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 12:38:33 +0000 Subject: [PATCH 13/69] Cancel saving the images (but sitll cannot see use cv2.imshow) --- .../vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 2f494b0f0..1d4f6cffe 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -235,6 +235,7 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, mo head_frame = pad_image_to_even_dims(head_frame) torso_frame = pad_image_to_even_dims(torso_frame) + # cv2 imshow is currently not working, not knowing why... # try: # r = rospkg.RosPack() # _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) From 9bca082711e9ad9dc36fa1c57fa19ab3b07ce72f Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Dec 2023 17:00:26 +0000 Subject: [PATCH 14/69] Runnable demo --- tasks/receptionist/launch/setup.launch | 6 +++-- tasks/receptionist/src/receptionist/sm.py | 8 +++++-- .../src/receptionist/states/__init__.py | 3 ++- .../src/receptionist/states/look_for_seats.py | 2 +- .../receptionist/states/speakdescriptions.py | 22 +++++++++++++++++++ 5 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 tasks/receptionist/src/receptionist/states/speakdescriptions.py diff --git a/tasks/receptionist/launch/setup.launch b/tasks/receptionist/launch/setup.launch index d2b7a96e9..51f801911 100644 --- a/tasks/receptionist/launch/setup.launch +++ b/tasks/receptionist/launch/setup.launch @@ -23,7 +23,7 @@ - + @@ -54,7 +54,9 @@ - + + + diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index b9cfe1b2f..6438e4035 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -9,7 +9,9 @@ from receptionist.states import GoToSeatingArea from receptionist.states import LookForSeats from receptionist.states import GoToWaitForPerson +from receptionist.states import SpeakDescriptions from lasr_skills import WaitForPersonInArea +from lasr_skills import DescribePeople #from receptionist.states.end import End @@ -25,7 +27,9 @@ def __init__(self): smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) - smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'GO_TO_SEATING_AREA'}) - smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) + smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) diff --git a/tasks/receptionist/src/receptionist/states/__init__.py b/tasks/receptionist/src/receptionist/states/__init__.py index cc177733f..0f0114b7c 100644 --- a/tasks/receptionist/src/receptionist/states/__init__.py +++ b/tasks/receptionist/src/receptionist/states/__init__.py @@ -5,4 +5,5 @@ from .go_to_seating_area import GoToSeatingArea from .go_to_wait_for_person import GoToWaitForPerson from .look_for_seats import LookForSeats -from .start import Start \ No newline at end of file +from .start import Start +from .speakdescriptions import SpeakDescriptions \ No newline at end of file diff --git a/tasks/receptionist/src/receptionist/states/look_for_seats.py b/tasks/receptionist/src/receptionist/states/look_for_seats.py index aea147463..f3c96307b 100755 --- a/tasks/receptionist/src/receptionist/states/look_for_seats.py +++ b/tasks/receptionist/src/receptionist/states/look_for_seats.py @@ -25,7 +25,7 @@ def execute(self, userdata): if not self.remaining_motions: self.remaining_motions = copy(self.motions) return 'done' - pm_goal = PlayMotionGoal(motion_name=self.motions.pop(0), skip_planning=True) + pm_goal = PlayMotionGoal(motion_name=self.remaining_motions.pop(0), skip_planning=True) self.default.pm.send_goal_and_wait(pm_goal) rospy.sleep(1.0) return 'not_done' diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py new file mode 100644 index 000000000..bbf9d5d91 --- /dev/null +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -0,0 +1,22 @@ +import smach +import rospy + + +class SpeakDescriptions(smach.State): + def __init__(self, default): + smach.State.__init__(self, outcomes=['succeeded','failed'], input_keys=['people']) + self.default = default + + def execute(self, userdata): + for person in userdata['people']: + self.default.voice.speak('I see a person') + + for feature in person['features']: + if feature.label: + if len(feature.colours) == 0: + self.default.voice.speak(f'They have {feature.name}.') + continue + + self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') + + return 'succeeded' From 5b034f645478ffa2aa2c94848f5f8abe949ae2f1 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Wed, 13 Dec 2023 21:31:40 +0000 Subject: [PATCH 15/69] added the hair colour distribution matching method --- .../{medium ash brown.jpg => black.jpg} | Bin .../{beeline honey.jpg => blond.jpg} | Bin .../{french-roast.jpg => brown .jpg} | Bin .../{dark golden brown.jpg => brown.jpg} | Bin .../hair_colours/temp/beeline honey.jpg | Bin 0 -> 5211 bytes .../{ => temp}/blowout burgundy.jpg | Bin .../hair_colours/{ => temp}/butter scotch.jpg | Bin .../hair_colours/{ => temp}/caramel.jpg | Bin .../{ => temp}/chocolate brown.jpg | Bin .../{ => temp}/chocolate-cherry.jpg | Bin .../{ => temp}/copper-shimmer.jpg | Bin .../hair_colours/{ => temp}/crushedgarnet.jpg | Bin .../hair_colours/temp/dark golden brown.jpg | Bin 0 -> 4041 bytes .../hair_colours/{ => temp}/espresso.jpg | Bin .../hair_colours/{ => temp}/expresso.jpg | Bin .../hair_colours/temp/french-roast.jpg | Bin 0 -> 6291 bytes .../hair_colours/temp/gray.png | Bin 0 -> 54379 bytes .../hair_colours/{ => temp}/havanabrown.jpg | Bin .../hair_colours/{ => temp}/hot-toffee.jpg | Bin .../hair_colours/{ => temp}/jet black.jpg | Bin .../hair_colours/{ => temp}/leatherblack.jpg | Bin .../{ => temp}/light ash blonde.jpg | Bin .../hair_colours/{ => temp}/light auburn.jpg | Bin .../hair_colours/{ => temp}/light blonde.jpg | Bin .../hair_colours/{ => temp}/light brown.jpg | Bin .../{ => temp}/light cool brown.jpg | Bin .../{ => temp}/light golden blonde.jpg | Bin .../{ => temp}/light golden brown.jpg | Bin .../hair_colours/temp/medium ash brown.jpg | Bin 0 -> 4209 bytes .../hair_colours/{ => temp}/medium auburn.jpg | Bin .../{ => temp}/medium champagne.jpg | Bin .../hair_colours/{ => temp}/midnighrruby.jpg | Bin .../hair_colours/{ => temp}/pure-diamond.jpg | Bin .../{ => temp}/red hot cinnamon.jpg | Bin .../{ => temp}/reddish blonde.jpg | Bin .../hair_colours/{ => temp}/rubyfusion.jpg | Bin .../{ => temp}/sparkling-amber.jpg | Bin .../{ => temp}/sunflower-blonde.jpg | Bin .../src/colour_estimation/__init__.py | 51 +++++------------- common/vision/lasr_vision_torch/nodes/service | 4 +- .../src/lasr_vision_torch/__init__.py | 31 +++++++---- 41 files changed, 36 insertions(+), 50 deletions(-) rename common/helpers/colour_estimation/hair_colours/{medium ash brown.jpg => black.jpg} (100%) rename common/helpers/colour_estimation/hair_colours/{beeline honey.jpg => blond.jpg} (100%) rename common/helpers/colour_estimation/hair_colours/{french-roast.jpg => brown .jpg} (100%) rename common/helpers/colour_estimation/hair_colours/{dark golden brown.jpg => brown.jpg} (100%) create mode 100644 common/helpers/colour_estimation/hair_colours/temp/beeline honey.jpg rename common/helpers/colour_estimation/hair_colours/{ => temp}/blowout burgundy.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/butter scotch.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/caramel.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/chocolate brown.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/chocolate-cherry.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/copper-shimmer.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/crushedgarnet.jpg (100%) create mode 100644 common/helpers/colour_estimation/hair_colours/temp/dark golden brown.jpg rename common/helpers/colour_estimation/hair_colours/{ => temp}/espresso.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/expresso.jpg (100%) create mode 100644 common/helpers/colour_estimation/hair_colours/temp/french-roast.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/temp/gray.png rename common/helpers/colour_estimation/hair_colours/{ => temp}/havanabrown.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/hot-toffee.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/jet black.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/leatherblack.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light ash blonde.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light auburn.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light blonde.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light brown.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light cool brown.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light golden blonde.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light golden brown.jpg (100%) create mode 100644 common/helpers/colour_estimation/hair_colours/temp/medium ash brown.jpg rename common/helpers/colour_estimation/hair_colours/{ => temp}/medium auburn.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/medium champagne.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/midnighrruby.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/pure-diamond.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/red hot cinnamon.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/reddish blonde.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/rubyfusion.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/sparkling-amber.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/sunflower-blonde.jpg (100%) diff --git a/common/helpers/colour_estimation/hair_colours/medium ash brown.jpg b/common/helpers/colour_estimation/hair_colours/black.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/medium ash brown.jpg rename to common/helpers/colour_estimation/hair_colours/black.jpg diff --git a/common/helpers/colour_estimation/hair_colours/beeline honey.jpg b/common/helpers/colour_estimation/hair_colours/blond.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/beeline honey.jpg rename to common/helpers/colour_estimation/hair_colours/blond.jpg diff --git a/common/helpers/colour_estimation/hair_colours/french-roast.jpg b/common/helpers/colour_estimation/hair_colours/brown .jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/french-roast.jpg rename to common/helpers/colour_estimation/hair_colours/brown .jpg diff --git a/common/helpers/colour_estimation/hair_colours/dark golden brown.jpg b/common/helpers/colour_estimation/hair_colours/brown.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/dark golden brown.jpg rename to common/helpers/colour_estimation/hair_colours/brown.jpg diff --git a/common/helpers/colour_estimation/hair_colours/temp/beeline honey.jpg b/common/helpers/colour_estimation/hair_colours/temp/beeline honey.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f83d188869a22c1b256c1d0e940b1faff6baa792 GIT binary patch literal 5211 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 Q9I~2vY+eFtJ?At31w#B?-v9sr literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg b/common/helpers/colour_estimation/hair_colours/temp/blowout burgundy.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg rename to common/helpers/colour_estimation/hair_colours/temp/blowout burgundy.jpg diff --git a/common/helpers/colour_estimation/hair_colours/butter scotch.jpg b/common/helpers/colour_estimation/hair_colours/temp/butter scotch.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/butter scotch.jpg rename to common/helpers/colour_estimation/hair_colours/temp/butter scotch.jpg diff --git a/common/helpers/colour_estimation/hair_colours/caramel.jpg b/common/helpers/colour_estimation/hair_colours/temp/caramel.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/caramel.jpg rename to common/helpers/colour_estimation/hair_colours/temp/caramel.jpg diff --git a/common/helpers/colour_estimation/hair_colours/chocolate brown.jpg b/common/helpers/colour_estimation/hair_colours/temp/chocolate brown.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/chocolate brown.jpg rename to common/helpers/colour_estimation/hair_colours/temp/chocolate brown.jpg diff --git a/common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg b/common/helpers/colour_estimation/hair_colours/temp/chocolate-cherry.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg rename to common/helpers/colour_estimation/hair_colours/temp/chocolate-cherry.jpg diff --git a/common/helpers/colour_estimation/hair_colours/copper-shimmer.jpg b/common/helpers/colour_estimation/hair_colours/temp/copper-shimmer.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/copper-shimmer.jpg rename to common/helpers/colour_estimation/hair_colours/temp/copper-shimmer.jpg diff --git a/common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg b/common/helpers/colour_estimation/hair_colours/temp/crushedgarnet.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg rename to common/helpers/colour_estimation/hair_colours/temp/crushedgarnet.jpg diff --git a/common/helpers/colour_estimation/hair_colours/temp/dark golden brown.jpg b/common/helpers/colour_estimation/hair_colours/temp/dark golden brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8005d3391d7b206d3091c5d2a708e68f0b1328d6 GIT binary patch literal 4041 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 Ly7zxbyITBzU#B&; literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/temp/gray.png b/common/helpers/colour_estimation/hair_colours/temp/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..97b47262a1f0a345af179b6e378a382b6fdb1cde GIT binary patch literal 54379 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 M07*qoM6N<$f|5*Ns&3pH62 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 TorchFaceFeatureDetecti # response.detected_features = str(class_pred) + str(colour_pred) response.detected_features = [] for c in ['hair', 'hat', 'glasses', 'cloth',]: - colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} + # colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} sorted_list = sorted(colour_pred[c].items(), key=lambda item: item[1], reverse=True) - rospy.loginfo(str(sorted_list)) + # rospy.loginfo(str(sorted_list)) if len(sorted_list) > 3: sorted_list = sorted_list[0:3] sorted_list = [k for k, v in sorted_list] diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 1d4f6cffe..9eb9fe556 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -1,8 +1,8 @@ from torch_module.modules import UNetWithResnet18Encoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression from torch_module.helpers import load_torch_model, binary_erosion_dilation -from colour_estimation import closest_colours, load_images_to_dict, generate_colour_table, average_colours_by_label, count_colours_in_masked_area -from colour_estimation import COLOURS, HAIR_COLOURS, SPESIFIC_COLOURS, DETAILED_COLOURS +from colour_estimation import load_images_to_dict, generate_colour_table, count_colours_in_masked_area, compare_colour_distributions +from colour_estimation import SPESIFIC_COLOURS, DETAILED_COLOURS import numpy as np import cv2 @@ -34,7 +34,7 @@ def load_face_classifier_model(): 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, ] thresholds_pred = [ - 0.6, 0.8, 0.1, 0.5, + 0.6, 0.8, 0.05, 0.5, ] erosion_iterations = 1 dilation_iterations = 1 @@ -152,11 +152,13 @@ def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilatio # Update class colours for f, each_mask, k, c_map in zip([head_frame, head_frame, head_frame], mask_list[0:2], ['hair', 'hat', 'glasses'], [SPESIFIC_COLOURS, DETAILED_COLOURS, DETAILED_COLOURS]): colours = count_colours_in_masked_area(f, each_mask, c_map, sort=True)[1] + # colours = [c in ] for colour in colours: - if colour[0] not in head_class_colours[k]: - head_class_colours[k][colour[0]] = [colour[1]] - else: - head_class_colours[k][colour[0]].append(colour[1]) + head_class_colours[k][colour[0]] = colour[1] + # if colour[0] not in head_class_colours[k]: + # head_class_colours[k][colour[0]] = [colour[1]] + # else: + # head_class_colours[k][colour[0]].append(colour[1]) return head_class_count, head_class_colours @@ -188,10 +190,11 @@ def process_cloth(full_frame, torso_mask): # Update cloth colours colours = count_colours_in_masked_area(full_frame, torso_mask, DETAILED_COLOURS, sort=True)[1] for colour in colours: - if colour[0] not in cloth_class_colours['cloth']: - cloth_class_colours['cloth'][colour[0]] = [colour[1]] - else: - cloth_class_colours['cloth'][colour[0]].append(colour[1]) + cloth_class_colours['cloth'][colour[0]] = colour[1] + # if colour[0] not in cloth_class_colours['cloth']: + # cloth_class_colours['cloth'][colour[0]] = [colour[1]] + # else: + # cloth_class_colours['cloth'][colour[0]].append(colour[1]) return cloth_class_count, cloth_class_colours @@ -263,6 +266,12 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, mo class_pred = {k: bool(class_count[k]) for k in class_count} colour_pred = {k: v for k, v in class_colours.items()} + rospy.loginfo(str(class_colours['hair'])) + rospy.loginfo(str(hair_colour_table)) + + # compare_colour_distributions([k,v class_colours['hair']], hair_colour_table) + colour_pred['hair'] = compare_colour_distributions(class_colours['hair'], hair_colour_table) + # class_pred, colour_pred = None, None return class_pred, colour_pred From e19e9df61b0b23e1d164c76302e37cfa240b2eb5 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 14 Dec 2023 11:10:30 +0000 Subject: [PATCH 16/69] retrained model is very robust so changed the threshold --- .../vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 9eb9fe556..e2fa4d725 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -34,7 +34,7 @@ def load_face_classifier_model(): 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, ] thresholds_pred = [ - 0.6, 0.8, 0.05, 0.5, + 0.6, 0.8, 0.1, 0.5, ] erosion_iterations = 1 dilation_iterations = 1 From 93434874e88bd13e969bd0ad6522e2a8b7c587e4 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Wed, 31 Jan 2024 17:52:00 +0000 Subject: [PATCH 17/69] Moving the head to meet the person. --- .../src/lasr_vision_bodypix/bodypix.py | 46 +++++++++++++++++-- .../lasr_vision_msgs/msg/BodyPixPose.msg | 3 +- skills/src/lasr_skills/describe_people.py | 3 ++ skills/src/lasr_skills/vision/get_image.py | 3 +- tasks/receptionist/launch/test.launch | 5 ++ .../src/receptionist/head_direction_test.py | 25 ++++++++++ tasks/receptionist/src/receptionist/sm.py | 24 +++++----- 7 files changed, 93 insertions(+), 16 deletions(-) create mode 100644 tasks/receptionist/launch/test.launch create mode 100644 tasks/receptionist/src/receptionist/head_direction_test.py diff --git a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py index 81a924640..fd62c29b3 100644 --- a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py +++ b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py @@ -9,7 +9,7 @@ from tf_bodypix.api import download_model, load_model, BodyPixModelPaths from sensor_msgs.msg import Image as SensorImage -from lasr_vision_msgs.msg import BodyPixMask +from lasr_vision_msgs.msg import BodyPixMask, BodyPixPose from lasr_vision_msgs.srv import BodyPixDetectionRequest, BodyPixDetectionResponse # model cache @@ -44,6 +44,7 @@ def detect(request: BodyPixDetectionRequest, debug_publisher: rospy.Publisher | # decode the image rospy.loginfo('Decoding') img = cv2_img.msg_to_cv2_img(request.image_raw) + img_height, img_width, _ = img.shape # Get image dimensions # load model rospy.loginfo('Loading model') @@ -65,8 +66,46 @@ def detect(request: BodyPixDetectionRequest, debug_publisher: rospy.Publisher | bodypix_mask.shape = list(part_mask.shape) masks.append(bodypix_mask) - # construct pose response - # TODO + # construct poses response and neck coordinates + poses = result.get_poses() + rospy.loginfo(str(poses)) + + neck_coordinates = [] + for pose in poses: + left_shoulder_keypoint = pose.keypoints.get(5) # 5 is the typical index for left shoulder + right_shoulder_keypoint = pose.keypoints.get(6) # 6 is the typical index for right shoulder + + if left_shoulder_keypoint and right_shoulder_keypoint: + # If both shoulders are detected, calculate neck as midpoint + left_shoulder = left_shoulder_keypoint.position + right_shoulder = right_shoulder_keypoint.position + neck_x = (left_shoulder.x + right_shoulder.x) / 2 + neck_y = (left_shoulder.y + right_shoulder.y) / 2 + neck_score = (left_shoulder_keypoint.score + right_shoulder_keypoint.score) / 2 # Optional: average score + elif left_shoulder_keypoint: + # Only left shoulder detected, use it as neck coordinate + left_shoulder = left_shoulder_keypoint.position + neck_x = left_shoulder.x + neck_y = left_shoulder.y + neck_score = left_shoulder_keypoint.score + elif right_shoulder_keypoint: + # Only right shoulder detected, use it as neck coordinate + right_shoulder = right_shoulder_keypoint.position + neck_x = right_shoulder.x + neck_y = right_shoulder.y + neck_score = right_shoulder_keypoint.score + + # Convert neck coordinates to relative positions (0-1) + rel_neck_x = neck_x / img_width + rel_neck_y = neck_y / img_height + + pose = BodyPixPose() + pose.coord = np.array([rel_neck_x, rel_neck_y]).astype(np.float32) + neck_coordinates.append(pose) + + pose = BodyPixPose() + pose.coord = np.array([neck_x, neck_y]).astype(np.float32) + neck_coordinates.append(pose) # publish to debug topic if debug_publisher is not None: @@ -85,4 +124,5 @@ def detect(request: BodyPixDetectionRequest, debug_publisher: rospy.Publisher | response = BodyPixDetectionResponse() response.masks = masks + response.poses = neck_coordinates return response diff --git a/common/vision/lasr_vision_msgs/msg/BodyPixPose.msg b/common/vision/lasr_vision_msgs/msg/BodyPixPose.msg index a8d70142d..8c03dc6df 100644 --- a/common/vision/lasr_vision_msgs/msg/BodyPixPose.msg +++ b/common/vision/lasr_vision_msgs/msg/BodyPixPose.msg @@ -1 +1,2 @@ -# https://github.com/de-code/python-tf-bodypix/blob/develop/tf_bodypix/bodypix_js_utils/types.py +# x and y coordinates +float32[] coord diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 24170f61f..cfe8a52a2 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -90,6 +90,9 @@ def execute(self, userdata): result = self.bodypix(userdata.img_msg, "resnet50", 0.7, masks) userdata.bodypix_masks = result.masks + rospy.loginfo("Found:::%s" % str(len(result.poses))) + neck_coord = (result.poses[0].coord[0], result.poses[0].coord[1]) + rospy.loginfo("COORD:::%s" % str(neck_coord)) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") diff --git a/skills/src/lasr_skills/vision/get_image.py b/skills/src/lasr_skills/vision/get_image.py index bb4b894c3..c0543c6e1 100644 --- a/skills/src/lasr_skills/vision/get_image.py +++ b/skills/src/lasr_skills/vision/get_image.py @@ -2,7 +2,8 @@ import smach import rospy from sensor_msgs.msg import Image - +# PointCloud2 +# topic: /xtion/depth_registered/points class GetImage(smach.State): """ diff --git a/tasks/receptionist/launch/test.launch b/tasks/receptionist/launch/test.launch new file mode 100644 index 000000000..f7bab932d --- /dev/null +++ b/tasks/receptionist/launch/test.launch @@ -0,0 +1,5 @@ + + + + + diff --git a/tasks/receptionist/src/receptionist/head_direction_test.py b/tasks/receptionist/src/receptionist/head_direction_test.py new file mode 100644 index 000000000..b362eb5b5 --- /dev/null +++ b/tasks/receptionist/src/receptionist/head_direction_test.py @@ -0,0 +1,25 @@ +import rospy +import tf2_ros +import geometry_msgs.msg + +rospy.init_node('head_orientation_listener') + +tfBuffer = tf2_ros.Buffer() +listener = tf2_ros.TransformListener(tfBuffer) + +while not rospy.is_shutdown(): + try: + # Replace 'base_frame' and 'head_frame' with the appropriate frame names + trans = tfBuffer.lookup_transform('base_frame', 'head_frame', rospy.Time()) + + # Orientation as quaternion + orientation_q = trans.transform.rotation + rospy.loginfo("Head orientation in quaternion: \s" % str(orientation_q)) + + # Optionally convert quaternion to Euler angles for roll, pitch, yaw + # ... + + except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException): + continue + + rospy.sleep(1.0) diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index 6438e4035..3daddbfdf 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -22,14 +22,16 @@ def __init__(self): self.userdata.area_polygon = [[1.94, 0.15], [2.98, 0.28], [3.08, -0.68], [2.06, -0.84]] self.userdata.depth_topic = "/xtion/depth_registered/points" with self: - smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) - smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) - smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) - smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) - smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) - smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) - smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) - smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) - smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) + # smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + # smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) + # smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) + # smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) + # smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) + # smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) + # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) + # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) + # smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) + # smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + # smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) + smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) From 98535a0650aae1d98a2f26c2a3b7452ab8f3ff0b Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 2 Feb 2024 15:24:54 +0000 Subject: [PATCH 18/69] xyz axis readable. --- .../helpers/cv2_img/src/cv2_img/__init__.py | 39 ++++++++++++++ .../src/lasr_vision_bodypix/bodypix.py | 14 ++--- skills/src/lasr_skills/describe_people.py | 28 ++++++---- skills/src/lasr_skills/vision/__init__.py | 4 +- skills/src/lasr_skills/vision/get_image.py | 53 ++++++++++++++++++- .../lasr_skills/vision/image_msg_to_cv2.py | 22 +++++++- tasks/receptionist/src/receptionist/sm.py | 1 - .../receptionist/states/speakdescriptions.py | 16 +++--- 8 files changed, 146 insertions(+), 31 deletions(-) diff --git a/common/helpers/cv2_img/src/cv2_img/__init__.py b/common/helpers/cv2_img/src/cv2_img/__init__.py index 822b2839a..ad0c74b74 100644 --- a/common/helpers/cv2_img/src/cv2_img/__init__.py +++ b/common/helpers/cv2_img/src/cv2_img/__init__.py @@ -1,5 +1,6 @@ import rospy import numpy as np +import ros_numpy as rnp from PIL import Image from sensor_msgs.msg import Image as SensorImage @@ -64,9 +65,47 @@ def msg_to_cv2_img(msg: SensorImage): img = np.array(img) img = img[:, :, ::-1].copy() + rospy.logwarn('shape of the image: ' + str(img.shape)) + return img +# pcl_xyz = rnp.point_cloud2.pointcloud2_to_xyz_array(pcl_msg, remove_nans=False) +def pcl_msg_to_xyz(pcl_msg): + pcl_xyz = rnp.point_cloud2.pointcloud2_to_xyz_array(pcl_msg, remove_nans=False) + + rospy.logwarn('shape of the image: ' + str(pcl_xyz.shape)) + + return pcl_xyz + + +def pcl_msg_to_cv2(pcl_msg): + """ + Constructs a cv2 image from a PointCloud2 message. + + Parameters + ---------- + pcl_msg : sensor_msgs/PointCloud2 + Input pointcloud (organised) + + Returns + ------- + np.array : cv2 image + """ + + # Extract rgb image from pointcloud + frame = np.fromstring(pcl_msg.data, dtype=np.uint8) + frame = frame.reshape(pcl_msg.height, pcl_msg.width, 32) + frame = frame[:,:,16:19] + + # Ensure array is contiguous + frame = np.ascontiguousarray(frame, dtype=np.uint8) + + rospy.logwarn('shape of the image: ' + str(frame.shape)) + + return frame + + def extract_mask_region(frame, mask, expand_x=0.5, expand_y=0.5): """ Extracts the face region from the image and expands the region by the specified amount. diff --git a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py index fd62c29b3..e4765814b 100644 --- a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py +++ b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py @@ -95,16 +95,16 @@ def detect(request: BodyPixDetectionRequest, debug_publisher: rospy.Publisher | neck_y = right_shoulder.y neck_score = right_shoulder_keypoint.score - # Convert neck coordinates to relative positions (0-1) - rel_neck_x = neck_x / img_width - rel_neck_y = neck_y / img_height + # # Convert neck coordinates to relative positions (0-1) + # rel_neck_x = neck_x / img_width + # rel_neck_y = neck_y / img_height - pose = BodyPixPose() - pose.coord = np.array([rel_neck_x, rel_neck_y]).astype(np.float32) - neck_coordinates.append(pose) + # pose = BodyPixPose() + # pose.coord = np.array([rel_neck_x, rel_neck_y]).astype(np.float32) + # neck_coordinates.append(pose) pose = BodyPixPose() - pose.coord = np.array([neck_x, neck_y]).astype(np.float32) + pose.coord = np.array([neck_x, neck_y]).astype(np.int32) neck_coordinates.append(pose) # publish to debug topic diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index cfe8a52a2..eb38c9b2d 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -11,7 +11,7 @@ from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection from numpy2message import numpy2message -from .vision import GetImage, ImageMsgToCv2 +from .vision import GetImage, ImageMsgToCv2, Get3DImage, PclMsgToCv2, Get2DAnd3DImages class DescribePeople(smach.StateMachine): @@ -21,16 +21,21 @@ def __init__(self): self, outcomes=['succeeded', 'failed'], input_keys=[], output_keys=['people']) with self: - smach.StateMachine.add('GET_IMAGE', GetImage(), transitions={ + # smach.StateMachine.add('GET_IMAGE', GetImage(), transitions={ + # 'succeeded': 'CONVERT_IMAGE'}) + # smach.StateMachine.add('CONVERT_IMAGE', ImageMsgToCv2(), transitions={ + # 'succeeded': 'SEGMENT'}) + + smach.StateMachine.add('GET_IMAGE', Get2DAnd3DImages(), transitions={ 'succeeded': 'CONVERT_IMAGE'}) - smach.StateMachine.add('CONVERT_IMAGE', ImageMsgToCv2(), transitions={ + smach.StateMachine.add('CONVERT_IMAGE', PclMsgToCv2(), transitions={ 'succeeded': 'SEGMENT'}) sm_con = smach.Concurrence(outcomes=['succeeded', 'failed'], default_outcome='failed', outcome_map={'succeeded': { 'SEGMENT_YOLO': 'succeeded', 'SEGMENT_BODYPIX': 'succeeded'}}, - input_keys=['img', 'img_msg'], + input_keys=['img', 'img_msg_2d', 'img_msg_3d', 'xyz'], output_keys=['people_detections', 'bodypix_masks']) with sm_con: @@ -51,13 +56,13 @@ class SegmentYolo(smach.State): def __init__(self): smach.State.__init__(self, outcomes=['succeeded', 'failed'], input_keys=[ - 'img_msg'], output_keys=['people_detections']) + 'img_msg_2d'], output_keys=['people_detections']) self.yolo = rospy.ServiceProxy('/yolov8/detect', YoloDetection) def execute(self, userdata): try: result = self.yolo( - userdata.img_msg, "yolov8n-seg.pt", 0.5, 0.3) + userdata.img_msg_2d, "yolov8n-seg.pt", 0.5, 0.3) userdata.people_detections = [ det for det in result.detected_objects if det.name == "person"] return 'succeeded' @@ -74,7 +79,7 @@ class SegmentBodypix(smach.State): def __init__(self): smach.State.__init__(self, outcomes=['succeeded', 'failed'], input_keys=[ - 'img_msg'], output_keys=['bodypix_masks']) + 'img_msg_2d', 'xyz'], output_keys=['bodypix_masks']) self.bodypix = rospy.ServiceProxy( '/bodypix/detect', BodyPixDetection) @@ -88,11 +93,14 @@ def execute(self, userdata): masks = [torso, head] - result = self.bodypix(userdata.img_msg, "resnet50", 0.7, masks) + result = self.bodypix(userdata.img_msg_2d, "resnet50", 0.7, masks) userdata.bodypix_masks = result.masks rospy.loginfo("Found:::%s" % str(len(result.poses))) - neck_coord = (result.poses[0].coord[0], result.poses[0].coord[1]) - rospy.loginfo("COORD:::%s" % str(neck_coord)) + neck_coord = (int(result.poses[0].coord[0]), int(result.poses[0].coord[1])) + rospy.loginfo("COORD_XY:::%s" % str(neck_coord)) + xyz = userdata.xyz + xyz = np.nanmean(xyz, axis=2) + rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") diff --git a/skills/src/lasr_skills/vision/__init__.py b/skills/src/lasr_skills/vision/__init__.py index 53bf0eb7b..127fbc849 100644 --- a/skills/src/lasr_skills/vision/__init__.py +++ b/skills/src/lasr_skills/vision/__init__.py @@ -1,3 +1,3 @@ -from .get_image import GetImage +from .get_image import GetImage, Get3DImage, Get2DAnd3DImages from .image_cv2_to_msg import ImageCv2ToMsg -from .image_msg_to_cv2 import ImageMsgToCv2 +from .image_msg_to_cv2 import ImageMsgToCv2, PclMsgToCv2 diff --git a/skills/src/lasr_skills/vision/get_image.py b/skills/src/lasr_skills/vision/get_image.py index c0543c6e1..edad9c078 100644 --- a/skills/src/lasr_skills/vision/get_image.py +++ b/skills/src/lasr_skills/vision/get_image.py @@ -1,7 +1,7 @@ import os import smach import rospy -from sensor_msgs.msg import Image +from sensor_msgs.msg import Image, PointCloud2 # PointCloud2 # topic: /xtion/depth_registered/points @@ -28,3 +28,54 @@ def execute(self, userdata): return 'failed' return 'succeeded' + + +class Get3DImage(smach.State): + """ + State for reading an sensor_msgs Image message + """ + + def __init__(self, topic: str = None): + smach.State.__init__( + self, outcomes=['succeeded', 'failed'], output_keys=['img_msg']) + + if topic is None: + self.topic = '/xtion/depth_registered/points' + else: + self.topic = topic + + def execute(self, userdata): + try: + userdata.img_msg = rospy.wait_for_message( + self.topic, PointCloud2) + except Exception as e: + print(e) + return 'failed' + + return 'succeeded' + + +class Get2DAnd3DImages(smach.State): + """ + State for reading an sensor_msgs Image message + """ + + def __init__(self, topic: str = None): + smach.State.__init__( + self, outcomes=['succeeded', 'failed'], output_keys=['img_msg_2d', 'img_msg_3d']) + + self.topic1 = '/xtion/rgb/image_raw' + self.topic2 = '/xtion/depth_registered/points' + + def execute(self, userdata): + try: + userdata.img_msg_2d = rospy.wait_for_message( + self.topic1, Image) + userdata.img_msg_3d = rospy.wait_for_message( + self.topic2, PointCloud2) + except Exception as e: + print(e) + return 'failed' + + return 'succeeded' + diff --git a/skills/src/lasr_skills/vision/image_msg_to_cv2.py b/skills/src/lasr_skills/vision/image_msg_to_cv2.py index e079b2e62..7ec81caa3 100644 --- a/skills/src/lasr_skills/vision/image_msg_to_cv2.py +++ b/skills/src/lasr_skills/vision/image_msg_to_cv2.py @@ -1,6 +1,7 @@ import os import smach import cv2_img +import rospy class ImageMsgToCv2(smach.State): @@ -10,8 +11,25 @@ class ImageMsgToCv2(smach.State): def __init__(self): smach.State.__init__( - self, outcomes=['succeeded'], input_keys=['img_msg'], output_keys=['img']) + self, outcomes=['succeeded'], input_keys=['img_msg_2d'], output_keys=['img']) def execute(self, userdata): - userdata.img = cv2_img.msg_to_cv2_img(userdata.img_msg) + userdata.img = cv2_img.msg_to_cv2_img(userdata.img_msg_2d) + return 'succeeded' + + +class PclMsgToCv2(smach.State): + """ + State for converting a sensor Image message to cv2 format + """ + + def __init__(self): + smach.State.__init__( + self, outcomes=['succeeded'], input_keys=['img_msg_3d'], output_keys=['img', 'xyz']) + + def execute(self, userdata): + userdata.img = cv2_img.pcl_msg_to_cv2(userdata.img_msg_3d) + userdata.xyz = cv2_img.pcl_msg_to_xyz(userdata.img_msg_3d) + rospy.logwarn('succeeded on image converge.') + # print('succeeded on image converge.') return 'succeeded' diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index 3daddbfdf..591060211 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -32,6 +32,5 @@ def __init__(self): # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) # smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) # smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - # smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py index bbf9d5d91..42e7546e8 100644 --- a/tasks/receptionist/src/receptionist/states/speakdescriptions.py +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -8,15 +8,15 @@ def __init__(self, default): self.default = default def execute(self, userdata): - for person in userdata['people']: - self.default.voice.speak('I see a person') + # for person in userdata['people']: + # self.default.voice.speak('I see a person') - for feature in person['features']: - if feature.label: - if len(feature.colours) == 0: - self.default.voice.speak(f'They have {feature.name}.') - continue + # for feature in person['features']: + # if feature.label: + # if len(feature.colours) == 0: + # self.default.voice.speak(f'They have {feature.name}.') + # continue - self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') + # self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') return 'succeeded' From ecd469e040ce527d1e3c1088372d2afe400aa135 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 5 Feb 2024 11:42:28 +0000 Subject: [PATCH 19/69] (Hopefully) Runnable with 3d input. --- skills/src/lasr_skills/describe_people.py | 38 ++++++++++++++++++++++- tasks/receptionist/src/receptionist/sm.py | 25 ++++++++------- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index eb38c9b2d..21daebd23 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -13,6 +13,41 @@ from .vision import GetImage, ImageMsgToCv2, Get3DImage, PclMsgToCv2, Get2DAnd3DImages +import actionlib +import numpy as np +# from sensor_msgs.msg import PointCloud2 +# from control_msgs.msg import PointHeadAction, PointHeadGoal +# from geometry_msgs.msg import PointStamped + +def point_head_client(xyz_array, u, v): + # rospy.init_node('point_head_client') + + rospy.logwarn('making client') + client = actionlib.SimpleActionClient('/head_controller/point_head_action', PointHeadAction) + client.wait_for_server() + + target_point = xyz_array[v, u] + + point_camera = PointStamped() + point_camera.header.frame_id = "xtion_rgb_optical_frame" + point_camera.header.stamp = rospy.Time.now() + point_camera.point.x = target_point[0] + point_camera.point.y = target_point[1] + point_camera.point.z = target_point[2] + + goal = PointHeadGoal() + goal.target = point_camera + goal.max_velocity = 1.0 + # goal.min_duration = rospy.Duration(1.0) + goal.pointing_frame = "/head_2_link" + goal.pointing_axis.x = 1.0 + goal.pointing_axis.y = 0.0 + goal.pointing_axis.z = 0.0 + + rospy.logwarn('sending the goal and waiting') + client.send_goal_and_wait(goal) + rospy.logwarn('end') + class DescribePeople(smach.StateMachine): @@ -99,8 +134,9 @@ def execute(self, userdata): neck_coord = (int(result.poses[0].coord[0]), int(result.poses[0].coord[1])) rospy.loginfo("COORD_XY:::%s" % str(neck_coord)) xyz = userdata.xyz - xyz = np.nanmean(xyz, axis=2) + # xyz = np.nanmean(xyz, axis=2) rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) + # point_head_client(xyz, neck_coord[0], neck_coord[1]) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index 591060211..91556c037 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -22,15 +22,16 @@ def __init__(self): self.userdata.area_polygon = [[1.94, 0.15], [2.98, 0.28], [3.08, -0.68], [2.06, -0.84]] self.userdata.depth_topic = "/xtion/depth_registered/points" with self: - # smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - # smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) - # smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) - # smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) - # smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) - # smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) - # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) - # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) - # smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) - # smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) - smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) + smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) + smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) + smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) + smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) + smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) + # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) + # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) From a4bfa70827cf3e2b46a2a4e5aac206ef216a9767 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 5 Feb 2024 12:20:05 +0000 Subject: [PATCH 20/69] Speak normally. --- .../src/receptionist/states/speakdescriptions.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py index 42e7546e8..bbf9d5d91 100644 --- a/tasks/receptionist/src/receptionist/states/speakdescriptions.py +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -8,15 +8,15 @@ def __init__(self, default): self.default = default def execute(self, userdata): - # for person in userdata['people']: - # self.default.voice.speak('I see a person') + for person in userdata['people']: + self.default.voice.speak('I see a person') - # for feature in person['features']: - # if feature.label: - # if len(feature.colours) == 0: - # self.default.voice.speak(f'They have {feature.name}.') - # continue + for feature in person['features']: + if feature.label: + if len(feature.colours) == 0: + self.default.voice.speak(f'They have {feature.name}.') + continue - # self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') + self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') return 'succeeded' From 2a1e8d78b3a4e6de0accce9127a00ee0a2f679e3 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 5 Feb 2024 12:22:39 +0000 Subject: [PATCH 21/69] Try to move the head. --- skills/src/lasr_skills/describe_people.py | 8 +++--- tasks/receptionist/src/receptionist/sm.py | 26 +++++++++---------- .../receptionist/states/speakdescriptions.py | 16 ++++++------ 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 21daebd23..19d4c97b9 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -15,9 +15,9 @@ import actionlib import numpy as np -# from sensor_msgs.msg import PointCloud2 -# from control_msgs.msg import PointHeadAction, PointHeadGoal -# from geometry_msgs.msg import PointStamped +from sensor_msgs.msg import PointCloud2 +from control_msgs.msg import PointHeadAction, PointHeadGoal +from geometry_msgs.msg import PointStamped def point_head_client(xyz_array, u, v): # rospy.init_node('point_head_client') @@ -136,7 +136,7 @@ def execute(self, userdata): xyz = userdata.xyz # xyz = np.nanmean(xyz, axis=2) rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) - # point_head_client(xyz, neck_coord[0], neck_coord[1]) + point_head_client(xyz, neck_coord[0], neck_coord[1]) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index 91556c037..3daddbfdf 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -22,16 +22,16 @@ def __init__(self): self.userdata.area_polygon = [[1.94, 0.15], [2.98, 0.28], [3.08, -0.68], [2.06, -0.84]] self.userdata.depth_topic = "/xtion/depth_registered/points" with self: - smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) - smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) - smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) - smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) - smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) - smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) - smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) - smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) - smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) - # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) - # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) + # smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + # smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) + # smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) + # smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) + # smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) + # smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) + # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) + # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) + # smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) + # smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + # smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) + smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py index bbf9d5d91..42e7546e8 100644 --- a/tasks/receptionist/src/receptionist/states/speakdescriptions.py +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -8,15 +8,15 @@ def __init__(self, default): self.default = default def execute(self, userdata): - for person in userdata['people']: - self.default.voice.speak('I see a person') + # for person in userdata['people']: + # self.default.voice.speak('I see a person') - for feature in person['features']: - if feature.label: - if len(feature.colours) == 0: - self.default.voice.speak(f'They have {feature.name}.') - continue + # for feature in person['features']: + # if feature.label: + # if len(feature.colours) == 0: + # self.default.voice.speak(f'They have {feature.name}.') + # continue - self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') + # self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') return 'succeeded' From 684d51bea63d1928816fe28c753677e8dda67e5d Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Tue, 5 Dec 2023 18:30:30 +0000 Subject: [PATCH 22/69] testtesttest --- .../vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv | 1 + skills/src/lasr_skills/describe_people.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv index 2edc1abba..db88a8041 100644 --- a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv @@ -1,5 +1,6 @@ # Image to run inference on sensor_msgs/Image image_raw + --- # Detection result lasr_vision_msgs/FeatureWithColour[] detected_features \ No newline at end of file diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 762e705c7..a6ed0256f 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -184,7 +184,7 @@ def execute(self, userdata): msg = cv2_img.cv2_img_to_msg(face_region) features.extend(self.torch_face_features( - msg).detected_features) + msg, False).detected_features) except Exception as e: rospy.logerr(f"Failed to process extraction: {e}") From d0c27e23c97b6232b166a3cf4ea516412b5a047d Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Tue, 5 Dec 2023 18:34:55 +0000 Subject: [PATCH 23/69] Test --- common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv | 1 + 1 file changed, 1 insertion(+) diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv index db88a8041..f71b95aec 100644 --- a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv @@ -2,5 +2,6 @@ sensor_msgs/Image image_raw --- + # Detection result lasr_vision_msgs/FeatureWithColour[] detected_features \ No newline at end of file From 49034099b9b7a7b74734c4ec1470670e0a162080 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Tue, 5 Dec 2023 18:44:38 +0000 Subject: [PATCH 24/69] Test --- common/vision/lasr_vision_torch/nodes/service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index 4a0144396..ab8705380 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -62,7 +62,7 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti ] return response - +#test test rospy.init_node('torch_service') rospy.Service('/torch/detect/face_features', TorchFaceFeatureDetection, detect) From 0dfc09a37b13adf35b5e9325672da6dc777b768b Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Wed, 6 Dec 2023 17:02:13 +0000 Subject: [PATCH 25/69] Message Change --- common/helpers/numpy2message/doc/usage.md | 1 + common/helpers/numpy2message/src/__init__.py | 19 ++++++ .../srv/TorchFaceFeatureDetection.srv | 7 +++ common/vision/lasr_vision_torch/nodes/service | 62 ++++++++++++++++++- skills/scripts/unit_test_describe_people.py | 2 +- skills/src/lasr_skills/describe_people.py | 35 +++++++++++ 6 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 common/helpers/numpy2message/doc/usage.md create mode 100644 common/helpers/numpy2message/src/__init__.py diff --git a/common/helpers/numpy2message/doc/usage.md b/common/helpers/numpy2message/doc/usage.md new file mode 100644 index 000000000..3f19ff99e --- /dev/null +++ b/common/helpers/numpy2message/doc/usage.md @@ -0,0 +1 @@ +To send numpy arrays with messages. \ No newline at end of file diff --git a/common/helpers/numpy2message/src/__init__.py b/common/helpers/numpy2message/src/__init__.py new file mode 100644 index 000000000..3ddad23fe --- /dev/null +++ b/common/helpers/numpy2message/src/__init__.py @@ -0,0 +1,19 @@ +import numpy as np + + +def numpy2message(np_array: np.ndarray) -> list[bytes, list[int], str]: + data = np_array.tobytes() + shape = list(np_array.shape) + dtype = str(np_array.dtype) + return data, shape, dtype + + +def message2numpy(data:bytes, shape:list[int], dtype:str) -> np.ndarray: + array_shape = tuple(shape) + array_dtype = np.dtype(dtype) + + deserialized_array = np.frombuffer(data, dtype=array_dtype) + deserialized_array = deserialized_array.reshape(array_shape) + + return deserialized_array + diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv index f71b95aec..e958bcd57 100644 --- a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv @@ -1,6 +1,13 @@ # Image to run inference on sensor_msgs/Image image_raw +uint8[] head_mask_data # For serialized array data +uint32[] head_mask_shape # To store the shape of the array +string head_mask_dtype # Data type of the array elements + +uint8[] torso_mask_data +uint32[] torso_mask_shape +string torso_mask_dtype --- # Detection result diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index ab8705380..e09829dae 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -3,12 +3,14 @@ from lasr_vision_msgs.msg import FeatureWithColour, ColourPrediction from colour_estimation import closest_colours, RGB_COLOURS, RGB_HAIR_COLOURS from cv2_img import msg_to_cv2_img from torch_module.helpers import binary_erosion_dilation, median_color_float +from numpy2message import message2numpy import numpy as np import torch import rospy import lasr_vision_torch + model = lasr_vision_torch.load_face_classifier_model() @@ -16,6 +18,12 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti # decode the image rospy.loginfo('Decoding') frame = msg_to_cv2_img(request.image_raw) + torso_mask_data, torso_mask_shape, torso_mask_dtype = request.torso_mask_data, request.torso_mask_shape, request.torso_mask_dtype + head_mask_data, head_mask_shape, head_mask_dtype = request.head_mask_data, request.head_mask_shape, request.head_mask_dtype + torsal_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) + head_mask = message2numpy(head_mask_data, head_mask_shape, head_mask_dtype) + print(torso_mask_shape) + print(head_mask_shape) # 'hair', 'hat', 'glasses', 'face' input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() @@ -62,7 +70,59 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti ] return response -#test test + + +# def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetectionResponse: +# # decode the image +# rospy.loginfo('Decoding') +# frame = msg_to_cv2_img(request.image_raw) + +# # 'hair', 'hat', 'glasses', 'face' +# input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() +# input_image /= 255.0 +# masks_batch_pred, pred_classes = model(input_image) + +# thresholds_mask = [ +# 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, +# ] +# thresholds_pred = [ +# 0.6, 0.8, 0.1, 0.5, +# ] +# erosion_iterations = 1 +# dilation_iterations = 1 +# categories = ['hair', 'hat', 'glasses', 'face',] + +# masks_batch_pred = binary_erosion_dilation( +# masks_batch_pred, thresholds=thresholds_mask, +# erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations +# ) + +# median_colours = (median_color_float( +# input_image, masks_batch_pred).detach().squeeze(0)*255).numpy().astype(np.uint8) + +# # discarded: masks = masks_batch_pred.detach().squeeze(0).numpy().astype(np.uint8) +# # discarded: mask_list = [masks[i,:,:] for i in range(masks.shape[0])] + +# pred_classes = pred_classes.detach().squeeze(0).numpy() +# # discarded: class_list = [categories[i] for i in range( +# # pred_classes.shape[0]) if pred_classes[i].item() > thresholds_pred[i]] +# colour_list = [median_colours[i, :] +# for i in range(median_colours.shape[0])] + +# response = TorchFaceFeatureDetectionResponse() +# response.detected_features = [ +# FeatureWithColour(categories[i], [ +# ColourPrediction(colour, distance) +# for colour, distance +# in closest_colours(colour_list[i], RGB_HAIR_COLOURS if categories[i] == 'hair' else RGB_COLOURS) +# ]) +# for i +# in range(pred_classes.shape[0]) +# if pred_classes[i].item() > thresholds_pred[i] +# ] + +# return response +# test test rospy.init_node('torch_service') rospy.Service('/torch/detect/face_features', TorchFaceFeatureDetection, detect) diff --git a/skills/scripts/unit_test_describe_people.py b/skills/scripts/unit_test_describe_people.py index 3cf73d34c..44a87463e 100644 --- a/skills/scripts/unit_test_describe_people.py +++ b/skills/scripts/unit_test_describe_people.py @@ -16,6 +16,6 @@ sm.execute() - print('\n\nDetected people:', sm.userdata['people']) + # print('\n\nDetected people:', sm.userdata['people']) rospy.signal_shutdown("down") diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index a6ed0256f..aa33ddf51 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -9,6 +9,7 @@ from colour_estimation import closest_colours, RGB_COLOURS from lasr_vision_msgs.msg import BodyPixMaskRequest, ColourPrediction, FeatureWithColour from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection +from numpy2message import numpy2message from .vision import GetImage, ImageMsgToCv2 @@ -136,6 +137,40 @@ def execute(self, userdata): # keep track features = [] + # process part masks + for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): + part_mask = np.array(bodypix_mask.mask).reshape( + bodypix_mask.shape[0], bodypix_mask.shape[1]) + + # filter out part for current person segmentation + try: + part_mask[mask_bin == 0] = 0 + except Exception: + rospy.logdebug('|> Failed to check {part} is visible') + continue + + if part_mask.any(): + rospy.logdebug(f'|> Person has {part} visible') + else: + rospy.logdebug( + f'|> Person does not have {part} visible') + continue + + if part == 'torso': + torso_mask = part_mask + elif part == 'head': + head_mask = part_mask + + torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) + head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) + + full_frame = cv2_img.cv2_img_to_msg(face_region) + features.extend(self.torch_face_features( + full_frame, + torso_mask_data, torso_mask_shape, torso_mask_dtype, + head_mask_data, head_mask_shape, head_mask_dtype, + ).detected_features) + # process part masks for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): part_mask = np.array(bodypix_mask.mask).reshape( From f9743aeb909b4178f728f58366a345cafa9af45c Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 7 Dec 2023 14:25:53 +0000 Subject: [PATCH 26/69] fixed message writting and reading --- common/helpers/numpy2message/CMakeLists.txt | 202 ++++++++++++++++++ common/helpers/numpy2message/package.xml | 59 +++++ common/helpers/numpy2message/setup.py | 11 + .../src/{ => numpy2message}/__init__.py | 4 +- common/helpers/torch_module/package.xml | 2 +- skills/src/lasr_skills/describe_people.py | 8 +- 6 files changed, 279 insertions(+), 7 deletions(-) create mode 100644 common/helpers/numpy2message/CMakeLists.txt create mode 100644 common/helpers/numpy2message/package.xml create mode 100644 common/helpers/numpy2message/setup.py rename common/helpers/numpy2message/src/{ => numpy2message}/__init__.py (72%) diff --git a/common/helpers/numpy2message/CMakeLists.txt b/common/helpers/numpy2message/CMakeLists.txt new file mode 100644 index 000000000..b5898aff7 --- /dev/null +++ b/common/helpers/numpy2message/CMakeLists.txt @@ -0,0 +1,202 @@ +cmake_minimum_required(VERSION 3.0.2) +project(numpy2message) + +## Compile as C++11, supported in ROS Kinetic and newer +# add_compile_options(-std=c++11) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend tag for "message_generation" +## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependency has been pulled in +## but can be declared for certainty nonetheless: +## * add a exec_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +## Generate services in the 'srv' folder +# add_service_files( +# FILES +# Service1.srv +# Service2.srv +# ) + +## Generate actions in the 'action' folder +# add_action_files( +# FILES +# Action1.action +# Action2.action +# ) + +## Generate added messages and services with any dependencies listed here +# generate_messages( +# DEPENDENCIES +# std_msgs # Or other packages containing msgs +# ) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +## Generate dynamic reconfigure parameters in the 'cfg' folder +# generate_dynamic_reconfigure_options( +# cfg/DynReconf1.cfg +# cfg/DynReconf2.cfg +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if your package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( +# INCLUDE_DIRS include +# LIBRARIES numpy2message +# CATKIN_DEPENDS other_catkin_pkg +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +include_directories( +# include +# ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ library +# add_library(${PROJECT_NAME} +# src/${PROJECT_NAME}/numpy2message.cpp +# ) + +## Add cmake target dependencies of the library +## as an example, code may need to be generated before libraries +## either from message generation or dynamic reconfigure +# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Declare a C++ executable +## With catkin_make all packages are built within a single CMake context +## The recommended prefix ensures that target names across packages don't collide +# add_executable(${PROJECT_NAME}_node src/numpy2message_node.cpp) + +## Rename C++ executable without prefix +## The above recommended prefix causes long target names, the following renames the +## target back to the shorter version for ease of user use +## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" +# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") + +## Add cmake target dependencies of the executable +## same as for the library above +# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Specify libraries to link a library or executable target against +# target_link_libraries(${PROJECT_NAME}_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# catkin_install_python(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables for installation +## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html +# install(TARGETS ${PROJECT_NAME}_node +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark libraries for installation +## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html +# install(TARGETS ${PROJECT_NAME} +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_torch_module.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/common/helpers/numpy2message/package.xml b/common/helpers/numpy2message/package.xml new file mode 100644 index 000000000..aa9384c64 --- /dev/null +++ b/common/helpers/numpy2message/package.xml @@ -0,0 +1,59 @@ + + + numpy2message + 0.0.0 + Various PyTorch helpers and utilties + + + + + Paul Makles + + + + + + MIT + + + + + + + + + + + + Benteng Ma + + + + + + + + + + + + + + + + + + + + + + + catkin + + + + + + + + diff --git a/common/helpers/numpy2message/setup.py b/common/helpers/numpy2message/setup.py new file mode 100644 index 000000000..d79792c72 --- /dev/null +++ b/common/helpers/numpy2message/setup.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 + +from distutils.core import setup +from catkin_pkg.python_setup import generate_distutils_setup + +setup_args = generate_distutils_setup( + packages=['numpy2message'], + package_dir={'': 'src'} +) + +setup(**setup_args) diff --git a/common/helpers/numpy2message/src/__init__.py b/common/helpers/numpy2message/src/numpy2message/__init__.py similarity index 72% rename from common/helpers/numpy2message/src/__init__.py rename to common/helpers/numpy2message/src/numpy2message/__init__.py index 3ddad23fe..7a330ca5f 100644 --- a/common/helpers/numpy2message/src/__init__.py +++ b/common/helpers/numpy2message/src/numpy2message/__init__.py @@ -1,14 +1,14 @@ import numpy as np -def numpy2message(np_array: np.ndarray) -> list[bytes, list[int], str]: +def numpy2message(np_array: np.ndarray) -> list: data = np_array.tobytes() shape = list(np_array.shape) dtype = str(np_array.dtype) return data, shape, dtype -def message2numpy(data:bytes, shape:list[int], dtype:str) -> np.ndarray: +def message2numpy(data:bytes, shape:list, dtype:str) -> np.ndarray: array_shape = tuple(shape) array_dtype = np.dtype(dtype) diff --git a/common/helpers/torch_module/package.xml b/common/helpers/torch_module/package.xml index e8752c9f4..622e78778 100644 --- a/common/helpers/torch_module/package.xml +++ b/common/helpers/torch_module/package.xml @@ -25,7 +25,7 @@ - Benteng Ma + Benteng Ma diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index aa33ddf51..d427b6b1b 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -156,10 +156,10 @@ def execute(self, userdata): f'|> Person does not have {part} visible') continue - if part == 'torso': - torso_mask = part_mask - elif part == 'head': - head_mask = part_mask + if part == 'torso': + torso_mask = part_mask + elif part == 'head': + head_mask = part_mask torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) From 47ebc7c98c489a51bdf4e0f77a33d78d45a57e95 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 7 Dec 2023 14:32:44 +0000 Subject: [PATCH 27/69] fixed image crop --- common/vision/lasr_vision_torch/nodes/service | 4 ++-- skills/scripts/unit_test_describe_people.py | 2 +- skills/src/lasr_skills/describe_people.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index e09829dae..ec5081ba7 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -22,8 +22,8 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti head_mask_data, head_mask_shape, head_mask_dtype = request.head_mask_data, request.head_mask_shape, request.head_mask_dtype torsal_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) head_mask = message2numpy(head_mask_data, head_mask_shape, head_mask_dtype) - print(torso_mask_shape) - print(head_mask_shape) + # print(torso_mask_shape) + # print(head_mask_shape) # 'hair', 'hat', 'glasses', 'face' input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() diff --git a/skills/scripts/unit_test_describe_people.py b/skills/scripts/unit_test_describe_people.py index 44a87463e..3cf73d34c 100644 --- a/skills/scripts/unit_test_describe_people.py +++ b/skills/scripts/unit_test_describe_people.py @@ -16,6 +16,6 @@ sm.execute() - # print('\n\nDetected people:', sm.userdata['people']) + print('\n\nDetected people:', sm.userdata['people']) rospy.signal_shutdown("down") diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index d427b6b1b..d64b07cee 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -164,7 +164,7 @@ def execute(self, userdata): torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) - full_frame = cv2_img.cv2_img_to_msg(face_region) + full_frame = cv2_img.cv2_img_to_msg(img) features.extend(self.torch_face_features( full_frame, torso_mask_data, torso_mask_shape, torso_mask_dtype, From e8b20126c305c1e7509368e9158f19e01d646bd0 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 7 Dec 2023 20:47:13 +0000 Subject: [PATCH 28/69] Updated the feature extraction node and changed the messages. --- .../hair_colours/beeline honey.jpg | Bin 0 -> 5211 bytes .../hair_colours/blowout burgundy.jpg | Bin 0 -> 6516 bytes .../hair_colours/butter scotch.jpg | Bin 0 -> 4525 bytes .../hair_colours/caramel.jpg | Bin 0 -> 5811 bytes .../hair_colours/chocolate brown.jpg | Bin 0 -> 5239 bytes .../hair_colours/chocolate-cherry.jpg | Bin 0 -> 5272 bytes .../hair_colours/copper-shimmer.jpg | Bin 0 -> 6993 bytes .../hair_colours/crushedgarnet.jpg | Bin 0 -> 5786 bytes .../hair_colours/dark golden brown.jpg | Bin 0 -> 4041 bytes .../hair_colours/espresso.jpg | Bin 0 -> 7104 bytes .../hair_colours/expresso.jpg | Bin 0 -> 3804 bytes .../hair_colours/french-roast.jpg | Bin 0 -> 6291 bytes .../colour_estimation/hair_colours/gray.png | Bin 0 -> 54379 bytes .../hair_colours/havanabrown.jpg | Bin 0 -> 7081 bytes .../hair_colours/hot-toffee.jpg | Bin 0 -> 7452 bytes .../hair_colours/jet black.jpg | Bin 0 -> 3536 bytes .../hair_colours/leatherblack.jpg | Bin 0 -> 5887 bytes .../hair_colours/light ash blonde.jpg | Bin 0 -> 5223 bytes .../hair_colours/light auburn.jpg | Bin 0 -> 4432 bytes .../hair_colours/light blonde.jpg | Bin 0 -> 5039 bytes .../hair_colours/light brown.jpg | Bin 0 -> 3611 bytes .../hair_colours/light cool brown.jpg | Bin 0 -> 5323 bytes .../hair_colours/light golden blonde.jpg | Bin 0 -> 5005 bytes .../hair_colours/light golden brown.jpg | Bin 0 -> 4205 bytes .../hair_colours/medium ash brown.jpg | Bin 0 -> 4209 bytes .../hair_colours/medium auburn.jpg | Bin 0 -> 4801 bytes .../hair_colours/medium champagne.jpg | Bin 0 -> 5302 bytes .../hair_colours/midnighrruby.jpg | Bin 0 -> 5809 bytes .../hair_colours/pure-diamond.jpg | Bin 0 -> 6282 bytes .../hair_colours/red hot cinnamon.jpg | Bin 0 -> 3878 bytes .../hair_colours/reddish blonde.jpg | Bin 0 -> 5022 bytes .../hair_colours/rubyfusion.jpg | Bin 0 -> 5129 bytes .../hair_colours/sparkling-amber.jpg | Bin 0 -> 6345 bytes .../hair_colours/sunflower-blonde.jpg | Bin 0 -> 6002 bytes .../src/colour_estimation/__init__.py | 331 +++++++++++++++++- .../src/colour_estimation/rgb.py | 172 +++++++-- .../src/torch_module/modules/__init__.py | 167 +++++++++ .../msg/FeatureWithColour.msg | 5 +- .../srv/TorchFaceFeatureDetection.srv | 3 +- common/vision/lasr_vision_torch/nodes/service | 94 ++--- .../src/lasr_vision_torch/__init__.py | 314 ++++++++++++++++- skills/scripts/unit_test_describe_people.py | 1 + skills/src/lasr_skills/describe_people.py | 104 +++--- 43 files changed, 1039 insertions(+), 152 deletions(-) create mode 100644 common/helpers/colour_estimation/hair_colours/beeline honey.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/butter scotch.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/caramel.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/chocolate brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/copper-shimmer.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/dark golden brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/espresso.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/expresso.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/french-roast.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/gray.png create mode 100644 common/helpers/colour_estimation/hair_colours/havanabrown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/hot-toffee.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/jet black.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/leatherblack.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light ash blonde.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light auburn.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light blonde.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light cool brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light golden blonde.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/light golden brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/medium ash brown.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/medium auburn.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/medium champagne.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/midnighrruby.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/pure-diamond.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/red hot cinnamon.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/reddish blonde.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/rubyfusion.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/sparkling-amber.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/sunflower-blonde.jpg diff --git a/common/helpers/colour_estimation/hair_colours/beeline honey.jpg b/common/helpers/colour_estimation/hair_colours/beeline honey.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f83d188869a22c1b256c1d0e940b1faff6baa792 GIT binary patch literal 5211 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 Q9I~2vY+eFtJ?At31w#B?-v9sr literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg b/common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e2918952490abbf863be54f3bb1623c55207a483 GIT binary patch literal 6516 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 VJ~H3I$~hvu;2#^U&!l-X|6kqEm|g$? literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/butter scotch.jpg b/common/helpers/colour_estimation/hair_colours/butter scotch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..090d91ad1c669e5b250e9c6a37ac18eae4f6280d GIT binary patch literal 4525 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 Ot0eW**vnF9v;POG92gA% literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/caramel.jpg b/common/helpers/colour_estimation/hair_colours/caramel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a26d62c67506143964b8eb2f9148116649dfac5 GIT binary patch literal 5811 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/chocolate brown.jpg b/common/helpers/colour_estimation/hair_colours/chocolate brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7db8c90c971dd03aca732c4f05a83f2d2d782592 GIT binary patch literal 5239 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg b/common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7b9b2816182e6876311a494e2297eb156099aa0 GIT binary patch literal 5272 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg b/common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3723ce8cfe41ffc92d410c98acab0eaab856b12a GIT binary patch literal 5786 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/expresso.jpg b/common/helpers/colour_estimation/hair_colours/expresso.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c64850a6203298f14edd7cb37594668016a9fd3 GIT binary patch literal 3804 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/french-roast.jpg b/common/helpers/colour_estimation/hair_colours/french-roast.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac3368aa8884918b1775b5e78b5a712c91da2ded GIT binary patch literal 6291 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 Ly7zxbyITBzU#B&; literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/gray.png b/common/helpers/colour_estimation/hair_colours/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..97b47262a1f0a345af179b6e378a382b6fdb1cde GIT binary patch literal 54379 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 aD*SPR)sBESC9-j6egSZ}Vtn-Z(*FUJ6p^6- literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/jet black.jpg b/common/helpers/colour_estimation/hair_colours/jet black.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a56c66e494215d9f14e24c5b58148c1333b79a7 GIT binary patch literal 3536 zcmbu7XHe6L*2e!Sgakr~v`|gxQbWn^B7&h4lq!J$;th3ap(!Xtk!C0&0tzA^QW7Z% zAOazPXwXm=;w~b+D3?VR5LiV41(oa0J9p;&e$R70ooD9voHKI{rwFPWEJI(VU(0G#|*VJ zv<%HmOw1f?9sK>Tfc{s&ArC;ofmomu0#XIQC=dh%I^+W>004%7{#o_E1%U!!ArK5M z34lQm2p9?#f`TFcm>@6;fMB6VjI7+HR0HCKjMECGt*cvKs(Hls!DMU#|NR5=|3Uv; z5B`zzV+Q__@n1dwLK#_M1HkTaM-FEJ;T}YAV7x^GIm46`zk-H+`!M_H#WpwJ$4afpY(F=ERGMVFli!Z*CX!1SuRg9&m3!*RL!K(*C`*D48!vyeJ=DAL_y(q&F){q zlRih78B7j=u}${|bjmI|KJ1Bu+>p2)wjI@~wqd19YD-?|Der$^jj?|Z&o77!>@U~h zf5*_3t!58_Am79%a!akh&csTscx|^|OivkKVTT&@xEy$G^=Xv|`K^uRQNt4;=Fodw z^U_LQhU+0P5k8YS!*!F=h~82)#$63?_G_!sTzc}z2@DU_;n})`e?J2|1o}1}eZfb7 zQX#ql4Uj`X`6<$F0Si&*?4%~IbhgZmR(X$oJze6GI8Sj@N*4>@bg!4Zj$W`S@LK() zLVo4G6!T8wi>~+aotSk!2dNm<;+QNSqCQJ(S{wQjuaLUYr|1SUwrMZ(To)xMT<7n% zyLWDUL2UT_`&2U6cAVAmt~zU{;t&64Ouv-L$poijU8;uDhPTcs(l~L@)QlC%Fiy+q z`}=jaeuFCfDA^QPrYyUIytHt~A^kzRzu=G;(>lH>iuse#(CWd$%nW?Lx7)+u^TNM0 zLA$7<8p|RME2>^6lVOWqWs8BS`h0mz2%)Z+{YSCWtsxJ~184UX1t->A>|nh$+Tm}z zuVMpsP}XmA(A$*f55i=ap~Lr{h%FwqBn45Q48l6}Q;sQ!5W(V~L`Er;Wrg83rhg}@ zbB>D?x{CW9fyw<;<~d1z#CdG0b|7;d3|c}@em5aB%HKP23M$U1!e))840N(r+wEWU zaAtA|!eMf5zosAeD2bVIV@LH~udx!v8jV)tUxaKbs`mC`JI_PsANHBN7K$J$W-aK= zmvqD#Tr1ud%eN3t{%{CLa_Ezz8#t23Htg03m?>?4)6FmV^;aib1jxV!Sx>>Tgnd5f zUUYe}vQ!Gi4YpQJ+%Iuwzi_UXLn!)v)CD(HwvqR2u%3auRE*L<60D=;9G6^cz5#*r zhVoxIbv*Pma(QvopMOm4ij_g?2m_ zz{X{!J37{&WG1%VQm{UFRB=A+NG_2;!qp6+7dQfzvkJdR7};q zYT6-1?&__(*=DEC-IT{Ke|qq-dG5F9ZAeKG^5(Z&_>C0g?qzI8wR}L)vXtQRb69q{ zFYP3Jyd_l+|489n|NG081EJ+dC7jKzg}S0D{DQbS%Lpdk`=q$+IvM$vf(v*11#?yA z4sB^SLB!hsr*jlZb*11b=YopK$Kjt0LGkQM*UoyfkC-`3HELu!iKh>>=6HoLh zjZa*5TtGF#OR^Gw%)m7@M_oUUH?eN<@lg8t3Sh_FJyk*z# z^~+?Y_iL$qa4f%ebGLG_K$A@u*+$2Pvc1rLxx|ISmszTfyH>)%r+(ZbK+F(6b^7y_x^{1Bt(BuQZnQ>0z zL=R^xd^$CBp+6nA_Piy={hWhW$k(mO7@_U^_k4|j+?P|ABmOj`4_luV%&X;;B6WX1 z*R^DHI~8-}kul+fSGar2SuVAghcH1RemuM!MFUfqK9ZN5yRu>*%Rt<CTUkjz!FH+tUmeN%;91D^Yn`H&>BQqWE`<`LOqJvW=XwjBlUnJ&9&=y#>TzpX# zVI>Jx6ePeJ)ZYc9`WlN(kZ@IsigO$gav|Qp^TB+RT2UUbJH64 ztg_s!9{rM&wb$UKw}-GJvV_!KtvrlW+gI7+^38oKRT+4!ETKT%Sr!svj}zC9#DMra z(mc|xTDq}V;7c13cE2Niojef63ZKY^DVSI|9I%)j@iKxVT#IAXjBZ4yP}O!-Dc*$1 z*6+#F@6w5bW=O5;j;>wM=jtlvJ_}eZ)?N2jdwsKd^hU_Nd{&$dA%M=I4GFxNt-rcg zdvd38I8{K?3YEdn#)G0(cZk6;V{=>_PgaL7Rgp2s#m~)-9@@t>9Itwp#r<4KeAuzCvX<@oJJ~GR)Xv=Ebq*bsY^eTMdQLU3RX_36kW31 z`OBbI?_PN*K|a+X2+wRBKL(Z6B&I(@qVDDjXwNVun7IA`g7Y&gapDHCNZXBI87{n2 zQ$Qy>w61XF;>=H14mRn_s&-S9NWbyXsI@Xw6KWDoU5^)wBeNi%)VS3d(uu(HJjg!E z9;&X3GKQyZg!Pv;F9yDC!|ZzqLV~JHEI-*&*^HIgE7|ol`Qcjn;I#xROv;<&+ee=F z>0FY?EtdaW54-$0&(1HrbLDh8=Ae?^O)7ZwaOkh6xQN{f&Bgd;OuqIw2pCF-{>fIT zwpNTHt|^BP*ms%)Gk+JY$0{{+pz3WPG-3Z(F^Zq2Lv2qZyT_Tt2jHzbMeU6ypf=)Fby@X-o z+g>A#pG>sxIa=SKMb@I{)p6&I3dz3yveS=qd99ew=Xo$tUc+8fV&rC6)noD}t&uo! zlZvBpeyb+Y*F=$!BN)hb4xcFVS4@G5sJ{nev50{AV8I$SkN%LR$3s+t23%epOv*Cv zoCp8RI-MF6%XWL-?ZfEOA!^!tHFS#eb4~`?g{lS#wDRH7$^ypiIAO*FpeJku-CfF3 zN2+M&k@DFCEl9#v0bynoFGY{ zxi47<`w8qnBBVQF7p|Ya%G>b>FUS+f(B}pS0gyPQ3@1$5%E^-8cnN&7WCYu;?`Kr3 z=jGwY3fGpa4QZ0pUM@5bt>pUA&(~ZbR3~PO<090zZDye;sjcuY@H^4tlbAHwzZ)=p z=pr-a8{uLqodj$-zdhDKlazJhB14HPRvxh%voMWr@T)OH9})iByXV1Id`%hMS^_=q zT^cBkR_S0eNE77FhZ-IF&k;UaIERsq*l;oDwz|lnk{oFCG2ypLLc%iau=>c^c(!dC z)^H|X@BoT7o27Zjywi_By%hM1>M4#qMx{H9;7by)iu+DTsa~`U@B!-j&Zm21_c4k} z#2{hVT=~`cLUN~j&n#0odI_#Y`BHO5Ecne+>U=?9(u{iC^q77^*$I9jS~Ikf7>fNK zv-Lf&_{awMKB~FNfZIV7--#I|bLeseOxpVV(D#jf83p1`;|$-mFs`-g#(6 z%w2N5knhN;%d5CQc5lolzUfkFp5Yf9?|@i0WiMVfY`NMIPR2-{d;9g;0irIdJelSV zA0fL{5wgb5t(@dj&I~avl^M3QJAWVhX)`r-f2YB7a^0CltmA~-P7bLPyy0{?GYzKKy3RnNwG@S4#k>E?Nf-00IF3;6DRgeFa1T$p5dd zT_dNYq@bjvhEP#Ks9`j;{|v?fWrY574pvSUW)@CX5nec)SLCLUfY42ODJgkvO>G;S zP~iU-aMcNbQ34(Vn!!K>00aYqVZf^%z*7JK1P1;S;Qxt?{J+RG3Q8yd1OkFVWaMBl zm<;@1G9WMvK*qo)sm6#fb|6Q2N2Kzb)G?_S;M2O0QjR_vrW3pWq5ePEe-!|M$zcC8 z43lKwyP5~k`~!nv|F|lE^9L_@y|v|u;=i1pFiBOnu*27_ujg)0W}$FhVpJ4~4U#^V zNohVA*=QhAhMI|L%SYEkTDif6GeyqmdSs>pq##RYnQf+4UO+d{&6rv>^>@0F9yw@m zB{l?sGTQb`nQwmg!&X+kJA80~yJHouZwbL3BD#*)holW8!cODz<|FIGaB!ul zizYolf{6`5iJba)AL$(p*0{_#9wpok0DLhJXxB2T%Cqz_J9~#{ofs;1TSWMQy0@Yaboq6 zW1@XtqscJ*Lt|7WbTWFO!aDD3aNiYRx!(RejnIk?chnH#FCiE9CL`$?VkdTU3fGU; z9<@;VHqE*H**NWfHUOx;NN=L7;9|2|2ljZT0YX}9kU~|Ia4FsOo-{=8(CbCV{+~BW zD0jv&t~#AUg&!TgG7CB4bS2-!*-W&@R)>*%={FN30Q--uU>yoX{sZd zy5H>dVoKA=EFJbh&9lIKuSxq`zW_5XcuT9#R&(_N#U(~41ub$hwj5l(mh5%HN zk2}=ZBE9M~hm75UdkBANb&ObY-5UIQ*JUY86zWeYn-9On8hqzixgk_qJyh(G+KbFB zE;UyBFn+<*xe)BGW}JFe`M^8=>MOvQPD+e=t&%7^oFz_jer>j8@S^ijz8uembdC9Unxz>Fy&I981RVIX5V4m?wTf=mB&1>X{n0b@`%h&9%TrD zK4cuo$0XqBcfc)wj=E64-iu64mC$djqa@W zmQzxxC?6srD!;jWZ`kHJ1tOy+1yD0&eSOpK4>!DD<(Xp=odztPb8(h#y$`^YBtGXT z-t~_=FXqY9ZUDc3deX-6i4~TG!*o+IlxV1W*lIuyyB%X@*5}=zY!=woqC+Jfr;IzO z%{R5hcu-0ZUd!V2Pj?#g3lV-a-*b;oa-x(4{u?20SUfF0)1+p~aH?8tMf0b=D^H(! zbI6qD7_L(zsZgHkvjZDnrHM0 z?RT{KdE)qFCUZcneU(KNl$HB_fD%u^&@IF z`ejL9xPaV$EK*hD!xSQ0Obd>XF+4f!o6F8m?5AYcCGMGUG%RxflmDvZG7BYjLDhtf z>iMt%Ygjy(At<1u2w5kk^r*2mMS*C9B(T}-e0n#Y2jBO=ij-Yg#2VFuhw!1N!C$;H zWN*f)#Xlu>^Q9Tm07EJ(mhG_Jlq-|?BV@j>pu#wq=oO%F1y9+GySGqrC^x!b^6${+LqI&u3@hXC&ktSI7Tx z-ponO@nVgu6tijxcX}w8co@v&(H;b!4`n01Fm~q@eqv}dk)x6^$WW2iP+RnHy@mWe zErGR5L5pZ$E>hsh2abP4wi{$;r|ON%U|w}L<1N3g>4)5<|6b5r%Tn4NYiKnhP1-4CN$yQ!o&90>nb87%8qnsuJ0L4wv`l=DkZXRBQ~u@g#qX&blxppddcoDJFiuS`(*0?{D?-SC7$f!ubYZiMX1t5 zUlpWo{(4TlmoDgL;k)wFr32AXCX+P!n05I_B`T2bj$w)PneQm!CbdtvT1yXHyRQJ| zePu_!D8o|Bnkg@5dNsh3@+6j6BVaK$=VzKyef=^wGDX0MQs@f6YU>?k)g>4sA`}-( z9@QFD1j1fUiG@mV`8f;{UqZUB_1Q^aZM7g9#d}-63K}H7yAc`5u}GW<^}HrvTWBIy z)SL009@4GKEE1zyu|e686!lhGz*f!WMu}?uP(JX_JsW{Xjr%i<56(vdk%STD00_e&I4_rJ^LX}sm*RP98L>>*IK4A5$y>5RU_xqlY1P7iQaf*n=0 z8E2$uHBIUjnd#Pc+@y(TIQ0O%j7xEMlOfQr%C7*$b9>C_u+=HYO1>wf1(>;_`Ft-e z><-x?=kX_A?Hoh#lyX$39@-*21Vx+p>j7T-%}aw%@z?!7DB-D25BtFlJ=`)b_E`0v z>5JCt=+KjHX{q8zz6AwM@|0UW^L3YKcSvao)>1ZWTtmPJM&kcLubk6C$<*`Jsv9~n z)avnKV_bQn!8b8!%2ijV!j!9@eF?HId&^w$t($O1PmGU}8q+tDTHd_+Fv7)?0jwZhNmP zLT3&vEtYLGeIG(C*hV!F2yQW-eqMc)oI3E4zwMgUj#X7ukQs@tI z@nq6u%4i}}$hjC!5sxG3`)u+%T$o3<+3-DVV3#%Har1i1xq0{+hEYo}Q(|9nG-K#6 zq2CKXH$=~SZXTsVk>Szy^t9|OQ5XOHh30t{o2B-CDopK>SAdEz&x;u0uKd)}-R0+f z?uD*v)uoz=7XP{m(XL&+d>!%2;n_GC<)+HEvj+w_DFp}8iN>C0@)66@xjgVLII`3g zG#eH9CFh0#d&N{Yr-lOBF==jQNNzXNl4AVro3bvcnf$q8|Ky%0&0;=_EYAjb!_veK z+YX2%=h(X?)2d?GI3Ae~^m4bi#1FpIRCDO?zancP$Gi|OO5@Dg2tt$ih76`CR zW)g^t784GoIu;VsRSJ3>2X%buh8`_h1}WJK5A=s4@e!w5OKhPu)4{$Z_~S9$Qn8l6<)-cANiAvWY#HltX24nY zqQpo$PY?Jsor)~z*1osF+a9C)@irUXZj18TKXfSm4J%T-0ySP!A+$b}O@{S;ezR~& zn<9=d=HLZM)x^I?O@4DNcIJqVuUMESP?f?jzqCnVu>Oux!2;GaixEqVcJDs+NeaW9 z>3T-GN(8IqO-(?`f8BUaeaJ8@JrGMky{-gb^o5k0xoJL8pIbtsyw&0Ck=H7b`VIC+Bb8bHmhA?kQ;8iSwW16d4>5SkKFH*45i<>_jP#?p8BwHjD9mZRV>3k%AyK@ zOoC(Vyrk51NbJb?xXlIgJHGhsO6LP*oyp#5xt|Sm+8r|PDo0dh*hH}snjz*0#c{x5 znD@{5gOv1)4Cr`?AKbkZF!{aYl1|b|7%Hmy3GEYYuHNh?M;`vGUnA)!0h6ulBO*@A z;Q2F=+LVMe+?Vu-e&}wVhX4x5QhS+4aGh1JevFoTtyf7@Og(igyCc3rd$1$MQz{Zu zfz)Z--?X%TIumgM_V;QE^0cKdU^6H(=Fk_E1k=6K4Br*UF?B{PMx1|hc%wD_z~9PK z0{Srlwg!c7DF=&Gj=9}IZ&>`rJ+098GqHyZQ1L!4I+Uk?qe;81f!8uU(vPG6q6>qH zf&xA(E=zk>|5Y5Ra2JgJ<5g2QNb&V=Kggb0?WKbyWXD!67rGSL%S{(}1xP?PY%b04 zy>I+jxLUwRA7*#L&UQ$#LUZa)-|I9lQ#<4^t=TiLfG>W1&eI`5B(;SK)`Qik7>rql z-<9`I8L8y%bGVxsx0x^t8J59%%R5}(ML$)p;_;4Eoo^Ta;Mxr069X#!4yvU+_OC^0 zLx-E(k%CE5>Z?tQjTFjFOIE%AfFjAaMM9-XJ^o%I;fG4H)Rn0Y*&!bDM5|*V3?Y>LZzI&;QsF{t#9I^T?3#IhGf+>0Oocq%Y&riQ}<7U&PW0^*wt_^ z=3y3+0n=l)`ExbAJLX(QR@mZuAN67iRE_(tnx^Hci+eR@p4}1|F<8WV{eAuyJ(XgC4d<3JMT|mJ8*rguzp*FcC{|gXa*c#d!o)6cqn%g(N=X+*wCEPS*HK75%pD4} z5!B(Uys=V}Fu%Iay|ipaQJHWWDC_Y7;$(l@Pnl{kYJ?FBl6K4sqF%DY4yFa$NU`Tn z4%KDR7%&g~^g>J>oV}zB75y}+6kr8j(a?@b(wb1wIBBC$x8<*hz#s$DlBhLW7%09U z5VEZ&HL9aE*y1ZICKlT2Ay)t&_{RF(A}o>Q60H}NLJ@aLS7}S~8SfIzv1Sx01ep4% z>d=Y^&F)2gE;Ppy*l)FI`+1bMVRAjyeG4Y$sWAL^gy-ZaG8jNQZwF5k)e>P^u1@*- zTI02V9YVLjtM-{KNq9WpRGW(;Ou4U^2bJT0traE7wl1Qc1xtUDa=o%BFe90o&-8aU zO=+v{0VOV?NjD#{vo>|#=k*#6|CwQ%v1NDCsGgxTK4xF?*Ie0aryLE%%_GRr6uYWP zj}^1b0DsDx$c4my!&?b3twbMil>PMrTCP)xx?{Fr1j_A!mD+LfR(_}0SuXm@!W}Wa#i~Jz?sYStaBXA zg2MQ>+r_4#1S|AqA-lAri4&`s%zBB?2w-dYF`nkkC3`rPCXO#4OcL!Ca*O}twr7Y% z4e74IQOBKe1*pz_BgpHw*wOo8q(a4F&Ze&^9>s~_Yj;~{c1gd8igXjjK~5mT?kni#b#j4#!0C{wPZA(^An}cTLJ1iWb_7J{#lMO z<{A%mKX7XR)ZU&@$P!$h8=tycH|eoI5*oo2{izGDN`S{m+%Rr-FLGzX&-$JP{U~Uv zY25#9q>oB1OSn+aeHyg#-VsLSU{F_^aTBlps<6H8IT?p9V|$~A6>mGc>H(c%#+u_# zKg-ngaWhDF8J`Yoe_3Z7W-i-bm$PwfEW?j8(oX#vbvu)K915a>^;=B*!FLSUjgLJJh@S2fD~g} z_48ap$J}El_;%Z5bDC}k(}_+|M6J7QNya@;Qg^648>{A9#wwVO7^s^dhW#%MW2TCX$`*F_rTu{V)nT?bxkG?}{!-~Ker?jOZhl)7gnx`fQ)A2*31lSi!oU@ZrqL*gg&z>F~M*TZBEms>m8j`gDDNDiTI z*lSZ~Fvoq|h^(SX<0n@P&Y{(z?uX;e-9?GV>AKnOnlZ<_okzkKfyeSFTqV`xzEfu< zi4s~;UX}BC8ZS6@4{1j(X^q?ebMJj~-`?{%Z_aa`&v^P7nl2> z|F6JRH^2k|LV#8GB7~S#4IEytixjIP9Yzfl!s>((S6qQ$tp|%>jBeCUf%ydTK~-=r(^=az+d)X zpZ|3MF_FnJ3+Y&f<_WuBeFf;ipud^GOn?@!*VLrcD?3||2)Y887cVy|OWaEjBQiYT z$#89ke%6b#F=@VNt zBXLb8DNw$C>hwbYN0JFqOKE*WC1-BA>bwYg4V8z)1(*tT%O+Bpve z9q}7vR-JQTb+Y%3sV2rIwf*%)TMR?rKMU@C>1>#~ha!UC55AC-GOgP-V7a?KwMM#E z`MU^C$>La~z4FI!+go_*b8@)g z{s%(5?o$?o;b&FBq_)Ai0UnBWthXJP8cKYOFjd2SbX3&R2bIj{Ej#HIqZUxmHxt<8 zNe2g^b$FN~EnV1_ZWd&RJk+JTlX!h_nzMCgWKWOW&2V1M6*&7$uEX|EVM%#}{6CvP zYw>1$^o?e6dE)>wZv(Zu?jpS=P3j9yExK0hcJJ`^!13F8?T6JUBt}(;AZQiwTnWRX z+Zs4tUqh)ppF1g8eo{^CZ7jk`o2EmQ>5J6bmTY_{;mP#?AjozH(((}n0(jmXZR(yxBJl&1xQa5 zmi5JK*}R(U7Z#<(SD{#82(96+7S10(2Zu8C&-><&}7HhLxaN&@#ncN z6Ljr(1bu4R{USuS=cd*5@KpZfMEMnT#xy{`a0RdxO5xQX^yr$F72OeX)D~#}qvUB9 zY4(Le8wsE{FmDUqriugQg1|)wnIFIi!q#&bVfcmVUt@R)=Q918@a;b7 zlyAzXr8?V&kA*m*8Zr77WFW2j$7=`H$awkRPPH^{8HKuwM}hR>xcNVdEhEF%Oc+SK zdwx&-Zxj&-GsCasw_%YM*Tou5GVPX@KP(!yelcgp!^+xsputP75aZ4 zitK9e2;#k0FX3R~?r5@MC8Ho?i0#a`kAtu{DjF2b>-+uTGaJ^0aMH#_Wh2GAth97C zsev{rWvY$axetxf#ol9uZw5bp5ElZRelgnRaN2-`5r{*YW_59;N`mJu<1iOVe$L7b zMH1slfLTL8cBGt|zN=mdjvJ@(+BfNP5NmAfOX;oRTCckgkm9yG93o6%Pwqn57*^F8 zF&i(}8j|a$IHJ@!d`MR17SA}a#ur>-M#!Xjdm4BvgrlnAikXMaAX%Y9CE%ji3&uSw6g>OKZj;BvN0^=B(vcMyC8Pwtf|6yNd0GaYKod1DwX|4BztfcMLO`eSs>KQRR5|S@2kp6=Jw}nR&p_Tn$ zy>PHflzHIa?}3_R}1OpKXpkY%WU<@u8DWZ%GDm?u`RYrci5eg zRovp@WfxIQbeeO_^eV_kR~B;a-J^NOdahSs!8!DbokT>V;op3f3Ck83w5}W%k`5d2 zV}Q|TwsQx#18JcO`r61f{i(w4m~g*j;LB@A%B|oUhUlp%r3q}s$F9!u9!MA5Jo@8W z-sMn$z3{}GUyjMB@_3{aS9+Z|zi#JjFXn6JI;Z)WqVLNx;mKjE{NnwW@K8mQK2dF~ z<*eL-#3{|S`LIlvz?C?5z31i0@Wsp;l6MYQP2NjW1th~}zH`@@nNt6-*g)@S*y3th z^ewxDH{#E`_$7Zg3A=WLBIprw4#Falwn&!kq1cA6!_`dP3aiNIe7;v7oXE|?qs1kb z8)R^qh9i{SR{Ktm*~Xq2580GP2}a&bZB!hEb4Uedcv?VIdsaOc&f}+GV|w!ce1}dZ z{Pd8l>%e^T#}@@6;7f6IG(yb{>O^4cCTuxh-t3d>;vZ?*Yn8?@+F-WYAs#w>DDvBIf57Ry)MdBsGy-M{A2jAQ6 zIAhqE2Q=A~%G7M@z&Ml{|F7m08KPmAy`78-a9YU#f#xAI6lmWrNm zZ}bSTYQl@Y1%`~J?iGbU{hHqS_8>TDQtnf+hq;ZcWD6L=Av~gn<>WQSnIUS`MB|W=ReeMph|5(G1sN+rVHF=Fmdr}HHZRL4T-DHhmzyUI z)f9I6k9@+y7L${v5*qxC#eSj6?F?BcrkGy$SG)C>`6eK;gFs=m8U{|0B)Oqk>rgmG zvJmi>WWE9(<~aW@t#Oy_MdvkTAN&p<2mLVOIqKk$IH8u3yu-q=q+YRuo@YdCtYvzp zqqM&$cEEW+DJ`e=sL0w4(jcyZZf$cBoPSP}=VtGY1cYtp?o(0bOZai~xCaG)RuRZ3 zU^CNOa5WXMc0L{fv7>tKjOxaKk2NBGHJCzoK&rkPg*Ka1SHOHJKhmzNV~cSw>DoZJac5WkvPB4qqqF@ zgycG{#tG@(b2B~|d+Ne4PoweJFzeql%~}-{P=j%l_sP4Jk)!*F31SU-uHg-4)tN~{ zPa*{ngny@9)b$F+(XV=+ua#z+){9s<^?NY2OqGa$kKc>0Nh0R`_+#{7+Hg@zbNBDt zF-ir7ycs@|4sPz_g(6s8Qr>aRbSMwK1C3&`k<>!zrqGnPJbuv-G#;BRd)S)FVyUua zfy{q{pywEZ7p^@G6LEn6;|_@cYk`+n%LJe|or^2IiVa{0*B!-n`t`wXgL4}EUW*I)0+r9+We_Hr?eGG&hU zlwlFH3NqV_9TgNTAO|6@ZW$7&BDNLw^wt|kYK}3>uVNPSd~%=`A0A(&BjTq-CPEe) z{cP)YY^j)!fk*`|qk`45L05x{ZBKpCSUU(>1*N_~REL{r`}C;4G^exM%ICL|S+yLm z)B5fLZh6!C@KczT+>D`ofBA!fY@Qul4#jl_oMHo)o>z28j@H@re;Yh}%G$X=85WeX zvrCs%rJ}p++M-x}y8<$lhY=V|exZERaPj;O+er>I1Wj6bU^SV?9Eg^;R~d3Q!+E{7 z`xeF;PK3qVq^ z8GGkV=~Gho$L53}+b`j_{1;v~^RjQoEu$6iJj8?~ixq=aC(3ra&iorOgOw<)`Yx>l z^DbFJi_?5GEe5?eM6^{V9Lx?i4=#t$2D3^B2(7#L-5t3waR_{t^WlOf^;vbKnIL;w zMaW(o(~Dt;zrQ>Cfmft9j!Qt4dR)XBkNI6OJu|`TPt)D*XTQ{~R-<`KVfgub8uLsM zuTC5<9Z=~Oq7^`c<}IBqSxXlsW?$EQ=QaJgGIAg4Zu?r9F(f>+CL#+Y&Y^;hFHP#3!q6F$>d=!WHD?a-OB?&0GGs_#~8~V#^7He|Pe1lPioE=X9sS z>>fAKkEbg;LmqFyDQl%il@;>02b)fu6n~lD3vJ=k=Lb>Y?l_N{Witi$@2&A3vm{g8 z<-fMPaxVmJQ6El}S#>{T^DB0@UEeC*u=6FFopAMdzRbOu+38pZA{Yof?n^1hpWB$M z<1BuB#Fd|@s$&g;oTg-)QuV%th33%P%S>}{-ldh75~USjN(Z{n+s*`I-v|XVFLz#7 z$)))zcyaGYSMJXjQMw7yai-V_@prYXYs{An(+k%(f-~YCXMe5t%81T!c9DpIAan`q zh9BUwppAOhn_I#UmB8}tG#!5$q9z8~pJC`_#lPKng$;4c4LHTdi>aGo6 zhN1QIEMN2x+UN)RH!%QzFV~;Aba33+4z~_W!ayz&85<7L?vFeUS3#&zw>!C_{PDKq zvu$5io%yUrVm&MqDMKji>APt)j&@UoCK;4fkmP*DT{5l(_ya!r=^bU|FgcIzKWl+5 z_&r9GFFVsCm-2xn0wLGO(X0F^Z^9(QEVN^^4{KXn_WDCMUfCE%utr)iJc>3&5{iyd`Y>-|4SM3-u690`>wcqGzq{Te zEJ1EC1jWDow2OVm3Z9D-@p5AYquj@`hiNaq4C=9RKQ+dh&z85S7tk#DrYkhhvCG~~ zR_We>$6QpErsiyFQ_;w3^Ccb!6p^Hy)K%mG%1`a833pq5f=AjLuK<7Pr3?(TC8sE~ zP#&?1i;<2yN!$726|Ako>5?P>GNM3H)(UEuF{tZmJuH}e!RjyMCG2k-LMd#x3Jw@K YTybjlT81jCwE_%OgD(qZ1g_@(3%#jFwEzGB literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light auburn.jpg b/common/helpers/colour_estimation/hair_colours/light auburn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dd3c79f091360df0cd9e41374e5f1a9c2e3c1a8 GIT binary patch literal 4432 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 S>UBIZJ>A~vU#*7A&;JFsdhT!l literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light blonde.jpg b/common/helpers/colour_estimation/hair_colours/light blonde.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb8fe425d36573a5fe5082fbcb5667506d76fd16 GIT binary patch literal 5039 zcmbtXX*d*)w;pD!5o2qNouS5--3-Fm*D#m}zw9FGXk__W$Ck!2)@0wZgiM8@?8}TL zCDg=-P$J0|igLUE``qWb-|u*r&CKRuvoky5TA~Tvu;xnikn3jU63V32y43j=G0RFQ5 zAG-gPF@wPWAp`xNP7Gj131uFX9nd2zQBsA79ypr^Z~z(pN&|ucdH{ZpYofu3>cUA4 zMv)WVf112Gome_Juild^eSH5KGjO z<(+w>2iY4|o7k^SD9z3ZC>!dZ7pynTj845{Li>|iYN-CA-{)WWl`#O=qUr%MN3}9n zbxdgWN>9T;uo6c&Gg{-?T8!^QkdC!Jw@pcDDA$Mx-#~#OVV$tbGAsP%T*L#_+NgYN z=6D6(x~kZlg)K+7R;@L8w)*)ozIx=*aWWw%yuo`7`ltkPkj(8bRVW{p9r(_HOK8-N zdXpZwj;+spX|I)e&zV;O&49QqIG8uUvey~Vk%yLb8S-%s^3KdxixQ!Nz8zMlJgd4_ z-S~qlz8sSwiEMEN#fIT4(6t#Fh#=pI0U4(bR*di)QqWWRZ9JD&E^5IXM2MiM?VU^L z=hI3Y5PZe*`b~|$WQa^9B`8=4b$Deng!v{-Gp!-<8Hw{^oI1Ro@u|rDmbG6t$u?56 zCj|G`ofvb8Oh^F|$|h)X*rKrgLSByhd|c&u-A(@|)`FrqW{vl|Wf#|=2A(!Y5wO~^ zmHxQug=N3q_-Mai%d&_k0d{?<6c|^4w}OXq1#4nv+whZBI@ofpJ!`SuUt?SIZJNW4 zFbAv09-JKEIW2;&?x|wqv8cNJgS`x#qP@1R>cbLL=t$q(4Q_&`(b{^&138QCq7+N!3$sw6B%SdOt9(4Xw?Y$A{Ml}p{28{h z_P-TccPgAWW}nK}6Eqz3NsHo6CvLLVe0*D}d6$F$m2FtEdaE9E8AcX1&kt@nCXqyw zL+3<#4%##nub~7vjwM{;Ki~MIyHaj4{<1Dr%&TP$$Hb|x{srs1-R|1TdhWaHKK1w_gg4;fewWW<^CwP~Y?h(NJEMat7d4Yd{)iS{fmqlLfyk@dhyww5Lh5x!LfbyQk|iq+e8 zS0}jE?J9rolA4<@+?ClIq+|7ee}#_=lvBn-|Dn(4OtMPh4<2;Tew;+L71p?jqxt#hEx+y#3du>Yg=VQ_Cb8+Mf9sjJj%OO|$o?eHCLW499r`uf z1{nmnKWRj3h^7TA8yjJyQpXHC@YLg$Yi0zc{Sg{R>G@%35jM@@D`8uoPQV(QG1s*B zid-8`>5#qCf2`KKH+h$HuEX4;p>?@5{DI11sVsSz7)B(`-@AvKgMK>y3kzg!fk#NZ zr!f!y^dXFh%c!Vz3v>8yU-{~r0O(8a#Qjb

1c=c7lRuKk zkcX$jyg)m~A)v&Btz8}!B(N0f;P@2Y(2Wc_GTs!h=lAjLr_PY2W_fK5=PqwSR0PVt$kLpRczr>aVpzIG#@%s?&9 zgO%zd&E<&@kH$=HH#rY@mIzEiVn-aJ<5z42F`G)s!aQ6BiNBi`I6t+l#czz|==X~} zhXyQD>&U6->juC}kYW?|6D6@8)M@tgq1pd3>P;w+FDoE=SELrrVU@A7#=Nj~!cK&X3(9Do{;FVq+Am*o& zH^!D5n=WX=JD4w);Qyn+ZoCV&zhT(qBFqc)BEjrq97(j2zzi&>_(?>%7xz3)+oMSzTUwk+!6f_Y@UPwZ335=)AJ2mHQ@@Ji^&ga zq^mwnzo^$;J<0G0(Xtvzl+~vQWfL*}l|iykjbI`P;~Kw5t)FBNW^9h>M5<=iF)+Q<$D~bY7E@CyVH2y#q{LR3&&6X5rjfNkI^Lf>%> zcr8Re19TM7=+eWSp!cJpVtaX}`lCziKY^k3WQzFPS#>`WKO8O+Qu(sUWt*5MvG~n= z?Fe2m-(cE2BzM16KrMDiu92l&lYddBGxNSqyk+Rsf9p%*S6%ma(>@Yss|ye1jAQPP zIT<@-Rsyg)1%BfZu&$$8h%bl8uK(nAAeimI`1ykNVVQMPCVoLIT@)gw2~=@ ztV^Bcw47E$@l`e{P?pK9BK1i{udouAf}q|0i#et}+G#D;Y>p4S3KoT157i$2%IAX@t{G+J*0WyCe~Ck%v_p- zm_1Hq{`0vx;;|g}n2t{ZU8TU?1|peaZ-P5m$8O7b11^BdCzT>9gFWvSO_ht9N)al; zEURxFFDUY5v7z;mTPQx~VvCPOgHlL3cWi%)`gk{nsiR`C-H9ofH3sKL=)2uc5LYR zqKioT&49clXwLcP$8z;Qd>{B^*4$qv8P*~x>eTLcAB7e)q`58n5aL-&>Ib=2nKduF zXqsLX8E&)PQL$)d>ROF^;!eQ4wdZitW6lbNc)>96&Sgn|{s@BwB}(AzBjuEom%Z0% zr55*TK$7n0b1~;r?U2}Wstf7&gqarvTkWH!zjwnXr<1;5TT4@~L&N+owL7eZ--?TN zVXNLBklgN~;Rl*)4=>jZvwpxpzb(b~sl-Q*Gje&3wp@(2@7pjnndW*~k>MgTZI}9* z<>A#??`ws0(i9SqF;|izW)wY{rrjkcugE1^!G()I z0Mqa}tbye%+7I{Z0(8h2D zHG!omLlTtMJ1soh$k0g#9!)ud_q#mxxcXsS_a4F$!iopA)$0K=}3DN`jdGh(fqP zo$G)wkgAJw%QlQluIA@*$Ke~(KC zP|nS$!Q7`xf@q8}&==%B7py-{X;QNiusQaTz-fZ1sL?Y(LDMwnhh|uYNu`6|Q_i-4 zL~gUcMIq7j3Wib~M!lFVtLJRHXA7B*t6 z-Hv|i1q`CqvAWJlKU2N{&j1qW=KW>F3l^I2?!MU_DW>r2YR=1l->ur2Su&prz35I8 zP>k8C;%QXY1^sfHkw|Ln3_ntQH zJazGC5R@)_Kc(`O5Og(u)5(B~`KL5fhp!AhJLrd0Tyk3-<{;%KO>n zD+JuF5{#+XW`aXS7+FnSB3rV~H*#EKSOg}r^L|9gOEW#a8JnAv#rpAG@NCV<833bl zs?6}JO340v*6Q)2M|YN)a=eI1D9I-yCM5!vnA`rg_`F>6bvWryfilC7KNxykF`r7? z1&Jl>L__@Ab7+aU+LwAMQ2mg1#_U9>dc0=Zgb51zyb%VrSAAj(8vl1%0BsW*19iSV z)rm^zhe<_qFLU2am*G(#>HT*&5Ggnsa3_HvpdC}C6PV_2%WM$kL0HM)S}_n7Q=;L& z(xDB_-`O&Zv>#4hX?n?lmnee5ex=pKpV)9ftmglbH><^OP!H7$HY+6Dvhwf`#^c8H H&ffnQ1u+Du literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light brown.jpg b/common/helpers/colour_estimation/hair_colours/light brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ae276b24a9b4f9a2f4417e4d8afce346a5d3c21 GIT binary patch literal 3611 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 Q3z;GdPP};Y^=SHk07tea00000 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light cool brown.jpg b/common/helpers/colour_estimation/hair_colours/light cool brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c59c7ace3b0f4b229ea2ce6ff4f6bfab8794953 GIT binary patch literal 5323 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light golden blonde.jpg b/common/helpers/colour_estimation/hair_colours/light golden blonde.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f02c77e3921ec48dff9d0583d8e91bbd7d2046ca GIT binary patch literal 5005 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 PKZa2hpDa%{d^7zYwN@Gn literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/light golden brown.jpg b/common/helpers/colour_estimation/hair_colours/light golden brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6592a4f7d09fb78503580173849af0586173515c GIT binary patch literal 4205 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 WHQsBDAzN3-U!MHMZ~+Wm%>4(srKscp literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/medium champagne.jpg b/common/helpers/colour_estimation/hair_colours/medium champagne.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c10df03711037976c279a48fbb8c292c06f0505 GIT binary patch literal 5302 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 C5L(s% literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/midnighrruby.jpg b/common/helpers/colour_estimation/hair_colours/midnighrruby.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c057e82bc280c92704c28e6e05db180217625682 GIT binary patch literal 5809 zcmbuD_fr!zqK47XUImPUfsx^AajB4W5K)`=!|Ht}IzPbe= zgZ(cH0{k!NzuPcgu!Ji7io?e!8Cu6L6-K&T0MJ}j0>Q58C?Nx2i-N>_n|+` z*uqy0tPagzJR5S@EYV=GDK$lNbTm&1Wk66hmU0Ive$L*lYd`w@(kw-}DNoRrhhpAa zMF&F8hvW&wI#u6zsyCyLs5Y72*v_0ME3ko0bGiATQ^V?Ej_nl=*ABzvpK##h_vVwr zXur9WpL2!XoTo2A6!~Wz3w1%NNaqM!bjf$-_Skr^e}CM{PugUkY=Tjuth-t0s%#E1xXH4{D#7;yc-|KeP zJj8yP^%9D5(8&Svlz~H355aSDOhTEMa$>lhM#V4R50`+f(2mUI8`ItoYJ2o{Wh*d1 zmC26V&r2q|Z;svBt+2Aq<{zfnpj@E;T|%TbEDD<1Ib{J@6g00q7Jp-FwII~k(u6a0 z7U4)1<>0GXa`x(iZ@RkwN zpvmyvMRZT#$AJnSB#y~|h7MSm+J4^9&0=uGy7?k+Vyd4lMd6$4fg2HDd+_(A;^BL^ ziux}#^XFpDjOw8i)C1am$tyU-rVYs;3OVJqs1ACyVTNL!pDMu6RcbL4-f z7%`(Vxmv_=eWu4(dX(tdT0(B@T7oPZVnPBy%HKn`z1wQ_+8(PsTx^EYeDtxRpwgm& zqM@wLp+xuXp~VkAm8rH)DB&8mE$TjPgELqR^8@uiV z$>O*#Akj%EG!fsX3IfnUO3UE6fApZL9Hf>wV$p!23dB4*}soPQ3stpc`;#S`yN6U1PechG=3DW9Mz6$cUF$J9bx-G$7D8yl> z|9e&0Tc3PTI>?Xs`NY+`Gy~~c=OjH&NvoO`qCtHL;I^StQ_%HzOEsY{os3yj;daD` zld@`jLl_!85+t`+z@J*RBKVr=-i{(d!W53&=$Kie@3K6X-Y>U{!raai|NNpARU9(e zA(2?5E1SA=QGB1V%qge*2hKJh*Qv(|YLf69%u_P0(Gacf5sxdm1iL=r`I3 zFRo+F#|95vtb)cCY6mJe`5lji+rIV^Qf8;)>P1o#i|KDcuX$>ZI527}xaTvlS!CCx z3QjbLa8(zYe8VJB(~Emp*;tuvPCcsodr^&wfHt! zYp+IDRNnFnH7FlhI%^hCkoa+8QvlW10X;=?{y{HOGkqQl;?d%t%nXm-c&&>#^Zwp# zT{dxa31}UkuSnLOmYhoRV|mOWO~6So+lB{D3bkDL*2S$i&FPEW*s;EMo}%|;nyUSa zAj=RLK2f6%wSPnX&UGqZcsM(^$`TY<=edAciB+h9zcf)2IUe^Mu-jwlg2VGko(?t^ zLXR9MxaB9RgkSQ1Q^shrHYTtJm)-FBJvslkXPE8%xkN^C+XBI)hz}K5yu`8+`S%f5 z6@oNcl3RQiY2?ZSr@RM2tk%o8Sj}!m^L89SudB-M1&S)ZvT@WEoZcMoDeM{jQ-7x_ zHg5)Nr&MT~R$o05J{G-FH9}Z@VF)>(O+pKVPTYxJ8v4G~K#mppipDtSADScV%wveK zu|<-3pw3g?4(~gHHhkXo_bNg7)#*G;Lh&^|4f`P3z3+BP^hQd}5c{_dy>-I*J*pH+ zvdOxz_2;_AO5+6~vYFk7!tPcw5r4D)ji-H}>0nARbfMV)^Y~@W&XX$4iN@4+%DwPs zw%+%s7P;8yQCv@1KV`2LrO35V{ex@7xxL%nlG+GNMM_o2mU}9_e3j`ECmK_R=3URX zT95g7bE5U`rvYDeH^F|c%^!xI)v5;0XZkPA`?*L99=%n8hWbDFEK#w|@N%Z$H7OGs z+WCtT*+ie8HVGU!AjF3huG4wjhA|lKZT9J0-8(PmcMIW!RcIO+mi#g}_&!Lt()m|{ zqMXO%Nn8U1)yM<6_JTSANA!%n*2xNF6LUw`dUvpoZi(TgQ!+hD znRV-zMEJBkao0KvMzIzCtoNj;Wj22hwaeUns<3{HTV@3(12xvURw+J&Rynhx7)s_T zn-rYei8$ct&Nd-zszULZ^hfi?ARhXH?W3`vGQ$(M*_ob=@~IN7W(;VH(iC8?ZS;Ze zl~0`4elr*CCEzzmUD8}{`7G!8Y!ggD;Kgw0_>a}ApPQnMQ5qTwv0_+=HL94{t1+A) zvQCuMr);I)=@n`dVaf||gOSJXx0<2uGP|K#=92As z>K28>F5?&%|098<^6pDO%#k%@V*8tQUn_Y*mz>Quk=KM&j9sA8T8wx|NkajQJwy1T z9V>Tqjp-RhNMFNdoSS2$p+yJbs5?{QEllTqX@*o^g;!RS@fUx_9=sO9>D~_rT`?-` zbuq#Lg57MsWg7#z;?l{S3+|!1xCi9|UkJ{42kie@yRN?A`yo2LeHpesTbm!%qhy*z z_mSvR@y;MZG|oGBLtbFbuulq_V5enSoCkoPetuK!Dj=QWuynUH0>hBvkR~W{r>ne? zC0L|J=i0q@jYik;C)LTUp$=5SLXkPPb*LnxUuvWV)3NZC#4oG_mQP;d;s*m-5ASqf zy*|}LW+;k{R6VNQnx5bvIo(g9%g^Wfms9cUpe*8Ld6(gP_1qzcPhHDoXE`>XEM70j zO6Y)lmIszE0os-ZBDj!)4@~l?=2ce7^u-;Al>nH)$0Ghc8vD6TGrjSYt>s7^saN+& z%F7ua$~4(EpZ(2Q&~J#&7UcM5%>?_1>$;eeQtnl%J#@7G7-cfIiI!P&U>Hc{{GtMT65xK?W}^f#I03>v*pX&yjy^fmdihLTddB_lyGW>0Iy zf>SoenW>u@wSyNW)h|sTimQFu9<|3TrQ(9ul9pJVew<@ZU+;+KqIVv^D%_5=g>P>h z<4Om)Wi~CJ&4kDCBUL3+HE7Kmtc4VdN8YH2lb_xtNLAJMe!>Tepd=A@y`L@m+)dVa z0{3n z{;eawXoET@)~4hX7ZU)bGSA9QcC}3_SJCJ@Crq(C0yUBNw8xQXn|UuwQN~)V7K3yp z?mC8hPbCP!xc|hoZ48;L%XQediY)OH(3STF zABvDH0}dljB9NOL+{g?DlLtS2uU_DJd7o0c=w03NIN81T3j|R7s$aqgr82?})*!Rc zkM|lNbHBA4CLpJ(AIHk%Yqy5bU(o5dvolIjRZ6oKRxl@ zm(w9;6YEMf<*8;Avz0YVfR+%niZ(-)+^#0TbE4r*;Z&JJcg2)~`1{HsmDfe_f6#V! z>#`{|vdK^y0wby`7yH;pZihG=lmF0W({aIJW_6V$uL}0hqEi!-i=~daoAxMRio>1a zHtq2tLFb!(fM)rq&Awi5`GF}de~`q*AmjBpZJ|U0ub1z9RYk3)0oIXsPUDtzOJq}7 zog$s%*1M2^L&ex9Qp_8ga=F-_hz`c}V0ku2t?sI~S^p?s;#7Qn8oiOG+$;%^54X2t zWu64SFy4wvlU7t+MnfJ6C_U?ztyxF*l}O|k(CKgSb@r~!6$g7|!` z5-g5*HGkn@&Dd&RQ(I#KmX!Up0?K;_G8;-FRy7_4etm-vi$$xZfxY$VfZV4a_TO(8 z@8Tvmdds=K#0Ao05^vpMzy5P|8mE)2<+Kuej}y1LjIbxYH`ybOr}OJwIgK0zRVwdR zxjqfFPByT?B0o|_M=|m@e>HO6BGY3r;17nQ6XXg`6evnIxA~ z7IIB+&Fe=?_(ANswhpt;_2lUOKovKvVO}Y}Gm)4@;nh;k{#u$wl|{pZ@xdxZydgD4 zHfKOCt*r7^Rvdw4UqLx5k=7vHe`sEn2lVV@~cPYI$tS?j@K9|)tnooy*tRYKDTt;`-Onl2W(s{oOVD_QUu7+z1|31aB{?h8Z z-@tl`4pBD-TaAW3$~U5rmx|KlyRy(J4q`}Qyw~WOLrFTm9jbz#!(MeIj~LH3>~Uxf zj?|4ywm5@zk7x-~9rMhZPy-#hsL^sqq|Bjeidx{ZDaw`7OLK(m$(v9vdVY4z@*8kc zw`s#Z_NLW}uzP~wS99fQe+1=}n_`0dCBQa|P6hqs{7I_7+NpxLjJxjqC7@CIrF9CI zI-)A@C}0k=^6>uL+p^tQ@|s}Z6xGJ;14%>BM$mOxI{Gh|8n{Xd73q9Y!fPc5kLrl9 zyofgUo_6p8gd}|JEB#Z?-1SE~NL;2eGy0s)LTG2He*4`gj--YyrpXf2s9ZVDkIsbGa>BA5#$6W_qw8LdrnW!2L=_DW+3(MewH z;^3AEzQA=~?3a^TE6QgIlzAAQAhvIuiFgKWFYn_XizCa~XTZ zjao^Ev3kE-G|%0Nx<$(t@d4t)#7&t+(ku9hXStAGobEEri}9UGz{y+Y&jPvy>2DkZ zw_I%ty4@mmPbC-EhEu4|=87JcT1kA|JbI;%yu&YZ`t~uFC%dKU{cnej!gzxP*C^>- z!8T#X5gnrQ#%fK$a4N@5&9UW~j!e_3$TFH9lV5^gVA+Ajl~$2O2mCM{4GHE{6gh|f zPpSG0tr86-EvrKkp(xklY9JVJMtm-j4FS|wl}>tDUg%NNb{u+sI29I=XSGQ?%a;t-%5Qtx&)rlJ zv*?wIl68G`qO$s$tc5EzIqDliw4Obb*tRK#JfSaJZ!u7?$3=s x2m|c-4}I~gqCPwxDOO|MOhxfyGp`yE?7S=B+jHe-!B(j#9ewwgUp`!Z`X7MeUvvNf literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/pure-diamond.jpg b/common/helpers/colour_estimation/hair_colours/pure-diamond.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80da260a644733efe92bc425c6622448d037f1e2 GIT binary patch literal 6282 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 G+5ZBJ_J!>L literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/red hot cinnamon.jpg b/common/helpers/colour_estimation/hair_colours/red hot cinnamon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b5185bbed6a7185136653ac794a5dedeec8d2df GIT binary patch literal 3878 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 literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/rubyfusion.jpg b/common/helpers/colour_estimation/hair_colours/rubyfusion.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c2174cc2753066291254b1e9945a8eb5e39ab85 GIT binary patch literal 5129 zcmbtVS3KMel>JZ9dkxVBgV8$?y_X>vCCZ2vHKRw1k{QC1=t2HUK~%003PRxLO3B0A&9Sa&j_C zN(xF!8fq#kY8ob5x@$7sWMpByj+-~Q*xA^*ZivFTxnZKxB0?h4D)RCwhI)ohPBEbW zufbI>z(fgz1MLuy003qJL6|^S13)?efFYo30RIaJ6abTf$SEip0Wb&x0Yjls@@vI) z8U$tnApB5fS#3)e0oNd0W+_2XPN$Dd9_1Ds$2zfAb_fFguh)OoK%ivgOaK@R27$@J zAhQ2ybM3`{?GprHmUG2r3J`Qy-1;UCuNDAW2hkFvAPAZ`6M z?^PDw4jC)BV@yhRJd)QDeK!05AqZ%n-&||{@jOJo-a%=dA+NtWtsbYKM15Wr=pp%m zXL{m^ zq2BT|MTh`lX>{H$D^W~~BV)H#&yKhFe4TW~(#kVT&k6()P=pG=qPP^ll!DcZ=Qe|? zcBeeKAZtEvkoi>i^cz`c1e=V!{6f$#wg@>^cV9BP8As@JD@)KY=YmTAs&&C+{}s?g zf&L6mV~u`xS90;mLbEWdjWjti5JLKS)4OeO391#4FC)4QH^+x$f2JvO_*NwXoP)rL ze+^s&0!to&26=Q+iIwDbr+}FaHmVmSck#$fz#%faO$OBL4ckaO8-O?{W$M>bUTcQr z8Oc1BJ)_oGay+zuw2SOKKw3oO$f>cf=X%LY>!V)X;Q5FLZ=aZIFPiEytVc);nsp&f_7`nRDz+KO3bhh#kHSIEo`)FMOQgO6$X& zyZtRg;MbAKJ56P8vTk>)xN3$y+GG2~)G|YTApC=1GoVuxt0>N3i0|mCO{>5jeh`Sv zEy!UVzqB{Z(RWcZ7*3Yt32WrLEe0Ru)><;J2&d?`?Cbqyi8BS-UW{of8F7lpl(l)W z-W4dwV#Wj=@P!np|wmE_~#4!-?7;CUm-?nha81IHCu2&?9 z=Rv(tic2PLCrHb~dBhm2-gyO#)aUiQGS|%e+e}pN0H=FI+geR={DK#^TKjv5#LYum zRvB{C{j@NY3pBiuu6({(Yg{FqNX(|%Fz+7DmJBtLmdMHrLu8+nIqU3J%TVN3%>tRO~6ccV{fMd0DwMhN>;lO&j}iD@BRmm-6i6>Z#BVJa&jZ zNVeHVQlnVIFj9uBBeNK_8QW_;CH1GGlfBO^YOew9GAh1L_1fNsP}Ok*5-0zH8C-C5yMNGPPeib z#rP`nbL*7Q9%UBx;T^ryas_hd9B&6IQOd9q+4l`K#duaZ*pr~Eym6l5w!2HbH-sv` zPpVk+h)biWy6`S!qkJ`$Z7M<>lPn016ql@+VQ>d5yUA#^C_^+;76b67iDU{k_TzsL zfP2RITPf5;nIJY7x~ZuQ_X0+p)i}9<{9kTlthHd);6R2pGiT2wM0^58E4xX;DT1Ov z3rh8=W=Ql0SH2yAalpKC9*#QwJc3{>VHcT*;JX=`?UA7Ud%;a5cTgB@)g~bozplcf z=~3R6>#>~YH}Dg%O;{A}_k>cWYp>*3z?7jR`QeDlq?|6)@7w(0YQ|vT1XElgP2oTB zB0%E2$V_2mg{OlzEH~X&fo%$+cg*6X$tFKZT|B7! zTvxq)R2iDSE(gmGlzVK}%7{=+?ITd+zafBGT_1-Sc9ieU&ZF4&b0_hSh-K8a}Wjab{)nD=k@Vx}n>^&p4fYDpIa z`K?dnX0jgoi`aayDeqizWr$>mAk48!d) zKQP&AUUO)pDEeW%R|p`&GkDC1VnG4W^J6mwQA3S$XBbm7j|zO_a-4bmb%0se*^Y~r zdbt5&9J3;ZFM-gi0)Z4G$&n5}?WbT^c}O<#U4P{j5Qa+i@j>nLNBR2f31p!+&i$EA zOPjdr93j*+#b#v`Y+)Xq)n0th!LblGhH5YhKE`kV;qa1{7*k&QDa*qY1a7G4;t0<&*B>&z0+>veB9!W-Dd6*xg zv{FE(itl~c@+&u$;+GDoPU^nM2H&$^+|*W&8Ak~YgjL^PbSCpdjB3p9cx4NuMwtv^ z9Blr&eqiZ8_Fb@1mTCf%RR}~v#=z7W^WHCBVtd&v%+?p zzl1i+p+Z$?nZPwm9sla%5Y;WRPS~S|4H9B_T8^cy&tQGe?1!- zojN#^2M|kJog85NoA~i$b>-Kok-=jw!gf*Vb2ht99d%RVRgm?fCw#n|m70lN#)W`*Ui6Ll}1mf^XRtoK8}Po?<3IJA%0ajJ8EqR{A6 z%&F?ql zBwxPt%h8wWimCPHRWp>=6kMWH@XWHg?(KES)51mXTRlV^@=Nij;z@Hz0jyh`M@PORn&^{i&UV=Iw_I@Bj^SCCKKGRiDLMs+!Yq>)oJCS6EK{0R<8 zW992nubEyxOnlxOmB=$}HXkgi&X5=o(T>8@5zQItDMrC5yZA8+KL^JL=P?MnwK=mh z&_h%Ftv#oISa`k5b3 za^hBtv=krIug3~P*5VvgaT$Uu^&tayHVBP;5+Ek(R(H$pv=Sj}ekYTW2Y?b3I=lPWNYHVOXXjiOsJP#c30X=?gK~z@@YUGO#z-=P|Kw_3SYcKK8}cr7V^Y68$>lcCiE~2M zSxU*gOwCYb!HUkgy_H^7>}j)mw|Q7m^0&4gtDayx2PV;F1*s2gTmgjACCjem3K_gm z%9t#trr4V$uJ(lI`u%@g$v~0y7Dh{dnF|p@A9ft-{QbKZ^{`>s+u14B_ALZ}7&qL~ z2QO$XlW5qK1+pG(W(JMN5ME}7-Zf3lmD&32QS(l5&t$>Q(H7)BN7%R^*ta>mEq9Zc zdQaSO=m+Co#t#`beYw2Trq~o7Y<)j_e3Q%Z>v8MdfB{i{i!l8wpzF~nezD^xad06@ zr*7aP#BK)1t^-j$(wu|lomJjkTj-1@@vueWjLX&}#8*ynT!|xVRwh1p68zWNm9Q*0B2MWwtZ;g)oUz+~n%5RWt zbryP(2V;;w7VCP6ubhMl^&fN_-i;N0-Wma28hGF7uE3>Su(v)eG2St(^B!`kZ%p)Q zNqzZ(zW85vJcHuwVSLf<{es~y86*!jt=uK|vPN)TPmI5_HKrm*LQCD~3Rtj5I}uy- zL|u%&jk6%N+b$1z>iHeRkgT-C24#!eL8$Dm=x~=iJZazN@BSS(L4>7q`p;k9-~awW zjdIn>HhbV*OG|`%2wxK)b&hyVkshj}gxLL{-G7OhkyU$!jJh{F95o^SU3_bb*Sa3HF@r4WXmOfra>`PeFhxk aYh5+X&K%zBNJp5)<<+1n$O6-^=Km9CBpd1g literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/sparkling-amber.jpg b/common/helpers/colour_estimation/hair_colours/sparkling-amber.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e36223b9cd3bcf29e1aa3af9f8851ccc48e53fa5 GIT binary patch literal 6345 zcmbu4^9Jm>Gs-(`SV7pH>*Kp+4B{WI`)9*6>{|3^?LH7zX- zEiD5*9UVObjPb%h!?>7Png0zJ2a=tQ9myfa&&|y*c0~j&az!4CmDkeHvbPTd{eJ`g zb^|b4AQ)(cfCK?B3*UXdQa4K*`xo^e{a@O@|G^L{YAEdA7JvZY zf5-k8fnWmCs$f4B6O39!@!vUs@gD)hATZzt@ZOfq)wMj6?w_g1P1Ior1NL0~$W-Sm8r$Hh5^7W_dg3`an-ZhG>do1^# zvm3XjP^dFRs{0eFXpDzd-j;K#!AZh!g>FCylvqQIh}cTEwOc7!T`X*m;L=g?YBDDl zfR=oz1v?^bB-;%lN2`kEk+LCdnukXgNjVW9x=S-uM`)bKgu-u)CcxSHTL;e!KULA7 z`>(hMECL8Qv~HxruGd_3nh>`HIFe7naAv1VOr_k5-746pjC_Zh^H=W{WG-_SN3OD0 z$3AtV=@cW6aP0dzM;*Y8o4YQv4yM+*}nN34Aaz2zKdfSkFyh>R zmSgU+{K7*+fyMBLzpUn~O2tFMjr{sB7wmZIuR1(|=fvzSu3p_WDrBybG4d_Fi_~RN z{N4axPz^%2_Ut|5-Q9zEq^Vb<9H9!-wgMk7CBk7TZ94^C>6Rr|TV5y_5`C+HVIAaX z!T~c>o{D(USb@G6B5$GiGL~K;kmpav^y;)p8Ocw0pzxKapBf6^l4ZeFz+|qsWPPOE zBEd2zeSLuMw8Vgpw0<)AJSfOBF2Y9rNn)&LQD@k3CGN{}iTj~V8l&@VOSBMK|L<^? zu)y}xwy>HWXJ;C7DRdhT%{6@v{?O{TEqPk4@dePJDVf@?%*3qF2~tc*ZCQ%gW;?6& z7pN0B{DS`*NgltnK%*mXtSnZ_Zab0N(^iTJxUrb*&Kf(TTpg6+ypq zIE8Jj(~IU}5|}*GU&ew|&6QCFjn6j);=TFMxroP%$K|2X3#W{EbhUH|mX_TKJmJ4h zdHBuFG&8gI7mZNqb?iDhDKwhAY|ok^g>^Oxm@SoUCdO>~T8~Ux3+<>ArLYD{#p9w^ zIlK9fb$|z+W&`&vo13gRlQB)r3Oq*x0+K!XhXr(!jVHGqqbhXCMyM;M42x+@U z5Z~AZ%JWC|`pgeQ#TPZOJ>EWh&t^EBos2YZwku~03kgC5E5TO14kwLre72ZrXyUj0 ztvzxB=Vka4%`$(X`QPjbX;V(wF>~Lc>TZY|&c@z`*F7HKL~8avWHpg?#|vSgg(}_T zIs<=R?nAsnUwOehvK&I*i2-IXNbAkh4VJsy8xBi@Fbmx>X|LnljGPNuaT3mnLWgQo zgvjOzs*I7Ezx)R%PvGk-(&=X}e!XyvkJ84H)oO;8*1dzDcgn`hsY7lm*)Zeoiatk3 zghLlMj(?Q9TuWnjYu#i|{kA|y19yvB74B~qRz)06LZ$T$(kb3ejSkzJa_{aiO5uNz zCVeiDTyN_yH`V3h#l8%8hgLTCl1}tv9X$to3*XTm-}p%|ak-Mi0-y)^wV07&DB|eX z+4i;sDg^9;Dds?(ccQgizM=IriQm>F<4K1G>^R@wFqGP#a&t+z06KWMVuf-yy~l^0 zt}A(ag(~R4A*8_(uMmi)AZ{7Wm1CPD)`Bx|_NDSug-bfEKSf7sb&+ny5(_iE%dEkI znvc5J@Xc$(d4Bif(^tz!9QqsIADVN~OpfAdQ45aGcX(<$;FkiPJqiC_+pgFie{_jb_3}<^m$v&%ul%Df@M1uVzjeW!opEKj zG+!6@j7QOJj0Y}?7U_+&;)2;a5LPT{J!el5N*G$px$lK<(;_`NvEB&$(yA&I< zg*JoWo4kQXfx@}qr^QJZJ-qk6*k(SK=U*4RRFz|4H25eNQw6dGHuOO|x z-{*wia^^1k`Ng91YEIQp>ed+KO$Q<^gd~$%w#;Wgf%doLa<#f zwrtFDLwmlU2O-(L;&^p|>ihCzY*X{|Hgp;l^0sO^*FnmNuK<0f^E&IzMH}nB-1TCk z!;Hu;`{U(u$)~C}`5f=x`5+y`Md4=`WwTqkfI~2>U0#nX&D$DRG1wOScr~{0i5Pc478M~1TBHD*KEUX{x zWFL+<4|*IOYsyr}mD?MnMB!BTB8_~%$?^W6hs&~m)qa@n&hx3m4EBuhS#@x8*V@5N z-mj)+xd;x<{n~;xQqKA6BHjBWafcCC5(dx1!s1+8ms39oZa+ORL*>PWb`%t)d41Mx z`*hTH2bMzJZYer{5R5F!r+4kG%kswdJ26WC1={?fyBIKNWt3}RY52ryj%k?4IQ*cW znkw9=&^@r`*Awc_lGVAe*3@~%ATIp!+E)347P~eZ?=*qxY_5A91RzYbl>V`YXiijI zxc%gT$|70hm-$77@9#dY7N;%mn126WP#9ALV9Z#>jh zd^;VnI>7UyHGvM3mG!feF^#NSdE{B7Yg$9vJ}>F44&&d0S`#C7-qa$(%AX28H`9?Y zG(L&=ode>-8!H*y{b({<{E@BWaG|Jkf3|OG;>X|~e}b#t9V&`Uu_ zfm!1fyakQxa6#f7qP(s$?Ixae8yVz4RnOj&$YJ^yyfOLW42B2~#x(9%&DtFD(>hKD zF4O&{@YJX#&D45h&KWlZPv{G|5-$_GXH(^caU=E`#5`xDY!5|HJwD!g;^7(EXH3&y z;(@-z0DeH+&GN<_*;$$)72#T&mqcH3N?NQKi&9$qyqR_|a@z80;JP7HfBZYNE@%59 z>8R$7b8OTgThn39lZe?_MgB9_ZLzR2lgA-jnNq2O;-JaqNSg875ZAF3Xzl^zg&>}4 z8~~|MpU2SD%IGl*sLkp2?e&uUKFW!_1HYPH$b5p!6sAfPqX^_=dlI&$E7wf5*y37a z@Y%j9_>IVjh@Tc6eug*Z1{Mw3HxEMM`!tLhAGj)4l>2*J&66V}W?IkmGI-LdFtk>4 zWfY+Ppk80RP$T5q)c+#*lMXD|A%punoAzZVDkj@rzcw`4g?BT2)%41H-!{&5bsyx7 zp@nSu(%Pge#W~^r^nD7@jDvd*xOUdETVCS0M+d~)L5IDrCK}?;ASYGWt4EYBWJo}h20Vf z2&EQd5Q^!z&%GKM71_5^*3$=zjAT-)q>OBfd75dQB<%8;>y*XpRAzv~pzd8lewQqz zBoa%Tnn544dAInk5j0Par1V^#teA05?{6sByu|GV6OI@I&a5v zdw``HiN_QGj5!->7byxqxmd0OF}$-4rF(uu z^Re0zb_hMb4Z&WnvHmS~9LM|etT>6SHI}O>a7S_ZQMiHYS}OI78*8At=%oi_Pj3&^ zZfpEEgfKEwh;bgkgRjGhQ+c&y?*^>>{5t^?E}X5FNsNoJ4&kg?thX*xE?=Y2aqssd zrZLFm+W5->jHcVeJLpaLWdG?*^vuPfTS_l=p1-nmlf7%MD2re3jM~hd`eoMGX^_Qa zF7RMbo9XGRq;>PET<6Y?)Qq6)>%j{7{zfBI=G7%<@|ktQ9}_7ew@=re!FLraIABug zjZ~7|^&y0^<&aj}f%igMs1HKoGWAL3PI-2j?BBPXXyaf@aEFMS2`fkmy%f*WC!c|G z6E=9*R%V273Lf9u3nyg8x%<6YJgCZZu@+LflP)Hp*icG!E_NxM^q4eBmpbJis?b=1 zt5qU(ZfdAPup^b^;ekeeknNXMh8LUZv2PLM1g*^OT{{tQ1727IQ{B)F$(cErT0E-$ zgHCM4%0$0(MZYQpQZ*B9QX5FwwS_yd(L=h-qZiUOHG7|0rRO&rU|-e+E44Kjom*=3 z{~mv~Wm*OK_=57BbodV0;5_IzPfd6l%U^WQ*D$ao>!9ZOx;qP?Pw@Np+6!8`*G75xlTHw6>Id4TTuXV| zu6!K)^B@^18cuUgk!`oYFYq3Xq%yE=FyZ5sR8GixsdCFamb(etZat?#|Gr7;RbV^k zSH4;opZcKz=ZqJby%9#5`T)nn6u4%{yLBORB6r#CvW9QSwWa)TZtM(t+CSEJSmeI| z1)#=nl$w(Zne7aGxU@~_$}S>t42y4NT_slNJk_4!P^3x(sClzq=F0idPMg!bvLL)s zv0i4rO}8->$W_gLd(HHNqP$7rYmbk-8Cv&!T;YkDO(l_rhUN||p(o|Zn7(=;Zniin z`g@>9X`#D%p6jyQx-NVZ@$wFZl(%o?cu}kxm*-0`DmpBK{opTYOc6)r*9^Vh#2#E> zZN_FK2^wyc$(gNJmE~0_7Da0#?8JPaO;(DTzaUfJED~Y6xooPahN?&H-$p%eFntPdY2Y-FafjR0Zo{sXt0F zyn}M*Yc}txpITViQm{uLGk@p}SWT}PO_G~2yR()Buo}? zaj%w$h4n+NwOAxTtG|ktYKr2PY|p&G)%||81y8OI+K~)&@e}xY86)oxg7@)$sss1#P)L>%YKZ8lEhJ3S&rNQoom50F>TC2e}Sr4OcJ+ zN>!)tz4LL~sr~&@7!L3Dx|c&=$C-{jFZzmSIdYqj04JNc1Jp8oiIoKX?+Cxcxso_U zPRhL?t^5Mlxjc38{=}%DvQ+rfJz~19`60`->ng4yn>e`1^m_vA8pZ?>f0kNi{A^~^ zva7T3C;v!_{m4!Nd;j4|J)2cvqKKoOsH6H&9M$#RlR+|M{J*=n)Q`CnX{J2@fALcXN47Au#+ zXQD$laV1V3m^QT0Q!Aeb;c6~s`5n0{41Zr)PSan;#Zo=E#%4WPONFHb2gu~VOk04Z z>2xDmjA||3*CjTVy7Mn|y$zU&<94|C)IDEkTG57nKehjoVv>~abvKJCN_rdzk~Zd< zvaVD~vcdM}$9`ywmX*n;FOZ%inUwBjT^`Z2?x7CFhX$pQ|z5C02eGF!cr1x-#7#@FUzqbzr;3KGX|| z1cxOzyw_EAg7;Kdir~x3-hM@%TbtJqZe@j>{pQzBcwVZonXlDZ8ZeocDbeB|{oSC> zI-s2*Tpg+Qv3dQ1s@m41d8N^Z`s~s3upIj?=Qv5+)av%mbk#KouY-A|O<~K1g|LR> zy%d_g8v**WgMQipT`eZ9zP6d-#-yEhC~@mO#M`q8LpJHizSV8f>0K5n(!UbS;?o$?b^O8ID?i(pXTz!vcr`Vf9W#uY< zmKw!ICkbMq{xtqR$)@7w)ju3R$Y%SnvT+f#JcAMV^dDuU@-bek1xlCVSB$i2xl5p3 z7ocU)k(yBWsNt4+#21|1qXMyo>I=Ub{!zD>q_Mt47AY0{NtEH!AJqxNYMd=RB2Eu* z<+{E5Z?eBhKE>M^kk-K$V?;w}rEpBa0Xrmd^IF4#otDlWxW7!U__J`O8S_fhm`{Ia F{|mBFUmE}b literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/sunflower-blonde.jpg b/common/helpers/colour_estimation/hair_colours/sunflower-blonde.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48b0181bfbb707a1e7e1862dd4809a0eb096334c GIT binary patch literal 6002 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 YGGYn%+~s^_A>#@)hqa*H@XLk&0k$&Mng9R* literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/src/colour_estimation/__init__.py b/common/helpers/colour_estimation/src/colour_estimation/__init__.py index 54779f81d..66d308c9d 100644 --- a/common/helpers/colour_estimation/src/colour_estimation/__init__.py +++ b/common/helpers/colour_estimation/src/colour_estimation/__init__.py @@ -1,6 +1,10 @@ -from .rgb import RGB_COLOURS, RGB_HAIR_COLOURS - import numpy as np +import os +import cv2 +# import torch +# from scipy.ndimage import convolve + +from .rgb import * def closest_colours(requested_colour, colours): @@ -18,3 +22,326 @@ def closest_colours(requested_colour, colours): for color_name, distance in top_three_colors] return formatted_colors + + +# def avg_color_float(rgb_image: torch.Tensor, mask: torch.Tensor) -> torch.Tensor: +# mask = mask.bool() +# avg_colors = torch.zeros((rgb_image.size(0), mask.size(1), rgb_image.size(1)), device=rgb_image.device) +# for i in range(rgb_image.size(0)): +# for j in range(mask.size(1)): +# for k in range(rgb_image.size(1)): +# valid_pixels = torch.masked_select(rgb_image[i, k], mask[i, j]) +# avg_color = valid_pixels.float().mean() if valid_pixels.numel() > 0 else torch.tensor(0.0) +# avg_colors[i, j, k] = avg_color + +# return avg_colors # / 255.0 + + +# def median_color_float(rgb_image: torch.Tensor, mask: torch.Tensor) -> torch.Tensor: +# mask = mask.bool() +# median_colors = torch.zeros((rgb_image.size(0), mask.size(1), rgb_image.size(1)), device=rgb_image.device) +# for i in range(rgb_image.size(0)): +# for j in range(mask.size(1)): +# for k in range(rgb_image.size(1)): +# valid_pixels = torch.masked_select(rgb_image[i, k], mask[i, j]) +# if valid_pixels.numel() > 0: +# median_value = valid_pixels.median() +# else: +# median_value = torch.tensor(0.0, device=rgb_image.device) +# median_colors[i, j, k] = median_value +# return median_colors # / 255.0 + + +# def plot_with_matplotlib(frame, categories, masks, predictions, colours): +# """Generate an image with matplotlib, showing the original frame and masks with titles and color overlays.""" +# assert len(masks) == len(categories) == len(predictions), "Length of masks, categories, and predictions must match." + +# num_masks = len(masks) +# cols = 3 +# rows = (num_masks + 1) // cols + ((num_masks + 1) % cols > 0) # Adding 1 for the frame +# position = range(1, num_masks + 2) # +2 to include the frame in the count + +# fig = plt.figure(figsize=(15, rows * 3)) # Adjust the size as needed + +# # Add the frame as the first image +# ax = fig.add_subplot(rows, cols, 1) +# # frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) +# ax.imshow(frame) +# ax.set_title('Original Frame') +# ax.axis('off') + +# # Iterate over the masks +# for i, idx in enumerate(position[1:], start=1): # Skip 1 for the frame +# ax = fig.add_subplot(rows, cols, idx) + +# # Create an RGB image for the colored mask +# colored_mask = np.stack([masks[i-1]]*3, axis=-1) # i-1 because we skip the frame in position + +# # Apply color if category is detected and color is provided +# if predictions[i-1]: +# if (i-1) < len(colours): +# color = np.array(colours[i-1], dtype=np.uint8) # Convert color to uint8 +# color_mask = np.zeros_like(colored_mask) # Initialize color_mask with the same shape as colored_mask +# color_mask[..., 0] = masks[i-1] * color[0] # Apply color channel 0 +# color_mask[..., 1] = masks[i-1] * color[1] # Apply color channel 1 +# color_mask[..., 2] = masks[i-1] * color[2] # Apply color channel 2 +# # Now combine the colored mask with the original grayscale mask +# colored_mask = np.where(masks[i-1][:, :, None], color_mask, colored_mask).astype(np.uint8) +# # Show the colored mask +# ax.imshow(colored_mask) +# # print(np.max(mask_image)) +# # mask_image = masks[i-1] +# # ax.imshow(mask_image, cmap="gray") +# else: +# # If there's no color provided for this category, use white color +# mask_image = masks[i-1] +# ax.imshow(mask_image, cmap="gray") +# else: +# # If the category is not detected, keep the mask black +# mask_image = masks[i-1] +# ax.imshow(mask_image, cmap="gray") + + +# # mask_image = masks[i-1] +# # ax.imshow(mask_image, cmap="gray") + +# # Set title with the detection status +# detection_status = 'yes' if predictions[i-1] else 'no' +# ax.set_title(f"{categories[i-1]} - {detection_status}") +# ax.axis('off') + +# plt.tight_layout() +# fig.canvas.draw() + +# # Retrieve buffer and close the plot to avoid memory issues +# data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) +# data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) +# plt.close(fig) + +# return data + + +def count_colours_in_masked_area(img, mask, colours, filter_size=3, sort=False): + """ + Counts the number of pixels of each color within the masked area of an image. + + Parameters: + img (numpy.ndarray): An RGB image, with the shape (height, width, 3). + mask (numpy.ndarray): A binary mask, with the shape (height, width), where 1 indicates the area of interest. + colours (dict): A dictionary where keys are color names and values are the corresponding RGB values. + filter_size (int): The size of the convolution filter to apply for smoothing the image, default is 3. + sort (bool): Whether to return a sorted list of colors based on pixel count, default is False. + + Returns: + dict: A dictionary containing the count of pixels for each color in the masked area. + If sort is True, it also returns a list of tuples, each containing a color name, its proportion in the masked area, and the pixel count. This list is sorted in descending order based on pixel count. + + The function first applies an averaging filter to the image for smoothing. Then, it calculates the Euclidean distance of each pixel in the masked area to the predefined colors. It identifies the closest color for each pixel, counts the occurrences of each color, and creates a dictionary mapping colors to their respective counts. If sorting is requested, it also calculates the proportion of each color and returns a sorted list of colors based on their pixel count. + """ + avg_filter = np.ones((filter_size, filter_size, 3)) / (filter_size ** 2) + img_filtered = img + # img_filtered = convolve(img, avg_filter, mode='constant', cval=0.0) + colours_array = np.array(list(colours.values())) + masked_img = img_filtered[mask == 1] + distances = np.linalg.norm(masked_img[:, None] - colours_array, axis=2) + closest_colours = np.argmin(distances, axis=1) + unique, counts = np.unique(closest_colours, return_counts=True) + colour_counts = {list(colours.keys())[i]: count for i, count in zip(unique, counts)} + if sort: + total_pixels = sum(counts) + sorted_colours = sorted(((list(colours.keys())[i], count / total_pixels, count) + for i, count in zip(unique, counts)), key=lambda item: item[2], reverse=True) + return colour_counts, sorted_colours + + return colour_counts + + +def average_colours_by_label(labels, colours): + """ + Computes the average values of colours associated with each label. + + Parameters: + labels (dict): A dictionary where keys are label names and values are lists of binary values (0 or 1). Each list represents whether a certain feature (labelled by the key) is present (1) or not (0) in a set of instances. + colours (dict): A dictionary where keys are label names and values are dictionaries. Each inner dictionary maps colour names to lists of values (e.g., pixel counts or intensities) associated with that colour for each instance. + + Returns: + dict: A dictionary where keys are label names and values are sorted lists of tuples. Each tuple contains a colour name and its average value calculated only from instances where the label is present (1). The tuples are sorted by average values in descending order. + + The function iterates through each label, calculating the average value for each colour only from instances where the label value is 1 (present). It then sorts these average values in descending order for each label and returns this sorted list along with the label name in a dictionary. + """ + averaged_colours = {} + + for label, label_values in labels.items(): + if label not in colours.keys(): + continue + + colour_values = colours[label] + averages = {} + + for colour, values in colour_values.items(): + valid_values = [value for value, label_value in zip(values, label_values) if label_value == 1] + if valid_values: + averages[colour] = sum(valid_values) / len(valid_values) + + sorted_colours = sorted(averages.items(), key=lambda item: item[1], reverse=True) + averaged_colours[label] = sorted_colours + + return averaged_colours + + +def load_images_to_dict(root_dir): + """ + Load images from a specified directory into a dictionary, removing file extensions from the keys. + + Parameters: + root_dir (str): The root directory containing the images. + + Returns: + dict: A dictionary with image names (without extensions) as keys and their corresponding numpy arrays as values. + """ + image_dict = {} + for filename in os.listdir(root_dir): + if filename.lower().endswith(('.png', '.jpg', '.jpeg')): + img_path = os.path.join(root_dir, filename) + # Read the image using OpenCV + img = cv2.imread(img_path) + # Convert it from BGR to RGB color space + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + # Remove the file extension from the filename + name_without_extension = os.path.splitext(filename)[0] + image_dict[name_without_extension] = img + + return image_dict + + +def generate_colour_table(image_dict: dict, colour_map: dict): + """ + Generates a colour table for each image in the given dictionary, counting the colours in each image. + + Parameters: + image_dict (dict): A dictionary where keys are image identifiers and values are image arrays in the format (height, width, 3). + colour_map (dict): A dictionary mapping colour names to their respective RGB values. + + Returns: + dict: A dictionary where keys are image identifiers and values are colour tables. Each colour table is generated by the 'count_colours_in_masked_area' function and contains a count of how many times each colour (as defined in colour_map) appears in the corresponding image. + + For each image in the image_dict, this function creates a mask that covers the entire image and uses 'count_colours_in_masked_area' to count the occurrences of each colour in the colour_map within the image. The results are stored in a new dictionary, mapping each image identifier to its corresponding colour table. + """ + colour_table = {} + for k in image_dict.keys(): + colour_table[k] = count_colours_in_masked_area(image_dict[k], np.ones((image_dict[k].shape[0], image_dict[k].shape[1])), colour_map, sort=True) + return colour_table + + +def compare_colour_distributions(averaged_colours_list, colour_table_dict): + """ + Compares colour distributions between an averaged colours list and a dictionary of colour tables by calculating the Euclidean distance. + + Parameters: + averaged_colours_list (list): A list of tuples, where each tuple contains a colour name and its proportion. This is typically the output from 'average_colours_by_label'. + colour_table_dict (dict): A dictionary where keys are image identifiers and values are colour tables. Each colour table is a list of tuples, each containing a colour name, its proportion in the image, and the pixel count. + + Returns: + dict: A dictionary where keys are image identifiers and values are the Euclidean distances between the colour distribution in the image and the averaged_colours_list. + + The function iterates over each image's colour table in colour_table_dict. For each image, it calculates the Euclidean distance between the colour proportions in averaged_colours_list and the colour proportions in the image's colour table. The results are stored in a dictionary, mapping each image identifier to the calculated distance. + """ + distances = {} + + avg_colours_dict = {colour: proportion for colour, proportion in averaged_colours_list} + + for image_name, colour_data in colour_table_dict.items(): + colour_proportions = {colour: proportion for colour, proportion, _ in colour_data[1]} + + common_colours = set(avg_colours_dict.keys()) & set(colour_proportions.keys()) + avg_values = [avg_colours_dict.get(colour, 0) for colour in common_colours] + prop_values = [colour_proportions.get(colour, 0) for colour in common_colours] + + distances[image_name] = np.linalg.norm(np.array(avg_values) - np.array(prop_values)) + + sorted_distances = sorted(distances.items(), key=lambda item: item[1]) + + return sorted_distances + +# Example usage +# sorted_distances = compare_colour_distributions(averaged_colours, colour_table) + +def extract_top_colours_by_threshold(colour_list, threshold): + """ + Extracts top colours based on a cumulative proportion threshold. + + Parameters: + colour_list (list): A list of tuples, each being a 2-element (colour, proportion) or + a 3-element (colour, proportion, count) tuple. + threshold (float): A float between 0 and 1, representing the threshold for the cumulative proportion. + + Returns: + list: A list of tuples (colour, proportion), sorted by proportion in descending order, + whose cumulative proportion just exceeds the threshold. + """ + # Sort the list by proportion in descending order + sorted_colours = sorted(colour_list, key=lambda x: x[1], reverse=True) + + # Extract top colours based on the cumulative proportion threshold + cumulative_proportion = 0.0 + top_colours = [] + for colour in sorted_colours: + cumulative_proportion += colour[1] + top_colours.append((colour[0], colour[1])) + if cumulative_proportion >= threshold: + break + + return top_colours + + +def find_nearest_colour_family(colour, colour_families): + """ + Determines the nearest colour family for a given colour. + + Parameters: + colour (tuple): The colour in RGB format. + colour_families (dict): A dictionary where keys are family names and values are lists of representative RGB colours for each family. + + Returns: + str: The name of the nearest colour family. + """ + min_distance = float('inf') + nearest_family = None + + for family, representative_colours in colour_families.items(): + for rep_colour in representative_colours: + distance = np.linalg.norm(np.array(colour) - np.array(rep_colour)) + if distance < min_distance: + min_distance = distance + nearest_family = family + + return nearest_family + + +def find_nearest_colour_family(colour, colour_families): + """ + Determines the nearest colour family for a given colour based on the minimum Euclidean distance. + + Parameters: + colour (tuple): The colour in RGB format. + colour_families (dict): A dictionary where keys are family names and values are lists of representative RGB colours for each family. + + Returns: + str: The name of the nearest colour family. + """ + min_distance = float('inf') + nearest_family = None + + # Convert colour to numpy array for distance calculation + colour = np.array(colour) + + for family, family_colours in colour_families.items(): + for rep_colour in family_colours: + # Calculate the Euclidean distance + distance = np.linalg.norm(colour - np.array(rep_colour)) + if distance < min_distance: + min_distance = distance + nearest_family = family + + return nearest_family + diff --git a/common/helpers/colour_estimation/src/colour_estimation/rgb.py b/common/helpers/colour_estimation/src/colour_estimation/rgb.py index 9854f110e..40d018fdc 100644 --- a/common/helpers/colour_estimation/src/colour_estimation/rgb.py +++ b/common/helpers/colour_estimation/src/colour_estimation/rgb.py @@ -1,42 +1,163 @@ import numpy as np -RGB_COLOURS = { +COLOURS = { + "red": [255, 0, 0], + "green": [0, 255, 0], + "blue": [0, 0, 255], + "white": [255, 255, 255], + "black": [0, 0, 0], + "yellow": [255, 255, 0], + "cyan": [0, 255, 255], + "magenta": [255, 0, 255], + "gray": [128, 128, 128], + "orange": [255, 165, 0], + "purple": [128, 0, 128], + "brown": [139, 69, 19], + "pink": [255, 182, 193], + "beige": [245, 245, 220], + "maroon": [128, 0, 0], + "olive": [128, 128, 0], + "navy": [0, 0, 128], + "lime": [50, 205, 50], + "golden": [255, 223, 0], + "teal": [0, 128, 128], + "coral": [255, 127, 80], + "salmon": [250, 128, 114], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "platinum": [229, 228, 226], + "ochre": [204, 119, 34], + "burntsienna": [233, 116, 81], + "chocolate": [210, 105, 30], + "tan": [210, 180, 140], + "ivory": [255, 255, 240], + "goldenrod": [218, 165, 32], + "orchid": [218, 112, 214], + "honey": [238, 220, 130] + } + +SPESIFIC_COLOURS = { + "red": [255, 0, 0], + "green": [0, 255, 0], + "blue": [0, 0, 255], + "white": [255, 255, 255], + "black": [0, 0, 0], + "yellow": [255, 255, 0], + "cyan": [0, 255, 255], + "magenta": [255, 0, 255], + "gray": [128, 128, 128], + "orange": [255, 165, 0], + "purple": [128, 0, 128], + "brown": [139, 69, 19], + "pink": [255, 182, 193], + "beige": [245, 245, 220], + "maroon": [128, 0, 0], + "olive": [128, 128, 0], + "navy": [0, 0, 128], + "lime": [50, 205, 50], + "golden": [255, 223, 0], + "teal": [0, 128, 128], + "coral": [255, 127, 80], + "salmon": [250, 128, 114], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "platinum": [229, 228, 226], + "ochre": [204, 119, 34], + "burntsienna": [233, 116, 81], + "chocolate": [210, 105, 30], + "tan": [210, 180, 140], + "ivory": [255, 255, 240], + "goldenrod": [218, 165, 32], + "orchid": [218, 112, 214], + "honey": [238, 220, 130], + "lavender": [230, 230, 250], + "mint": [189, 252, 201], + "peach": [255, 229, 180], + "ruby": [224, 17, 95], + "indigo": [75, 0, 130], + "amber": [255, 191, 0], + "emerald": [80, 200, 120], + "sapphire": [15, 82, 186], + "aquamarine": [127, 255, 212], + "periwinkle": [204, 204, 255], + "fuchsia": [255, 0, 255], + "raspberry": [227, 11, 92], + "slate": [112, 128, 144], + "charcoal": [54, 69, 79] + } + +DETAILED_COLOURS = { + "light_red": [255, 204, 204], + "bright_red": [255, 0, 0], + "dark_red": [139, 0, 0], + "light_green": [204, 255, 204], + "bright_green": [0, 255, 0], + "dark_green": [0, 100, 0], + "light_blue": [204, 204, 255], + "bright_blue": [0, 0, 255], + "dark_blue": [0, 0, 139], + "light_yellow": [255, 255, 204], + "bright_yellow": [255, 255, 0], + "dark_yellow": [204, 204, 0], + "light_cyan": [204, 255, 255], + "bright_cyan": [0, 255, 255], + "dark_cyan": [0, 139, 139], + "light_magenta": [255, 204, 255], + "bright_magenta": [255, 0, 255], + "dark_magenta": [139, 0, 139], + "light_orange": [255, 229, 204], + "bright_orange": [255, 165, 0], + "dark_orange": [255, 140, 0], + "light_purple": [229, 204, 255], + "bright_purple": [128, 0, 128], + "dark_purple": [102, 0, 102], + "light_pink": [255, 204, 229], + "bright_pink": [255, 105, 180], + "dark_pink": [255, 20, 147], + "light_brown": [210, 180, 140], + "medium_brown": [165, 42, 42], + "dark_brown": [101, 67, 33], + # ... +} + +COLOUR_FAMILIES = { + "light_reds": [[255, 182, 193], [255, 192, 203], [255, 160, 122]], + "dark_reds": [[139, 0, 0], [178, 34, 34], [165, 42, 42]], + "light_blues": [[173, 216, 230], [135, 206, 250], [176, 224, 230]], + "dark_blues": [[0, 0, 139], [25, 25, 112], [0, 0, 128]], + "bluish_greens": [[102, 205, 170], [32, 178, 170], [72, 209, 204]], + "light_greens": [[144, 238, 144], [152, 251, 152], [143, 188, 143]], + "dark_greens": [[0, 100, 0], [34, 139, 34], [47, 79, 79]], + "yellows": [[255, 255, 0], [255, 255, 102], [255, 215, 0]], + "oranges": [[255, 165, 0], [255, 140, 0], [255, 69, 0]], + "purples": [[128, 0, 128], [147, 112, 219], [138, 43, 226]], + "pinks": [[255, 192, 203], [255, 182, 193], [255, 105, 180]], + "browns": [[165, 42, 42], [139, 69, 19], [160, 82, 45]], + "cyans": [[0, 255, 255], [0, 139, 139], [72, 209, 204]], + "greys": [[128, 128, 128], [169, 169, 169], [192, 192, 192]], + # ... +} + +SIMPLIFIED_COLOURS = { "red": [255, 0, 0], "green": [0, 255, 0], "blue": [0, 0, 255], "white": [255, 255, 255], "black": [0, 0, 0], "yellow": [255, 255, 0], - "cyan": [0, 255, 255], - "magenta": [255, 0, 255], "gray": [128, 128, 128], "orange": [255, 165, 0], "purple": [128, 0, 128], - "brown": [139, 69, 19], "pink": [255, 182, 193], + "light blue": [173, 216, 230], + "dark green": [0, 100, 0], + "light gray": [211, 211, 211], + "dark red": [139, 0, 0], "beige": [245, 245, 220], - "maroon": [128, 0, 0], - "olive": [128, 128, 0], - "navy": [0, 0, 128], - "lime": [50, 205, 50], - "golden": [255, 223, 0], - "teal": [0, 128, 128], - "coral": [255, 127, 80], - "salmon": [250, 128, 114], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "platinum": [229, 228, 226], - "ochre": [204, 119, 34], - "burntsienna": [233, 116, 81], - "chocolate": [210, 105, 30], - "tan": [210, 180, 140], - "ivory": [255, 255, 240], - "goldenrod": [218, 165, 32], - "orchid": [218, 112, 214], - "honey": [238, 220, 130] + "navy": [0, 0, 128] } -RGB_HAIR_COLOURS = { +HAIR_COLOURS = { 'midnight black': (9, 8, 6), 'off black': (44, 34, 43), 'strong dark brown': (58, 48, 36), @@ -65,4 +186,5 @@ 'white blonde': (255, 24, 225), 'platinum blonde': (202, 191, 177), 'russet red': (145, 74, 67), - 'terra cotta': (181, 82, 57)} + 'terra cotta': (181, 82, 57) + } \ No newline at end of file diff --git a/common/helpers/torch_module/src/torch_module/modules/__init__.py b/common/helpers/torch_module/src/torch_module/modules/__init__.py index b0eac41aa..26331726f 100644 --- a/common/helpers/torch_module/src/torch_module/modules/__init__.py +++ b/common/helpers/torch_module/src/torch_module/modules/__init__.py @@ -129,3 +129,170 @@ def forward(self, x): if self.sigmoid: x = torch.sigmoid(x) return x + + +def x2conv(in_channels, out_channels, inner_channels=None): + inner_channels = out_channels // 2 if inner_channels is None else inner_channels + down_conv = nn.Sequential( + nn.Conv2d(in_channels, inner_channels, kernel_size=3, padding=1, bias=False), + nn.BatchNorm2d(inner_channels), + nn.ReLU(inplace=True), + nn.Conv2d(inner_channels, out_channels, kernel_size=3, padding=1, bias=False), + nn.BatchNorm2d(out_channels), + nn.ReLU(inplace=True)) + return down_conv + + +class Encoder(nn.Module): + def __init__(self, in_channels, out_channels): + super(Encoder, self).__init__() + self.down_conv = x2conv(in_channels, out_channels) + self.pool = nn.MaxPool2d(kernel_size=2, ceil_mode=True) + + def forward(self, x): + x = self.down_conv(x) + x = self.pool(x) + return x + + +class Decoder(nn.Module): + def __init__(self, in_channels, out_channels): + super(Decoder, self).__init__() + self.up = nn.ConvTranspose2d(in_channels, in_channels // 2, kernel_size=2, stride=2) + self.up_conv = x2conv(in_channels, out_channels) + + def forward(self, x_copy, x, interpolate=True): + x = self.up(x) + + if (x.size(2) != x_copy.size(2)) or (x.size(3) != x_copy.size(3)): + if interpolate: + # Iterpolating instead of padding + x = F.interpolate(x, size=(x_copy.size(2), x_copy.size(3)), + mode="bilinear", align_corners=True) + else: + # Padding in case the incomping volumes are of different sizes + diffY = x_copy.size()[2] - x.size()[2] + diffX = x_copy.size()[3] - x.size()[3] + x = F.pad(x, (diffX // 2, diffX - diffX // 2, + diffY // 2, diffY - diffY // 2)) + + # Concatenate + x = torch.cat([x_copy, x], dim=1) + x = self.up_conv(x) + return x + + +class UNetWithResnet18Encoder(nn.Module): + class Decoder(nn.Module): + def __init__(self, in_channels, skip_channels, out_channels): + super(UNetWithResnet18Encoder.Decoder, self).__init__() + self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2) + self.up_conv = x2conv(out_channels + skip_channels, out_channels) + + def forward(self, x_copy, x): + x = self.up(x) + if x.size(2) != x_copy.size(2) or x.size(3) != x_copy.size(3): + x = F.interpolate(x, size=(x_copy.size(2), x_copy.size(3)), mode='bilinear', align_corners=True) + x = torch.cat((x_copy, x), dim=1) + x = self.up_conv(x) + return x + + def __init__(self, num_classes, in_channels=3, freeze_bn=False, sigmoid=True): + super(UNetWithResnet18Encoder, self).__init__() + self.sigmoid = sigmoid + resnet18 = models.resnet18(pretrained=True) + + if in_channels != 3: + resnet18.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) + + self.encoder1 = nn.Sequential(resnet18.conv1, resnet18.bn1, resnet18.relu) + self.encoder2 = resnet18.layer1 + self.encoder3 = resnet18.layer2 + self.encoder4 = resnet18.layer3 + self.encoder5 = resnet18.layer4 + + self.up1 = UNetWithResnet18Encoder.Decoder(512, 256, 256) + self.up2 = UNetWithResnet18Encoder.Decoder(256, 128, 128) + self.up3 = UNetWithResnet18Encoder.Decoder(128, 64, 64) + self.up4 = UNetWithResnet18Encoder.Decoder(64, 64, 64) + + self.final_conv = nn.Conv2d(64, num_classes, kernel_size=1) + self._initialize_weights() + + if freeze_bn: + self.freeze_bn() + + def _initialize_weights(self): + for module in self.modules(): + if isinstance(module, nn.Conv2d) or isinstance(module, nn.ConvTranspose2d): + nn.init.kaiming_normal_(module.weight) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.BatchNorm2d): + module.weight.data.fill_(1) + module.bias.data.zero_() + + def forward(self, x): + x1 = self.encoder1(x) + x2 = self.encoder2(x1) + x3 = self.encoder3(x2) + x4 = self.encoder4(x3) + x5 = self.encoder5(x4) + + x = self.up1(x4, x5) + x = self.up2(x3, x) + x = self.up3(x2, x) + x = self.up4(x1, x) + x = F.interpolate(x, size=(x.size(2)*2, x.size(3)*2), mode='bilinear', align_corners=True) + + x = self.final_conv(x) + + if self.sigmoid: + x = torch.sigmoid(x) + return x + + def freeze_bn(self): + for module in self.modules(): + if isinstance(module, nn.BatchNorm2d): + module.eval() + + +class MultiLabelResNet(nn.Module): + def __init__(self, num_labels, input_channels=3, sigmoid=True, pretrained=True,): + super(MultiLabelResNet, self).__init__() + self.model = models.resnet18(pretrained=pretrained) + self.sigmoid = sigmoid + + if input_channels != 3: + self.model.conv1 = nn.Conv2d(input_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) + + num_ftrs = self.model.fc.in_features + + self.model.fc = nn.Linear(num_ftrs, num_labels) + + def forward(self, x): + x = self.model(x) + if self.sigmoid: + x = torch.sigmoid(x) + return x + + +class CombinedModel(nn.Module): + def __init__(self, segment_model: nn.Module, predict_model: nn.Module, cat_layers:int=None): + super(CombinedModel, self).__init__() + self.segment_model = segment_model + self.predict_model = predict_model + self.cat_layers = cat_layers + + def forward(self, x: torch.Tensor): + seg_masks = self.segment_model(x) + + if self.cat_layers: + seg_masks_ = seg_masks[:, 0:self.cat_layers] + x = torch.cat((x, seg_masks_), dim=1) + else: + x = torch.cat((x, seg_masks), dim=1) + + logic_outputs = self.predict_model(x) + return seg_masks, logic_outputs + diff --git a/common/vision/lasr_vision_msgs/msg/FeatureWithColour.msg b/common/vision/lasr_vision_msgs/msg/FeatureWithColour.msg index fe9ca3d71..21702415b 100644 --- a/common/vision/lasr_vision_msgs/msg/FeatureWithColour.msg +++ b/common/vision/lasr_vision_msgs/msg/FeatureWithColour.msg @@ -1,5 +1,8 @@ # Feature name string name +# Feature label +bool label + # Colour predictions -lasr_vision_msgs/ColourPrediction[] colours +string[] colours diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv index e958bcd57..fe7aa0812 100644 --- a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetection.srv @@ -11,4 +11,5 @@ string torso_mask_dtype --- # Detection result -lasr_vision_msgs/FeatureWithColour[] detected_features \ No newline at end of file +lasr_vision_msgs/FeatureWithColour[] detected_features +# string detected_features diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index ec5081ba7..fb51c5265 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -1,74 +1,43 @@ from lasr_vision_msgs.srv import TorchFaceFeatureDetection, TorchFaceFeatureDetectionRequest, TorchFaceFeatureDetectionResponse from lasr_vision_msgs.msg import FeatureWithColour, ColourPrediction -from colour_estimation import closest_colours, RGB_COLOURS, RGB_HAIR_COLOURS from cv2_img import msg_to_cv2_img from torch_module.helpers import binary_erosion_dilation, median_color_float from numpy2message import message2numpy import numpy as np +import cv2 import torch import rospy +import rospkg import lasr_vision_torch - - -model = lasr_vision_torch.load_face_classifier_model() +from os import path def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetectionResponse: # decode the image rospy.loginfo('Decoding') - frame = msg_to_cv2_img(request.image_raw) + full_frame = msg_to_cv2_img(request.image_raw) torso_mask_data, torso_mask_shape, torso_mask_dtype = request.torso_mask_data, request.torso_mask_shape, request.torso_mask_dtype head_mask_data, head_mask_shape, head_mask_dtype = request.head_mask_data, request.head_mask_shape, request.head_mask_dtype - torsal_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) + torso_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) head_mask = message2numpy(head_mask_data, head_mask_shape, head_mask_dtype) - # print(torso_mask_shape) - # print(head_mask_shape) - - # 'hair', 'hat', 'glasses', 'face' - input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() - input_image /= 255.0 - masks_batch_pred, pred_classes = model(input_image) - - thresholds_mask = [ - 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, - ] - thresholds_pred = [ - 0.6, 0.8, 0.1, 0.5, - ] - erosion_iterations = 1 - dilation_iterations = 1 - categories = ['hair', 'hat', 'glasses', 'face',] - - masks_batch_pred = binary_erosion_dilation( - masks_batch_pred, thresholds=thresholds_mask, - erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations - ) - - median_colours = (median_color_float( - input_image, masks_batch_pred).detach().squeeze(0)*255).numpy().astype(np.uint8) - - # discarded: masks = masks_batch_pred.detach().squeeze(0).numpy().astype(np.uint8) - # discarded: mask_list = [masks[i,:,:] for i in range(masks.shape[0])] - - pred_classes = pred_classes.detach().squeeze(0).numpy() - # discarded: class_list = [categories[i] for i in range( - # pred_classes.shape[0]) if pred_classes[i].item() > thresholds_pred[i]] - colour_list = [median_colours[i, :] - for i in range(median_colours.shape[0])] + head_frame = lasr_vision_torch.extract_mask_region(full_frame, head_mask.astype(np.uint8), expand_x=0.4, expand_y=0.5) + torso_frame = lasr_vision_torch.extract_mask_region(full_frame, torso_mask.astype(np.uint8), expand_x=0.2, expand_y=0.0) + class_pred, colour_pred = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) + response = TorchFaceFeatureDetectionResponse() - response.detected_features = [ - FeatureWithColour(categories[i], [ - ColourPrediction(colour, distance) - for colour, distance - in closest_colours(colour_list[i], RGB_HAIR_COLOURS if categories[i] == 'hair' else RGB_COLOURS) - ]) - for i - in range(pred_classes.shape[0]) - if pred_classes[i].item() > thresholds_pred[i] - ] - + # response.detected_features = str(class_pred) + str(colour_pred) + response.detected_features = [] + for c in ['hair', 'hat', 'glasses', 'cloth',]: + colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} + sorted_list = sorted(colour_pred[c].items(), key=lambda item: item[1], reverse=True) + rospy.loginfo(str(sorted_list)) + if len(sorted_list) > 3: + sorted_list = sorted_list[0:3] + sorted_list = [k for k, v in sorted_list] + # rospy.loginfo(str(colour_pred[c])) + response.detected_features.append(FeatureWithColour(c, class_pred[c], sorted_list)) return response @@ -80,7 +49,7 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti # # 'hair', 'hat', 'glasses', 'face' # input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() # input_image /= 255.0 -# masks_batch_pred, pred_classes = model(input_image) +# masks_batch_pred, pred_classes = lasr_vision_torch.model(input_image) # thresholds_mask = [ # 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, @@ -110,16 +79,17 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti # for i in range(median_colours.shape[0])] # response = TorchFaceFeatureDetectionResponse() -# response.detected_features = [ -# FeatureWithColour(categories[i], [ -# ColourPrediction(colour, distance) -# for colour, distance -# in closest_colours(colour_list[i], RGB_HAIR_COLOURS if categories[i] == 'hair' else RGB_COLOURS) -# ]) -# for i -# in range(pred_classes.shape[0]) -# if pred_classes[i].item() > thresholds_pred[i] -# ] +# # response.detected_features = [ +# # FeatureWithColour(categories[i], [ +# # ColourPrediction(colour, distance) +# # for colour, distance +# # in closest_colours(colour_list[i], HAIR_COLOURS if categories[i] == 'hair' else COLOURS) +# # ]) +# # for i +# # in range(pred_classes.shape[0]) +# # if pred_classes[i].item() > thresholds_pred[i] +# # ] +# response.detected_features = "feature" # return response # test test diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index fa62dbc3f..b1d380b4a 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -1,21 +1,317 @@ -from torch_module.modules import DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression -from torch_module.helpers import load_torch_model +from torch_module.modules import UNetWithResnet18Encoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression +from torch_module.helpers import load_torch_model, binary_erosion_dilation +from colour_estimation import closest_colours, load_images_to_dict, generate_colour_table, average_colours_by_label, count_colours_in_masked_area +from colour_estimation import COLOURS, HAIR_COLOURS, SPESIFIC_COLOURS, DETAILED_COLOURS + +import numpy as np +import cv2 +import torch +import rospy import rospkg +import lasr_vision_torch from os import path def load_face_classifier_model(): cat_layers = 4 - # 'cloth', 'hair', 'hat', 'glasses', 'face', - segment_model = DeepLabV3PlusMobileNetV3(num_classes=4) - # 'hair', 'hat', 'glasses', 'face', ; first three with colours, rgb - predict_model = MultiLabelMobileNetV3Large(cat_layers, 7) - model = CombinedModelNoRegression( - segment_model, predict_model, cat_layers=cat_layers) + segment_model = UNetWithResnet18Encoder(num_classes=4) + predict_model = MultiLabelResNet(num_labels=4, input_channels=7) + model = CombinedModel(segment_model, predict_model, cat_layers=cat_layers) model.eval() r = rospkg.RosPack() model, _, _, _ = load_torch_model(model, None, path=path.join(r.get_path( - "lasr_vision_torch"), "models", "best_model_epoch_31.pth"), cpu_only=True) + "lasr_vision_torch"), "models", "model.pth"), cpu_only=True) return model + + +model = load_face_classifier_model() +# setups +face_th_rate = 0.05 +thresholds_mask = [ + 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, +] +thresholds_pred = [ + 0.6, 0.8, 0.1, 0.5, +] +erosion_iterations = 1 +dilation_iterations = 1 +colour_distance_rate = 1.2 +categories = ['hair', 'hat', 'glasses', 'face',] +cat_layers = 4 + +# prepare hair colour table +r = rospkg.RosPack() +image_dict = load_images_to_dict(path.join(r.get_path( + "colour_estimation"), "hair_colours")) +hair_colour_table = generate_colour_table(image_dict, SPESIFIC_COLOURS) + + +def pad_image_to_even_dims(image): + # Get the current shape of the image + height, width, _ = image.shape + + # Calculate the padding needed for height and width + height_pad = 0 if height % 2 == 0 else 1 + width_pad = 0 if width % 2 == 0 else 1 + + # Pad the image. Pad the bottom and right side of the image + padded_image = np.pad(image, ((0, height_pad), (0, width_pad), (0, 0)), mode='constant', constant_values=0) + + return padded_image + + +def extract_mask_region(frame, mask, expand_x=0.5, expand_y=0.5): + """ + Extracts the face region from the image and expands the region by the specified amount. + + :param frame: The source image. + :param mask: The mask with the face part. + :param expand_x: The percentage to expand the width of the bounding box. + :param expand_y: The percentage to expand the height of the bounding box. + :return: The extracted face region as a numpy array, or None if not found. + """ + contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + if contours: + largest_contour = max(contours, key=cv2.contourArea) + x, y, w, h = cv2.boundingRect(largest_contour) + + # Expand the bounding box + new_w = w * (1 + expand_x) + new_h = h * (1 + expand_y) + x -= (new_w - w) // 2 + y -= (new_h - h) // 2 + + # Ensure the new bounding box is within the frame dimensions + x = int(max(0, x)) + y = int(max(0, y)) + new_w = min(frame.shape[1] - x, new_w) + new_h = min(frame.shape[0] - y, new_h) + + face_region = frame[y:y+int(new_h), x:x+int(new_w)] + return face_region + return None + + +def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): + """ + Processes the head frame to extract class counts and color information for head-related classes. + + Args: + - head_frame (np.ndarray): The head frame extracted by the BodyPix model. + - model: A PyTorch model instance for classifying and predicting masks for head features. + - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. + - thresholds_pred: A list of prediction thresholds. + + Returns: + - Tuple[dict, dict]: A tuple containing two dictionaries: + - head_class_count: A dictionary with counts for each head-related class. + - head_class_colours: A dictionary with color information for each head-related class. + """ + head_class_count = { + 'hair': 0, + 'hat': 0, + 'glasses': 0, + } + head_class_colours = { + 'hair': {}, + 'hat': {}, + 'glasses': {}, + } + + if head_frame is not None: + # try: + # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) + # cv2.imshow('Head Frame', _head_frame_bgr) + # except Exception as ignore: + # pass + + # Convert head frame to PyTorch tensor and normalize + head_frame_tensor = torch.from_numpy(head_frame).permute(2, 0, 1).unsqueeze(0).float() / 255.0 + masks_batch_pred, pred_classes = model(head_frame_tensor) + + # Apply binary erosion and dilation to the masks + processed_masks = binary_erosion_dilation( + masks_batch_pred, thresholds=thresholds_mask, + erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations + ) + masks = processed_masks.detach().squeeze(0).numpy().astype(np.uint8) + mask_list = [masks[i,:,:] for i in range(masks.shape[0])] + pred_classes = pred_classes.detach().squeeze(0).numpy() + + # Determine if each class is present + class_list = [pred_classes[i].item() > thresholds_pred[i] for i in range(pred_classes.shape[0])] + + # Update class count + for each_class, k in zip(class_list[0:3], ['hair', 'hat', 'glasses']): + head_class_count[k] = int(each_class) + + # Update class colours + for f, each_mask, k, c_map in zip([head_frame, head_frame, head_frame], mask_list[0:2], ['hair', 'hat', 'glasses'], [SPESIFIC_COLOURS, DETAILED_COLOURS, DETAILED_COLOURS]): + colours = count_colours_in_masked_area(f, each_mask, c_map, sort=True)[1] + for colour in colours: + if colour[0] not in head_class_colours[k]: + head_class_colours[k][colour[0]] = [colour[1]] + else: + head_class_colours[k][colour[0]].append(colour[1]) + + return head_class_count, head_class_colours + + +def process_cloth(full_frame, torso_mask): + """ + Processes the full frame with the torso mask to extract class counts and color information for cloth. + + Args: + - full_frame (np.ndarray): The full original frame from the video source. + - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. + + Returns: + - Tuple[dict, dict]: A tuple containing two dictionaries: + - cloth_class_count: A dictionary with counts for the cloth class. + - cloth_class_colours: A dictionary with color information for the cloth class. + """ + cloth_class_count = { + 'cloth': 0, + } + cloth_class_colours = { + 'cloth': {}, + } + + # Check if cloth is detected + if torso_mask is not None and np.sum(torso_mask) >= 50: + cloth_class_count['cloth'] = 1 + + # Update cloth colours + colours = count_colours_in_masked_area(full_frame, torso_mask, DETAILED_COLOURS, sort=True)[1] + for colour in colours: + if colour[0] not in cloth_class_colours['cloth']: + cloth_class_colours['cloth'][colour[0]] = [colour[1]] + else: + cloth_class_colours['cloth'][colour[0]].append(colour[1]) + + return cloth_class_count, cloth_class_colours + + +# you can use this function directly for prediction. +def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): + """ + Predicts classes and color information for a single processed video frame. + + Args: + - head_frame (np.ndarray): The head frame extracted by the BodyPix model. + - full_frame (np.ndarray): The full original frame from the video source. + - head_mask (np.ndarray): The head mask extracted by the BodyPix model. + - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. + - model: A PyTorch model instance for classifying and predicting masks for head features. + - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. + - thresholds_pred: A list of prediction thresholds. + + Returns: + - Tuple[dict, dict]: A tuple containing: + - class_pred: A dictionary with predicted classes for the single frame. + - colour_pred: A dictionary with predicted colors for the single frame. + """ + class_count = { + 'hair': 0, + 'hat': 0, + 'glasses': 0, + 'cloth': 0, + } + class_colours = { + 'hair': {}, + 'hat': {}, + 'glasses': {}, + 'cloth': {}, + } + + head_frame = pad_image_to_even_dims(head_frame) + torso_frame = pad_image_to_even_dims(torso_frame) + + # Process head and cloth separately for the single frame + head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) + cloth_class_count, cloth_class_colours = process_cloth(full_frame, torso_mask) + + # Update class counts and colours + for k in head_class_count: + class_count[k] = head_class_count[k] + class_colours[k] = head_class_colours[k] + + class_count['cloth'] = cloth_class_count['cloth'] + class_colours['cloth'] = cloth_class_colours['cloth'] + + # Compute final class predictions and colors for the single frame + class_pred = {k: bool(class_count[k]) for k in class_count} + colour_pred = {k: v for k, v in class_colours.items()} + + # class_pred, colour_pred = None, None + + return class_pred, colour_pred + + +# # if able to provide multiple frames (see __main__ seciton), then this should work better than the single frame version. +# def predict_frames(head_frames, torso_frames, full_frames, head_masks, torso_masks, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred, SPESIFIC_COLOURS): +# """ +# Predicts classes and color information for a sequence of processed video frames. + +# Args: +# - head_frames (list[np.ndarray]): List of head frames extracted by the BodyPix model. +# - torso_frames (list[np.ndarray]): List of body frames extracted by the BodyPix model. +# - full_frames (list[np.ndarray]): List of full original frames from the video source. +# - head_masks (list[np.ndarray]): List of head masks extracted by the BodyPix model. +# - torso_masks (list[np.ndarray]): List of torso masks extracted by the BodyPix model. +# - model: A PyTorch model instance for classifying and predicting masks for head features. +# - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. +# - thresholds_pred: A list of prediction thresholds. +# - SPESIFIC_COLOURS: A dictionary of specific colors. + +# Returns: +# - Tuple[dict, dict]: A tuple containing: +# - class_pred: A dictionary with predicted classes. +# - colour_pred: A dictionary with predicted colors. +# """ +# total_class_count = { +# 'hair': [], +# 'hat': [], +# 'glasses': [], +# 'cloth': [], +# } +# total_class_colours = { +# 'hair': {}, +# 'hat': {}, +# 'glasses': {}, +# 'cloth': {}, +# } + +# for head_frame, torso_frame, full_frame, head_mask, torso_mask in zip(head_frames, torso_frames, full_frames, head_masks, torso_masks): +# head_frame = pad_image_to_even_dims(head_frame) +# torso_frame = pad_image_to_even_dims(torso_frame) + +# # Process head and cloth separately +# head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) +# cloth_class_count, cloth_class_colours = process_cloth(full_frame, torso_mask) + +# # Accumulate class counts and colours +# for k in head_class_count: +# total_class_count[k].append(head_class_count[k]) +# if k in head_class_colours: +# for colour, count in head_class_colours[k].items(): +# if colour not in total_class_colours[k]: +# total_class_colours[k][colour] = count +# else: +# total_class_colours[k][colour].extend(count) + +# total_class_count['cloth'].append(cloth_class_count['cloth']) +# for colour, count in cloth_class_colours['cloth'].items(): +# if colour not in total_class_colours['cloth']: +# total_class_colours['cloth'][colour] = count +# else: +# total_class_colours['cloth'][colour].extend(count) + +# # Compute final class predictions and colors +# class_pred = {k: sum(v) >= len(v) / 2 for k, v in total_class_count.items()} +# colour_pred = average_colours_by_label(total_class_count, total_class_colours) + +# return class_pred, colour_pred + diff --git a/skills/scripts/unit_test_describe_people.py b/skills/scripts/unit_test_describe_people.py index 3cf73d34c..3445980b9 100644 --- a/skills/scripts/unit_test_describe_people.py +++ b/skills/scripts/unit_test_describe_people.py @@ -14,6 +14,7 @@ sm.add('DESCRIBE', DescribePeople(), transitions={ 'succeeded': 'end', 'failed': 'end'}) + # while True: sm.execute() print('\n\nDetected people:', sm.userdata['people']) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index d64b07cee..29a37c1ae 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -6,7 +6,7 @@ import cv2_img import numpy as np -from colour_estimation import closest_colours, RGB_COLOURS +# from colour_estimation import closest_colours, RGB_COLOURS from lasr_vision_msgs.msg import BodyPixMaskRequest, ColourPrediction, FeatureWithColour from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection from numpy2message import numpy2message @@ -171,57 +171,57 @@ def execute(self, userdata): head_mask_data, head_mask_shape, head_mask_dtype, ).detected_features) - # process part masks - for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): - part_mask = np.array(bodypix_mask.mask).reshape( - bodypix_mask.shape[0], bodypix_mask.shape[1]) - - # filter out part for current person segmentation - try: - part_mask[mask_bin == 0] = 0 - except Exception: - rospy.logdebug('|> Failed to check {part} is visible') - continue - - if part_mask.any(): - rospy.logdebug(f'|> Person has {part} visible') - else: - rospy.logdebug( - f'|> Person does not have {part} visible') - continue - - # do colour processing on the torso - if part == 'torso': - try: - features.append(FeatureWithColour("torso", [ - ColourPrediction(colour, distance) - for colour, distance - in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) - ])) - except Exception as e: - rospy.logerr(f"Failed to process colour: {e}") - - # do feature extraction on the head - if part == 'head': - try: - # crop out face - face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( - userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) - - mask_image_only_face = mask_image.copy() - mask_image_only_face[face_mask == 0] = 0 - - face_region = cv2_img.extract_mask_region( - img, mask_image_only_face) - if face_region is None: - raise Exception( - "Failed to extract mask region") - - msg = cv2_img.cv2_img_to_msg(face_region) - features.extend(self.torch_face_features( - msg, False).detected_features) - except Exception as e: - rospy.logerr(f"Failed to process extraction: {e}") + # # process part masks + # for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): + # part_mask = np.array(bodypix_mask.mask).reshape( + # bodypix_mask.shape[0], bodypix_mask.shape[1]) + + # # filter out part for current person segmentation + # try: + # part_mask[mask_bin == 0] = 0 + # except Exception: + # rospy.logdebug('|> Failed to check {part} is visible') + # continue + + # if part_mask.any(): + # rospy.logdebug(f'|> Person has {part} visible') + # else: + # rospy.logdebug( + # f'|> Person does not have {part} visible') + # continue + + # # do colour processing on the torso + # if part == 'torso': + # try: + # features.append(FeatureWithColour("torso", [ + # ColourPrediction(colour, distance) + # for colour, distance + # in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) + # ])) + # except Exception as e: + # rospy.logerr(f"Failed to process colour: {e}") + + # # do feature extraction on the head + # if part == 'head': + # try: + # # crop out face + # face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( + # userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) + + # mask_image_only_face = mask_image.copy() + # mask_image_only_face[face_mask == 0] = 0 + + # face_region = cv2_img.extract_mask_region( + # img, mask_image_only_face) + # if face_region is None: + # raise Exception( + # "Failed to extract mask region") + + # msg = cv2_img.cv2_img_to_msg(face_region) + # features.extend(self.torch_face_features( + # msg, False).detected_features) + # except Exception as e: + # rospy.logerr(f"Failed to process extraction: {e}") people.append({ 'detection': person, From 77feadbf7d7250fd89ee69ec9637e69daade94cc Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 10:46:20 +0000 Subject: [PATCH 29/69] fixed that torsal and head frames were inversed. --- common/vision/lasr_vision_torch/full_frame.jpg | Bin 0 -> 70408 bytes common/vision/lasr_vision_torch/head_frame.jpg | Bin 0 -> 34700 bytes .../src/lasr_vision_torch/__init__.py | 15 ++++++++++++++- common/vision/lasr_vision_torch/torso_frame.jpg | Bin 0 -> 20771 bytes skills/src/lasr_skills/describe_people.py | 2 +- 5 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 common/vision/lasr_vision_torch/full_frame.jpg create mode 100644 common/vision/lasr_vision_torch/head_frame.jpg create mode 100644 common/vision/lasr_vision_torch/torso_frame.jpg diff --git a/common/vision/lasr_vision_torch/full_frame.jpg b/common/vision/lasr_vision_torch/full_frame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f307b546a1e7c72a4ed67d640560ffa3c628900 GIT binary patch literal 70408 zcmbTcWl$VX)IPefI0S;bF1on8I|=TR1P$))u2~i*uy}9}1Sf(o5+FFiVUghO_UHG$ zRrh|mAMU+ps?W^S^z=MWch%H6r=REf=QY4
Lg01^@afb?_3nE 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 Y#z@WqKGacJI&kLL>Wx~S&FX*u*<*vQfdBvi literal 0 HcmV?d00001 diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index b1d380b4a..be2509220 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -11,6 +11,7 @@ import rospkg import lasr_vision_torch from os import path +# import matplotlib.pyplot as plt def load_face_classifier_model(): @@ -122,8 +123,9 @@ def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilatio if head_frame is not None: # try: + # r = rospkg.RosPack() # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) - # cv2.imshow('Head Frame', _head_frame_bgr) + # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) # except Exception as ignore: # pass @@ -228,6 +230,17 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, mo head_frame = pad_image_to_even_dims(head_frame) torso_frame = pad_image_to_even_dims(torso_frame) + + try: + r = rospkg.RosPack() + _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) + cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) + _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) + cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) + _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) + cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) + except Exception as ignore: + pass # Process head and cloth separately for the single frame head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) diff --git a/common/vision/lasr_vision_torch/torso_frame.jpg b/common/vision/lasr_vision_torch/torso_frame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a49c8711f1a99d3f3a8db5693a26f03794732a6 GIT binary patch literal 20771 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%0A7pmb443hVF;bhF?Sz{&o*F7$?pcfP z&~py;^CgN78Wr6=IhDnb@l&jRF-Ybo^k)O^OJo{(IODJGPif%XvIU!_sT@*PzDZF5 zjI#a-bzu7QUxNlvGFkYJKp8J3A{)7eb+SG>3(SISTQ-w8CC$=_ub3;!)SszBa9&?E zq*wM-97AHqXDWS;FM+Sf!MGu9%g=&P8Ow!l{;uH4V_L0kQue>1Wims84zREZpfcRj z8G~!SLdi;p5TI(GgV0zI$iqNV2p1>uQ8UE{{E{mS|4bUE?IQ^-FI-%!4}?#&KK1m_ zh1(tq5U8FDiuHnOZrz{yK1nhOQx?c^FBi!M#w+LmflvBnR9Lz$kUt7(Vlahh+zBoXmMs?(bho4E>!lQC(3B0 zTcek@Y5RLmoWz+?Fn!WLv*-3ZY2S%?%j#6o? zDSFPHEa%Ieu5PlEM0AaiAtDuk}cAl21(Irv|{A9vf6 zMO3?PnT@+FQp~l%taCJ8(Ln)35-vVPlIo(GByn)rARAWi zNQS7i$K3BdKcHY${UrKKEH{IaN<1^>!{T$cQvV7!&#aQNSH>C|c2kY*apclO zPXpoGUVuG@YDPitWjmn_+tC8@a|RwhpaN~7`COXxvQc+;>KNgP1U4EO>22x&Zct4R zWApO7p!iFNV~Q7PuRdXzmd;w=`C2zb$fIcOpA`{lk^$kgDb_E7j@`d}R_5gPMp39( zY%{-grqhoslnv-mE=M6MR@tQTD6&B)(%%&+Cl%|INi+`Elu-TX5|)N(J9RF7XJdVg zJ&{aCU%Ae6aPsvXRGQloz$C0b6=Ur1|JwgecRI~7r{7)46-`d`2Pldyx2oEa`7?YA zO_o%kXUk5yCBT6Y@Es4JE^esAr`t?XL;gzOpnlGau#rS?y+~A&-p8B9a+{133WEja zR^4mEFMsU_Y0Y#pklP^MZ&)x2(c01&Bx^W{v~FtkSQlGmZ^6Cyq%rVe*N;t_C@q<5 zJJR~w{w0;zDEW_&%;BR(q9FTjZfdczp8QfveJbdgX%>09<`Twri8^~Q#^&F*hxBHf zr@#E4&(h$6R|20M%vtu2UAf@6Nq?a$^%iz$H@VfEQc2??);Ppp45Qq9hJR&K(2WjAOD z837P7vlq+m`6tBGc<;G<{&E*99IGtSKd5o6_i}_z7J;ypFNyQ;G^xmf>U8^2yZ`)( zwZF--EU+UHk`cn3@wfR>89Z52*5oyU@SZL6d_COIr19ShVc9)r=sPEQf5%PNJYuv7 zO40%*rEC`%kB3iO`e0PNv-a;^vxr!=};)ep5}X4f9#Z zQM@wlEWaPvo}=B#FsAcr0yU}Q^3$*XEwh*k)7OTvJ=AYfp>?N``rj!V2%As;o*1i@ z*-p|-+sBs)qP{Kqq9)DbQVDBM^OM9+{mWN2X))4IK3r0sbtic9EQ1Vx;M6Xqa|2-! zj@4|#!Od(0<$r%OO{oNA8?pc>R?39$zEPcB^ZQQ-7bvmks$Bht0bG4Yo{tDsgijbH`qoUbv<=G zRf%EG-n@(R_XTFyiduzTwon_50CVauZXLIRqevDw2k>m=eaW(+8RSQPgk90ZzyE`C zWpo(#-XZHWpFQ*OA*1fVqpDUgg?yn#qJ^rz8W$h6BNoBCZ<_ zax-k9s~D&AcsY7gFzk1GkZkWqru!Cz7=|PUXEx}3O!jXU>f1`9sS$ooZ(whE$(bOb z1G0q+mUL{6{yFvJ=4xB~T-{(7*W@#P8oUoQ(gXBwPxBh)_fpsT zZvceEH^7L(GtwKt6e#xwn3->q0A6^qA-p2HZ+t<2p7Le+AL4;KDiWRL2vvTeJwk>v z{oqNmz*WA)7*I;W<1c$y1(D*4_9fs$xU4$J&yrZ)N2xs6slzjn0_yB=MU#`84UVh{ zmCtYqxF!hgEHG6b9>~~!$5xxR?u$y>;}1!TknFuo)Sm7yX6U0@Zey~MRi?s$c!;Mk8@+<(+?j*y-yor1b6cqYMpOALVL81NDaars)yj*m+b7;CEpH-a`d~^Dixr@<` z9fMPweR61=MSF;2jn=!Ex@@bVpBGNipY&yD<1dLJ2;VOHWQoubp`Obqj2{NRjpwlM z{selQ4v}b%`SC$RoKRCzb-qPfE4Atkpo)F{5vM*O!zc=erRbL&*2(Z>oZ?yQ>-6uU z%4*JS>ZCZd7~hlB>C)S3e$uK?w*WKejG2`!CcsOBVt%YPevkWPhfQREzNM}5yCCFU zaEmYMDPi=ClLk!E#DLhn4cb0^(`A^z@|{@xbo7>c~*xe+HK0Q(Bf*Q zh^@7v7lHMv!@DfiJL~L3`sT6PmjIos0HFzwYQ{_W;z}D$$dg{1r>PJR5A1TK${yc4 z8MV;fT(dv!*GXMzNK4z&80iTNo$z{$xSK@tSl12v80D@ag#q&wM1fq!78vvEt{M^Q zzPYBV)y%PCsNF|GjYPEf%GGt3nFh}`6R&YNEQIP?VODM~71e-_{wz|L(NFX-(=GMhZCVVeDH74$adLOt zAuV(z4o09Yj`bWB%F_Ref8l+kbF%#eRyE`X38W$EetslRMfgd#XS9gX9tU1&%-9$g z+L*fmJ=sK#s)0U@Ka;P1bxJr)UM`5^Q$ZKH)N_dRF@wWbc#NJ|6(AkE8c!TPlHsbL zoSyAaVo_X*=9oTEo&Z^TYl-Ldc5Ztd1IHwhGm2b{*wrx|3GShl(j z1Rq|lz|c-(M#Lt!5nZ2JNHlv!V^AZ-Z4Hw5R|JqK^rFdr= z@Hom60L7x!mzYOTmA^Z=Nvx>N>a&plr?uafMQ|7d*#FksaY#rOik>+Z6p9NX`GD9u zAyGMM`&Q4*Z-9WOh3Sh|3d!=K$82WTpLg|q3*sdUwoT~urku6o7~rg-%Wg~hJg@t~<2ZeX z`Q&alpRQ5@ceZgKd4D}Qok7dm75DFQ$4GL&D!^&MRs5v^Y&;;BGH5&q-_p#rWCUX% zxN|wd@OO^l7iuFK-*B#cnjlF3)9odHg()82EiXZtCjZm9g$%6Izmh7yy#oiPJ?!k} zvTH@oFxe5OBXn5>+vOBYS}Q|n$eN5Bz$<+sRZ|pc9h?pCQHK9%?$-^8>AcU3^iGON z?6-O6a#Jt0KQ+=*9dol-;1r?2iqUcTU0c&w>yTmO&%kFIdQGC)LK>3SIiY$%Rz$fZBAtc=Qh3?w;d}| zNFqC=ltj-07I#+!cuTnwtN6D^{wuI~2(O{N<2GUgB0 z8vw`f=Lt1kTRDpGHH3qkLA(GZp`CQ$(noLBCRR=mMga# zF1^Mb@7TE?fc|Y^Ku*KgWOc0Wd%iux7TciCWQ+!?(|}%BNCCHe;&Hl?HX6I<4d;}u z5Wng#0hZPM8k}k4KfgVrFkHuNmU3&qf!vO@mv!uX&qVmAu;A&K<{KhvGP9cSUj6Hr z+F2$?qBQ93Ylvcq z0n4dLK#nHbmId$s5%!`wu9_Tq^Cw_oA*T+x>zN)Mh0OpC-&;Yzw{`ywP_4zMb?`%P zEp{0QrJjU*Vu5tkhNfO@t6YAHy_*baC_knACvOv$awI1~xrL7z%D8Pi))o{)HE5et z{KK23KSFGh3Kv>_k=U=%39Ngfp4J{^e5^@^9c&J&k&0@Z(xj07sKEbd+!+Std2;Y^ zfI7Lt=@`bC&2laRq^6$bI8z&o$Pqu#BXWoZ#^Bau_dDt1a1g02tFZN(aUDygqrNaU zNzlRF9x%+>1OaZVsb4bvZDK=3fWKp!<)C6mOZ4uMfW^r){wD6h0|adZjE|mf;rhVD(OK2|J@?8{>gpoP}Re`hkg! zBq>7(E8HCe^SGntU9vnK|Gebivn}8DifprC@LuzQNA>MLcG4ih^NNncBlU`GvEk4# zP}8;f_3#(5==PJ1&W-u2i)MxTITqW~e8aKX#RcUOWthv%VF;2mTN=?3} zF)H(hYmGFjrJ@4-81lQrc;RDBVu&UK!j28r*;0Pm22C1U5~H(}Uex`&gs~vT@h!sS zO76SsD!gz*22*C5g)_T?U$S*SNmX(2LsWk*8MI;?MO-e+#v9@ou(Mt0njTX2YcX5V z!FpSm#>WI|^&|krR)ywXiubcxJ-TLk5-)ltHp7MG8*aHB0Nx)lJ2K3E*tixIyV7?T zBT_4J61(Le>E$iz8fcrMgNi*?zGtw?8%hEXJ%Q6hB4bp+@d9jrV=G zk2_06`HMg}0lqTN=d;Yp+-H#d=*hKL<#j_rT_s)t{h{BzXQfr;j8Mqlr*7OPx=lFY zwLs%rR??nKWBlP_b@oxRGnBPrS9HT76M4&7&c*(G_Q;|W6_z?PcxFDgWr4gY7MzLh z)j!)%?(IS@7Zuy?L?xbkMC(rATYSWc{PR=tj%<>*L!#As)%n5KDw8iJSR-R z;qC6FA0B-A8f!G&P`NjKQxck1ti#l<>=^&Giy`*-mXEGOin;9IM*tG(xbsMRV!f75w_GY2L1YNmsr_eBf|Iu+G(GigC=#adP0Q z$X2^dwuKEokhDtbey11!kZN!Gb2@xks;98_gE?%e>fssxygne#8Dx!H_@ylUKtfuw zfW)j$Xi#C6sy#@c+^P?r5Vbg1MK3us0el>_kO~Ds5)UfxP*R!f_q#3@a>Yt|N}ZXan4ql+U8(!Fx-YWG8$aHeXQIjQt^ zgBSDAX4I~tIPwu8r3xv>q;)mb5Vo5xDaia#)ObJJ6HblkV_WrVkB~Kylo@}SZkmBj zSx!cBy!^C)X=E`_2T$7udih{HS`5D{EbQuNp$xZbg)FZX*2IteS zwrFUI4eG9_Uauco7zTz(9nACKS5_VQk^j^{`kjUj(>3KwzHrMsSMcx6 z{#zE%a_t&r{hZb_i92OgE6rUBx8s6PXr$Hu)FYB*ci1f{UIXD@@G&8B;ytc1)xQjF zOh*s3x44!aWixQHl-aBduhe`r?a9ZENW%ivab9_7+=oTeP_hd&gjRgIlA2_XuQ}3qfveX_)(- zCt~FqzXQ8)_7<@pu?yCOf#-@Hp3D=$7-+ziXvfm)B5QIdD4{UzWw!w#Cn+lZny6G#5q^ zc9S0IYA{Ls`vS?yUAN&0H!;CN>UWa z0(a`?Sk{S?s=IB+9Ve*9FP-KHtX41l@Z2B$z0*=>?-`r(NIyjA{sz>?Vk27KJmgOk z-pR(W9i4s*g1`9Gf*C++@bezs$>z)O7w zYHGIUXTyCg&9@=a46D!Zb^kg`*;>~YCTHh_VrHtsj#ypZYvNn)D$GF|_}Kok7L(Yk zS?;ifLR?Bsfpx`gP8Jwyv*Li$Q1Q#w2>bvxfHm*`G&-jU%XO~fJ7S&wjmL9qYfU%y zE>&c{skEH;@I)#4SATy_D{l#zN*eY4v4S=Z1!F&^x`pF-9HgNb=bqAzR-SZ;5BZ-? zot;Y*ciqjQ_7~$~LI8}47%z}l@UED__a|Y#8{xepI+rujBgwUvTazsD$FduIik~B% zq!LcEMKP_;7T2EdT1Nu+8vsf_8HoO(^ndCa_|If)6p63MRvRjcih)Gm-_?+JlHtjP zTlDux)jde0kZ{s^vQ5I-Q8;t%;r;Rul@?x;+iEde(}h;^HOf=!YOXYYf@M*HaT|m0 z^jq!kE1s9KP6EGSLzJ^lDj(@tNk^0S=?IaBD5M9-s9f!=s5*rv|EZwri+l%a*K+J# zI@IjFjE<}2^1NSPdbbWQtw>a?xvQCKH-hU-=Ew_XmNhq`RFO0wM zL1|)JcFNf8i8hU}_cY344;bR+kkp9A5ijGrO~M

&2%CPudufs9cP^tfY?kwL} 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 literal 0 HcmV?d00001 diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 29a37c1ae..24170f61f 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -167,8 +167,8 @@ def execute(self, userdata): full_frame = cv2_img.cv2_img_to_msg(img) features.extend(self.torch_face_features( full_frame, - torso_mask_data, torso_mask_shape, torso_mask_dtype, head_mask_data, head_mask_shape, head_mask_dtype, + torso_mask_data, torso_mask_shape, torso_mask_dtype, ).detected_features) # # process part masks From c096166783b5edcc80e3b40ceb0b108170df4158 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 11:05:03 +0000 Subject: [PATCH 30/69] Changed colour format from BGR to RGB within the detection process. --- .../vision/lasr_vision_torch/full_frame.jpg | Bin 70408 -> 0 bytes .../vision/lasr_vision_torch/head_frame.jpg | Bin 34700 -> 0 bytes .../src/lasr_vision_torch/__init__.py | 24 ++++++++++-------- .../vision/lasr_vision_torch/torso_frame.jpg | Bin 20771 -> 0 bytes 4 files changed, 14 insertions(+), 10 deletions(-) delete mode 100644 common/vision/lasr_vision_torch/full_frame.jpg delete mode 100644 common/vision/lasr_vision_torch/head_frame.jpg delete mode 100644 common/vision/lasr_vision_torch/torso_frame.jpg diff --git a/common/vision/lasr_vision_torch/full_frame.jpg b/common/vision/lasr_vision_torch/full_frame.jpg deleted file mode 100644 index 7f307b546a1e7c72a4ed67d640560ffa3c628900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70408 zcmbTcWl$VX)IPefI0S;bF1on8I|=TR1P$))u2~i*uy}9}1Sf(o5+FFiVUghO_UHG$ zRrh|mAMU+ps?W^S^z=MWch%H6r=REf=QY4

Lg01^@afb?_3nE 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 Y#z@WqKGacJI&kLL>Wx~S&FX*u*<*vQfdBvi diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index be2509220..2f494b0f0 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -228,19 +228,23 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, mo 'cloth': {}, } + full_frame = cv2.cvtColor(full_frame, cv2.COLOR_BGR2RGB) + head_frame = cv2.cvtColor(head_frame, cv2.COLOR_BGR2RGB) + torso_frame = cv2.cvtColor(torso_frame, cv2.COLOR_BGR2RGB) + head_frame = pad_image_to_even_dims(head_frame) torso_frame = pad_image_to_even_dims(torso_frame) - try: - r = rospkg.RosPack() - _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) - cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) - _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) - cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) - _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) - cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) - except Exception as ignore: - pass + # try: + # r = rospkg.RosPack() + # _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) + # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) + # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) + # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) + # _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) + # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) + # except Exception as ignore: + # pass # Process head and cloth separately for the single frame head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) diff --git a/common/vision/lasr_vision_torch/torso_frame.jpg b/common/vision/lasr_vision_torch/torso_frame.jpg deleted file mode 100644 index 6a49c8711f1a99d3f3a8db5693a26f03794732a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20771 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%0A7pmb443hVF;bhF?Sz{&o*F7$?pcfP z&~py;^CgN78Wr6=IhDnb@l&jRF-Ybo^k)O^OJo{(IODJGPif%XvIU!_sT@*PzDZF5 zjI#a-bzu7QUxNlvGFkYJKp8J3A{)7eb+SG>3(SISTQ-w8CC$=_ub3;!)SszBa9&?E zq*wM-97AHqXDWS;FM+Sf!MGu9%g=&P8Ow!l{;uH4V_L0kQue>1Wims84zREZpfcRj z8G~!SLdi;p5TI(GgV0zI$iqNV2p1>uQ8UE{{E{mS|4bUE?IQ^-FI-%!4}?#&KK1m_ zh1(tq5U8FDiuHnOZrz{yK1nhOQx?c^FBi!M#w+LmflvBnR9Lz$kUt7(Vlahh+zBoXmMs?(bho4E>!lQC(3B0 zTcek@Y5RLmoWz+?Fn!WLv*-3ZY2S%?%j#6o? zDSFPHEa%Ieu5PlEM0AaiAtDuk}cAl21(Irv|{A9vf6 zMO3?PnT@+FQp~l%taCJ8(Ln)35-vVPlIo(GByn)rARAWi zNQS7i$K3BdKcHY${UrKKEH{IaN<1^>!{T$cQvV7!&#aQNSH>C|c2kY*apclO zPXpoGUVuG@YDPitWjmn_+tC8@a|RwhpaN~7`COXxvQc+;>KNgP1U4EO>22x&Zct4R zWApO7p!iFNV~Q7PuRdXzmd;w=`C2zb$fIcOpA`{lk^$kgDb_E7j@`d}R_5gPMp39( zY%{-grqhoslnv-mE=M6MR@tQTD6&B)(%%&+Cl%|INi+`Elu-TX5|)N(J9RF7XJdVg zJ&{aCU%Ae6aPsvXRGQloz$C0b6=Ur1|JwgecRI~7r{7)46-`d`2Pldyx2oEa`7?YA zO_o%kXUk5yCBT6Y@Es4JE^esAr`t?XL;gzOpnlGau#rS?y+~A&-p8B9a+{133WEja zR^4mEFMsU_Y0Y#pklP^MZ&)x2(c01&Bx^W{v~FtkSQlGmZ^6Cyq%rVe*N;t_C@q<5 zJJR~w{w0;zDEW_&%;BR(q9FTjZfdczp8QfveJbdgX%>09<`Twri8^~Q#^&F*hxBHf zr@#E4&(h$6R|20M%vtu2UAf@6Nq?a$^%iz$H@VfEQc2??);Ppp45Qq9hJR&K(2WjAOD z837P7vlq+m`6tBGc<;G<{&E*99IGtSKd5o6_i}_z7J;ypFNyQ;G^xmf>U8^2yZ`)( zwZF--EU+UHk`cn3@wfR>89Z52*5oyU@SZL6d_COIr19ShVc9)r=sPEQf5%PNJYuv7 zO40%*rEC`%kB3iO`e0PNv-a;^vxr!=};)ep5}X4f9#Z zQM@wlEWaPvo}=B#FsAcr0yU}Q^3$*XEwh*k)7OTvJ=AYfp>?N``rj!V2%As;o*1i@ z*-p|-+sBs)qP{Kqq9)DbQVDBM^OM9+{mWN2X))4IK3r0sbtic9EQ1Vx;M6Xqa|2-! zj@4|#!Od(0<$r%OO{oNA8?pc>R?39$zEPcB^ZQQ-7bvmks$Bht0bG4Yo{tDsgijbH`qoUbv<=G zRf%EG-n@(R_XTFyiduzTwon_50CVauZXLIRqevDw2k>m=eaW(+8RSQPgk90ZzyE`C zWpo(#-XZHWpFQ*OA*1fVqpDUgg?yn#qJ^rz8W$h6BNoBCZ<_ zax-k9s~D&AcsY7gFzk1GkZkWqru!Cz7=|PUXEx}3O!jXU>f1`9sS$ooZ(whE$(bOb z1G0q+mUL{6{yFvJ=4xB~T-{(7*W@#P8oUoQ(gXBwPxBh)_fpsT zZvceEH^7L(GtwKt6e#xwn3->q0A6^qA-p2HZ+t<2p7Le+AL4;KDiWRL2vvTeJwk>v z{oqNmz*WA)7*I;W<1c$y1(D*4_9fs$xU4$J&yrZ)N2xs6slzjn0_yB=MU#`84UVh{ zmCtYqxF!hgEHG6b9>~~!$5xxR?u$y>;}1!TknFuo)Sm7yX6U0@Zey~MRi?s$c!;Mk8@+<(+?j*y-yor1b6cqYMpOALVL81NDaars)yj*m+b7;CEpH-a`d~^Dixr@<` z9fMPweR61=MSF;2jn=!Ex@@bVpBGNipY&yD<1dLJ2;VOHWQoubp`Obqj2{NRjpwlM z{selQ4v}b%`SC$RoKRCzb-qPfE4Atkpo)F{5vM*O!zc=erRbL&*2(Z>oZ?yQ>-6uU z%4*JS>ZCZd7~hlB>C)S3e$uK?w*WKejG2`!CcsOBVt%YPevkWPhfQREzNM}5yCCFU zaEmYMDPi=ClLk!E#DLhn4cb0^(`A^z@|{@xbo7>c~*xe+HK0Q(Bf*Q zh^@7v7lHMv!@DfiJL~L3`sT6PmjIos0HFzwYQ{_W;z}D$$dg{1r>PJR5A1TK${yc4 z8MV;fT(dv!*GXMzNK4z&80iTNo$z{$xSK@tSl12v80D@ag#q&wM1fq!78vvEt{M^Q zzPYBV)y%PCsNF|GjYPEf%GGt3nFh}`6R&YNEQIP?VODM~71e-_{wz|L(NFX-(=GMhZCVVeDH74$adLOt zAuV(z4o09Yj`bWB%F_Ref8l+kbF%#eRyE`X38W$EetslRMfgd#XS9gX9tU1&%-9$g z+L*fmJ=sK#s)0U@Ka;P1bxJr)UM`5^Q$ZKH)N_dRF@wWbc#NJ|6(AkE8c!TPlHsbL zoSyAaVo_X*=9oTEo&Z^TYl-Ldc5Ztd1IHwhGm2b{*wrx|3GShl(j z1Rq|lz|c-(M#Lt!5nZ2JNHlv!V^AZ-Z4Hw5R|JqK^rFdr= z@Hom60L7x!mzYOTmA^Z=Nvx>N>a&plr?uafMQ|7d*#FksaY#rOik>+Z6p9NX`GD9u zAyGMM`&Q4*Z-9WOh3Sh|3d!=K$82WTpLg|q3*sdUwoT~urku6o7~rg-%Wg~hJg@t~<2ZeX z`Q&alpRQ5@ceZgKd4D}Qok7dm75DFQ$4GL&D!^&MRs5v^Y&;;BGH5&q-_p#rWCUX% zxN|wd@OO^l7iuFK-*B#cnjlF3)9odHg()82EiXZtCjZm9g$%6Izmh7yy#oiPJ?!k} zvTH@oFxe5OBXn5>+vOBYS}Q|n$eN5Bz$<+sRZ|pc9h?pCQHK9%?$-^8>AcU3^iGON z?6-O6a#Jt0KQ+=*9dol-;1r?2iqUcTU0c&w>yTmO&%kFIdQGC)LK>3SIiY$%Rz$fZBAtc=Qh3?w;d}| zNFqC=ltj-07I#+!cuTnwtN6D^{wuI~2(O{N<2GUgB0 z8vw`f=Lt1kTRDpGHH3qkLA(GZp`CQ$(noLBCRR=mMga# zF1^Mb@7TE?fc|Y^Ku*KgWOc0Wd%iux7TciCWQ+!?(|}%BNCCHe;&Hl?HX6I<4d;}u z5Wng#0hZPM8k}k4KfgVrFkHuNmU3&qf!vO@mv!uX&qVmAu;A&K<{KhvGP9cSUj6Hr z+F2$?qBQ93Ylvcq z0n4dLK#nHbmId$s5%!`wu9_Tq^Cw_oA*T+x>zN)Mh0OpC-&;Yzw{`ywP_4zMb?`%P zEp{0QrJjU*Vu5tkhNfO@t6YAHy_*baC_knACvOv$awI1~xrL7z%D8Pi))o{)HE5et z{KK23KSFGh3Kv>_k=U=%39Ngfp4J{^e5^@^9c&J&k&0@Z(xj07sKEbd+!+Std2;Y^ zfI7Lt=@`bC&2laRq^6$bI8z&o$Pqu#BXWoZ#^Bau_dDt1a1g02tFZN(aUDygqrNaU zNzlRF9x%+>1OaZVsb4bvZDK=3fWKp!<)C6mOZ4uMfW^r){wD6h0|adZjE|mf;rhVD(OK2|J@?8{>gpoP}Re`hkg! zBq>7(E8HCe^SGntU9vnK|Gebivn}8DifprC@LuzQNA>MLcG4ih^NNncBlU`GvEk4# zP}8;f_3#(5==PJ1&W-u2i)MxTITqW~e8aKX#RcUOWthv%VF;2mTN=?3} zF)H(hYmGFjrJ@4-81lQrc;RDBVu&UK!j28r*;0Pm22C1U5~H(}Uex`&gs~vT@h!sS zO76SsD!gz*22*C5g)_T?U$S*SNmX(2LsWk*8MI;?MO-e+#v9@ou(Mt0njTX2YcX5V z!FpSm#>WI|^&|krR)ywXiubcxJ-TLk5-)ltHp7MG8*aHB0Nx)lJ2K3E*tixIyV7?T zBT_4J61(Le>E$iz8fcrMgNi*?zGtw?8%hEXJ%Q6hB4bp+@d9jrV=G zk2_06`HMg}0lqTN=d;Yp+-H#d=*hKL<#j_rT_s)t{h{BzXQfr;j8Mqlr*7OPx=lFY zwLs%rR??nKWBlP_b@oxRGnBPrS9HT76M4&7&c*(G_Q;|W6_z?PcxFDgWr4gY7MzLh z)j!)%?(IS@7Zuy?L?xbkMC(rATYSWc{PR=tj%<>*L!#As)%n5KDw8iJSR-R z;qC6FA0B-A8f!G&P`NjKQxck1ti#l<>=^&Giy`*-mXEGOin;9IM*tG(xbsMRV!f75w_GY2L1YNmsr_eBf|Iu+G(GigC=#adP0Q z$X2^dwuKEokhDtbey11!kZN!Gb2@xks;98_gE?%e>fssxygne#8Dx!H_@ylUKtfuw zfW)j$Xi#C6sy#@c+^P?r5Vbg1MK3us0el>_kO~Ds5)UfxP*R!f_q#3@a>Yt|N}ZXan4ql+U8(!Fx-YWG8$aHeXQIjQt^ zgBSDAX4I~tIPwu8r3xv>q;)mb5Vo5xDaia#)ObJJ6HblkV_WrVkB~Kylo@}SZkmBj zSx!cBy!^C)X=E`_2T$7udih{HS`5D{EbQuNp$xZbg)FZX*2IteS zwrFUI4eG9_Uauco7zTz(9nACKS5_VQk^j^{`kjUj(>3KwzHrMsSMcx6 z{#zE%a_t&r{hZb_i92OgE6rUBx8s6PXr$Hu)FYB*ci1f{UIXD@@G&8B;ytc1)xQjF zOh*s3x44!aWixQHl-aBduhe`r?a9ZENW%ivab9_7+=oTeP_hd&gjRgIlA2_XuQ}3qfveX_)(- zCt~FqzXQ8)_7<@pu?yCOf#-@Hp3D=$7-+ziXvfm)B5QIdD4{UzWw!w#Cn+lZny6G#5q^ zc9S0IYA{Ls`vS?yUAN&0H!;CN>UWa z0(a`?Sk{S?s=IB+9Ve*9FP-KHtX41l@Z2B$z0*=>?-`r(NIyjA{sz>?Vk27KJmgOk z-pR(W9i4s*g1`9Gf*C++@bezs$>z)O7w zYHGIUXTyCg&9@=a46D!Zb^kg`*;>~YCTHh_VrHtsj#ypZYvNn)D$GF|_}Kok7L(Yk zS?;ifLR?Bsfpx`gP8Jwyv*Li$Q1Q#w2>bvxfHm*`G&-jU%XO~fJ7S&wjmL9qYfU%y zE>&c{skEH;@I)#4SATy_D{l#zN*eY4v4S=Z1!F&^x`pF-9HgNb=bqAzR-SZ;5BZ-? zot;Y*ciqjQ_7~$~LI8}47%z}l@UED__a|Y#8{xepI+rujBgwUvTazsD$FduIik~B% zq!LcEMKP_;7T2EdT1Nu+8vsf_8HoO(^ndCa_|If)6p63MRvRjcih)Gm-_?+JlHtjP zTlDux)jde0kZ{s^vQ5I-Q8;t%;r;Rul@?x;+iEde(}h;^HOf=!YOXYYf@M*HaT|m0 z^jq!kE1s9KP6EGSLzJ^lDj(@tNk^0S=?IaBD5M9-s9f!=s5*rv|EZwri+l%a*K+J# zI@IjFjE<}2^1NSPdbbWQtw>a?xvQCKH-hU-=Ew_XmNhq`RFO0wM zL1|)JcFNf8i8hU}_cY344;bR+kkp9A5ijGrO~M

&2%CPudufs9cP^tfY?kwL} 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 From 67804ec13f7ae45638d43c020d99ae75039b13b5 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 11:55:28 +0000 Subject: [PATCH 31/69] keep the saved model --- common/vision/lasr_vision_torch/models/.gitkeep | 1 + 1 file changed, 1 insertion(+) diff --git a/common/vision/lasr_vision_torch/models/.gitkeep b/common/vision/lasr_vision_torch/models/.gitkeep index e69de29bb..25e597304 100644 --- a/common/vision/lasr_vision_torch/models/.gitkeep +++ b/common/vision/lasr_vision_torch/models/.gitkeep @@ -0,0 +1 @@ +model.pth \ No newline at end of file From cc860acfb9041ba010d2eabf8b81d716b016feb3 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 11:57:47 +0000 Subject: [PATCH 32/69] keep the model file --- common/vision/lasr_vision_torch/models/.gitkeep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/models/.gitkeep b/common/vision/lasr_vision_torch/models/.gitkeep index 25e597304..0c260a72e 100644 --- a/common/vision/lasr_vision_torch/models/.gitkeep +++ b/common/vision/lasr_vision_torch/models/.gitkeep @@ -1 +1 @@ -model.pth \ No newline at end of file +models/model.pth \ No newline at end of file From 8f54363fdc2625067fcc19ae084356ceebf089c7 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 12:18:48 +0000 Subject: [PATCH 33/69] keep the saved model --- common/vision/lasr_vision_torch/models/.gitkeep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/models/.gitkeep b/common/vision/lasr_vision_torch/models/.gitkeep index 0c260a72e..a6f7acf7f 100644 --- a/common/vision/lasr_vision_torch/models/.gitkeep +++ b/common/vision/lasr_vision_torch/models/.gitkeep @@ -1 +1 @@ -models/model.pth \ No newline at end of file +# models/model.pth \ No newline at end of file From 7827dc261ad7172eaba9532c25eec5083d5b8303 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 8 Dec 2023 12:38:33 +0000 Subject: [PATCH 34/69] Cancel saving the images (but sitll cannot see use cv2.imshow) --- .../vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 2f494b0f0..1d4f6cffe 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -235,6 +235,7 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, mo head_frame = pad_image_to_even_dims(head_frame) torso_frame = pad_image_to_even_dims(torso_frame) + # cv2 imshow is currently not working, not knowing why... # try: # r = rospkg.RosPack() # _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) From 134c8703e9e096bc9b0a1b0e1f8b1609d306f3e7 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Dec 2023 17:00:26 +0000 Subject: [PATCH 35/69] Runnable demo --- tasks/receptionist/launch/setup.launch | 6 +++-- tasks/receptionist/src/receptionist/sm.py | 8 +++++-- .../src/receptionist/states/__init__.py | 3 ++- .../src/receptionist/states/look_for_seats.py | 2 +- .../receptionist/states/speakdescriptions.py | 22 +++++++++++++++++++ 5 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 tasks/receptionist/src/receptionist/states/speakdescriptions.py diff --git a/tasks/receptionist/launch/setup.launch b/tasks/receptionist/launch/setup.launch index d2b7a96e9..51f801911 100644 --- a/tasks/receptionist/launch/setup.launch +++ b/tasks/receptionist/launch/setup.launch @@ -23,7 +23,7 @@ - + @@ -54,7 +54,9 @@ - + + + diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index b9cfe1b2f..6438e4035 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -9,7 +9,9 @@ from receptionist.states import GoToSeatingArea from receptionist.states import LookForSeats from receptionist.states import GoToWaitForPerson +from receptionist.states import SpeakDescriptions from lasr_skills import WaitForPersonInArea +from lasr_skills import DescribePeople #from receptionist.states.end import End @@ -25,7 +27,9 @@ def __init__(self): smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) - smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'GO_TO_SEATING_AREA'}) - smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) + smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) diff --git a/tasks/receptionist/src/receptionist/states/__init__.py b/tasks/receptionist/src/receptionist/states/__init__.py index cc177733f..0f0114b7c 100644 --- a/tasks/receptionist/src/receptionist/states/__init__.py +++ b/tasks/receptionist/src/receptionist/states/__init__.py @@ -5,4 +5,5 @@ from .go_to_seating_area import GoToSeatingArea from .go_to_wait_for_person import GoToWaitForPerson from .look_for_seats import LookForSeats -from .start import Start \ No newline at end of file +from .start import Start +from .speakdescriptions import SpeakDescriptions \ No newline at end of file diff --git a/tasks/receptionist/src/receptionist/states/look_for_seats.py b/tasks/receptionist/src/receptionist/states/look_for_seats.py index aea147463..f3c96307b 100755 --- a/tasks/receptionist/src/receptionist/states/look_for_seats.py +++ b/tasks/receptionist/src/receptionist/states/look_for_seats.py @@ -25,7 +25,7 @@ def execute(self, userdata): if not self.remaining_motions: self.remaining_motions = copy(self.motions) return 'done' - pm_goal = PlayMotionGoal(motion_name=self.motions.pop(0), skip_planning=True) + pm_goal = PlayMotionGoal(motion_name=self.remaining_motions.pop(0), skip_planning=True) self.default.pm.send_goal_and_wait(pm_goal) rospy.sleep(1.0) return 'not_done' diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py new file mode 100644 index 000000000..bbf9d5d91 --- /dev/null +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -0,0 +1,22 @@ +import smach +import rospy + + +class SpeakDescriptions(smach.State): + def __init__(self, default): + smach.State.__init__(self, outcomes=['succeeded','failed'], input_keys=['people']) + self.default = default + + def execute(self, userdata): + for person in userdata['people']: + self.default.voice.speak('I see a person') + + for feature in person['features']: + if feature.label: + if len(feature.colours) == 0: + self.default.voice.speak(f'They have {feature.name}.') + continue + + self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') + + return 'succeeded' From 3c6743f17439293e89c5a706d7ad44ed87770c56 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Wed, 13 Dec 2023 21:31:40 +0000 Subject: [PATCH 36/69] added the hair colour distribution matching method --- .../{medium ash brown.jpg => black.jpg} | Bin .../{beeline honey.jpg => blond.jpg} | Bin .../{french-roast.jpg => brown .jpg} | Bin .../{dark golden brown.jpg => brown.jpg} | Bin .../hair_colours/temp/beeline honey.jpg | Bin 0 -> 5211 bytes .../{ => temp}/blowout burgundy.jpg | Bin .../hair_colours/{ => temp}/butter scotch.jpg | Bin .../hair_colours/{ => temp}/caramel.jpg | Bin .../{ => temp}/chocolate brown.jpg | Bin .../{ => temp}/chocolate-cherry.jpg | Bin .../{ => temp}/copper-shimmer.jpg | Bin .../hair_colours/{ => temp}/crushedgarnet.jpg | Bin .../hair_colours/temp/dark golden brown.jpg | Bin 0 -> 4041 bytes .../hair_colours/{ => temp}/espresso.jpg | Bin .../hair_colours/{ => temp}/expresso.jpg | Bin .../hair_colours/temp/french-roast.jpg | Bin 0 -> 6291 bytes .../hair_colours/temp/gray.png | Bin 0 -> 54379 bytes .../hair_colours/{ => temp}/havanabrown.jpg | Bin .../hair_colours/{ => temp}/hot-toffee.jpg | Bin .../hair_colours/{ => temp}/jet black.jpg | Bin .../hair_colours/{ => temp}/leatherblack.jpg | Bin .../{ => temp}/light ash blonde.jpg | Bin .../hair_colours/{ => temp}/light auburn.jpg | Bin .../hair_colours/{ => temp}/light blonde.jpg | Bin .../hair_colours/{ => temp}/light brown.jpg | Bin .../{ => temp}/light cool brown.jpg | Bin .../{ => temp}/light golden blonde.jpg | Bin .../{ => temp}/light golden brown.jpg | Bin .../hair_colours/temp/medium ash brown.jpg | Bin 0 -> 4209 bytes .../hair_colours/{ => temp}/medium auburn.jpg | Bin .../{ => temp}/medium champagne.jpg | Bin .../hair_colours/{ => temp}/midnighrruby.jpg | Bin .../hair_colours/{ => temp}/pure-diamond.jpg | Bin .../{ => temp}/red hot cinnamon.jpg | Bin .../{ => temp}/reddish blonde.jpg | Bin .../hair_colours/{ => temp}/rubyfusion.jpg | Bin .../{ => temp}/sparkling-amber.jpg | Bin .../{ => temp}/sunflower-blonde.jpg | Bin .../src/colour_estimation/__init__.py | 51 +++++------------- common/vision/lasr_vision_torch/nodes/service | 4 +- .../src/lasr_vision_torch/__init__.py | 31 +++++++---- 41 files changed, 36 insertions(+), 50 deletions(-) rename common/helpers/colour_estimation/hair_colours/{medium ash brown.jpg => black.jpg} (100%) rename common/helpers/colour_estimation/hair_colours/{beeline honey.jpg => blond.jpg} (100%) rename common/helpers/colour_estimation/hair_colours/{french-roast.jpg => brown .jpg} (100%) rename common/helpers/colour_estimation/hair_colours/{dark golden brown.jpg => brown.jpg} (100%) create mode 100644 common/helpers/colour_estimation/hair_colours/temp/beeline honey.jpg rename common/helpers/colour_estimation/hair_colours/{ => temp}/blowout burgundy.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/butter scotch.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/caramel.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/chocolate brown.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/chocolate-cherry.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/copper-shimmer.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/crushedgarnet.jpg (100%) create mode 100644 common/helpers/colour_estimation/hair_colours/temp/dark golden brown.jpg rename common/helpers/colour_estimation/hair_colours/{ => temp}/espresso.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/expresso.jpg (100%) create mode 100644 common/helpers/colour_estimation/hair_colours/temp/french-roast.jpg create mode 100644 common/helpers/colour_estimation/hair_colours/temp/gray.png rename common/helpers/colour_estimation/hair_colours/{ => temp}/havanabrown.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/hot-toffee.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/jet black.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/leatherblack.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light ash blonde.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light auburn.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light blonde.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light brown.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light cool brown.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light golden blonde.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/light golden brown.jpg (100%) create mode 100644 common/helpers/colour_estimation/hair_colours/temp/medium ash brown.jpg rename common/helpers/colour_estimation/hair_colours/{ => temp}/medium auburn.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/medium champagne.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/midnighrruby.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/pure-diamond.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/red hot cinnamon.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/reddish blonde.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/rubyfusion.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/sparkling-amber.jpg (100%) rename common/helpers/colour_estimation/hair_colours/{ => temp}/sunflower-blonde.jpg (100%) diff --git a/common/helpers/colour_estimation/hair_colours/medium ash brown.jpg b/common/helpers/colour_estimation/hair_colours/black.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/medium ash brown.jpg rename to common/helpers/colour_estimation/hair_colours/black.jpg diff --git a/common/helpers/colour_estimation/hair_colours/beeline honey.jpg b/common/helpers/colour_estimation/hair_colours/blond.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/beeline honey.jpg rename to common/helpers/colour_estimation/hair_colours/blond.jpg diff --git a/common/helpers/colour_estimation/hair_colours/french-roast.jpg b/common/helpers/colour_estimation/hair_colours/brown .jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/french-roast.jpg rename to common/helpers/colour_estimation/hair_colours/brown .jpg diff --git a/common/helpers/colour_estimation/hair_colours/dark golden brown.jpg b/common/helpers/colour_estimation/hair_colours/brown.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/dark golden brown.jpg rename to common/helpers/colour_estimation/hair_colours/brown.jpg diff --git a/common/helpers/colour_estimation/hair_colours/temp/beeline honey.jpg b/common/helpers/colour_estimation/hair_colours/temp/beeline honey.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f83d188869a22c1b256c1d0e940b1faff6baa792 GIT binary patch literal 5211 zcmbu7X*3j$zs6?_Gj>J@W68djv9H-1rmSO6gc%y!(AcvS326qy5JEJv8*8@YM;TjL zLUzCG*-Ipp-2UgDd+vRIpXdATIp5EDUOea1=ZgT&>j)$Q00aU6z`q8Z&jAtu4F4@K zn1PWI!pO+N%*4dZ0%c|UYp4L{1o2$cw7*>s|@BAH;Sw8M#Yngc_1pbp7@VT!2huR5A466z)%3) zUjZ5ZHv-cAC2<*wfoxD7cP}WP&jMIMz`wOXP=G#Q-S)xK%QS!R7~#=b)g^5L`l>Ff zUy6}YKBJunws=$uFB8k^UmLC1Fr1#s^{u;y8Dfv!#osT<+<#bJrmoCjppqpm7cTa+ zJ!VgQ>`6tgKlz1{4$BWEDjXMa}Chl8=@(}j4< zJc0>UU62RuYAa#5{%ms~{oi#mpXBPu9>x6toP9`F$v2Vfyb@g89EaGxXa%oVP@>hXFIpA#qv34O zirjej#yj+1xGg5;8(q>v);8xi-7dG;Gx2F@LDnC31k#d$oe2eTeb*Uy-;$HsI;>yU zp`WK)==oeXIvE9)Www=seOIhi2Qw*>J~v}Gb6v$zA>Q31(bga-4~OShzDUkIwq0E= zucP+`ClEL$U)I3JIuD&TK&+9yayO{L-S_Ko8H?8{D+Iq*F&Vsne{WBjc;>~2m}`5@;3bB zowG^rsMUG=h?TO_jZUGVh=LDJqli1Xghwj!mIjuIJx%}tS#JEOzj~T{b@*Uu|3r` zzd~iE7LymFw_PZ?Ug=ewd_sS8#$YTpkt_hTX7^6Wi@o`7MfJt>uETCBQm)BHTRvc# zaV7|1*!9^O%W{M%xZ5bCbH~_a*UPpP52P0%In!(iz^+el)1y2RW`uWlNJ%c#Yn|J5 zC%+D1*zNCrLX&OE;T_=PI|o>lQ*g>h$^g7|zDP=U6mN&_{7rsx6h^Xsm3Ymec-bJ}+RLQn5Z!tw1Jg#j{xmefSj+o)!{yU@L`Am5> zfVb_pn70jeWP=&krprU^BIUMzRX1>wKyi9f@k#l6oud8***U?D8TybRl=FPfvuS+U zU6NydL~@hm{H$xx37rKLYiZQ4F3cw4Z`Yu!?9p4q1`{t=^LK!?2JM3(=63%;7g0CU z9Hx1b3q6zWrpURoC>!Io0v*R0o;J+30FfVH1Wc3zb%NkkAjS)E6xSFqc7BN2LO@Z@z4{iagkYLhd$VKi|kCcqwUJWax&Qi*k#S01*j; zeqOG?>m195Jah)%)zc+*y+1TdQHO$9p7a|^QFGZ0Y6qA2a>J+qH|AC^ZpcUC8&N{Vat`{Fq=n*GuWqX1jl%ytws{Y#f!YQSh)fD9e zU(wGZs%OQm#;8<0N%~yB#?Pear4SVS?bI%O_8ITeZ`&yYlVGTfW-p_rhbwgFg)?<$ z)eU>)V~M#xk}pW#T);(xBUbJ06;1zY{Z)UCx|Vg2Nk9~lO-PA5O;>D5arg4vvxR=1 zw5;k1j>eYw!SyJ4DhBk-xV5{wCPCm*4K5y@!Mm1@;VaQ{fD}np)<|4H@Pou-F#!|D zB|qo6)EJgLbqH9!YclbB2TAP}l4PN@J+^SwH}=cFQ?CWhYFiMuyX6ju`=#BLV>20B zS0d8jm$GeZ3D8^blJ@2OnxO*;(w=?BcHb0^Qfn^=FA@)rsbTr9$`#W`zv5?I;d;49 z@KB@7$u^Q&gf&3sdSPbq%y3v#%Ae)R>WC5z|9Ue!b2E@f=A5+euO7`nC55iOOPXBh z*=XpARUW^yiuC2yc9U~J@G`4iK7FK8qOc%#BIZ*@UB4T~-H1RmC2UNjB|GKJ(VzO^jR!nvBcFUd<4t2c?$~yN9bR>=}A& zTKU-3b*e&n_Nlq_co}6EQUy9YP3J*)-_X4jCquNbfX0;N*``D_wjF?-ok{l38D6O` z!nGnjwz?4PC4TX~>3m*-so~Rwg>2xXDPF4&dBlC>i^^QlAyt#AVo13Tbp7f4w~bn+ zC{JFG+AA~E4By2=oDnkk@p^_@Wn3>Yv4QPh#}gn=XIHfUs_+`pF+tJ zi${T%K0c0=Fp%}9Mw0qZt-in6n0c9Z1*>>D#-=W&y_cVQ}Tb`gCJ;C^Qv1+rh` z$4PAVlrHMVYL@&enKc&u#NL^yVI{X9`-N+%SIT)=@MA`pmhdhu*t=OK(nSUl>9n}g z`d#kJ&R0Q(7fZjdUzGq_XYP>M9$XbDU2YfBXk=vx4^&Gy1v4z7r)U<_^FwdHE*83) zYAo!Je!U$cZ2F6PQyqESAiirw=O)fmE3)|KM+k6PKm&c& z_0`!PHy&guszJexzY79&D2e#BAkhaznwNl8`%mVOr+$ow2G6ZJ?AO}Ll4Q#}W0R^GRl zT;tSKBjXxgFU>o9+CLr7*#Kc@Hh=O%F34Cmg$!SuEYp33eD0jQu zt*DSib&$&7(Hlq?j_B=iKin&Q9#kml6|%mPu<$5!qQ?c|HdDnIxYWi~{ZEpLPhwx` z>Yv+r+%Kcd*;>zN`O5N-Yn~M_cLbc+{c;g<)DhmoCQG7N)6L*WN%p)?WkSE?81uH1 z%83I~W_Nd^9ksG~iPH++u&e=$&V^ahQffmDkHb&+$Zmj$CwpR^!VrMYW6Su=7)9wX ze;@9W4wTYz9NF<%y_jia5{y~#-bad&Wc63Zc5QaoCeqNwT1Z3A{2}F;MC8+!n+xkYtyA%XIARU6xow0#oFT+6}~uCf~C-`7@5zrF;(JwfEXZ z?htu(uu`id4@=KEU~_epV&N6k@IWPT^f!3hRb3v(6HGt+5}i(zj!R_fTkl#6oIo8t zNp=>$+Oa7XEQH1rfb;nL8he^tXy-@zg->rjsXUthHZ1B%!xe>sJQ0S)q7hcg?HNfy z+EA)rF(DCe9yk?T&y5z?cr9WE&)fJ2>G{M(^2r(ye=!Q}zPF zZ@5OacFOBSBOW)KAX%Ytw<_zHuy`}WI#w3-Wt6% zKn@Uw?PDY9n-A^Pp>iE!%&=Y}J{mP0fH~}GreV^w0eFZj$93uS4;|Fb(pI_Y^{GZ? zjtz|zIr^Z%+>EP?@8J_188WbQK%;yp&O|W71UX6?cnaip^GWHdBgR&}KjK6DAsPVGZd^H7ZUply#O)-!O zyVv|$S;qO3;a+U!pD=1>sK{r|YKmf7m|iYmizBwTNHZ($ReF=Sd?&l1c!hAZ-OIS; zw_;pI!Ti05xQ@dz^$yexPhLxGJEy5KXRPndvF}=pk5id60fdSZk^Zt#abCs}kHko) z)!0OG>F7zMM4+1*_Ic1zwMyX{Qw?F>Sa5WRwa3@8eB~-l)K;=l#9Y-}!`$Z}1>0d_ zChoJGXu0%;c&esWHl6QR1!?=|4I%i}O-|s5c3jy{X2{pN{%P&{dH>lX)!C(GvWlTj z&x)6XQs2YL^jk(Fq|5DQrt7!S)={h>0b$MFeO3K^r%!KBaVw-lba(kAVncpLd&hfv z9?|6816e8hecui993=(4_a<$ue6r({^T@^#4(y~d|;$clj`hZ(NLyi6sX|$NSn85 zaJl)f49Bka_x56bV;I&oTS%Mi%HsSPs`75_#4+}MG zTU|W5vpMl4ekndeJt}~;I;X64S4N%1RU5z{Y~y2=Bx?eP51KTGfZ6i4N5*#C5MF9V z7cRywrwijeZ>?VVQMt;gU*R{p{^&lifpJ}_e)w)1@f?scIVuZ3SxVi2%2g-vL9A>o z3-TzMPl3#ALphSmIQ0AUK~rLPB{r~_OqNIzZ%$fuu#oRvYA}8PKlPawUd|e4wouYw zUa`2x(D5BV4}26{rUZLf*tCan6J@P$v5B|8nQ}g_&80Bd*Gc^kwzr}raO$1G|=oD?6RLR#{ zyE_Fs`@}Y3y&$(Bag!+ZgzwTs=ulfrD|5-x*+-t=G(*jiUNTYjT}-y`d+pR)aB(@i z1J-bE9dK|KC?|ZhaQUTwAVGz};Rso7Q~ILZq9<5UJ($P@p^p%2lp(&ymm6JAU_S?- zGW30=b6xD|OnRfzA$zheW?f4I;(V;Hf5W$Ls}c^xuecb&HqncRsx|O2mO{>VeB-5| z;=jiZaB3eSrSa|RdTiV+;?GC}DAfr}8vT8>BZT-o++e!aT06x>jpYQhCSO82@}SB@ z29Q+xnbPnH{!uAd3=$#85PK%j>{54m;{!n2M4Ea}0L%kMmGT=z43`hJAFGk=7m5fQ Q9I~2vY+eFtJ?At31w#B?-v9sr literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg b/common/helpers/colour_estimation/hair_colours/temp/blowout burgundy.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/blowout burgundy.jpg rename to common/helpers/colour_estimation/hair_colours/temp/blowout burgundy.jpg diff --git a/common/helpers/colour_estimation/hair_colours/butter scotch.jpg b/common/helpers/colour_estimation/hair_colours/temp/butter scotch.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/butter scotch.jpg rename to common/helpers/colour_estimation/hair_colours/temp/butter scotch.jpg diff --git a/common/helpers/colour_estimation/hair_colours/caramel.jpg b/common/helpers/colour_estimation/hair_colours/temp/caramel.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/caramel.jpg rename to common/helpers/colour_estimation/hair_colours/temp/caramel.jpg diff --git a/common/helpers/colour_estimation/hair_colours/chocolate brown.jpg b/common/helpers/colour_estimation/hair_colours/temp/chocolate brown.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/chocolate brown.jpg rename to common/helpers/colour_estimation/hair_colours/temp/chocolate brown.jpg diff --git a/common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg b/common/helpers/colour_estimation/hair_colours/temp/chocolate-cherry.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/chocolate-cherry.jpg rename to common/helpers/colour_estimation/hair_colours/temp/chocolate-cherry.jpg diff --git a/common/helpers/colour_estimation/hair_colours/copper-shimmer.jpg b/common/helpers/colour_estimation/hair_colours/temp/copper-shimmer.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/copper-shimmer.jpg rename to common/helpers/colour_estimation/hair_colours/temp/copper-shimmer.jpg diff --git a/common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg b/common/helpers/colour_estimation/hair_colours/temp/crushedgarnet.jpg similarity index 100% rename from common/helpers/colour_estimation/hair_colours/crushedgarnet.jpg rename to common/helpers/colour_estimation/hair_colours/temp/crushedgarnet.jpg diff --git a/common/helpers/colour_estimation/hair_colours/temp/dark golden brown.jpg b/common/helpers/colour_estimation/hair_colours/temp/dark golden brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8005d3391d7b206d3091c5d2a708e68f0b1328d6 GIT binary patch literal 4041 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 Ly7zxbyITBzU#B&; literal 0 HcmV?d00001 diff --git a/common/helpers/colour_estimation/hair_colours/temp/gray.png b/common/helpers/colour_estimation/hair_colours/temp/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..97b47262a1f0a345af179b6e378a382b6fdb1cde GIT binary patch literal 54379 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 M07*qoM6N<$f|5*Ns&3pH62 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 TorchFaceFeatureDetecti # response.detected_features = str(class_pred) + str(colour_pred) response.detected_features = [] for c in ['hair', 'hat', 'glasses', 'cloth',]: - colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} + # colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} sorted_list = sorted(colour_pred[c].items(), key=lambda item: item[1], reverse=True) - rospy.loginfo(str(sorted_list)) + # rospy.loginfo(str(sorted_list)) if len(sorted_list) > 3: sorted_list = sorted_list[0:3] sorted_list = [k for k, v in sorted_list] diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 1d4f6cffe..9eb9fe556 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -1,8 +1,8 @@ from torch_module.modules import UNetWithResnet18Encoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression from torch_module.helpers import load_torch_model, binary_erosion_dilation -from colour_estimation import closest_colours, load_images_to_dict, generate_colour_table, average_colours_by_label, count_colours_in_masked_area -from colour_estimation import COLOURS, HAIR_COLOURS, SPESIFIC_COLOURS, DETAILED_COLOURS +from colour_estimation import load_images_to_dict, generate_colour_table, count_colours_in_masked_area, compare_colour_distributions +from colour_estimation import SPESIFIC_COLOURS, DETAILED_COLOURS import numpy as np import cv2 @@ -34,7 +34,7 @@ def load_face_classifier_model(): 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, ] thresholds_pred = [ - 0.6, 0.8, 0.1, 0.5, + 0.6, 0.8, 0.05, 0.5, ] erosion_iterations = 1 dilation_iterations = 1 @@ -152,11 +152,13 @@ def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilatio # Update class colours for f, each_mask, k, c_map in zip([head_frame, head_frame, head_frame], mask_list[0:2], ['hair', 'hat', 'glasses'], [SPESIFIC_COLOURS, DETAILED_COLOURS, DETAILED_COLOURS]): colours = count_colours_in_masked_area(f, each_mask, c_map, sort=True)[1] + # colours = [c in ] for colour in colours: - if colour[0] not in head_class_colours[k]: - head_class_colours[k][colour[0]] = [colour[1]] - else: - head_class_colours[k][colour[0]].append(colour[1]) + head_class_colours[k][colour[0]] = colour[1] + # if colour[0] not in head_class_colours[k]: + # head_class_colours[k][colour[0]] = [colour[1]] + # else: + # head_class_colours[k][colour[0]].append(colour[1]) return head_class_count, head_class_colours @@ -188,10 +190,11 @@ def process_cloth(full_frame, torso_mask): # Update cloth colours colours = count_colours_in_masked_area(full_frame, torso_mask, DETAILED_COLOURS, sort=True)[1] for colour in colours: - if colour[0] not in cloth_class_colours['cloth']: - cloth_class_colours['cloth'][colour[0]] = [colour[1]] - else: - cloth_class_colours['cloth'][colour[0]].append(colour[1]) + cloth_class_colours['cloth'][colour[0]] = colour[1] + # if colour[0] not in cloth_class_colours['cloth']: + # cloth_class_colours['cloth'][colour[0]] = [colour[1]] + # else: + # cloth_class_colours['cloth'][colour[0]].append(colour[1]) return cloth_class_count, cloth_class_colours @@ -263,6 +266,12 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, mo class_pred = {k: bool(class_count[k]) for k in class_count} colour_pred = {k: v for k, v in class_colours.items()} + rospy.loginfo(str(class_colours['hair'])) + rospy.loginfo(str(hair_colour_table)) + + # compare_colour_distributions([k,v class_colours['hair']], hair_colour_table) + colour_pred['hair'] = compare_colour_distributions(class_colours['hair'], hair_colour_table) + # class_pred, colour_pred = None, None return class_pred, colour_pred From c1b50a572bbd81dea055212b125834a2b64acddc Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 14 Dec 2023 11:10:30 +0000 Subject: [PATCH 37/69] retrained model is very robust so changed the threshold --- .../vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 9eb9fe556..e2fa4d725 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -34,7 +34,7 @@ def load_face_classifier_model(): 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, ] thresholds_pred = [ - 0.6, 0.8, 0.05, 0.5, + 0.6, 0.8, 0.1, 0.5, ] erosion_iterations = 1 dilation_iterations = 1 From 2ed42a4269a918e74f6bb97ef60b71c08b7cd9a9 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Wed, 31 Jan 2024 17:52:00 +0000 Subject: [PATCH 38/69] Moving the head to meet the person. --- .../src/lasr_vision_bodypix/bodypix.py | 46 +++++++++++++++++-- .../lasr_vision_msgs/msg/BodyPixPose.msg | 3 +- skills/src/lasr_skills/describe_people.py | 3 ++ skills/src/lasr_skills/vision/get_image.py | 3 +- tasks/receptionist/launch/test.launch | 5 ++ .../src/receptionist/head_direction_test.py | 25 ++++++++++ tasks/receptionist/src/receptionist/sm.py | 24 +++++----- 7 files changed, 93 insertions(+), 16 deletions(-) create mode 100644 tasks/receptionist/launch/test.launch create mode 100644 tasks/receptionist/src/receptionist/head_direction_test.py diff --git a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py index 81a924640..fd62c29b3 100644 --- a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py +++ b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py @@ -9,7 +9,7 @@ from tf_bodypix.api import download_model, load_model, BodyPixModelPaths from sensor_msgs.msg import Image as SensorImage -from lasr_vision_msgs.msg import BodyPixMask +from lasr_vision_msgs.msg import BodyPixMask, BodyPixPose from lasr_vision_msgs.srv import BodyPixDetectionRequest, BodyPixDetectionResponse # model cache @@ -44,6 +44,7 @@ def detect(request: BodyPixDetectionRequest, debug_publisher: rospy.Publisher | # decode the image rospy.loginfo('Decoding') img = cv2_img.msg_to_cv2_img(request.image_raw) + img_height, img_width, _ = img.shape # Get image dimensions # load model rospy.loginfo('Loading model') @@ -65,8 +66,46 @@ def detect(request: BodyPixDetectionRequest, debug_publisher: rospy.Publisher | bodypix_mask.shape = list(part_mask.shape) masks.append(bodypix_mask) - # construct pose response - # TODO + # construct poses response and neck coordinates + poses = result.get_poses() + rospy.loginfo(str(poses)) + + neck_coordinates = [] + for pose in poses: + left_shoulder_keypoint = pose.keypoints.get(5) # 5 is the typical index for left shoulder + right_shoulder_keypoint = pose.keypoints.get(6) # 6 is the typical index for right shoulder + + if left_shoulder_keypoint and right_shoulder_keypoint: + # If both shoulders are detected, calculate neck as midpoint + left_shoulder = left_shoulder_keypoint.position + right_shoulder = right_shoulder_keypoint.position + neck_x = (left_shoulder.x + right_shoulder.x) / 2 + neck_y = (left_shoulder.y + right_shoulder.y) / 2 + neck_score = (left_shoulder_keypoint.score + right_shoulder_keypoint.score) / 2 # Optional: average score + elif left_shoulder_keypoint: + # Only left shoulder detected, use it as neck coordinate + left_shoulder = left_shoulder_keypoint.position + neck_x = left_shoulder.x + neck_y = left_shoulder.y + neck_score = left_shoulder_keypoint.score + elif right_shoulder_keypoint: + # Only right shoulder detected, use it as neck coordinate + right_shoulder = right_shoulder_keypoint.position + neck_x = right_shoulder.x + neck_y = right_shoulder.y + neck_score = right_shoulder_keypoint.score + + # Convert neck coordinates to relative positions (0-1) + rel_neck_x = neck_x / img_width + rel_neck_y = neck_y / img_height + + pose = BodyPixPose() + pose.coord = np.array([rel_neck_x, rel_neck_y]).astype(np.float32) + neck_coordinates.append(pose) + + pose = BodyPixPose() + pose.coord = np.array([neck_x, neck_y]).astype(np.float32) + neck_coordinates.append(pose) # publish to debug topic if debug_publisher is not None: @@ -85,4 +124,5 @@ def detect(request: BodyPixDetectionRequest, debug_publisher: rospy.Publisher | response = BodyPixDetectionResponse() response.masks = masks + response.poses = neck_coordinates return response diff --git a/common/vision/lasr_vision_msgs/msg/BodyPixPose.msg b/common/vision/lasr_vision_msgs/msg/BodyPixPose.msg index a8d70142d..8c03dc6df 100644 --- a/common/vision/lasr_vision_msgs/msg/BodyPixPose.msg +++ b/common/vision/lasr_vision_msgs/msg/BodyPixPose.msg @@ -1 +1,2 @@ -# https://github.com/de-code/python-tf-bodypix/blob/develop/tf_bodypix/bodypix_js_utils/types.py +# x and y coordinates +float32[] coord diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 24170f61f..cfe8a52a2 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -90,6 +90,9 @@ def execute(self, userdata): result = self.bodypix(userdata.img_msg, "resnet50", 0.7, masks) userdata.bodypix_masks = result.masks + rospy.loginfo("Found:::%s" % str(len(result.poses))) + neck_coord = (result.poses[0].coord[0], result.poses[0].coord[1]) + rospy.loginfo("COORD:::%s" % str(neck_coord)) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") diff --git a/skills/src/lasr_skills/vision/get_image.py b/skills/src/lasr_skills/vision/get_image.py index bb4b894c3..c0543c6e1 100644 --- a/skills/src/lasr_skills/vision/get_image.py +++ b/skills/src/lasr_skills/vision/get_image.py @@ -2,7 +2,8 @@ import smach import rospy from sensor_msgs.msg import Image - +# PointCloud2 +# topic: /xtion/depth_registered/points class GetImage(smach.State): """ diff --git a/tasks/receptionist/launch/test.launch b/tasks/receptionist/launch/test.launch new file mode 100644 index 000000000..f7bab932d --- /dev/null +++ b/tasks/receptionist/launch/test.launch @@ -0,0 +1,5 @@ + + + + + diff --git a/tasks/receptionist/src/receptionist/head_direction_test.py b/tasks/receptionist/src/receptionist/head_direction_test.py new file mode 100644 index 000000000..b362eb5b5 --- /dev/null +++ b/tasks/receptionist/src/receptionist/head_direction_test.py @@ -0,0 +1,25 @@ +import rospy +import tf2_ros +import geometry_msgs.msg + +rospy.init_node('head_orientation_listener') + +tfBuffer = tf2_ros.Buffer() +listener = tf2_ros.TransformListener(tfBuffer) + +while not rospy.is_shutdown(): + try: + # Replace 'base_frame' and 'head_frame' with the appropriate frame names + trans = tfBuffer.lookup_transform('base_frame', 'head_frame', rospy.Time()) + + # Orientation as quaternion + orientation_q = trans.transform.rotation + rospy.loginfo("Head orientation in quaternion: \s" % str(orientation_q)) + + # Optionally convert quaternion to Euler angles for roll, pitch, yaw + # ... + + except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException): + continue + + rospy.sleep(1.0) diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index 6438e4035..3daddbfdf 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -22,14 +22,16 @@ def __init__(self): self.userdata.area_polygon = [[1.94, 0.15], [2.98, 0.28], [3.08, -0.68], [2.06, -0.84]] self.userdata.depth_topic = "/xtion/depth_registered/points" with self: - smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) - smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) - smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) - smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) - smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) - smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) - smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) - smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) - smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) + # smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + # smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) + # smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) + # smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) + # smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) + # smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) + # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) + # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) + # smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) + # smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + # smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) + smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) From 6282d2d7843b64edea13fcf755826af3eed2605d Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 2 Feb 2024 15:24:54 +0000 Subject: [PATCH 39/69] xyz axis readable. --- .../helpers/cv2_img/src/cv2_img/__init__.py | 39 ++++++++++++++ .../src/lasr_vision_bodypix/bodypix.py | 14 ++--- skills/src/lasr_skills/describe_people.py | 28 ++++++---- skills/src/lasr_skills/vision/__init__.py | 4 +- skills/src/lasr_skills/vision/get_image.py | 53 ++++++++++++++++++- .../lasr_skills/vision/image_msg_to_cv2.py | 22 +++++++- tasks/receptionist/src/receptionist/sm.py | 1 - .../receptionist/states/speakdescriptions.py | 16 +++--- 8 files changed, 146 insertions(+), 31 deletions(-) diff --git a/common/helpers/cv2_img/src/cv2_img/__init__.py b/common/helpers/cv2_img/src/cv2_img/__init__.py index 822b2839a..ad0c74b74 100644 --- a/common/helpers/cv2_img/src/cv2_img/__init__.py +++ b/common/helpers/cv2_img/src/cv2_img/__init__.py @@ -1,5 +1,6 @@ import rospy import numpy as np +import ros_numpy as rnp from PIL import Image from sensor_msgs.msg import Image as SensorImage @@ -64,9 +65,47 @@ def msg_to_cv2_img(msg: SensorImage): img = np.array(img) img = img[:, :, ::-1].copy() + rospy.logwarn('shape of the image: ' + str(img.shape)) + return img +# pcl_xyz = rnp.point_cloud2.pointcloud2_to_xyz_array(pcl_msg, remove_nans=False) +def pcl_msg_to_xyz(pcl_msg): + pcl_xyz = rnp.point_cloud2.pointcloud2_to_xyz_array(pcl_msg, remove_nans=False) + + rospy.logwarn('shape of the image: ' + str(pcl_xyz.shape)) + + return pcl_xyz + + +def pcl_msg_to_cv2(pcl_msg): + """ + Constructs a cv2 image from a PointCloud2 message. + + Parameters + ---------- + pcl_msg : sensor_msgs/PointCloud2 + Input pointcloud (organised) + + Returns + ------- + np.array : cv2 image + """ + + # Extract rgb image from pointcloud + frame = np.fromstring(pcl_msg.data, dtype=np.uint8) + frame = frame.reshape(pcl_msg.height, pcl_msg.width, 32) + frame = frame[:,:,16:19] + + # Ensure array is contiguous + frame = np.ascontiguousarray(frame, dtype=np.uint8) + + rospy.logwarn('shape of the image: ' + str(frame.shape)) + + return frame + + def extract_mask_region(frame, mask, expand_x=0.5, expand_y=0.5): """ Extracts the face region from the image and expands the region by the specified amount. diff --git a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py index fd62c29b3..e4765814b 100644 --- a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py +++ b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py @@ -95,16 +95,16 @@ def detect(request: BodyPixDetectionRequest, debug_publisher: rospy.Publisher | neck_y = right_shoulder.y neck_score = right_shoulder_keypoint.score - # Convert neck coordinates to relative positions (0-1) - rel_neck_x = neck_x / img_width - rel_neck_y = neck_y / img_height + # # Convert neck coordinates to relative positions (0-1) + # rel_neck_x = neck_x / img_width + # rel_neck_y = neck_y / img_height - pose = BodyPixPose() - pose.coord = np.array([rel_neck_x, rel_neck_y]).astype(np.float32) - neck_coordinates.append(pose) + # pose = BodyPixPose() + # pose.coord = np.array([rel_neck_x, rel_neck_y]).astype(np.float32) + # neck_coordinates.append(pose) pose = BodyPixPose() - pose.coord = np.array([neck_x, neck_y]).astype(np.float32) + pose.coord = np.array([neck_x, neck_y]).astype(np.int32) neck_coordinates.append(pose) # publish to debug topic diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index cfe8a52a2..eb38c9b2d 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -11,7 +11,7 @@ from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection from numpy2message import numpy2message -from .vision import GetImage, ImageMsgToCv2 +from .vision import GetImage, ImageMsgToCv2, Get3DImage, PclMsgToCv2, Get2DAnd3DImages class DescribePeople(smach.StateMachine): @@ -21,16 +21,21 @@ def __init__(self): self, outcomes=['succeeded', 'failed'], input_keys=[], output_keys=['people']) with self: - smach.StateMachine.add('GET_IMAGE', GetImage(), transitions={ + # smach.StateMachine.add('GET_IMAGE', GetImage(), transitions={ + # 'succeeded': 'CONVERT_IMAGE'}) + # smach.StateMachine.add('CONVERT_IMAGE', ImageMsgToCv2(), transitions={ + # 'succeeded': 'SEGMENT'}) + + smach.StateMachine.add('GET_IMAGE', Get2DAnd3DImages(), transitions={ 'succeeded': 'CONVERT_IMAGE'}) - smach.StateMachine.add('CONVERT_IMAGE', ImageMsgToCv2(), transitions={ + smach.StateMachine.add('CONVERT_IMAGE', PclMsgToCv2(), transitions={ 'succeeded': 'SEGMENT'}) sm_con = smach.Concurrence(outcomes=['succeeded', 'failed'], default_outcome='failed', outcome_map={'succeeded': { 'SEGMENT_YOLO': 'succeeded', 'SEGMENT_BODYPIX': 'succeeded'}}, - input_keys=['img', 'img_msg'], + input_keys=['img', 'img_msg_2d', 'img_msg_3d', 'xyz'], output_keys=['people_detections', 'bodypix_masks']) with sm_con: @@ -51,13 +56,13 @@ class SegmentYolo(smach.State): def __init__(self): smach.State.__init__(self, outcomes=['succeeded', 'failed'], input_keys=[ - 'img_msg'], output_keys=['people_detections']) + 'img_msg_2d'], output_keys=['people_detections']) self.yolo = rospy.ServiceProxy('/yolov8/detect', YoloDetection) def execute(self, userdata): try: result = self.yolo( - userdata.img_msg, "yolov8n-seg.pt", 0.5, 0.3) + userdata.img_msg_2d, "yolov8n-seg.pt", 0.5, 0.3) userdata.people_detections = [ det for det in result.detected_objects if det.name == "person"] return 'succeeded' @@ -74,7 +79,7 @@ class SegmentBodypix(smach.State): def __init__(self): smach.State.__init__(self, outcomes=['succeeded', 'failed'], input_keys=[ - 'img_msg'], output_keys=['bodypix_masks']) + 'img_msg_2d', 'xyz'], output_keys=['bodypix_masks']) self.bodypix = rospy.ServiceProxy( '/bodypix/detect', BodyPixDetection) @@ -88,11 +93,14 @@ def execute(self, userdata): masks = [torso, head] - result = self.bodypix(userdata.img_msg, "resnet50", 0.7, masks) + result = self.bodypix(userdata.img_msg_2d, "resnet50", 0.7, masks) userdata.bodypix_masks = result.masks rospy.loginfo("Found:::%s" % str(len(result.poses))) - neck_coord = (result.poses[0].coord[0], result.poses[0].coord[1]) - rospy.loginfo("COORD:::%s" % str(neck_coord)) + neck_coord = (int(result.poses[0].coord[0]), int(result.poses[0].coord[1])) + rospy.loginfo("COORD_XY:::%s" % str(neck_coord)) + xyz = userdata.xyz + xyz = np.nanmean(xyz, axis=2) + rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") diff --git a/skills/src/lasr_skills/vision/__init__.py b/skills/src/lasr_skills/vision/__init__.py index 53bf0eb7b..127fbc849 100644 --- a/skills/src/lasr_skills/vision/__init__.py +++ b/skills/src/lasr_skills/vision/__init__.py @@ -1,3 +1,3 @@ -from .get_image import GetImage +from .get_image import GetImage, Get3DImage, Get2DAnd3DImages from .image_cv2_to_msg import ImageCv2ToMsg -from .image_msg_to_cv2 import ImageMsgToCv2 +from .image_msg_to_cv2 import ImageMsgToCv2, PclMsgToCv2 diff --git a/skills/src/lasr_skills/vision/get_image.py b/skills/src/lasr_skills/vision/get_image.py index c0543c6e1..edad9c078 100644 --- a/skills/src/lasr_skills/vision/get_image.py +++ b/skills/src/lasr_skills/vision/get_image.py @@ -1,7 +1,7 @@ import os import smach import rospy -from sensor_msgs.msg import Image +from sensor_msgs.msg import Image, PointCloud2 # PointCloud2 # topic: /xtion/depth_registered/points @@ -28,3 +28,54 @@ def execute(self, userdata): return 'failed' return 'succeeded' + + +class Get3DImage(smach.State): + """ + State for reading an sensor_msgs Image message + """ + + def __init__(self, topic: str = None): + smach.State.__init__( + self, outcomes=['succeeded', 'failed'], output_keys=['img_msg']) + + if topic is None: + self.topic = '/xtion/depth_registered/points' + else: + self.topic = topic + + def execute(self, userdata): + try: + userdata.img_msg = rospy.wait_for_message( + self.topic, PointCloud2) + except Exception as e: + print(e) + return 'failed' + + return 'succeeded' + + +class Get2DAnd3DImages(smach.State): + """ + State for reading an sensor_msgs Image message + """ + + def __init__(self, topic: str = None): + smach.State.__init__( + self, outcomes=['succeeded', 'failed'], output_keys=['img_msg_2d', 'img_msg_3d']) + + self.topic1 = '/xtion/rgb/image_raw' + self.topic2 = '/xtion/depth_registered/points' + + def execute(self, userdata): + try: + userdata.img_msg_2d = rospy.wait_for_message( + self.topic1, Image) + userdata.img_msg_3d = rospy.wait_for_message( + self.topic2, PointCloud2) + except Exception as e: + print(e) + return 'failed' + + return 'succeeded' + diff --git a/skills/src/lasr_skills/vision/image_msg_to_cv2.py b/skills/src/lasr_skills/vision/image_msg_to_cv2.py index e079b2e62..7ec81caa3 100644 --- a/skills/src/lasr_skills/vision/image_msg_to_cv2.py +++ b/skills/src/lasr_skills/vision/image_msg_to_cv2.py @@ -1,6 +1,7 @@ import os import smach import cv2_img +import rospy class ImageMsgToCv2(smach.State): @@ -10,8 +11,25 @@ class ImageMsgToCv2(smach.State): def __init__(self): smach.State.__init__( - self, outcomes=['succeeded'], input_keys=['img_msg'], output_keys=['img']) + self, outcomes=['succeeded'], input_keys=['img_msg_2d'], output_keys=['img']) def execute(self, userdata): - userdata.img = cv2_img.msg_to_cv2_img(userdata.img_msg) + userdata.img = cv2_img.msg_to_cv2_img(userdata.img_msg_2d) + return 'succeeded' + + +class PclMsgToCv2(smach.State): + """ + State for converting a sensor Image message to cv2 format + """ + + def __init__(self): + smach.State.__init__( + self, outcomes=['succeeded'], input_keys=['img_msg_3d'], output_keys=['img', 'xyz']) + + def execute(self, userdata): + userdata.img = cv2_img.pcl_msg_to_cv2(userdata.img_msg_3d) + userdata.xyz = cv2_img.pcl_msg_to_xyz(userdata.img_msg_3d) + rospy.logwarn('succeeded on image converge.') + # print('succeeded on image converge.') return 'succeeded' diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index 3daddbfdf..591060211 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -32,6 +32,5 @@ def __init__(self): # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) # smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) # smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - # smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py index bbf9d5d91..42e7546e8 100644 --- a/tasks/receptionist/src/receptionist/states/speakdescriptions.py +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -8,15 +8,15 @@ def __init__(self, default): self.default = default def execute(self, userdata): - for person in userdata['people']: - self.default.voice.speak('I see a person') + # for person in userdata['people']: + # self.default.voice.speak('I see a person') - for feature in person['features']: - if feature.label: - if len(feature.colours) == 0: - self.default.voice.speak(f'They have {feature.name}.') - continue + # for feature in person['features']: + # if feature.label: + # if len(feature.colours) == 0: + # self.default.voice.speak(f'They have {feature.name}.') + # continue - self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') + # self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') return 'succeeded' From a15a9d98b78570c032a359b59a3cc87ce64d508d Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 5 Feb 2024 11:42:28 +0000 Subject: [PATCH 40/69] (Hopefully) Runnable with 3d input. --- skills/src/lasr_skills/describe_people.py | 38 ++++++++++++++++++++++- tasks/receptionist/src/receptionist/sm.py | 25 ++++++++------- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index eb38c9b2d..21daebd23 100644 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -13,6 +13,41 @@ from .vision import GetImage, ImageMsgToCv2, Get3DImage, PclMsgToCv2, Get2DAnd3DImages +import actionlib +import numpy as np +# from sensor_msgs.msg import PointCloud2 +# from control_msgs.msg import PointHeadAction, PointHeadGoal +# from geometry_msgs.msg import PointStamped + +def point_head_client(xyz_array, u, v): + # rospy.init_node('point_head_client') + + rospy.logwarn('making client') + client = actionlib.SimpleActionClient('/head_controller/point_head_action', PointHeadAction) + client.wait_for_server() + + target_point = xyz_array[v, u] + + point_camera = PointStamped() + point_camera.header.frame_id = "xtion_rgb_optical_frame" + point_camera.header.stamp = rospy.Time.now() + point_camera.point.x = target_point[0] + point_camera.point.y = target_point[1] + point_camera.point.z = target_point[2] + + goal = PointHeadGoal() + goal.target = point_camera + goal.max_velocity = 1.0 + # goal.min_duration = rospy.Duration(1.0) + goal.pointing_frame = "/head_2_link" + goal.pointing_axis.x = 1.0 + goal.pointing_axis.y = 0.0 + goal.pointing_axis.z = 0.0 + + rospy.logwarn('sending the goal and waiting') + client.send_goal_and_wait(goal) + rospy.logwarn('end') + class DescribePeople(smach.StateMachine): @@ -99,8 +134,9 @@ def execute(self, userdata): neck_coord = (int(result.poses[0].coord[0]), int(result.poses[0].coord[1])) rospy.loginfo("COORD_XY:::%s" % str(neck_coord)) xyz = userdata.xyz - xyz = np.nanmean(xyz, axis=2) + # xyz = np.nanmean(xyz, axis=2) rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) + # point_head_client(xyz, neck_coord[0], neck_coord[1]) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index 591060211..91556c037 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -22,15 +22,16 @@ def __init__(self): self.userdata.area_polygon = [[1.94, 0.15], [2.98, 0.28], [3.08, -0.68], [2.06, -0.84]] self.userdata.depth_topic = "/xtion/depth_registered/points" with self: - # smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - # smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) - # smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) - # smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) - # smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) - # smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) - # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) - # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) - # smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) - # smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) - smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) + smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) + smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) + smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) + smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) + smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) + # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) + # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) From 29060c0b77cb9dced59989d5dfbe6e51ec546765 Mon Sep 17 00:00:00 2001 From: tiago Date: Mon, 5 Feb 2024 13:45:56 +0000 Subject: [PATCH 41/69] ah --- common/speech/lasr_speech/nodes/service | 34 +- legacy/aruco_service/CMakeLists.txt | 210 ---- legacy/aruco_service/README.md | 175 ---- legacy/aruco_service/doc/EXAMPLE.md | 3 - legacy/aruco_service/doc/PREREQUISITES.md | 0 legacy/aruco_service/doc/TECHNICAL.md | 1 - legacy/aruco_service/doc/USAGE.md | 56 - .../launch/coffee_shop_prep.launch | 9 - .../aruco_service/launch/singleTiago.launch | 24 - legacy/aruco_service/package.xml | 76 -- .../scripts/GenerateTableCuboid.py | 224 ---- .../scripts/publish_points_of_table.py | 75 -- .../scripts/save_navigation_points.py | 86 -- legacy/aruco_service/service_debug.rviz | 970 ------------------ .../aruco_service/srv/GenerateTableCuboid.srv | 8 - .../aruco_service/srv/PublishTablePoints.srv | 3 - .../aruco_service/srv/SaveNavigationPoint.srv | 3 - .../aruco_service/test_check_table_sim.yaml | 93 -- .../test_lift_wait_position.yaml | 5 - tasks/receptionist/launch/setup.launch | 4 +- 20 files changed, 19 insertions(+), 2040 deletions(-) delete mode 100644 legacy/aruco_service/CMakeLists.txt delete mode 100644 legacy/aruco_service/README.md delete mode 100644 legacy/aruco_service/doc/EXAMPLE.md delete mode 100644 legacy/aruco_service/doc/PREREQUISITES.md delete mode 100644 legacy/aruco_service/doc/TECHNICAL.md delete mode 100644 legacy/aruco_service/doc/USAGE.md delete mode 100644 legacy/aruco_service/launch/coffee_shop_prep.launch delete mode 100644 legacy/aruco_service/launch/singleTiago.launch delete mode 100644 legacy/aruco_service/package.xml delete mode 100755 legacy/aruco_service/scripts/GenerateTableCuboid.py delete mode 100755 legacy/aruco_service/scripts/publish_points_of_table.py delete mode 100755 legacy/aruco_service/scripts/save_navigation_points.py delete mode 100644 legacy/aruco_service/service_debug.rviz delete mode 100644 legacy/aruco_service/srv/GenerateTableCuboid.srv delete mode 100644 legacy/aruco_service/srv/PublishTablePoints.srv delete mode 100644 legacy/aruco_service/srv/SaveNavigationPoint.srv delete mode 100644 legacy/aruco_service/test_check_table_sim.yaml delete mode 100644 legacy/aruco_service/test_lift_wait_position.yaml diff --git a/common/speech/lasr_speech/nodes/service b/common/speech/lasr_speech/nodes/service index 901058ba4..c4e92805a 100755 --- a/common/speech/lasr_speech/nodes/service +++ b/common/speech/lasr_speech/nodes/service @@ -3,9 +3,9 @@ import rospy from lasr_speech.srv import Speech, SpeechResponse from lasr_rasa.srv import Rasa from lasr_speech_recognition_msgs.srv import TranscribeAudio -import sounddevice -import soundfile -import pyaudio +#import sounddevice +#import soundfile +#import pyaudio from time import sleep from multiprocessing import Process import rospkg @@ -17,23 +17,23 @@ class TranscribeAndParse: rospy.wait_for_service("/lasr_rasa/parse") self.rasa = rospy.ServiceProxy("/lasr_rasa/parse", Rasa) self.transcribe_audio = rospy.ServiceProxy("/whisper/transcribe_audio", TranscribeAudio) - self.sound_data = soundfile.read(os.path.join(rospkg.RosPack().get_path("lasr_speech"), "sounds", "beep.wav"))[0] + # self.sound_data = soundfile.read(os.path.join(rospkg.RosPack().get_path("lasr_speech"), "sounds", "beep.wav"))[0] - def play_sound(self): - def play(): - audio_interface = pyaudio.PyAudio() - sample_rate = int(audio_interface.get_default_output_device_info()["defaultSampleRate"]) - sounddevice.play(self.sound_data, sample_rate, - device=audio_interface.get_default_output_device_info()["index"]) - sounddevice.wait() - audio_interface.terminate() - p = Process(target=play) - p.start() - sleep(0.5) + # def play_sound(self): + # def play(): + # audio_interface = pyaudio.PyAudio() + # sample_rate = int(audio_interface.get_default_output_device_info()["defaultSampleRate"]) + # sounddevice.play(self.sound_data, sample_rate, + # device=audio_interface.get_default_output_device_info()["index"]) + # sounddevice.wait() + # audio_interface.terminate() + # p = Process(target=play) + # p.start() + #sleep(0.5) def __call__(self, req): - if req.play_sound: - self.play_sound() + # if req.play_sound: + # self.play_sound() transcription = self.transcribe_audio() rospy.loginfo(transcription) rasa_response = self.rasa(transcription.phrase) diff --git a/legacy/aruco_service/CMakeLists.txt b/legacy/aruco_service/CMakeLists.txt deleted file mode 100644 index 890b5aba2..000000000 --- a/legacy/aruco_service/CMakeLists.txt +++ /dev/null @@ -1,210 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2) -project(aruco_service) - -## Compile as C++11, supported in ROS Kinetic and newer -# add_compile_options(-std=c++11) - -## Find catkin macros and libraries -## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) -## is used, also find other catkin packages -find_package(catkin REQUIRED COMPONENTS - aruco_msgs - geometry_msgs - roscpp - rospy - std_msgs - message_generation -) - -## System dependencies are found with CMake's conventions -# find_package(Boost REQUIRED COMPONENTS system) - - -## Uncomment this if the package has a setup.py. This macro ensures -## modules and global scripts declared therein get installed -## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html -# catkin_python_setup() - -################################################ -## Declare ROS messages, services and actions ## -################################################ - -## To declare and build messages, services or actions from within this -## package, follow these steps: -## * Let MSG_DEP_SET be the set of packages whose message types you use in -## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). -## * In the file package.xml: -## * add a build_depend tag for "message_generation" -## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET -## * If MSG_DEP_SET isn't empty the following dependency has been pulled in -## but can be declared for certainty nonetheless: -## * add a exec_depend tag for "message_runtime" -## * In this file (CMakeLists.txt): -## * add "message_generation" and every package in MSG_DEP_SET to -## find_package(catkin REQUIRED COMPONENTS ...) -## * add "message_runtime" and every package in MSG_DEP_SET to -## catkin_package(CATKIN_DEPENDS ...) -## * uncomment the add_*_files sections below as needed -## and list every .msg/.srv/.action file to be processed -## * uncomment the generate_messages entry below -## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) - -## Generate messages in the 'msg' folder -# add_message_files( -# FILES -# Message1.msg -# Message2.msg -# ) - -## Generate services in the 'srv' folder -add_service_files( - FILES - GenerateTableCuboid.srv - PublishTablePoints.srv - SaveNavigationPoint.srv - ) - -## Generate actions in the 'action' folder -# add_action_files( -# FILES -# Action1.action -# Action2.action -# ) - -## Generate added messages and services with any dependencies listed here -generate_messages( - DEPENDENCIES - aruco_msgs geometry_msgs std_msgs -) - -################################################ -## Declare ROS dynamic reconfigure parameters ## -################################################ - -## To declare and build dynamic reconfigure parameters within this -## package, follow these steps: -## * In the file package.xml: -## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" -## * In this file (CMakeLists.txt): -## * add "dynamic_reconfigure" to -## find_package(catkin REQUIRED COMPONENTS ...) -## * uncomment the "generate_dynamic_reconfigure_options" section below -## and list every .cfg file to be processed - -## Generate dynamic reconfigure parameters in the 'cfg' folder -# generate_dynamic_reconfigure_options( -# cfg/DynReconf1.cfg -# cfg/DynReconf2.cfg -# ) - -################################### -## catkin specific configuration ## -################################### -## The catkin_package macro generates cmake config files for your package -## Declare things to be passed to dependent projects -## INCLUDE_DIRS: uncomment this if your package contains header files -## LIBRARIES: libraries you create in this project that dependent projects also need -## CATKIN_DEPENDS: catkin_packages dependent projects also need -## DEPENDS: system dependencies of this project that dependent projects also need -catkin_package( -# INCLUDE_DIRS include -# LIBRARIES aruco_service -# CATKIN_DEPENDS aruco_msgs geometry_msgs roscpp rospy std_msgs -# DEPENDS system_lib -) - -########### -## Build ## -########### - -## Specify additional locations of header files -## Your package locations should be listed before other locations -include_directories( -# include - ${catkin_INCLUDE_DIRS} -) - -## Declare a C++ library -# add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/aruco_service.cpp -# ) - -## Add cmake target dependencies of the library -## as an example, code may need to be generated before libraries -## either from message generation or dynamic reconfigure -# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Declare a C++ executable -## With catkin_make all packages are built within a single CMake context -## The recommended prefix ensures that target names across packages don't collide -# add_executable(${PROJECT_NAME}_node src/aruco_service_node.cpp) - -## Rename C++ executable without prefix -## The above recommended prefix causes long target names, the following renames the -## target back to the shorter version for ease of user use -## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" -# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") - -## Add cmake target dependencies of the executable -## same as for the library above -# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Specify libraries to link a library or executable target against -# target_link_libraries(${PROJECT_NAME}_node -# ${catkin_LIBRARIES} -# ) - -############# -## Install ## -############# - -# all install targets should use catkin DESTINATION variables -# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html - -## Mark executable scripts (Python etc.) for installation -## in contrast to setup.py, you can choose the destination -# catkin_install_python(PROGRAMS -# scripts/my_python_script -# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark executables for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html -# install(TARGETS ${PROJECT_NAME}_node -# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark libraries for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html -# install(TARGETS ${PROJECT_NAME} -# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} -# ) - -## Mark cpp header files for installation -# install(DIRECTORY include/${PROJECT_NAME}/ -# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -# FILES_MATCHING PATTERN "*.h" -# PATTERN ".svn" EXCLUDE -# ) - -## Mark other files for installation (e.g. launch and bag files, etc.) -# install(FILES -# # myfile1 -# # myfile2 -# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} -# ) - -############# -## Testing ## -############# - -## Add gtest based cpp test target and link libraries -# catkin_add_gtest(${PROJECT_NAME}-test test/test_aruco_service.cpp) -# if(TARGET ${PROJECT_NAME}-test) -# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) -# endif() - -## Add folders to be run by python nosetests -# catkin_add_nosetests(test) diff --git a/legacy/aruco_service/README.md b/legacy/aruco_service/README.md deleted file mode 100644 index a7d793832..000000000 --- a/legacy/aruco_service/README.md +++ /dev/null @@ -1,175 +0,0 @@ -# aruco_service - -Package for generation of table positions using arUco markers. - -This package is maintained by: -- [Peter Tisnikar](mailto:peter.tisnikar@kcl.ac.uk) - -## Prerequisites - -This package depends on the following ROS packages: -- catkin (buildtool) -- aruco_msgs (build) -- geometry_msgs (build) -- roscpp (build) -- rospy (build) -- std_msgs (build) -- message_generation (build) -- aruco_msgs (exec) -- geometry_msgs (exec) -- roscpp (exec) -- rospy (exec) -- std_msgs (exec) -- message_runtime (exec) - - - -## Usage - -This package contains 3 services: - - Service generating table cuboids (GenerateTableCuboid.py): This service requires an arUco marker placed on the edge of the table, counter, or waiting area. - - Service publishing points of the table to a topic (publish_points_of_table.py): This service is used for visualising the points set by the table cuboid service. - - Service storing the robot positions at the table (save_navigation_points.py): This service stores the current position of the robot into the location namespace of the coffee shop representation. - -To run the table cuboid service: - - First, run the arUco marker recognition service with the custom launch file: - - ```bash - roslaunch aruco_ros singleTiago.launch - ``` - - - Then, run the service node: - - ```bash - rosrun aruco_service GenerateTableCuboid.py - ``` - - - Finally, you can call the service using the following command: - - ```bash - rosservice call /generate_table_cuboid table: "N" - ``` - where you replace N with -2 for the waiting area, -1 for the counter, and 1-Inf for tables. - - - You can visualize the points using RViz with the configuration set up to show all relevant points: - - ```bash - rosrun rviz rviz -d $(rospack find aruco_service)/service_debug.rviz - ``` - -To run the points publisher: - You need to ensure that the rosparam server on the robot contains the table parameters. If so, you can run: - - ```bash - rosrun aruco_service publish_points_of_table.py - ``` - You can then call the service with the following command: - - ```bash - rosservice call /publish_table_points table: "N" - ``` - Where you replace N with -2 for the waiting area, -1 for the counter, and 1-Inf for tables. - -To run the navigation points storing service: - You need to ensure that the rosparam server on the robot contains the table parameters. If so, you can run: - - ```bash - rosrun aruco_service save_navigation_points.py - ``` - You can then call the service with the following command: - - ```bash - rosservice call /save_navigation_points table: "N" - ``` - Where you replace N with -2 for the waiting area, -1 for the counter, and 1-Inf for tables. - -## Example - -Running the service - -TODOTODOTODO - -## Technical Overview - -TODO - -## ROS Definitions - -### Launch Files - -#### `singleTiago` - -No description provided. - -| Argument | Default | Description | -|:-:|:-:|---| -| markerId | 500 | | -| markerSize | 0.1 | | -| eye | left | | -| marker_frame | aruco_marker_frame | | -| ref_frame | /map | | -| corner_refinement | LINES | | - - -#### `coffee_shop_prep` - -No description provided. - - -### Messages - -This package has no messages. - -### Services - -#### `SaveNavigationPoint` - -Request - -| Field | Type | Description | -|:-:|:-:|---| -| table | int8 | | - -Response - -| Field | Type | Description | -|:-:|:-:|---| -| success | bool | | - -#### `PublishTablePoints` - -Request - -| Field | Type | Description | -|:-:|:-:|---| -| table | int8 | | - -Response - -| Field | Type | Description | -|:-:|:-:|---| -| success | bool | | - -#### `GenerateTableCuboid` - -Request - -| Field | Type | Description | -|:-:|:-:|---| -| table | int8 | | -| long_side | float64 | | -| short_side | float64 | | -| padding | float64 | | -| is_rect | bool | | -| radius | float64 | | - -Response - -| Field | Type | Description | -|:-:|:-:|---| -| success | bool | | - - -### Actions - -This package has no actions. diff --git a/legacy/aruco_service/doc/EXAMPLE.md b/legacy/aruco_service/doc/EXAMPLE.md deleted file mode 100644 index 62be6dcc3..000000000 --- a/legacy/aruco_service/doc/EXAMPLE.md +++ /dev/null @@ -1,3 +0,0 @@ -Running the service - -TODOTODOTODO \ No newline at end of file diff --git a/legacy/aruco_service/doc/PREREQUISITES.md b/legacy/aruco_service/doc/PREREQUISITES.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/legacy/aruco_service/doc/TECHNICAL.md b/legacy/aruco_service/doc/TECHNICAL.md deleted file mode 100644 index 30404ce4c..000000000 --- a/legacy/aruco_service/doc/TECHNICAL.md +++ /dev/null @@ -1 +0,0 @@ -TODO \ No newline at end of file diff --git a/legacy/aruco_service/doc/USAGE.md b/legacy/aruco_service/doc/USAGE.md deleted file mode 100644 index 7d0ff4056..000000000 --- a/legacy/aruco_service/doc/USAGE.md +++ /dev/null @@ -1,56 +0,0 @@ -This package contains 3 services: - - Service generating table cuboids (GenerateTableCuboid.py): This service requires an arUco marker placed on the edge of the table, counter, or waiting area. - - Service publishing points of the table to a topic (publish_points_of_table.py): This service is used for visualising the points set by the table cuboid service. - - Service storing the robot positions at the table (save_navigation_points.py): This service stores the current position of the robot into the location namespace of the coffee shop representation. - -To run the table cuboid service: - - First, run the arUco marker recognition service with the custom launch file: - - ```bash - roslaunch aruco_ros singleTiago.launch - ``` - - - Then, run the service node: - - ```bash - rosrun aruco_service GenerateTableCuboid.py - ``` - - - Finally, you can call the service using the following command: - - ```bash - rosservice call /generate_table_cuboid table: "N" - ``` - where you replace N with -2 for the waiting area, -1 for the counter, and 1-Inf for tables. - - - You can visualize the points using RViz with the configuration set up to show all relevant points: - - ```bash - rosrun rviz rviz -d $(rospack find aruco_service)/service_debug.rviz - ``` - -To run the points publisher: - You need to ensure that the rosparam server on the robot contains the table parameters. If so, you can run: - - ```bash - rosrun aruco_service publish_points_of_table.py - ``` - You can then call the service with the following command: - - ```bash - rosservice call /publish_table_points table: "N" - ``` - Where you replace N with -2 for the waiting area, -1 for the counter, and 1-Inf for tables. - -To run the navigation points storing service: - You need to ensure that the rosparam server on the robot contains the table parameters. If so, you can run: - - ```bash - rosrun aruco_service save_navigation_points.py - ``` - You can then call the service with the following command: - - ```bash - rosservice call /save_navigation_points table: "N" - ``` - Where you replace N with -2 for the waiting area, -1 for the counter, and 1-Inf for tables. diff --git a/legacy/aruco_service/launch/coffee_shop_prep.launch b/legacy/aruco_service/launch/coffee_shop_prep.launch deleted file mode 100644 index 6639975c3..000000000 --- a/legacy/aruco_service/launch/coffee_shop_prep.launch +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/legacy/aruco_service/launch/singleTiago.launch b/legacy/aruco_service/launch/singleTiago.launch deleted file mode 100644 index 580939ed2..000000000 --- a/legacy/aruco_service/launch/singleTiago.launch +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/aruco_service/package.xml b/legacy/aruco_service/package.xml deleted file mode 100644 index a7ae4524c..000000000 --- a/legacy/aruco_service/package.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - aruco_service - 0.0.0 - Package for generation of table positions using arUco markers. - - - - - Peter Tisnikar - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - catkin - aruco_msgs - geometry_msgs - roscpp - rospy - std_msgs - message_generation - aruco_msgs - geometry_msgs - roscpp - rospy - std_msgs - aruco_msgs - geometry_msgs - roscpp - rospy - std_msgs - message_runtime - - - - - - - - diff --git a/legacy/aruco_service/scripts/GenerateTableCuboid.py b/legacy/aruco_service/scripts/GenerateTableCuboid.py deleted file mode 100755 index cc02598d0..000000000 --- a/legacy/aruco_service/scripts/GenerateTableCuboid.py +++ /dev/null @@ -1,224 +0,0 @@ -#!/usr/bin/env python - -import yaml -import rospy -import datetime -from aruco_service.srv import GenerateTableCuboid, GenerateTableCuboidResponse -from geometry_msgs.msg import PointStamped, PoseStamped -from visualization_msgs.msg import Marker -import rosparam -import tf2_ros -import tf2_geometry_msgs -from math import sqrt - -# Units are in meters -# The marker should be placed on the bottom left corner of the table, with the x axis pointing to the right and the y axis pointing up -# Use 0 to inf for tables, use -1 for counter, use -2 for waiting area - -def get_transform_to_marker(from_frame, to_frame): - tf_buffer = tf2_ros.Buffer() - tf_listener = tf2_ros.TransformListener(tf_buffer) - try: - t = tf_buffer.lookup_transform(to_frame, from_frame, rospy.Time(0), rospy.Duration(5)) - return t - except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException): - raise - -def get_map_frame_pose(input_xy, transform): - ps = PointStamped() - ps.point.x = input_xy[0] - ps.point.y = input_xy[1] - ps.header.frame_id = "aruco_marker_frame" - ps.header.stamp = rospy.Time.now() - - tr_point = tf2_geometry_msgs.do_transform_point(ps, transform) - return (tr_point.point.x, tr_point.point.y) - -def create_marker_msg(point, idx): - marker_msg = Marker() - marker_msg.header.frame_id = "map" - marker_msg.header.stamp = rospy.Time.now() - marker_msg.id = idx - marker_msg.type = Marker.SPHERE - marker_msg.action = Marker.ADD - marker_msg.pose.position.x = point[0] - marker_msg.pose.position.y = point[1] - marker_msg.color.r = 1.0 - marker_msg.color.g = 0.0 - marker_msg.color.b = 0.0 - marker_msg.scale.x = 0.1 - marker_msg.scale.y = 0.1 - marker_msg.scale.z = 0.1 - marker_msg.color.a = 1.0 - return marker_msg - -def generate_cuboid(msg): - table = msg.table - long_side = msg.long_side - short_side = msg.short_side - padding = msg.padding - is_rect = msg.is_rect - radius = msg.radius - seconds = rospy.get_time() - objects_marker_pub = rospy.Publisher("/table/objects_cuboid", Marker, queue_size= 4 if is_rect else 8) - persons_marker_pub = rospy.Publisher("/table/persons_cuboid", Marker, queue_size=4 if is_rect else 8) - - if latest_pose is not None and (seconds - latest_pose.header.stamp.secs < 1.0): - - tr = get_transform_to_marker("aruco_marker_frame", "map") - - if is_rect: - - # THESE POINTS ARE IN MARKER COORDINATE FRAME [LOCATION OF ARUCO MARKER IS (0,0) IN THIS FRAME] - local_corner_1 = [0, 0] - local_corner_2 = [long_side, 0] - local_corner_3 = [long_side, short_side] - local_corner_4 = [0, short_side] - - - # TRANSFORM TO MAP FRAME - corner_1 = get_map_frame_pose(local_corner_1, tr) - corner_2 = get_map_frame_pose(local_corner_2, tr) - corner_3 = get_map_frame_pose(local_corner_3, tr) - corner_4 = get_map_frame_pose(local_corner_4, tr) - - objects_marker_pub.publish(create_marker_msg(corner_1, 0)) - objects_marker_pub.publish(create_marker_msg(corner_2, 1)) - objects_marker_pub.publish(create_marker_msg(corner_3, 2)) - objects_marker_pub.publish(create_marker_msg(corner_4, 3)) - - if table >= 0: - - local_padded_corner_1 = [local_corner_1[0] - padding, local_corner_1[1] - padding] - local_padded_corner_2 = [local_corner_2[0] + padding, local_corner_2[1] - padding] - local_padded_corner_3 = [local_corner_3[0] + padding, local_corner_3[1] + padding] - local_padded_corner_4 = [local_corner_4[0] - padding, local_corner_4[1] + padding] - - padded_corner_1 = get_map_frame_pose(local_padded_corner_1, tr) - padded_corner_2 = get_map_frame_pose(local_padded_corner_2, tr) - padded_corner_3 = get_map_frame_pose(local_padded_corner_3, tr) - padded_corner_4 = get_map_frame_pose(local_padded_corner_4, tr) - - persons_marker_pub.publish(create_marker_msg(padded_corner_1, 0)) - persons_marker_pub.publish(create_marker_msg(padded_corner_2, 1)) - persons_marker_pub.publish(create_marker_msg(padded_corner_3, 2)) - persons_marker_pub.publish(create_marker_msg(padded_corner_4, 3)) - - rospy.set_param("/tables/table" + str(table) + "/objects_cuboid", [corner_1, corner_2, corner_3, corner_4]) - rospy.set_param("/tables/table" + str(table) + "/persons_cuboid", [padded_corner_1, padded_corner_2, padded_corner_3, padded_corner_4]) - now = str(datetime.datetime.now()) - rospy.set_param("/tables/table" + str(table) + "/last_updated", now) - rospy.loginfo("Cuboid for table %d saved to parameter server", table) - - elif table == -1: - rospy.set_param("/counter/cuboid", [corner_1, corner_2, corner_3, corner_4]) - now = str(datetime.datetime.now()) - rospy.set_param("/counter/last_updated", now) - rospy.loginfo("Cuboid for the counter saved to parameter server") - - elif table == -2: - rospy.set_param("/wait/cuboid", [corner_1, corner_2, corner_3, corner_4]) - now = str(datetime.datetime.now()) - rospy.set_param("/wait/last_updated", now) - rospy.loginfo("Cuboid for the waiting area saved to parameter server") - - else: - rospy.logerr("Invalid table number %d", table) - return GenerateTableCuboidResponse(False) - - # Dump rosparams to file - data = { - 'tables': rosparam.get_param('/tables'), - 'counter': rosparam.get_param('/counter'), - 'wait': rosparam.get_param('/wait') - } - - with open(rosparam.get_param('/config_path'), 'w') as file: - yaml.dump(data, file) - else: - # assume circular, and aruco marker is placed in the centre of the table - local_r1 = [-radius, 0] - local_r2 = [(sqrt(2.)*-radius)/2., (sqrt(2.)*+radius)/2.] - local_r3 = [0, +radius] - local_r4 = [(sqrt(2.)*+radius)/2., (sqrt(2.)*+radius)/2.] - local_r5 = [+radius, 0] - local_r6 = [(sqrt(2.)*+radius)/2., (sqrt(2.)*-radius)/2.] - local_r7 = [0, -radius] - local_r8 = [(sqrt(2.)*-radius)/2., (sqrt(2.)*-radius)/2.] - - r1 = get_map_frame_pose(local_r1, tr) - r2 = get_map_frame_pose(local_r2, tr) - r3 = get_map_frame_pose(local_r3, tr) - r4 = get_map_frame_pose(local_r4, tr) - r5 = get_map_frame_pose(local_r5, tr) - r6 = get_map_frame_pose(local_r6, tr) - r7 = get_map_frame_pose(local_r7, tr) - r8 = get_map_frame_pose(local_r8, tr) - - objects_marker_pub.publish(create_marker_msg(r1, 0)) - objects_marker_pub.publish(create_marker_msg(r2, 1)) - objects_marker_pub.publish(create_marker_msg(r3, 2)) - objects_marker_pub.publish(create_marker_msg(r4, 3)) - objects_marker_pub.publish(create_marker_msg(r5, 4)) - objects_marker_pub.publish(create_marker_msg(r6, 5)) - objects_marker_pub.publish(create_marker_msg(r7, 6)) - objects_marker_pub.publish(create_marker_msg(r8, 7)) - - local_padded_r1 = [local_r1[0] - padding, 0] - local_padded_r2 = [local_r2[0] - padding, local_r2[1] + padding] - local_padded_r3 = [0, local_r3[1] + padding] - local_padded_r4 = [local_r4[0] + padding, local_r4[1] + padding] - local_padded_r5 = [local_r5[0] + padding, 0] - local_padded_r6 = [local_r6[0] + padding, local_r6[1] - padding] - local_padded_r7 = [0, local_r7[1] - padding] - local_padded_r8 = [local_r8[0] - padding, local_r8[1] - padding] - - r1p = get_map_frame_pose(local_padded_r1, tr) - r2p = get_map_frame_pose(local_padded_r2, tr) - r3p = get_map_frame_pose(local_padded_r3, tr) - r4p = get_map_frame_pose(local_padded_r4, tr) - r5p = get_map_frame_pose(local_padded_r5, tr) - r6p = get_map_frame_pose(local_padded_r6, tr) - r7p = get_map_frame_pose(local_padded_r7, tr) - r8p = get_map_frame_pose(local_padded_r8, tr) - - persons_marker_pub.publish(create_marker_msg(r1p, 0)) - persons_marker_pub.publish(create_marker_msg(r2p, 1)) - persons_marker_pub.publish(create_marker_msg(r3p, 2)) - persons_marker_pub.publish(create_marker_msg(r4p, 3)) - persons_marker_pub.publish(create_marker_msg(r5p, 4)) - persons_marker_pub.publish(create_marker_msg(r6p, 5)) - persons_marker_pub.publish(create_marker_msg(r7p, 6)) - persons_marker_pub.publish(create_marker_msg(r8p, 7)) - - - rospy.set_param("/tables/table" + str(table) + "/objects_cuboid", [r1, r2, r3, r4, r5, r6, r7, r8]) - rospy.set_param("/tables/table" + str(table) + "/persons_cuboid", [r1p, r2p, r3p, r4p, r5p, r6p, r7p, r8p]) - now = str(datetime.datetime.now()) - rospy.set_param("/tables/table" + str(table) + "/last_updated", now) - rospy.loginfo("Cuboid for table %d saved to parameter server", table) - - return GenerateTableCuboidResponse(True) - else: - rospy.logerr("No pose data available to generate cuboid for table %d, please check if the marker is on the table", table) - return GenerateTableCuboidResponse(False) - -def get_latest_pose(msg): - global latest_pose - latest_pose = msg - -if __name__ == "__main__": - - rospy.init_node("generate_table_cuboid") - sub = rospy.Subscriber("/aruco_single/pose", PoseStamped, get_latest_pose) - s = rospy.Service("generate_table_cuboid", GenerateTableCuboid, generate_cuboid) - - if rospy.has_param("/config_path"): - els = rosparam.load_file(rosparam.get_param('/config_path')) - for param, ns in els: - rosparam.upload_params(ns, param) - - rospy.loginfo("Cuboid Generator Service Ready") - - while not rospy.is_shutdown(): - rospy.sleep(1.0) \ No newline at end of file diff --git a/legacy/aruco_service/scripts/publish_points_of_table.py b/legacy/aruco_service/scripts/publish_points_of_table.py deleted file mode 100755 index 0008ad272..000000000 --- a/legacy/aruco_service/scripts/publish_points_of_table.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python - -import rospy -from aruco_service.srv import PublishTablePoints, PublishTablePointsResponse -from visualization_msgs.msg import Marker - -def create_marker_msg(point, idx): - marker_msg = Marker() - marker_msg.header.frame_id = "map" - marker_msg.header.stamp = rospy.Time.now() - marker_msg.id = idx - marker_msg.type = Marker.SPHERE - marker_msg.action = Marker.ADD - marker_msg.pose.position.x = point[0] - marker_msg.pose.position.y = point[1] - marker_msg.color.r = 1.0 - marker_msg.color.g = 0.0 - marker_msg.color.b = 0.0 - marker_msg.scale.x = 0.1 - marker_msg.scale.y = 0.1 - marker_msg.scale.z = 0.1 - marker_msg.color.a = 1.0 - return marker_msg - -def publish_points(number): - table = number.table - objects_marker_pub = rospy.Publisher("/table/objects_cuboid", Marker, queue_size=8) - persons_marker_pub = rospy.Publisher("/table/persons_cuboid", Marker, queue_size=8) - - if table >= 0: - - obj = rospy.get_param("/tables/table" + str(table) + "/objects_cuboid") - - for i, p in enumerate(obj): - - objects_marker_pub.publish(create_marker_msg(p, i)) - - per = rospy.get_param("/tables/table" + str(table) + "/persons_cuboid") - - - for i, p in enumerate(per): - - persons_marker_pub.publish(create_marker_msg(p, i)) - - elif table == -1: - - cuboid = rospy.get_param("/counter/cuboid") - - objects_marker_pub.publish(create_marker_msg(cuboid[0], 0)) - objects_marker_pub.publish(create_marker_msg(cuboid[1], 1)) - objects_marker_pub.publish(create_marker_msg(cuboid[2], 2)) - objects_marker_pub.publish(create_marker_msg(cuboid[3], 3)) - - elif table == -2: - cuboid = rospy.get_param("/wait/cuboid") - - objects_marker_pub.publish(create_marker_msg(cuboid[0], 0)) - objects_marker_pub.publish(create_marker_msg(cuboid[1], 1)) - objects_marker_pub.publish(create_marker_msg(cuboid[2], 2)) - objects_marker_pub.publish(create_marker_msg(cuboid[3], 3)) - - - rospy.loginfo("Published points for table " + str(table)) - - return PublishTablePointsResponse(True) - -if __name__ == "__main__": - - rospy.init_node("point_publisher") - s = rospy.Service("publish_table_points", PublishTablePoints, publish_points) - - rospy.loginfo("Point Publisher Service Ready") - - while not rospy.is_shutdown(): - rospy.sleep(1.0) \ No newline at end of file diff --git a/legacy/aruco_service/scripts/save_navigation_points.py b/legacy/aruco_service/scripts/save_navigation_points.py deleted file mode 100755 index b0e0cfb8e..000000000 --- a/legacy/aruco_service/scripts/save_navigation_points.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python - -import yaml -import rospy -from aruco_service.srv import SaveNavigationPoint, SaveNavigationPointResponse -from geometry_msgs.msg import PoseWithCovarianceStamped -import rosparam - -def save_navigation_points(number): - table = number.table - - position = latest_pose.pose.pose.position - orientation = latest_pose.pose.pose.orientation - - if table >= 0: - rospy.set_param("/tables/table" + str(table) + "/location/position", {"x": position.x, "y": position.y, "z": 0.}) - rospy.set_param("/tables/table" + str(table) + "/location/orientation", {"x": orientation.x, "y": orientation.y, "z": orientation.z, "w": orientation.w}) - rospy.loginfo("Navigation point for table %d saved to parameter server", table) - - elif table == -1: - rospy.set_param("/counter/location/position", {"x": position.x, "y": position.y, "z": 0.}) - rospy.set_param("counter/location/orientation", {"x": orientation.x, "y": orientation.y, "z": orientation.z, "w": orientation.w}) - rospy.loginfo("Navigation point for the counter saved to parameter server") - - elif table == -2: - rospy.set_param("/wait/location/position", {"x": position.x, "y": position.y, "z": 0.}) - rospy.set_param("wait/location/orientation", {"x": orientation.x, "y": orientation.y, "z": orientation.z, "w": orientation.w}) - rospy.loginfo("Navigation point for the waiting area saved to parameter server") - - else: - rospy.loginfo("Invalid table number.") - return SaveNavigationPointResponse(False) - -# Dump rosparams to file - data = { - 'tables': rosparam.get_param('/tables'), - 'counter': rosparam.get_param('/counter'), - 'wait': rosparam.get_param('/wait') - } - - with open(rosparam.get_param("/config_path"), 'w') as file: - yaml.dump(data, file) - - return SaveNavigationPointResponse(True) - -def save_pre_navigation_points(number): - table = number.table - - position = latest_pose.pose.pose.position - orientation = latest_pose.pose.pose.orientation - - if table >= 0: - rospy.set_param("/tables/table" + str(table) + "/pre_location/position", {"x": position.x, "y": position.y, "z": 0.}) - rospy.set_param("/tables/table" + str(table) + "/pre_location/orientation", {"x": orientation.x, "y": orientation.y, "z": orientation.z, "w": orientation.w}) - rospy.loginfo("Pre-navigation point for table %d saved to parameter server", table) - - else: - rospy.loginfo("Invalid table number.") - return SaveNavigationPointResponse(False) - - # Dump rosparams to file - data = { - 'tables': rosparam.get_param('/tables'), - 'counter': rosparam.get_param('/counter'), - 'wait': rosparam.get_param('/wait') - } - - with open(rosparam.get_param("/config_path"), 'w') as file: - yaml.dump(data, file) - - return SaveNavigationPointResponse(True) - -def get_latest_pose(msg): - global latest_pose - latest_pose = msg - -if __name__ == "__main__": - - rospy.init_node("save_navigation_points") - sub = rospy.Subscriber("/amcl_pose", PoseWithCovarianceStamped, get_latest_pose) - rospy.Service("save_navigation_points", SaveNavigationPoint, save_navigation_points) - rospy.Service("save_pre_navigation_points", SaveNavigationPoint, save_pre_navigation_points) - rospy.loginfo("Navigation Points Saver Ready") - - while not rospy.is_shutdown(): - rospy.sleep(1.0) \ No newline at end of file diff --git a/legacy/aruco_service/service_debug.rviz b/legacy/aruco_service/service_debug.rviz deleted file mode 100644 index 74dd26dbb..000000000 --- a/legacy/aruco_service/service_debug.rviz +++ /dev/null @@ -1,970 +0,0 @@ -Panels: - - Class: rviz/Displays - Help Height: 0 - Name: Displays - Property Tree Widget: - Expanded: - - /Robot1 - - /Control1/Move1 - - /Control1/Path1 - - /Planning1/Base1 - - /Planning1/Base1/Global1 - - /Planning1/Base1/Local1/motion vector1 - - /Mapping1/Map (with Virtual Obstacles)1 - - /Marker1 - - /Marker1/Status1 - - /PointCloud21 - Splitter Ratio: 0.552763819694519 - Tree Height: 559 - - Class: rviz/Selection - Name: Selection - - Class: pal-navigation_rviz_plugins/DockUndockPanel - Name: DockUndockPanel - - Class: pal-waypoint_rviz_plugins/Waypoint Group - Name: Waypoint Group - - Class: pal-navigation_rviz_plugins/MapManagementWidget - Name: MapManagementWidget - - Class: pal-navigation_rviz_plugins/NavigationUtilsPanel - Name: NavigationUtilsPanel - - Class: pal-teleop_rviz_plugins/PalTeleop - Name: PalTeleop - - Class: rviz/Views - Expanded: - - /Current View1 - Name: Views - Splitter Ratio: 0.5 -Preferences: - PromptSaveOnExit: true -Toolbars: - toolButtonStyle: 2 -Visualization Manager: - Class: "" - Displays: - - Alpha: 0.5 - Cell Size: 1 - Class: rviz/Grid - Color: 160; 160; 164 - Enabled: true - Line Style: - Line Width: 0.029999999329447746 - Value: Lines - Name: Grid - Normal Cell Count: 0 - Offset: - X: 0 - Y: 0 - Z: 0 - Plane: XY - Plane Cell Count: 10 - Reference Frame: base_footprint - Value: true - - Class: rviz/Group - Displays: - - Alpha: 0.20000000298023224 - Class: rviz/RobotModel - Collision Enabled: false - Enabled: true - Links: - All Links Enabled: true - Expand Joint Details: false - Expand Link Details: false - Expand Tree: false - Link Tree Style: Links in Alphabetic Order - arm_1_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - arm_2_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - arm_3_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - arm_4_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - arm_5_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - arm_6_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - arm_7_link: - Alpha: 1 - Show Axes: false - Show Trail: false - arm_tool_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_antenna_left_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_antenna_right_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_cover_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_footprint: - Alpha: 1 - Show Axes: false - Show Trail: false - base_imu_link: - Alpha: 1 - Show Axes: false - Show Trail: false - base_laser_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_mic_back_left_link: - Alpha: 1 - Show Axes: false - Show Trail: false - base_mic_back_right_link: - Alpha: 1 - Show Axes: false - Show Trail: false - base_mic_front_left_link: - Alpha: 1 - Show Axes: false - Show Trail: false - base_mic_front_right_link: - Alpha: 1 - Show Axes: false - Show Trail: false - base_sonar_01_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_sonar_02_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_sonar_03_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - caster_back_left_1_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - caster_back_left_2_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - caster_back_right_1_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - caster_back_right_2_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - caster_front_left_1_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - caster_front_left_2_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - caster_front_right_1_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - caster_front_right_2_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - gripper_grasping_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - gripper_left_finger_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - gripper_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - gripper_right_finger_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - gripper_tool_link: - Alpha: 1 - Show Axes: false - Show Trail: false - head_1_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - head_2_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rgbd_laser_link: - Alpha: 1 - Show Axes: false - Show Trail: false - suspension_left_link: - Alpha: 1 - Show Axes: false - Show Trail: false - suspension_right_link: - Alpha: 1 - Show Axes: false - Show Trail: false - torso_fixed_column_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - torso_fixed_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - torso_lift_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - wheel_left_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - wheel_right_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - xtion_depth_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - xtion_depth_optical_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - xtion_link: - Alpha: 1 - Show Axes: false - Show Trail: false - xtion_optical_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - xtion_orbbec_aux_joint_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - xtion_rgb_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - xtion_rgb_optical_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - Name: RobotModel - Robot Description: robot_description - TF Prefix: "" - Update Interval: 0 - Value: true - Visual Enabled: true - - Class: rviz/TF - Enabled: false - Frame Timeout: 15 - Frames: - All Enabled: true - Marker Scale: 0.10000000149011612 - Name: TF - Show Arrows: true - Show Axes: true - Show Names: true - Tree: - {} - Update Interval: 0 - Value: false - - Alpha: 1 - Class: rviz/Polygon - Color: 25; 255; 0 - Enabled: true - Name: Footprint - Topic: /move_base/local_costmap/footprint - Unreliable: false - Value: true - - Class: rviz/Marker - Enabled: true - Marker Topic: twist_marker - Name: Twist - Namespaces: - "": true - Queue Size: 100 - Value: true - - Class: rviz/Marker - Enabled: false - Marker Topic: text_marker - Name: Mode - Namespaces: - {} - Queue Size: 100 - Value: false - - Class: rviz/Group - Displays: - - Alpha: 0.5 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 10 - Min Value: -10 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz/LaserScan - Color: 0; 0; 255 - Color Transformer: FlatColor - Decay Time: 0 - Enabled: true - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 0 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: Laser - Position Transformer: XYZ - Queue Size: 10 - Selectable: true - Size (Pixels): 3 - Size (m): 0.009999999776482582 - Style: Points - Topic: scan - Unreliable: false - Use Fixed Frame: true - Use rainbow: true - Value: true - - Alpha: 0.5 - Buffer Length: 3 - Class: rviz/Range - Color: 255; 255; 255 - Enabled: true - Name: Sonar - Queue Size: 100 - Topic: /sonar_base - Unreliable: false - Value: true - - Alpha: 1 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 0.45725369453430176 - Min Value: -0.12522876262664795 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz/PointCloud2 - Color: 255; 255; 255 - Color Transformer: AxisColor - Decay Time: 0 - Enabled: false - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 4096 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: PointCloud2 - Position Transformer: XYZ - Queue Size: 10 - Selectable: true - Size (Pixels): 3 - Size (m): 0.009999999776482582 - Style: Flat Squares - Topic: /xtion/depth/points - Unreliable: false - Use Fixed Frame: true - Use rainbow: true - Value: false - Enabled: false - Name: Sensors - Enabled: true - Name: Robot - - Class: rviz/Group - Displays: - - Class: rviz/InteractiveMarkers - Enable Transparency: true - Enabled: true - Name: Move - Show Axes: false - Show Descriptions: false - Show Visual Aids: false - Update Topic: marker_teleop_srv/update - Value: true - - Alpha: 1 - Buffer Length: 1 - Class: rviz/Path - Color: 0; 0; 255 - Enabled: true - Head Diameter: 0.30000001192092896 - Head Length: 0.20000000298023224 - Length: 0.30000001192092896 - Line Style: Lines - Line Width: 0.029999999329447746 - Name: Path - Offset: - X: 0 - Y: 0 - Z: 0 - Pose Color: 255; 85; 255 - Pose Style: None - Radius: 0.029999999329447746 - Shaft Diameter: 0.10000000149011612 - Shaft Length: 0.10000000149011612 - Topic: path - Unreliable: false - Value: true - Enabled: true - Name: Control - - Class: rviz/Group - Displays: - - Class: rviz/Group - Displays: - - Class: rviz/Group - Displays: - - Class: rviz/Group - Displays: - - Alpha: 1 - Buffer Length: 1 - Class: rviz/Path - Color: 0; 0; 255 - Enabled: true - Head Diameter: 0.30000001192092896 - Head Length: 0.20000000298023224 - Length: 0.30000001192092896 - Line Style: Lines - Line Width: 0.029999999329447746 - Name: Navfn - Offset: - X: 0 - Y: 0 - Z: 0 - Pose Color: 255; 85; 255 - Pose Style: None - Radius: 0.029999999329447746 - Shaft Diameter: 0.10000000149011612 - Shaft Length: 0.10000000149011612 - Topic: move_base/NavfnROS/plan - Unreliable: false - Value: true - - Alpha: 1 - Buffer Length: 1 - Class: rviz/Path - Color: 0; 0; 255 - Enabled: true - Head Diameter: 0.30000001192092896 - Head Length: 0.20000000298023224 - Length: 0.30000001192092896 - Line Style: Lines - Line Width: 0.029999999329447746 - Name: Global Planner - Offset: - X: 0 - Y: 0 - Z: 0 - Pose Color: 255; 85; 255 - Pose Style: None - Radius: 0.029999999329447746 - Shaft Diameter: 0.10000000149011612 - Shaft Length: 0.10000000149011612 - Topic: move_base/GlobalPlanner/plan - Unreliable: false - Value: true - Enabled: true - Name: Plan - - Alpha: 0.699999988079071 - Class: rviz/Map - Color Scheme: costmap - Draw Behind: true - Enabled: false - Name: Potential - Topic: move_base/GlobalPlanner/potential - Unreliable: false - Use Timestamp: false - Value: false - - Alpha: 0.699999988079071 - Class: rviz/Map - Color Scheme: costmap - Draw Behind: true - Enabled: true - Name: Costmap - Topic: move_base/global_costmap/costmap - Unreliable: false - Use Timestamp: false - Value: true - Enabled: true - Name: Global - - Class: rviz/Group - Displays: - - Class: rviz/Group - Displays: - - Alpha: 1 - Arrow Length: 0.30000001192092896 - Axes Length: 0.30000001192092896 - Axes Radius: 0.009999999776482582 - Class: rviz/PoseArray - Color: 255; 25; 0 - Enabled: true - Head Length: 0.07000000029802322 - Head Radius: 0.029999999329447746 - Name: PoseArray - Shaft Length: 0.23000000417232513 - Shaft Radius: 0.009999999776482582 - Shape: Arrow (Flat) - Topic: /move_base/TebLocalPlannerROS/teb_poses - Unreliable: false - Value: true - - Class: rviz/Marker - Enabled: true - Marker Topic: /move_base/TebLocalPlannerROS/teb_markers - Name: Marker - Namespaces: - {} - Queue Size: 100 - Value: true - - Alpha: 1 - Buffer Length: 1 - Class: rviz/Path - Color: 25; 255; 0 - Enabled: true - Head Diameter: 0.30000001192092896 - Head Length: 0.20000000298023224 - Length: 0.30000001192092896 - Line Style: Lines - Line Width: 0.029999999329447746 - Name: Path - Offset: - X: 0 - Y: 0 - Z: 0 - Pose Color: 255; 85; 255 - Pose Style: None - Radius: 0.029999999329447746 - Shaft Diameter: 0.10000000149011612 - Shaft Length: 0.10000000149011612 - Topic: /move_base/TebLocalPlannerROS/local_plan - Unreliable: false - Value: true - Enabled: true - Name: TEB - - Class: rviz/Group - Displays: - - Class: rviz/MarkerArray - Enabled: true - Marker Topic: /move_base/local_planner/vfh_angle_candidates - Name: CandidatesMB - Namespaces: - {} - Queue Size: 100 - Value: true - - Class: rviz/MarkerArray - Enabled: true - Marker Topic: /pal_local_planner/local_planner/vfh_angle_candidates - Name: CandidatesVFH - Namespaces: - {} - Queue Size: 100 - Value: true - Enabled: true - Name: PLP - - Class: rviz/Group - Displays: - - Alpha: 1 - Buffer Length: 1 - Class: rviz/Path - Color: 25; 255; 0 - Enabled: true - Head Diameter: 0.30000001192092896 - Head Length: 0.20000000298023224 - Length: 0.30000001192092896 - Line Style: Lines - Line Width: 0.029999999329447746 - Name: Trajectory - Offset: - X: 0 - Y: 0 - Z: 0 - Pose Color: 255; 85; 255 - Pose Style: None - Radius: 0.029999999329447746 - Shaft Diameter: 0.10000000149011612 - Shaft Length: 0.10000000149011612 - Topic: move_base/TrajectoryPlannerROS/local_plan - Unreliable: false - Value: true - - Alpha: 1 - Buffer Length: 1 - Class: rviz/Path - Color: 25; 255; 0 - Enabled: true - Head Diameter: 0.30000001192092896 - Head Length: 0.20000000298023224 - Length: 0.30000001192092896 - Line Style: Lines - Line Width: 0.029999999329447746 - Name: DWA - Offset: - X: 0 - Y: 0 - Z: 0 - Pose Color: 255; 85; 255 - Pose Style: None - Radius: 0.029999999329447746 - Shaft Diameter: 0.10000000149011612 - Shaft Length: 0.10000000149011612 - Topic: move_base/DWAPlannerROS/local_plan - Unreliable: false - Value: true - - Alpha: 1 - Buffer Length: 1 - Class: rviz/Path - Color: 25; 255; 0 - Enabled: true - Head Diameter: 0.30000001192092896 - Head Length: 0.20000000298023224 - Length: 0.30000001192092896 - Line Style: Lines - Line Width: 0.029999999329447746 - Name: Pal - Offset: - X: 0 - Y: 0 - Z: 0 - Pose Color: 255; 85; 255 - Pose Style: None - Radius: 0.029999999329447746 - Shaft Diameter: 0.10000000149011612 - Shaft Length: 0.10000000149011612 - Topic: move_base/PalPlannerROS/local_plan - Unreliable: false - Value: true - Enabled: true - Name: Plan - - Alpha: 0.699999988079071 - Class: rviz/Map - Color Scheme: costmap - Draw Behind: false - Enabled: true - Name: Costmap - Topic: move_base/local_costmap/costmap - Unreliable: false - Use Timestamp: false - Value: true - - Class: rviz/Group - Displays: ~ - Enabled: true - Name: motion vector - Enabled: true - Name: Local - - Alpha: 1 - Axes Length: 1 - Axes Radius: 0.10000000149011612 - Class: rviz/Pose - Color: 255; 25; 0 - Enabled: true - Head Length: 0.30000001192092896 - Head Radius: 0.10000000149011612 - Name: Goal - Shaft Length: 1 - Shaft Radius: 0.05000000074505806 - Shape: Arrow - Topic: move_base/current_goal - Unreliable: false - Value: true - Enabled: true - Name: Base - Enabled: true - Name: Planning - - Class: rviz/Group - Displays: - - Alpha: 1 - Arrow Length: 0.30000001192092896 - Axes Length: 0.30000001192092896 - Axes Radius: 0.009999999776482582 - Class: rviz/PoseArray - Color: 255; 25; 0 - Enabled: true - Head Length: 0.07000000029802322 - Head Radius: 0.029999999329447746 - Name: Pose - Shaft Length: 0.23000000417232513 - Shaft Radius: 0.009999999776482582 - Shape: Arrow (Flat) - Topic: particlecloud - Unreliable: false - Value: true - - 6DOF: false - Alpha: 1 - Axis: false - Class: rviz_plugin_covariance/Pose - Color: 204; 51; 204 - Enabled: false - Name: Pose - Orientation: true - Position: true - Scale: 1 - Topic: "" - Unreliable: false - Value: false - - Class: rviz/MarkerArray - Enabled: true - Marker Topic: slam_graph_marker_array - Name: Pose Graph - Namespaces: - {} - Queue Size: 100 - Value: true - Enabled: true - Name: Localization - - Class: rviz/Group - Displays: - - Alpha: 0.699999988079071 - Class: rviz/Map - Color Scheme: map - Draw Behind: true - Enabled: true - Name: Map - Topic: map - Unreliable: false - Use Timestamp: false - Value: true - - Alpha: 0.800000011920929 - Class: rviz/Map - Color Scheme: map - Draw Behind: false - Enabled: true - Name: Map (with Virtual Obstacles) - Topic: vo_map - Unreliable: false - Use Timestamp: false - Value: true - - Class: rviz/Marker - Enabled: true - Marker Topic: /slam_graph_edges - Name: SLAM Graph Edges - Namespaces: - {} - Queue Size: 100 - Value: true - - Class: rviz/Marker - Enabled: true - Marker Topic: /slam_graph_vertices - Name: SLAM Graph Vertices - Namespaces: - {} - Queue Size: 100 - Value: true - - Alpha: 1 - Arrow Length: 0.30000001192092896 - Axes Length: 0.30000001192092896 - Axes Radius: 0.009999999776482582 - Class: rviz/PoseArray - Color: 255; 25; 0 - Enabled: true - Head Length: 0.07000000029802322 - Head Radius: 0.029999999329447746 - Name: Trajectory - Shaft Length: 0.23000000417232513 - Shaft Radius: 0.009999999776482582 - Shape: Arrow (Flat) - Topic: slam_trajectory - Unreliable: false - Value: true - Enabled: true - Name: Mapping - - Alpha: 1 - Axes Length: 1 - Axes Radius: 0.10000000149011612 - Class: rviz/Pose - Color: 255; 25; 0 - Enabled: true - Head Length: 0.30000001192092896 - Head Radius: 0.10000000149011612 - Name: Pose - Shaft Length: 1 - Shaft Radius: 0.05000000074505806 - Shape: Axes - Topic: /aruco_single/pose - Unreliable: false - Value: true - - Class: rviz/Image - Enabled: true - Image Topic: /xtion/rgb/image_raw - Max Value: 1 - Median window: 5 - Min Value: 0 - Name: Image - Normalize Range: true - Queue Size: 2 - Transport Hint: raw - Unreliable: false - Value: true - - Class: rviz/Marker - Enabled: true - Marker Topic: /table/objects_cuboid - Name: Marker - Namespaces: - "": true - Queue Size: 100 - Value: true - - Class: rviz/Marker - Enabled: true - Marker Topic: /table/persons_cuboid - Name: Marker - Namespaces: - "": true - Queue Size: 100 - Value: true - - Alpha: 0.30000001192092896 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 10 - Min Value: -10 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz/PointCloud2 - Color: 255; 255; 255 - Color Transformer: RGB8 - Decay Time: 0 - Enabled: true - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 4096 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: PointCloud2 - Position Transformer: XYZ - Queue Size: 10 - Selectable: true - Size (Pixels): 1 - Size (m): 0.009999999776482582 - Style: Points - Topic: /throttle_filtering_points/filtered_points - Unreliable: false - Use Fixed Frame: true - Use rainbow: true - Value: true - Enabled: true - Global Options: - Background Color: 48; 48; 48 - Default Light: true - Fixed Frame: map - Frame Rate: 30 - Name: root - Tools: - - Class: rviz/Interact - Hide Inactive Objects: true - - Class: rviz/MoveCamera - - Class: rviz/Select - - Class: rviz/FocusCamera - - Class: rviz/Measure - - Class: rviz/SetInitialPose - Theta std deviation: 0.2617993950843811 - Topic: initialpose - X std deviation: 0.5 - Y std deviation: 0.5 - - Class: rviz/SetGoal - Topic: move_base_simple/goal - - Class: rviz/PublishPoint - Single click: true - Topic: clicked_point - - Class: pal-waypoint_rviz_plugins/Point of Interest - - Class: pal-waypoint_rviz_plugins/Zone of Interest - - Class: pal-waypoint_rviz_plugins/Virtual Obstacle - Value: true - Views: - Current: - Angle: 0.3550000786781311 - Class: rviz/TopDownOrtho - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Invert Z Axis: false - Name: Current View - Near Clip Distance: 0.009999999776482582 - Scale: 297.98052978515625 - Target Frame: - Value: TopDownOrtho (rviz) - X: 3.4167370796203613 - Y: 0.05514177307486534 - Saved: ~ -Window Geometry: - Displays: - collapsed: false - DockUndockPanel: - collapsed: false - Height: 1464 - Hide Left Dock: false - Hide Right Dock: false - Image: - collapsed: false - MapManagementWidget: - collapsed: false - NavigationUtilsPanel: - collapsed: false - PalTeleop: - collapsed: false - QMainWindow State: 000000ff00000000fd0000000400000000000003d900000526fc020000000efb0000001200530065006c0065006300740069006f006e00000001e10000009b000000ab00fffffffb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c0061007900730100000069000002930000017800fffffffb0000001200500061006c00540065006c0065006f007000000001360000017c000000cf00fffffffb0000001e0044006f0063006b0055006e0064006f0063006b00500061006e0065006c00000002560000005c000000cf00fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000001c0043006f006d00700072006500730073006500640020004d0061007000000002d7000000c90000000000000000fb00000014004800650061006400430061006d0065007200610100000276000000c20000000000000000fb0000000a0056006900650077007300000001f1000000c10000012300fffffffb0000000c00430061006d00650072006101000002ed000002a20000000000000000fb0000000a0049006d0061006700650100000308000002870000002100ffffff000000010000014700000277fc0200000006fb0000001e0054006f006f006c002000500072006f0070006500720074006900650073010000003b000001aa0000000000000000fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730000000028000000a30000000000000000fb00000026004d00610070004d0061006e006100670065006d0065006e0074005700690064006700650074000000003b00000183000000cf00fffffffb0000001c0057006100790070006f0069006e0074002000470072006f00750070000000003b00000277000000cf00fffffffb00000028004e0061007600690067006100740069006f006e005500740069006c007300500061006e0065006c000000023900000079000000cf00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000052d0000003efc0100000002fb0000000800540069006d006501000000000000052d0000000000000000fb0000000800540069006d006501000000000000045000000000000000000000081b0000052600000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Selection: - collapsed: false - Views: - collapsed: false - Waypoint Group: - collapsed: false - Width: 3072 - X: 0 - Y: 54 diff --git a/legacy/aruco_service/srv/GenerateTableCuboid.srv b/legacy/aruco_service/srv/GenerateTableCuboid.srv deleted file mode 100644 index 8138d5cce..000000000 --- a/legacy/aruco_service/srv/GenerateTableCuboid.srv +++ /dev/null @@ -1,8 +0,0 @@ -int8 table -float64 long_side -float64 short_side -float64 padding -bool is_rect -float64 radius ---- -bool success \ No newline at end of file diff --git a/legacy/aruco_service/srv/PublishTablePoints.srv b/legacy/aruco_service/srv/PublishTablePoints.srv deleted file mode 100644 index 5c10e0c49..000000000 --- a/legacy/aruco_service/srv/PublishTablePoints.srv +++ /dev/null @@ -1,3 +0,0 @@ -int8 table ---- -bool success \ No newline at end of file diff --git a/legacy/aruco_service/srv/SaveNavigationPoint.srv b/legacy/aruco_service/srv/SaveNavigationPoint.srv deleted file mode 100644 index 5c10e0c49..000000000 --- a/legacy/aruco_service/srv/SaveNavigationPoint.srv +++ /dev/null @@ -1,3 +0,0 @@ -int8 table ---- -bool success \ No newline at end of file diff --git a/legacy/aruco_service/test_check_table_sim.yaml b/legacy/aruco_service/test_check_table_sim.yaml deleted file mode 100644 index 5672a5b9a..000000000 --- a/legacy/aruco_service/test_check_table_sim.yaml +++ /dev/null @@ -1,93 +0,0 @@ -counter: - cuboid: - - [1.5107849957816444, -0.25066567350926594] - - [1.2876042868157063, 0.9279327218929462] - - [0.6980933854538911, 0.8162488708444934] - - [0.9212740944198292, -0.36234952455771874] - last_updated: '2023-08-11 14:42:35.347921' - location: - orientation: {w: 0.0173693114911, x: 0.0, y: 0.0, z: -0.99} - position: {x: 0.222374471246, y: 5.10986001747, z: 0.0} -current_table: table0 -tables: - table0: - last_updated: '2023-08-11 14:39:42.428180' - location: - orientation: {w: 0.03, x: 0.0, y: 0.0, z: -0.99} - position: {x: -0.74, y: -3.57, z: 0.0} - semantic: end - num_persons: 0 - objects_cuboid: - - [1.5106148803956831, -0.2530914533537322] - - [1.295776049010358, 0.9270992669926367] - - [0.7054739490540517, 0.8196612763333845] - - [0.9203127804393768, -0.36052944401298437] - order: [] - persons_cuboid: - - [3.836353265892246, -1.8619493517335064] - - [2.9053849965558367, 3.2522104364340927] - - [-1.6202644364425114, 2.428519174713159] - - [-0.6892961671061022, -2.68564061345444] - pre_location: - orientation: {w: 0.715250767432, x: 0.0, y: 0.0, z: -0.698867898596} - position: {x: 1.70070851471, y: -0.2850247924, z: 0.0} - status: unvisited - table1: - last_updated: '2023-09-06 17:27:24.621675' - location: - orientation: {w: 0.6945330930107928, x: 0.0, y: 0.0, z: -0.7194607582855798} - position: {x: 0.2380382653418661, y: -1.9596508344283876, z: 0.0} - semantic: end - objects_cuboid: - - [0.18085621646545255, 0.4951742497371268] - - [1.3788119304369095, 0.44839179933338924] - - [1.4023456344766423, 1.0479236512678833] - - [0.20438992050518523, 1.094706101671621] - persons_cuboid: - - [-0.3379034177224317, 0.015057060793272237] - - [1.8583487245585726, -0.07071076494691336] - - [1.9211052686645265, 1.5280408402117382] - - [-0.27514687361647794, 1.6138086659519237] - table2: - last_updated: '2023-09-14 13:24:45.784027' - location: - orientation: {w: 0.8777675185589325, x: 0.0, y: 0.0, z: 0.4790868223640617} - position: {x: 4.268568695185875, y: 1.65876967686265, z: 0.0} - objects_cuboid: - - [4.14781513511814, 2.303367071557133] - - [5.152473956594257, 1.647248810124097] - - [5.480062020696485, 2.14933934009104] - - [4.475403199220368, 2.8054576015240755] - persons_cuboid: - - [3.4562172394179016, 2.158340905515112] - - [5.298091745457448, 0.955457426221213] - - [6.171659916396723, 2.294365506133061] - - [4.329785410357177, 3.4972489854269595] - table3: - last_updated: '2023-09-14 13:26:20.189639' - location: - orientation: {w: 0.9161691481201792, x: 0.0, y: 0.0, z: 0.40079183129493184} - position: {x: 3.2981378736303015, y: 2.2215985543521324, z: 0.0} - objects_cuboid: - - [3.2658046838385357, 3.0752199117922876] - - [4.258617072502906, 2.403343913032094] - - [4.594381212847623, 2.9004544748762413] - - [3.6015688241832535, 3.5723304736364354] - persons_cuboid: - - [2.572329404941117, 2.940909443072245] - - [4.392485450825795, 1.7091367786785567] - - [5.287856491745043, 3.0347649435962842] - - [3.467700445860364, 4.266537607989973] -wait: - cuboid: - - [1.5106714710118636, -0.2507169263966076] - - [1.2892009736373304, 0.9281830359742076] - - [0.6995199087568477, 0.8173865689933699] - - [0.9209904061313808, -0.36151339337744526] - last_updated: '2023-08-11 14:43:04.183469' - location: - orientation: {w: 0.658324712318, x: 0.0, y: 0.0, z: 0.752734065} - position: {x: 2.71006066106, y: 2.12491014098, z: 0.0} - pose: - orientation: {w: 0.988446808547, x: 0.0, y: 0.0, z: -0.151568158509} - position: {x: 2.67279863358, y: -0.270290255547, z: -0.00143432617188} diff --git a/legacy/aruco_service/test_lift_wait_position.yaml b/legacy/aruco_service/test_lift_wait_position.yaml deleted file mode 100644 index 5ba601877..000000000 --- a/legacy/aruco_service/test_lift_wait_position.yaml +++ /dev/null @@ -1,5 +0,0 @@ -corner 1: !!python/tuple [12.386118771657284, 28.238929907020307] -corner 2: !!python/tuple [12.971571544394878, 26.59451863098756] -corner 3: !!python/tuple [11.324766697049062, 26.01868978106935] -corner 4: !!python/tuple [10.739313924311467, 27.663101057102097] -wait position: !!python/tuple [10.362901387775281, 27.53148303426365] diff --git a/tasks/receptionist/launch/setup.launch b/tasks/receptionist/launch/setup.launch index 51f801911..b1fcf9a20 100644 --- a/tasks/receptionist/launch/setup.launch +++ b/tasks/receptionist/launch/setup.launch @@ -23,8 +23,8 @@ - - + + From ef0a5f168b9fec8c5209cf85fd639d0987ddc3f8 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 8 Feb 2024 17:20:41 +0000 Subject: [PATCH 42/69] At least the head moves, not looking at me though. --- .../src/lasr_vision_bodypix/bodypix.py | 8 +- skills/src/lasr_skills/describe_people.py | 294 +++++++++--------- .../receptionist/states/speakdescriptions.py | 3 +- 3 files changed, 159 insertions(+), 146 deletions(-) mode change 100644 => 100755 skills/src/lasr_skills/describe_people.py diff --git a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py index e4765814b..fb6d306cc 100644 --- a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py +++ b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py @@ -25,9 +25,13 @@ def load_model_cached(dataset: str) -> None: model = loaded_models[dataset] else: if dataset == 'resnet50': - model = load_model(download_model(BodyPixModelPaths.RESNET50_FLOAT_STRIDE_16)) + name = download_model(BodyPixModelPaths.RESNET50_FLOAT_STRIDE_16) + rospy.logwarn(name) + model = load_model(name) elif dataset == 'mobilenet50': - model = load_model(download_model(BodyPixModelPaths.MOBILENET_FLOAT_50_STRIDE_16)) + name = download_model(BodyPixModelPaths.MOBILENET_FLOAT_50_STRIDE_16) + rospy.logwarn(name) + model = load_model(name) else: model = load_model(dataset) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py old mode 100644 new mode 100755 index 19d4c97b9..37ab97749 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -18,34 +18,36 @@ from sensor_msgs.msg import PointCloud2 from control_msgs.msg import PointHeadAction, PointHeadGoal from geometry_msgs.msg import PointStamped +from pal_common_msgs.msg import DisableActionGoal, DisableAction -def point_head_client(xyz_array, u, v): - # rospy.init_node('point_head_client') - - rospy.logwarn('making client') - client = actionlib.SimpleActionClient('/head_controller/point_head_action', PointHeadAction) - client.wait_for_server() +# rospy.init_node('point_head_client') +client = actionlib.SimpleActionClient("/head_controller/point_head_action", PointHeadAction) # +rospy.logwarn('making client') + +def point_head_client(xyz_array, u, v, client): + u = 480 - 1 if u > 480 else u + v = 640 - 1 if v > 640 else u target_point = xyz_array[v, u] point_camera = PointStamped() point_camera.header.frame_id = "xtion_rgb_optical_frame" - point_camera.header.stamp = rospy.Time.now() - point_camera.point.x = target_point[0] - point_camera.point.y = target_point[1] - point_camera.point.z = target_point[2] + # point_camera.header.stamp = rospy.Time.now() + point_camera.point.x = target_point[0] if target_point[0] != np.nan else 0 + point_camera.point.y = target_point[1] if target_point[1] != np.nan else 0 + point_camera.point.z = target_point[2] if target_point[2] != np.nan else 0 goal = PointHeadGoal() goal.target = point_camera - goal.max_velocity = 1.0 + goal.max_velocity = 0.3 # goal.min_duration = rospy.Duration(1.0) - goal.pointing_frame = "/head_2_link" + goal.pointing_frame = "head_2_link" goal.pointing_axis.x = 1.0 goal.pointing_axis.y = 0.0 goal.pointing_axis.z = 0.0 - rospy.logwarn('sending the goal and waiting') - client.send_goal_and_wait(goal) + rospy.logwarn('sending the goal and waiting, moving to: %s' % str(list(target_point))) + client.send_goal(goal) rospy.logwarn('end') @@ -131,12 +133,15 @@ def execute(self, userdata): result = self.bodypix(userdata.img_msg_2d, "resnet50", 0.7, masks) userdata.bodypix_masks = result.masks rospy.loginfo("Found:::%s" % str(len(result.poses))) - neck_coord = (int(result.poses[0].coord[0]), int(result.poses[0].coord[1])) + try: + neck_coord = (int(result.poses[0].coord[0]), int(result.poses[0].coord[1])) + except Exception: + neck_coord = (240, 320) rospy.loginfo("COORD_XY:::%s" % str(neck_coord)) xyz = userdata.xyz # xyz = np.nanmean(xyz, axis=2) - rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) - point_head_client(xyz, neck_coord[0], neck_coord[1]) + # rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) + point_head_client(xyz, neck_coord[0], neck_coord[1], client) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") @@ -156,131 +161,134 @@ def __init__(self): '/torch/detect/face_features', TorchFaceFeatureDetection) def execute(self, userdata): - if len(userdata.people_detections) == 0: - rospy.logerr("Couldn't find anyone!") + try: + if len(userdata.people_detections) == 0: + rospy.logerr("Couldn't find anyone!") + return 'failed' + elif len(userdata.people_detections) == 1: + rospy.logdebug("There is one person.") + else: + rospy.logdebug( + f"There are {len(userdata.people_detections)} people.") + + img = userdata.img + height, width, _ = img.shape + + people = [] + + for person in userdata.people_detections: + rospy.logdebug( + f"\n\nFound person with confidence {person.confidence}!") + + # mask for this person + mask_image = np.zeros((height, width), np.uint8) + contours = np.array(person.xyseg).reshape(-1, 2) + cv2.fillPoly(mask_image, pts=np.int32( + [contours]), color=(255, 255, 255)) + mask_bin = mask_image > 128 + + # keep track + features = [] + + # process part masks + for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): + part_mask = np.array(bodypix_mask.mask).reshape( + bodypix_mask.shape[0], bodypix_mask.shape[1]) + + # filter out part for current person segmentation + try: + part_mask[mask_bin == 0] = 0 + except Exception: + rospy.logdebug('|> Failed to check {part} is visible') + continue + + if part_mask.any(): + rospy.logdebug(f'|> Person has {part} visible') + else: + rospy.logdebug( + f'|> Person does not have {part} visible') + continue + + if part == 'torso': + torso_mask = part_mask + elif part == 'head': + head_mask = part_mask + + torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) + head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) + + full_frame = cv2_img.cv2_img_to_msg(img) + features.extend(self.torch_face_features( + full_frame, + head_mask_data, head_mask_shape, head_mask_dtype, + torso_mask_data, torso_mask_shape, torso_mask_dtype, + ).detected_features) + + # # process part masks + # for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): + # part_mask = np.array(bodypix_mask.mask).reshape( + # bodypix_mask.shape[0], bodypix_mask.shape[1]) + + # # filter out part for current person segmentation + # try: + # part_mask[mask_bin == 0] = 0 + # except Exception: + # rospy.logdebug('|> Failed to check {part} is visible') + # continue + + # if part_mask.any(): + # rospy.logdebug(f'|> Person has {part} visible') + # else: + # rospy.logdebug( + # f'|> Person does not have {part} visible') + # continue + + # # do colour processing on the torso + # if part == 'torso': + # try: + # features.append(FeatureWithColour("torso", [ + # ColourPrediction(colour, distance) + # for colour, distance + # in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) + # ])) + # except Exception as e: + # rospy.logerr(f"Failed to process colour: {e}") + + # # do feature extraction on the head + # if part == 'head': + # try: + # # crop out face + # face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( + # userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) + + # mask_image_only_face = mask_image.copy() + # mask_image_only_face[face_mask == 0] = 0 + + # face_region = cv2_img.extract_mask_region( + # img, mask_image_only_face) + # if face_region is None: + # raise Exception( + # "Failed to extract mask region") + + # msg = cv2_img.cv2_img_to_msg(face_region) + # features.extend(self.torch_face_features( + # msg, False).detected_features) + # except Exception as e: + # rospy.logerr(f"Failed to process extraction: {e}") + + people.append({ + 'detection': person, + 'features': features + }) + + # Userdata: + # - people + # - - detection (YOLO) + # - parts + # - - part + # - mask + + userdata['people'] = people + except Exception: return 'failed' - elif len(userdata.people_detections) == 1: - rospy.logdebug("There is one person.") - else: - rospy.logdebug( - f"There are {len(userdata.people_detections)} people.") - - img = userdata.img - height, width, _ = img.shape - - people = [] - - for person in userdata.people_detections: - rospy.logdebug( - f"\n\nFound person with confidence {person.confidence}!") - - # mask for this person - mask_image = np.zeros((height, width), np.uint8) - contours = np.array(person.xyseg).reshape(-1, 2) - cv2.fillPoly(mask_image, pts=np.int32( - [contours]), color=(255, 255, 255)) - mask_bin = mask_image > 128 - - # keep track - features = [] - - # process part masks - for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): - part_mask = np.array(bodypix_mask.mask).reshape( - bodypix_mask.shape[0], bodypix_mask.shape[1]) - - # filter out part for current person segmentation - try: - part_mask[mask_bin == 0] = 0 - except Exception: - rospy.logdebug('|> Failed to check {part} is visible') - continue - - if part_mask.any(): - rospy.logdebug(f'|> Person has {part} visible') - else: - rospy.logdebug( - f'|> Person does not have {part} visible') - continue - - if part == 'torso': - torso_mask = part_mask - elif part == 'head': - head_mask = part_mask - - torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) - head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) - - full_frame = cv2_img.cv2_img_to_msg(img) - features.extend(self.torch_face_features( - full_frame, - head_mask_data, head_mask_shape, head_mask_dtype, - torso_mask_data, torso_mask_shape, torso_mask_dtype, - ).detected_features) - - # # process part masks - # for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): - # part_mask = np.array(bodypix_mask.mask).reshape( - # bodypix_mask.shape[0], bodypix_mask.shape[1]) - - # # filter out part for current person segmentation - # try: - # part_mask[mask_bin == 0] = 0 - # except Exception: - # rospy.logdebug('|> Failed to check {part} is visible') - # continue - - # if part_mask.any(): - # rospy.logdebug(f'|> Person has {part} visible') - # else: - # rospy.logdebug( - # f'|> Person does not have {part} visible') - # continue - - # # do colour processing on the torso - # if part == 'torso': - # try: - # features.append(FeatureWithColour("torso", [ - # ColourPrediction(colour, distance) - # for colour, distance - # in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) - # ])) - # except Exception as e: - # rospy.logerr(f"Failed to process colour: {e}") - - # # do feature extraction on the head - # if part == 'head': - # try: - # # crop out face - # face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( - # userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) - - # mask_image_only_face = mask_image.copy() - # mask_image_only_face[face_mask == 0] = 0 - - # face_region = cv2_img.extract_mask_region( - # img, mask_image_only_face) - # if face_region is None: - # raise Exception( - # "Failed to extract mask region") - - # msg = cv2_img.cv2_img_to_msg(face_region) - # features.extend(self.torch_face_features( - # msg, False).detected_features) - # except Exception as e: - # rospy.logerr(f"Failed to process extraction: {e}") - - people.append({ - 'detection': person, - 'features': features - }) - - # Userdata: - # - people - # - - detection (YOLO) - # - parts - # - - part - # - mask - - userdata['people'] = people return 'succeeded' diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py index 42e7546e8..4b145b351 100644 --- a/tasks/receptionist/src/receptionist/states/speakdescriptions.py +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -10,7 +10,8 @@ def __init__(self, default): def execute(self, userdata): # for person in userdata['people']: # self.default.voice.speak('I see a person') - + # self.default.voice.speak('Yes I do see you. I am trying to turn to you. But if I do not move my head, it is your own issue, not mine.') + # for feature in person['features']: # if feature.label: # if len(feature.colours) == 0: From 86e7a3e83b1cc34bcda4f1f7e70b16ea0066a2e4 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 23 Feb 2024 13:02:43 +0000 Subject: [PATCH 43/69] Cleaned the file to have only one model appear. --- .../src/torch_module/modules/__init__.py | 243 ++++-------------- skills/src/lasr_skills/vision/get_image.py | 2 +- 2 files changed, 45 insertions(+), 200 deletions(-) diff --git a/common/helpers/torch_module/src/torch_module/modules/__init__.py b/common/helpers/torch_module/src/torch_module/modules/__init__.py index 26331726f..ff6ec81c2 100644 --- a/common/helpers/torch_module/src/torch_module/modules/__init__.py +++ b/common/helpers/torch_module/src/torch_module/modules/__init__.py @@ -4,134 +4,7 @@ import torchvision.models as models -class CombinedModelNoRegression(nn.Module): - def __init__(self, segment_model: nn.Module, predict_model: nn.Module, cat_layers: int = None): - super(CombinedModelNoRegression, self).__init__() - self.segment_model = segment_model - self.predict_model = predict_model - self.cat_layers = cat_layers - - def forward(self, x: torch.Tensor): - seg_masks = self.segment_model(x) - if self.cat_layers: - seg_masks_ = seg_masks[:, 0:self.cat_layers] - x = torch.cat((x, seg_masks_), dim=1) - else: - x = torch.cat((x, seg_masks), dim=1) - logic_outputs = self.predict_model(x) - return seg_masks, logic_outputs - - -class ASPP(nn.Module): - def __init__(self, in_channels, out_channels): - super(ASPP, self).__init__() - self.atrous_block1 = nn.Conv2d(in_channels, out_channels, 1, 1) - self.atrous_block6 = nn.Conv2d( - in_channels, out_channels, 3, padding=6, dilation=6) - self.atrous_block12 = nn.Conv2d( - in_channels, out_channels, 3, padding=12, dilation=12) - self.atrous_block18 = nn.Conv2d( - in_channels, out_channels, 3, padding=18, dilation=18) - self.conv_out = nn.Conv2d(out_channels * 4, out_channels, 1, 1) - - def forward(self, x): - x1 = self.atrous_block1(x) - x6 = self.atrous_block6(x) - x12 = self.atrous_block12(x) - x18 = self.atrous_block18(x) - x = torch.cat([x1, x6, x12, x18], dim=1) - return self.conv_out(x) - - -class DeepLabV3PlusMobileNetV3(nn.Module): - def __init__(self, num_classes, in_channels=3, sigmoid=True): - super(DeepLabV3PlusMobileNetV3, self).__init__() - self.sigmoid = sigmoid - mobilenet_v3 = models.mobilenet_v3_large(pretrained=True) - - if in_channels != 3: - mobilenet_v3.features[0][0] = nn.Conv2d( - in_channels, 16, kernel_size=3, stride=2, padding=1, bias=False - ) - - self.encoder = mobilenet_v3.features - - intermediate_channel = self.encoder[-1].out_channels - self.aspp = ASPP(intermediate_channel, 256) - - self.decoder = nn.Sequential( - # Concatenated with original input - nn.Conv2d(256 + in_channels, 256, kernel_size=3, padding=1), - nn.ReLU(inplace=True), - nn.Conv2d(256, 256, kernel_size=3, padding=1), - nn.ReLU(inplace=True), - nn.Conv2d(256, num_classes, kernel_size=1) - ) - - def forward(self, x): - original_input = x - x_encoded = self.encoder(x) - x_aspp = self.aspp(x_encoded) - - x = F.interpolate( - x_aspp, size=original_input.shape[2:], mode='bilinear', align_corners=False) - # Concatenate with original input - x = torch.cat([x, original_input], dim=1) - x = self.decoder(x) - - if self.sigmoid: - x = torch.sigmoid(x) - - return x - - -class MultiLabelMobileNetV3Small(nn.Module): - def __init__(self, num_labels, input_channels=3, sigmoid=True, pretrained=True): - super(MultiLabelMobileNetV3Small, self).__init__() - mobilenet_v3_small = models.mobilenet_v3_small(pretrained=pretrained) - self.sigmoid = sigmoid - - if input_channels != 3: - mobilenet_v3_small.features[0][0] = nn.Conv2d( - input_channels, 16, kernel_size=3, stride=2, padding=1, bias=False - ) - - self.model = mobilenet_v3_small - - num_ftrs = self.model.classifier[3].in_features - self.model.classifier[3] = nn.Linear(num_ftrs, num_labels) - - def forward(self, x): - x = self.model(x) - if self.sigmoid: - x = torch.sigmoid(x) - return x - - -class MultiLabelMobileNetV3Large(nn.Module): - def __init__(self, num_labels, input_channels=3, sigmoid=True, pretrained=True): - super(MultiLabelMobileNetV3Large, self).__init__() - mobilenet_v3_small = models.mobilenet_v3_large(pretrained=pretrained) - self.sigmoid = sigmoid - - if input_channels != 3: - mobilenet_v3_small.features[0][0] = nn.Conv2d( - input_channels, 16, kernel_size=3, stride=2, padding=1, bias=False - ) - - self.model = mobilenet_v3_small - - num_ftrs = self.model.classifier[3].in_features - self.model.classifier[3] = nn.Linear(num_ftrs, num_labels) - - def forward(self, x): - x = self.model(x) - if self.sigmoid: - x = torch.sigmoid(x) - return x - - -def x2conv(in_channels, out_channels, inner_channels=None): +def X2conv(in_channels, out_channels, inner_channels=None): inner_channels = out_channels // 2 if inner_channels is None else inner_channels down_conv = nn.Sequential( nn.Conv2d(in_channels, inner_channels, kernel_size=3, padding=1, bias=False), @@ -143,78 +16,40 @@ def x2conv(in_channels, out_channels, inner_channels=None): return down_conv -class Encoder(nn.Module): - def __init__(self, in_channels, out_channels): - super(Encoder, self).__init__() - self.down_conv = x2conv(in_channels, out_channels) - self.pool = nn.MaxPool2d(kernel_size=2, ceil_mode=True) - - def forward(self, x): - x = self.down_conv(x) - x = self.pool(x) - return x - - class Decoder(nn.Module): - def __init__(self, in_channels, out_channels): + def __init__(self, in_channels, skip_channels, out_channels): super(Decoder, self).__init__() - self.up = nn.ConvTranspose2d(in_channels, in_channels // 2, kernel_size=2, stride=2) - self.up_conv = x2conv(in_channels, out_channels) + self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2) + self.up_conv = X2conv(out_channels + skip_channels, out_channels) - def forward(self, x_copy, x, interpolate=True): + def forward(self, x_copy, x): x = self.up(x) - - if (x.size(2) != x_copy.size(2)) or (x.size(3) != x_copy.size(3)): - if interpolate: - # Iterpolating instead of padding - x = F.interpolate(x, size=(x_copy.size(2), x_copy.size(3)), - mode="bilinear", align_corners=True) - else: - # Padding in case the incomping volumes are of different sizes - diffY = x_copy.size()[2] - x.size()[2] - diffX = x_copy.size()[3] - x.size()[3] - x = F.pad(x, (diffX // 2, diffX - diffX // 2, - diffY // 2, diffY - diffY // 2)) - - # Concatenate - x = torch.cat([x_copy, x], dim=1) + if x.size(2) != x_copy.size(2) or x.size(3) != x_copy.size(3): + x = F.interpolate(x, size=(x_copy.size(2), x_copy.size(3)), mode='bilinear', align_corners=True) + x = torch.cat((x_copy, x), dim=1) x = self.up_conv(x) return x -class UNetWithResnet18Encoder(nn.Module): - class Decoder(nn.Module): - def __init__(self, in_channels, skip_channels, out_channels): - super(UNetWithResnet18Encoder.Decoder, self).__init__() - self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2) - self.up_conv = x2conv(out_channels + skip_channels, out_channels) - - def forward(self, x_copy, x): - x = self.up(x) - if x.size(2) != x_copy.size(2) or x.size(3) != x_copy.size(3): - x = F.interpolate(x, size=(x_copy.size(2), x_copy.size(3)), mode='bilinear', align_corners=True) - x = torch.cat((x_copy, x), dim=1) - x = self.up_conv(x) - return x - +class UNetWithResnetEncoder(nn.Module): def __init__(self, num_classes, in_channels=3, freeze_bn=False, sigmoid=True): - super(UNetWithResnet18Encoder, self).__init__() + super(UNetWithResnetEncoder, self).__init__() self.sigmoid = sigmoid - resnet18 = models.resnet18(pretrained=True) - + self.resnet = models.resnet34(pretrained=True) # Initialize with a ResNet model + if in_channels != 3: - resnet18.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) + self.resnet.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) - self.encoder1 = nn.Sequential(resnet18.conv1, resnet18.bn1, resnet18.relu) - self.encoder2 = resnet18.layer1 - self.encoder3 = resnet18.layer2 - self.encoder4 = resnet18.layer3 - self.encoder5 = resnet18.layer4 + self.encoder1 = nn.Sequential(self.resnet.conv1, self.resnet.bn1, self.resnet.relu) + self.encoder2 = self.resnet.layer1 + self.encoder3 = self.resnet.layer2 + self.encoder4 = self.resnet.layer3 + self.encoder5 = self.resnet.layer4 - self.up1 = UNetWithResnet18Encoder.Decoder(512, 256, 256) - self.up2 = UNetWithResnet18Encoder.Decoder(256, 128, 128) - self.up3 = UNetWithResnet18Encoder.Decoder(128, 64, 64) - self.up4 = UNetWithResnet18Encoder.Decoder(64, 64, 64) + self.up1 = Decoder(512, 256, 256) + self.up2 = Decoder(256, 128, 128) + self.up3 = Decoder(128, 64, 64) + self.up4 = Decoder(64, 64, 64) self.final_conv = nn.Conv2d(64, num_classes, kernel_size=1) self._initialize_weights() @@ -233,7 +68,7 @@ def _initialize_weights(self): module.bias.data.zero_() def forward(self, x): - x1 = self.encoder1(x) + x1 = self.encoder1(x) x2 = self.encoder2(x1) x3 = self.encoder3(x2) x4 = self.encoder4(x3) @@ -243,10 +78,10 @@ def forward(self, x): x = self.up2(x3, x) x = self.up3(x2, x) x = self.up4(x1, x) - x = F.interpolate(x, size=(x.size(2)*2, x.size(3)*2), mode='bilinear', align_corners=True) + x = F.interpolate(x, size=(x.size(2) * 2, x.size(3) * 2), mode='bilinear', align_corners=True) x = self.final_conv(x) - + if self.sigmoid: x = torch.sigmoid(x) return x @@ -256,18 +91,23 @@ def freeze_bn(self): if isinstance(module, nn.BatchNorm2d): module.eval() + def unfreeze_bn(self): + for module in self.modules(): + if isinstance(module, nn.BatchNorm2d): + module.train() + class MultiLabelResNet(nn.Module): - def __init__(self, num_labels, input_channels=3, sigmoid=True, pretrained=True,): + def __init__(self, num_labels, input_channels=3, sigmoid=True, pretrained=True, ): super(MultiLabelResNet, self).__init__() - self.model = models.resnet18(pretrained=pretrained) + self.model = models.resnet34(pretrained=pretrained) self.sigmoid = sigmoid if input_channels != 3: self.model.conv1 = nn.Conv2d(input_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) - + num_ftrs = self.model.fc.in_features - + self.model.fc = nn.Linear(num_ftrs, num_labels) def forward(self, x): @@ -278,21 +118,26 @@ def forward(self, x): class CombinedModel(nn.Module): - def __init__(self, segment_model: nn.Module, predict_model: nn.Module, cat_layers:int=None): + def __init__(self, segment_model: nn.Module, predict_model: nn.Module, cat_layers: int = None): super(CombinedModel, self).__init__() self.segment_model = segment_model self.predict_model = predict_model self.cat_layers = cat_layers + self.freeze_seg = False def forward(self, x: torch.Tensor): seg_masks = self.segment_model(x) - + seg_masks_ = seg_masks.detach() if self.cat_layers: - seg_masks_ = seg_masks[:, 0:self.cat_layers] + seg_masks_ = seg_masks_[:, 0:self.cat_layers] x = torch.cat((x, seg_masks_), dim=1) else: - x = torch.cat((x, seg_masks), dim=1) - + x = torch.cat((x, seg_masks_), dim=1) logic_outputs = self.predict_model(x) return seg_masks, logic_outputs + def freeze_segment_model(self): + self.segment_model.eval() + + def unfreeze_segment_model(self): + self.segment_model.train() diff --git a/skills/src/lasr_skills/vision/get_image.py b/skills/src/lasr_skills/vision/get_image.py index edad9c078..c82ac26e4 100644 --- a/skills/src/lasr_skills/vision/get_image.py +++ b/skills/src/lasr_skills/vision/get_image.py @@ -57,7 +57,7 @@ def execute(self, userdata): class Get2DAnd3DImages(smach.State): """ - State for reading an sensor_msgs Image message + State for reading an sensor_msgs Image message, get 2d and 3d messages simutainously """ def __init__(self, topic: str = None): From 3e384d1053f95f9a5240e468bd87649907389e79 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 23 Feb 2024 14:05:06 +0000 Subject: [PATCH 44/69] Replace the old model with the new one. --- common/vision/lasr_vision_msgs/CMakeLists.txt | 2 + .../lasr_vision_msgs/msg/Description.msg | 1 + .../TorchFaceFeatureDetectionDescription.srv | 14 + common/vision/lasr_vision_torch/nodes/service | 30 +- .../src/lasr_vision_torch/__init__.py | 437 ++++++++++-------- .../categories_and_attributes.py | 62 +++ .../image_with_masks_and_attributes.py | 133 ++++++ skills/src/lasr_skills/describe_people.py | 20 +- .../receptionist/states/speakdescriptions.py | 2 + 9 files changed, 494 insertions(+), 207 deletions(-) create mode 100644 common/vision/lasr_vision_msgs/msg/Description.msg create mode 100644 common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetectionDescription.srv create mode 100644 common/vision/lasr_vision_torch/src/lasr_vision_torch/categories_and_attributes.py create mode 100644 common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py diff --git a/common/vision/lasr_vision_msgs/CMakeLists.txt b/common/vision/lasr_vision_msgs/CMakeLists.txt index 491efb56d..611316d32 100644 --- a/common/vision/lasr_vision_msgs/CMakeLists.txt +++ b/common/vision/lasr_vision_msgs/CMakeLists.txt @@ -51,6 +51,7 @@ add_message_files( BodyPixMaskRequest.msg ColourPrediction.msg FeatureWithColour.msg + # Description.msg ) ## Generate services in the 'srv' folder @@ -59,6 +60,7 @@ add_service_files( YoloDetection.srv BodyPixDetection.srv TorchFaceFeatureDetection.srv + TorchFaceFeatureDetectionDescription.srv ) ## Generate actions in the 'action' folder diff --git a/common/vision/lasr_vision_msgs/msg/Description.msg b/common/vision/lasr_vision_msgs/msg/Description.msg new file mode 100644 index 000000000..48d2eb86f --- /dev/null +++ b/common/vision/lasr_vision_msgs/msg/Description.msg @@ -0,0 +1 @@ +string discription diff --git a/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetectionDescription.srv b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetectionDescription.srv new file mode 100644 index 000000000..a08f5bb52 --- /dev/null +++ b/common/vision/lasr_vision_msgs/srv/TorchFaceFeatureDetectionDescription.srv @@ -0,0 +1,14 @@ +# Image to run inference on +sensor_msgs/Image image_raw + +uint8[] head_mask_data # For serialized array data +uint32[] head_mask_shape # To store the shape of the array +string head_mask_dtype # Data type of the array elements + +uint8[] torso_mask_data +uint32[] torso_mask_shape +string torso_mask_dtype +--- + +# Detection result +string description diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index d81a01d3e..59065f702 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -1,4 +1,4 @@ -from lasr_vision_msgs.srv import TorchFaceFeatureDetection, TorchFaceFeatureDetectionRequest, TorchFaceFeatureDetectionResponse +from lasr_vision_msgs.srv import TorchFaceFeatureDetection, TorchFaceFeatureDetectionRequest, TorchFaceFeatureDetectionResponse, TorchFaceFeatureDetectionDescriptionRequest, TorchFaceFeatureDetectionDescriptionResponse from lasr_vision_msgs.msg import FeatureWithColour, ColourPrediction from cv2_img import msg_to_cv2_img from torch_module.helpers import binary_erosion_dilation, median_color_float @@ -13,7 +13,7 @@ import lasr_vision_torch from os import path -def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetectionResponse: +def detect(request: TorchFaceFeatureDetectionDescriptionRequest) -> TorchFaceFeatureDetectionDescriptionRequest: # decode the image rospy.loginfo('Decoding') full_frame = msg_to_cv2_img(request.image_raw) @@ -24,20 +24,22 @@ def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetecti head_frame = lasr_vision_torch.extract_mask_region(full_frame, head_mask.astype(np.uint8), expand_x=0.4, expand_y=0.5) torso_frame = lasr_vision_torch.extract_mask_region(full_frame, torso_mask.astype(np.uint8), expand_x=0.2, expand_y=0.0) - class_pred, colour_pred = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) + # class_pred, colour_pred = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) + rst_str = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) - response = TorchFaceFeatureDetectionResponse() + response = TorchFaceFeatureDetectionDescriptionRequest() + response.description = rst_str # response.detected_features = str(class_pred) + str(colour_pred) - response.detected_features = [] - for c in ['hair', 'hat', 'glasses', 'cloth',]: - # colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} - sorted_list = sorted(colour_pred[c].items(), key=lambda item: item[1], reverse=True) - # rospy.loginfo(str(sorted_list)) - if len(sorted_list) > 3: - sorted_list = sorted_list[0:3] - sorted_list = [k for k, v in sorted_list] - # rospy.loginfo(str(colour_pred[c])) - response.detected_features.append(FeatureWithColour(c, class_pred[c], sorted_list)) + # response.detected_features = [] + # for c in ['hair', 'hat', 'glasses', 'cloth',]: + # # colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} + # sorted_list = sorted(colour_pred[c].items(), key=lambda item: item[1], reverse=True) + # # rospy.loginfo(str(sorted_list)) + # if len(sorted_list) > 3: + # sorted_list = sorted_list[0:3] + # sorted_list = [k for k, v in sorted_list] + # # rospy.loginfo(str(colour_pred[c])) + # response.detected_features.append(FeatureWithColour(c, class_pred[c], sorted_list)) return response diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index e2fa4d725..1498265c2 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -1,8 +1,10 @@ -from torch_module.modules import UNetWithResnet18Encoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression +from torch_module.modules import UNetWithResnetEncoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression from torch_module.helpers import load_torch_model, binary_erosion_dilation from colour_estimation import load_images_to_dict, generate_colour_table, count_colours_in_masked_area, compare_colour_distributions from colour_estimation import SPESIFIC_COLOURS, DETAILED_COLOURS +from categories_and_attributes import CelebAMaskHQCategoriesAndAttributes +from image_with_masks_and_attributes import ImageWithMasksAndAttributes, ImageOfPerson import numpy as np import cv2 @@ -14,10 +16,56 @@ # import matplotlib.pyplot as plt +class Predictor: + def __init__(self, model: torch.nn.Module, device: torch.device, categories_and_attributes: CategoriesAndAttributes): + self.model = model + self.device = device + self.categories_and_attributes = categories_and_attributes + + self._thresholds_mask: list[float] = [] + self._thresholds_pred: list[float] = [] + for key in sorted(list(self.categories_and_attributes.merged_categories.keys())): + self._thresholds_mask.append(self.categories_and_attributes.thresholds_mask[key]) + for attribute in self.categories_and_attributes.attributes: + if attribute not in self.categories_and_attributes.avoided_attributes: + self._thresholds_pred.append(self.categories_and_attributes.thresholds_pred[attribute]) + + def predict(self, rgb_image: np.ndarray) -> ImageWithMasksAndAttributes: + mean_val = np.mean(rgb_image) + image_tensor = torch.from_numpy(rgb_image).permute(2, 0, 1).unsqueeze(0).float() / 255.0 + pred_masks, pred_classes = self.model(image_tensor) + # Apply binary erosion and dilation to the masks + pred_masks = binary_erosion_dilation( + pred_masks, thresholds=self._thresholds_mask, + erosion_iterations=1, dilation_iterations=1 + ) + pred_masks = pred_masks.detach().squeeze(0).numpy().astype(np.uint8) + mask_list = [pred_masks[i, :, :] for i in range(pred_masks.shape[0])] + pred_classes = pred_classes.detach().squeeze(0).numpy() + class_list = [pred_classes[i].item() for i in range(pred_classes.shape[0])] + # print(rgb_image) + print(mean_val) + print(pred_classes) + mask_dict = {} + for i, mask in enumerate(mask_list): + mask_dict[self.categories_and_attributes.mask_categories[i]] = mask + attribute_dict = {} + class_list_iter = class_list.__iter__() + for attribute in self.categories_and_attributes.attributes: + if attribute not in self.categories_and_attributes.avoided_attributes: + attribute_dict[attribute] = class_list_iter.__next__() + for attribute in self.categories_and_attributes.mask_labels: + attribute_dict[attribute] = class_list_iter.__next__() + image_obj = ImageWithMasksAndAttributes(rgb_image, mask_dict, attribute_dict, self.categories_and_attributes) + return image_obj + + def load_face_classifier_model(): - cat_layers = 4 - segment_model = UNetWithResnet18Encoder(num_classes=4) - predict_model = MultiLabelResNet(num_labels=4, input_channels=7) + cat_layers = CelebAMaskHQCategoriesAndAttributes.merged_categories.keys().__len__() + segment_model = UNetWithResnetEncoder(num_classes=cat_layers) + predictions = len(CelebAMaskHQCategoriesAndAttributes.attributes) - len( + CelebAMaskHQCategoriesAndAttributes.avoided_attributes) + len(CelebAMaskHQCategoriesAndAttributes.mask_labels) + predict_model = MultiLabelResNet(num_labels=predictions, input_channels=cat_layers + 3) model = CombinedModel(segment_model, predict_model, cat_layers=cat_layers) model.eval() @@ -28,25 +76,26 @@ def load_face_classifier_model(): model = load_face_classifier_model() -# setups -face_th_rate = 0.05 -thresholds_mask = [ - 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, -] -thresholds_pred = [ - 0.6, 0.8, 0.1, 0.5, -] -erosion_iterations = 1 -dilation_iterations = 1 -colour_distance_rate = 1.2 -categories = ['hair', 'hat', 'glasses', 'face',] -cat_layers = 4 - -# prepare hair colour table -r = rospkg.RosPack() -image_dict = load_images_to_dict(path.join(r.get_path( - "colour_estimation"), "hair_colours")) -hair_colour_table = generate_colour_table(image_dict, SPESIFIC_COLOURS) + +# # setups +# face_th_rate = 0.05 +# thresholds_mask = [ +# 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, +# ] +# thresholds_pred = [ +# 0.6, 0.8, 0.1, 0.5, +# ] +# erosion_iterations = 1 +# dilation_iterations = 1 +# colour_distance_rate = 1.2 +# categories = ['hair', 'hat', 'glasses', 'face',] +# cat_layers = 4 + +# # prepare hair colour table +# r = rospkg.RosPack() +# image_dict = load_images_to_dict(path.join(r.get_path( +# "colour_estimation"), "hair_colours")) +# hair_colour_table = generate_colour_table(image_dict, SPESIFIC_COLOURS) def pad_image_to_even_dims(image): @@ -95,186 +144,202 @@ def extract_mask_region(frame, mask, expand_x=0.5, expand_y=0.5): return None -def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): - """ - Processes the head frame to extract class counts and color information for head-related classes. - - Args: - - head_frame (np.ndarray): The head frame extracted by the BodyPix model. - - model: A PyTorch model instance for classifying and predicting masks for head features. - - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. - - thresholds_pred: A list of prediction thresholds. - - Returns: - - Tuple[dict, dict]: A tuple containing two dictionaries: - - head_class_count: A dictionary with counts for each head-related class. - - head_class_colours: A dictionary with color information for each head-related class. - """ - head_class_count = { - 'hair': 0, - 'hat': 0, - 'glasses': 0, - } - head_class_colours = { - 'hair': {}, - 'hat': {}, - 'glasses': {}, - } - - if head_frame is not None: - # try: - # r = rospkg.RosPack() - # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) - # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) - # except Exception as ignore: - # pass - - # Convert head frame to PyTorch tensor and normalize - head_frame_tensor = torch.from_numpy(head_frame).permute(2, 0, 1).unsqueeze(0).float() / 255.0 - masks_batch_pred, pred_classes = model(head_frame_tensor) +# def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): +# """ +# Processes the head frame to extract class counts and color information for head-related classes. - # Apply binary erosion and dilation to the masks - processed_masks = binary_erosion_dilation( - masks_batch_pred, thresholds=thresholds_mask, - erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations - ) - masks = processed_masks.detach().squeeze(0).numpy().astype(np.uint8) - mask_list = [masks[i,:,:] for i in range(masks.shape[0])] - pred_classes = pred_classes.detach().squeeze(0).numpy() +# Args: +# - head_frame (np.ndarray): The head frame extracted by the BodyPix model. +# - model: A PyTorch model instance for classifying and predicting masks for head features. +# - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. +# - thresholds_pred: A list of prediction thresholds. - # Determine if each class is present - class_list = [pred_classes[i].item() > thresholds_pred[i] for i in range(pred_classes.shape[0])] +# Returns: +# - Tuple[dict, dict]: A tuple containing two dictionaries: +# - head_class_count: A dictionary with counts for each head-related class. +# - head_class_colours: A dictionary with color information for each head-related class. +# """ +# head_class_count = { +# 'hair': 0, +# 'hat': 0, +# 'glasses': 0, +# } +# head_class_colours = { +# 'hair': {}, +# 'hat': {}, +# 'glasses': {}, +# } - # Update class count - for each_class, k in zip(class_list[0:3], ['hair', 'hat', 'glasses']): - head_class_count[k] = int(each_class) +# if head_frame is not None: +# # try: +# # r = rospkg.RosPack() +# # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) +# # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) +# # except Exception as ignore: +# # pass + +# # Convert head frame to PyTorch tensor and normalize +# head_frame_tensor = torch.from_numpy(head_frame).permute(2, 0, 1).unsqueeze(0).float() / 255.0 +# masks_batch_pred, pred_classes = model(head_frame_tensor) + +# # Apply binary erosion and dilation to the masks +# processed_masks = binary_erosion_dilation( +# masks_batch_pred, thresholds=thresholds_mask, +# erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations +# ) +# masks = processed_masks.detach().squeeze(0).numpy().astype(np.uint8) +# mask_list = [masks[i,:,:] for i in range(masks.shape[0])] +# pred_classes = pred_classes.detach().squeeze(0).numpy() + +# # Determine if each class is present +# class_list = [pred_classes[i].item() > thresholds_pred[i] for i in range(pred_classes.shape[0])] + +# # Update class count +# for each_class, k in zip(class_list[0:3], ['hair', 'hat', 'glasses']): +# head_class_count[k] = int(each_class) + +# # Update class colours +# for f, each_mask, k, c_map in zip([head_frame, head_frame, head_frame], mask_list[0:2], ['hair', 'hat', 'glasses'], [SPESIFIC_COLOURS, DETAILED_COLOURS, DETAILED_COLOURS]): +# colours = count_colours_in_masked_area(f, each_mask, c_map, sort=True)[1] +# # colours = [c in ] +# for colour in colours: +# head_class_colours[k][colour[0]] = colour[1] +# # if colour[0] not in head_class_colours[k]: +# # head_class_colours[k][colour[0]] = [colour[1]] +# # else: +# # head_class_colours[k][colour[0]].append(colour[1]) + +# return head_class_count, head_class_colours + + +# def process_cloth(full_frame, torso_mask): +# """ +# Processes the full frame with the torso mask to extract class counts and color information for cloth. - # Update class colours - for f, each_mask, k, c_map in zip([head_frame, head_frame, head_frame], mask_list[0:2], ['hair', 'hat', 'glasses'], [SPESIFIC_COLOURS, DETAILED_COLOURS, DETAILED_COLOURS]): - colours = count_colours_in_masked_area(f, each_mask, c_map, sort=True)[1] - # colours = [c in ] - for colour in colours: - head_class_colours[k][colour[0]] = colour[1] - # if colour[0] not in head_class_colours[k]: - # head_class_colours[k][colour[0]] = [colour[1]] - # else: - # head_class_colours[k][colour[0]].append(colour[1]) +# Args: +# - full_frame (np.ndarray): The full original frame from the video source. +# - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. - return head_class_count, head_class_colours +# Returns: +# - Tuple[dict, dict]: A tuple containing two dictionaries: +# - cloth_class_count: A dictionary with counts for the cloth class. +# - cloth_class_colours: A dictionary with color information for the cloth class. +# """ +# cloth_class_count = { +# 'cloth': 0, +# } +# cloth_class_colours = { +# 'cloth': {}, +# } +# # Check if cloth is detected +# if torso_mask is not None and np.sum(torso_mask) >= 50: +# cloth_class_count['cloth'] = 1 -def process_cloth(full_frame, torso_mask): - """ - Processes the full frame with the torso mask to extract class counts and color information for cloth. +# # Update cloth colours +# colours = count_colours_in_masked_area(full_frame, torso_mask, DETAILED_COLOURS, sort=True)[1] +# for colour in colours: +# cloth_class_colours['cloth'][colour[0]] = colour[1] +# # if colour[0] not in cloth_class_colours['cloth']: +# # cloth_class_colours['cloth'][colour[0]] = [colour[1]] +# # else: +# # cloth_class_colours['cloth'][colour[0]].append(colour[1]) - Args: - - full_frame (np.ndarray): The full original frame from the video source. - - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. +# return cloth_class_count, cloth_class_colours - Returns: - - Tuple[dict, dict]: A tuple containing two dictionaries: - - cloth_class_count: A dictionary with counts for the cloth class. - - cloth_class_colours: A dictionary with color information for the cloth class. - """ - cloth_class_count = { - 'cloth': 0, - } - cloth_class_colours = { - 'cloth': {}, - } - - # Check if cloth is detected - if torso_mask is not None and np.sum(torso_mask) >= 50: - cloth_class_count['cloth'] = 1 - - # Update cloth colours - colours = count_colours_in_masked_area(full_frame, torso_mask, DETAILED_COLOURS, sort=True)[1] - for colour in colours: - cloth_class_colours['cloth'][colour[0]] = colour[1] - # if colour[0] not in cloth_class_colours['cloth']: - # cloth_class_colours['cloth'][colour[0]] = [colour[1]] - # else: - # cloth_class_colours['cloth'][colour[0]].append(colour[1]) - - return cloth_class_count, cloth_class_colours - - -# you can use this function directly for prediction. -def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): - """ - Predicts classes and color information for a single processed video frame. - - Args: - - head_frame (np.ndarray): The head frame extracted by the BodyPix model. - - full_frame (np.ndarray): The full original frame from the video source. - - head_mask (np.ndarray): The head mask extracted by the BodyPix model. - - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. - - model: A PyTorch model instance for classifying and predicting masks for head features. - - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. - - thresholds_pred: A list of prediction thresholds. - - Returns: - - Tuple[dict, dict]: A tuple containing: - - class_pred: A dictionary with predicted classes for the single frame. - - colour_pred: A dictionary with predicted colors for the single frame. - """ - class_count = { - 'hair': 0, - 'hat': 0, - 'glasses': 0, - 'cloth': 0, - } - class_colours = { - 'hair': {}, - 'hat': {}, - 'glasses': {}, - 'cloth': {}, - } +p = Predictor(model, torch.device('cpu'), CelebAMaskHQCategoriesAndAttributes) + + +def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): full_frame = cv2.cvtColor(full_frame, cv2.COLOR_BGR2RGB) head_frame = cv2.cvtColor(head_frame, cv2.COLOR_BGR2RGB) torso_frame = cv2.cvtColor(torso_frame, cv2.COLOR_BGR2RGB) head_frame = pad_image_to_even_dims(head_frame) torso_frame = pad_image_to_even_dims(torso_frame) + + rst = ImageOfPerson.from_parent_instance(p.predict(full_frame)) + + return rst.describe() + + +# # you can use this function directly for prediction. +# def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): +# """ +# Predicts classes and color information for a single processed video frame. + +# Args: +# - head_frame (np.ndarray): The head frame extracted by the BodyPix model. +# - full_frame (np.ndarray): The full original frame from the video source. +# - head_mask (np.ndarray): The head mask extracted by the BodyPix model. +# - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. +# - model: A PyTorch model instance for classifying and predicting masks for head features. +# - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. +# - thresholds_pred: A list of prediction thresholds. + +# Returns: +# - Tuple[dict, dict]: A tuple containing: +# - class_pred: A dictionary with predicted classes for the single frame. +# - colour_pred: A dictionary with predicted colors for the single frame. +# """ +# class_count = { +# 'hair': 0, +# 'hat': 0, +# 'glasses': 0, +# 'cloth': 0, +# } +# class_colours = { +# 'hair': {}, +# 'hat': {}, +# 'glasses': {}, +# 'cloth': {}, +# } + +# full_frame = cv2.cvtColor(full_frame, cv2.COLOR_BGR2RGB) +# head_frame = cv2.cvtColor(head_frame, cv2.COLOR_BGR2RGB) +# torso_frame = cv2.cvtColor(torso_frame, cv2.COLOR_BGR2RGB) + +# head_frame = pad_image_to_even_dims(head_frame) +# torso_frame = pad_image_to_even_dims(torso_frame) - # cv2 imshow is currently not working, not knowing why... - # try: - # r = rospkg.RosPack() - # _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) - # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) - # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) - # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) - # _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) - # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) - # except Exception as ignore: - # pass - - # Process head and cloth separately for the single frame - head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) - cloth_class_count, cloth_class_colours = process_cloth(full_frame, torso_mask) - - # Update class counts and colours - for k in head_class_count: - class_count[k] = head_class_count[k] - class_colours[k] = head_class_colours[k] - - class_count['cloth'] = cloth_class_count['cloth'] - class_colours['cloth'] = cloth_class_colours['cloth'] - - # Compute final class predictions and colors for the single frame - class_pred = {k: bool(class_count[k]) for k in class_count} - colour_pred = {k: v for k, v in class_colours.items()} - - rospy.loginfo(str(class_colours['hair'])) - rospy.loginfo(str(hair_colour_table)) - - # compare_colour_distributions([k,v class_colours['hair']], hair_colour_table) - colour_pred['hair'] = compare_colour_distributions(class_colours['hair'], hair_colour_table) - - # class_pred, colour_pred = None, None - - return class_pred, colour_pred +# # cv2 imshow is currently not working, not knowing why... +# # try: +# # r = rospkg.RosPack() +# # _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) +# # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) +# # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) +# # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) +# # _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) +# # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) +# # except Exception as ignore: +# # pass + +# # Process head and cloth separately for the single frame +# head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) +# cloth_class_count, cloth_class_colours = process_cloth(full_frame, torso_mask) + +# # Update class counts and colours +# for k in head_class_count: +# class_count[k] = head_class_count[k] +# class_colours[k] = head_class_colours[k] + +# class_count['cloth'] = cloth_class_count['cloth'] +# class_colours['cloth'] = cloth_class_colours['cloth'] + +# # Compute final class predictions and colors for the single frame +# class_pred = {k: bool(class_count[k]) for k in class_count} +# colour_pred = {k: v for k, v in class_colours.items()} + +# rospy.loginfo(str(class_colours['hair'])) +# rospy.loginfo(str(hair_colour_table)) + +# # compare_colour_distributions([k,v class_colours['hair']], hair_colour_table) +# colour_pred['hair'] = compare_colour_distributions(class_colours['hair'], hair_colour_table) + +# # class_pred, colour_pred = None, None + +# return class_pred, colour_pred # # if able to provide multiple frames (see __main__ seciton), then this should work better than the single frame version. diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/categories_and_attributes.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/categories_and_attributes.py new file mode 100644 index 000000000..d03f51cf9 --- /dev/null +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/categories_and_attributes.py @@ -0,0 +1,62 @@ +class CategoriesAndAttributes: + mask_categories: list[str] = [] + merged_categories: dict[str, list[str]] = {} + mask_labels: list[str] = [] + selective_attributes: dict[str, list[str]] = {} + plane_attributes: list[str] = [] + avoided_attributes: list[str] = [] + attributes: list[str] = [] + thresholds_mask: dict[str, float] = {} + thresholds_pred: dict[str, float] = {} + + +class CelebAMaskHQCategoriesAndAttributes(CategoriesAndAttributes): + mask_categories = ['cloth', 'r_ear', 'hair', 'l_brow', 'l_eye', 'l_lip', 'mouth', 'neck', 'nose', 'r_brow', + 'r_ear', 'r_eye', 'skin', 'u_lip', 'hat', 'l_ear', 'neck_l', 'eye_g', ] + merged_categories = { + 'ear': ['l_ear', 'r_ear',], + 'brow': ['l_brow', 'r_brow',], + 'eye': ['l_eye', 'r_eye',], + 'mouth': ['l_lip', 'u_lip', 'mouth',], + } + _categories_to_merge = [] + for key in sorted(list(merged_categories.keys())): + for cat in merged_categories[key]: + _categories_to_merge.append(cat) + for key in mask_categories: + if key not in _categories_to_merge: + merged_categories[key] = [key] + mask_labels = ['hair'] + selective_attributes = { + 'facial_hair': ['5_o_Clock_Shadow', 'Goatee', 'Mustache', 'No_Beard', 'Sideburns', ], + 'hair_colour': ['Black_Hair', 'Blond_Hair', 'Brown_Hair', 'Gray_Hair', ], + 'hair_shape': ['Straight_Hair', 'Wavy_Hair', ] + } + plane_attributes = ['Bangs', 'Eyeglasses', 'Wearing_Earrings', 'Wearing_Hat', 'Wearing_Necklace', + 'Wearing_Necktie', 'Male', ] + avoided_attributes = ['Arched_Eyebrows', 'Bags_Under_Eyes', 'Big_Lips', 'Big_Nose', 'Bushy_Eyebrows', 'Chubby', + 'Double_Chin', 'High_Cheekbones', 'Narrow_Eyes', 'Oval_Face', 'Pointy_Nose', + 'Receding_Hairline', 'Rosy_Cheeks', 'Heavy_Makeup', 'Wearing_Lipstick', 'Attractive', + 'Blurry', 'Mouth_Slightly_Open', 'Pale_Skin', 'Smiling', 'Young', ] + attributes = ["5_o_Clock_Shadow", "Arched_Eyebrows", "Attractive", "Bags_Under_Eyes", "Bald", "Bangs", "Big_Lips", + "Big_Nose", "Black_Hair", "Blond_Hair", "Blurry", "Brown_Hair", "Bushy_Eyebrows", "Chubby", + "Double_Chin", "Eyeglasses", "Goatee", "Gray_Hair", "Heavy_Makeup", "High_Cheekbones", "Male", + "Mouth_Slightly_Open", "Mustache", "Narrow_Eyes", "No_Beard", "Oval_Face", "Pale_Skin", "Pointy_Nose", + "Receding_Hairline", "Rosy_Cheeks", "Sideburns", "Smiling", "Straight_Hair", "Wavy_Hair", + "Wearing_Earrings", "Wearing_Hat", "Wearing_Lipstick", "Wearing_Necklace", "Wearing_Necktie", "Young"] + + thresholds_mask: dict[str, float] = {} + thresholds_pred: dict[str, float] = {} + + # set default thresholds: + for key in sorted(merged_categories.keys()): + thresholds_mask[key] = 0.5 + for key in attributes + mask_labels: + thresholds_pred[key] = 0.5 + + # set specific thresholds: + thresholds_mask['eye_g'] = 0.25 + thresholds_pred['Eyeglasses'] = 0.25 + thresholds_pred['Wearing_Earrings'] = 0.5 + thresholds_pred['Wearing_Necklace'] = 0.5 + thresholds_pred['Wearing_Necktie'] = 0.5 diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py new file mode 100644 index 000000000..e244445de --- /dev/null +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py @@ -0,0 +1,133 @@ +import numpy as np +from categories_and_attributes import CategoriesAndAttributes + + +def _softmax(x: list[float]) -> list[float]: + """Compute softmax values for each set of scores in x without using NumPy.""" + # First, compute e^x for each value in x + exp_values = [_exp(val) for val in x] + # Compute the sum of all e^x values + sum_of_exp_values = sum(exp_values) + # Now compute the softmax value for each original value in x + softmax_values = [exp_val / sum_of_exp_values for exp_val in exp_values] + return softmax_values + + +def _exp(x): + """Compute e^x for a given x. A simple implementation of the exponential function.""" + return 2.718281828459045 ** x # Using an approximation of Euler's number e + + +class ImageWithMasksAndAttributes: + def __init__(self, image: np.ndarray, masks: dict[str, np.ndarray], attributes: dict[str, float], + categories_and_attributes: CategoriesAndAttributes): + self.image: np.ndarray = image + self.masks: dict[str, np.ndarray] = masks + self.attributes: dict[str, float] = attributes + self.categories_and_attributes: CategoriesAndAttributes = categories_and_attributes + + self.plane_attribute_dict: dict[str, float] = {} + for attribute in self.categories_and_attributes.plane_attributes: + self.plane_attribute_dict[attribute] = self.attributes[attribute] + + self.selective_attribute_dict: dict[str, dict[str, float]] = {} + for category in sorted(list(self.categories_and_attributes.selective_attributes.keys())): + self.selective_attribute_dict[category] = {} + temp_list: list[float] = [] + for attribute in self.categories_and_attributes.selective_attributes[category]: + temp_list.append(self.attributes[attribute]) + softmax_list = _softmax(temp_list) + for i, attribute in enumerate(self.categories_and_attributes.selective_attributes[category]): + self.selective_attribute_dict[category][attribute] = softmax_list[i] + + def describe(self) -> str: + # abstract method + pass + + +def _max_value_tuple(some_dict: dict[str, float]) -> tuple[str, float]: + max_key = max(some_dict, key=some_dict.get) + return max_key, some_dict[max_key] + + +class ImageOfPerson(ImageWithMasksAndAttributes): + def __init__(self, image: np.ndarray, masks: dict[str, np.ndarray], attributes: dict[str, float], + categories_and_attributes: CategoriesAndAttributes): + super().__init__(image, masks, attributes, categories_and_attributes) + + @classmethod + def from_parent_instance(cls, parent_instance: ImageWithMasksAndAttributes) -> 'ImageOfPerson': + """ + Creates an instance of ImageOfPerson using the properties of an + instance of ImageWithMasksAndAttributes. + """ + return cls(image=parent_instance.image, + masks=parent_instance.masks, + attributes=parent_instance.attributes, + categories_and_attributes=parent_instance.categories_and_attributes) + + def describe(self) -> str: + male = (self.attributes['Male'] > self.categories_and_attributes.thresholds_pred['Male'], self.attributes['Male']) + has_hair = ( + self.attributes['hair'] > self.categories_and_attributes.thresholds_pred['hair'], self.attributes['hair']) + hair_colour = _max_value_tuple(self.selective_attribute_dict['hair_colour']) + hair_shape = _max_value_tuple(self.selective_attribute_dict['hair_shape']) + facial_hair = _max_value_tuple(self.selective_attribute_dict['facial_hair']) + # bangs = ( + # self.attributes['Bangs'] > self.categories_and_attributes.thresholds_pred['Bangs'], + # self.attributes['Bangs']) + hat = (self.attributes['Wearing_Hat'] > self.categories_and_attributes.thresholds_pred['Wearing_Hat'], + self.attributes['Wearing_Hat']) + glasses = (self.attributes['Eyeglasses'] > self.categories_and_attributes.thresholds_pred['Eyeglasses'], + self.attributes['Eyeglasses']) + earrings = ( + self.attributes['Wearing_Earrings'] > self.categories_and_attributes.thresholds_pred['Wearing_Earrings'], + self.attributes['Wearing_Earrings']) + necklace = ( + self.attributes['Wearing_Necklace'] > self.categories_and_attributes.thresholds_pred['Wearing_Necklace'], + self.attributes['Wearing_Necklace']) + necktie = ( + self.attributes['Wearing_Necktie'] > self.categories_and_attributes.thresholds_pred['Wearing_Necktie'], + self.attributes['Wearing_Necktie']) + + description = "This customer has " + if has_hair[0]: + hair_shape_str = '' + if hair_shape[0] == 'Straight_Hair': + hair_shape_str = ' straight' + elif hair_shape[0] == 'Wavy_Hair': + hair_shape_str = ' wavy' + if hair_colour[0] == 'Black_Hair': + description += 'black%s hair, ' % hair_shape_str + elif hair_colour[0] == 'Blond_Hair': + description += 'blond%s hair, ' % hair_shape_str + elif hair_colour[0] == 'Brown_Hair': + description += 'brown%s hair, ' % hair_shape_str + elif hair_colour[0] == 'Gray_Hair': + description += 'gray%s hair, ' % hair_shape_str + + if male: # here 'male' is only used to determine whether it is confident to decide whether the person has beard + if not facial_hair[0] == 'No_Beard': + description += 'and has beard. ' + + if hat[0] or glasses[0]: + description += 'I can also see this customer wearing ' + if hat[0] and glasses[0]: + description += 'a hat and a pair of glasses. ' + elif hat[0]: + description += 'a hat. ' + else: + description += 'a pair of glasses. ' + + if earrings[0] or necklace[0] or necktie[0]: + description += 'This customer might also wear ' + wearables = [] + if earrings[0]: + wearables.append('a pair of earrings') + if necklace[0]: + wearables.append('a necklace') + if necktie[0]: + wearables.append('a necktie') + description += ", ".join(wearables[:-2] + [" and ".join(wearables[-2:])]) + '. ' + + return description diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 37ab97749..095d0f766 100755 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -8,7 +8,7 @@ # from colour_estimation import closest_colours, RGB_COLOURS from lasr_vision_msgs.msg import BodyPixMaskRequest, ColourPrediction, FeatureWithColour -from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection +from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection, TorchFaceFeatureDetectionDescription from numpy2message import numpy2message from .vision import GetImage, ImageMsgToCv2, Get3DImage, PclMsgToCv2, Get2DAnd3DImages @@ -158,7 +158,7 @@ def __init__(self): smach.State.__init__(self, outcomes=['succeeded', 'failed'], input_keys=[ 'img', 'people_detections', 'bodypix_masks'], output_keys=['people']) self.torch_face_features = rospy.ServiceProxy( - '/torch/detect/face_features', TorchFaceFeatureDetection) + '/torch/detect/face_features', TorchFaceFeatureDetectionDescription) def execute(self, userdata): try: @@ -187,8 +187,8 @@ def execute(self, userdata): [contours]), color=(255, 255, 255)) mask_bin = mask_image > 128 - # keep track - features = [] + # # keep track + # features = [] # process part masks for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): @@ -218,11 +218,17 @@ def execute(self, userdata): head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) full_frame = cv2_img.cv2_img_to_msg(img) - features.extend(self.torch_face_features( + # features.extend(self.torch_face_features( + # full_frame, + # head_mask_data, head_mask_shape, head_mask_dtype, + # torso_mask_data, torso_mask_shape, torso_mask_dtype, + # ).detected_features) + + rst = self.torch_face_features( full_frame, head_mask_data, head_mask_shape, head_mask_dtype, torso_mask_data, torso_mask_shape, torso_mask_dtype, - ).detected_features) + ).description # # process part masks # for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): @@ -278,7 +284,7 @@ def execute(self, userdata): people.append({ 'detection': person, - 'features': features + 'features': rst }) # Userdata: diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py index 4b145b351..837592b18 100644 --- a/tasks/receptionist/src/receptionist/states/speakdescriptions.py +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -8,6 +8,8 @@ def __init__(self, default): self.default = default def execute(self, userdata): + for person in userdata['people']: + self.default.voice.speak(person['features']) # for person in userdata['people']: # self.default.voice.speak('I see a person') # self.default.voice.speak('Yes I do see you. I am trying to turn to you. But if I do not move my head, it is your own issue, not mine.') From d66fcb33d79aaa097f3ffc21d95ebe7331f81d39 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 23 Feb 2024 15:11:11 +0000 Subject: [PATCH 45/69] correct the lost module. --- .../lasr_vision_torch/src/lasr_vision_torch/__init__.py | 4 ++-- .../src/lasr_vision_torch/image_with_masks_and_attributes.py | 2 +- skills/src/lasr_skills/describe_people.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 1498265c2..5fcb001f7 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -3,8 +3,8 @@ from colour_estimation import load_images_to_dict, generate_colour_table, count_colours_in_masked_area, compare_colour_distributions from colour_estimation import SPESIFIC_COLOURS, DETAILED_COLOURS -from categories_and_attributes import CelebAMaskHQCategoriesAndAttributes -from image_with_masks_and_attributes import ImageWithMasksAndAttributes, ImageOfPerson +from lasr_vision_torch.categories_and_attributes import CategoriesAndAttributes, CelebAMaskHQCategoriesAndAttributes +from lasr_vision_torch.image_with_masks_and_attributes import ImageWithMasksAndAttributes, ImageOfPerson import numpy as np import cv2 diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py index e244445de..b30724138 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py @@ -1,5 +1,5 @@ import numpy as np -from categories_and_attributes import CategoriesAndAttributes +from lasr_vision_torch.categories_and_attributes import CategoriesAndAttributes def _softmax(x: list[float]) -> list[float]: diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 095d0f766..b30d63daa 100755 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -141,7 +141,7 @@ def execute(self, userdata): xyz = userdata.xyz # xyz = np.nanmean(xyz, axis=2) # rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) - point_head_client(xyz, neck_coord[0], neck_coord[1], client) + # point_head_client(xyz, neck_coord[0], neck_coord[1], client) return 'succeeded' except rospy.ServiceException as e: rospy.logwarn(f"Unable to perform inference. ({str(e)})") From aa8ec6ec3bbd4dccf2d0f21a7c7105a141955e51 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 23 Feb 2024 15:17:56 +0000 Subject: [PATCH 46/69] info update --- skills/src/lasr_skills/describe_people.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index b30d63daa..e95341cd8 100755 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -140,7 +140,7 @@ def execute(self, userdata): rospy.loginfo("COORD_XY:::%s" % str(neck_coord)) xyz = userdata.xyz # xyz = np.nanmean(xyz, axis=2) - # rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) + rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) # point_head_client(xyz, neck_coord[0], neck_coord[1], client) return 'succeeded' except rospy.ServiceException as e: From c65ccd17d0b1ddabf14371c0d5a7c4d826f58698 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 23 Feb 2024 16:22:47 +0000 Subject: [PATCH 47/69] fixed issues in the service --- .../lasr_vision_msgs/msg/Description.msg | 1 - common/vision/lasr_vision_torch/nodes/service | 6 +- .../src/lasr_vision_torch/__init__.py | 2 +- skills/src/lasr_skills/describe_people.py | 276 +++++++++--------- 4 files changed, 142 insertions(+), 143 deletions(-) delete mode 100644 common/vision/lasr_vision_msgs/msg/Description.msg diff --git a/common/vision/lasr_vision_msgs/msg/Description.msg b/common/vision/lasr_vision_msgs/msg/Description.msg deleted file mode 100644 index 48d2eb86f..000000000 --- a/common/vision/lasr_vision_msgs/msg/Description.msg +++ /dev/null @@ -1 +0,0 @@ -string discription diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index 59065f702..ba5e8eb82 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -1,4 +1,4 @@ -from lasr_vision_msgs.srv import TorchFaceFeatureDetection, TorchFaceFeatureDetectionRequest, TorchFaceFeatureDetectionResponse, TorchFaceFeatureDetectionDescriptionRequest, TorchFaceFeatureDetectionDescriptionResponse +from lasr_vision_msgs.srv import TorchFaceFeatureDetection, TorchFaceFeatureDetectionRequest, TorchFaceFeatureDetectionResponse, TorchFaceFeatureDetectionDescription, TorchFaceFeatureDetectionDescriptionRequest, TorchFaceFeatureDetectionDescriptionResponse from lasr_vision_msgs.msg import FeatureWithColour, ColourPrediction from cv2_img import msg_to_cv2_img from torch_module.helpers import binary_erosion_dilation, median_color_float @@ -25,7 +25,7 @@ def detect(request: TorchFaceFeatureDetectionDescriptionRequest) -> TorchFaceFea torso_frame = lasr_vision_torch.extract_mask_region(full_frame, torso_mask.astype(np.uint8), expand_x=0.2, expand_y=0.0) # class_pred, colour_pred = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) - rst_str = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) + rst_str = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask,) response = TorchFaceFeatureDetectionDescriptionRequest() response.description = rst_str @@ -97,6 +97,6 @@ def detect(request: TorchFaceFeatureDetectionDescriptionRequest) -> TorchFaceFea # test test rospy.init_node('torch_service') -rospy.Service('/torch/detect/face_features', TorchFaceFeatureDetection, detect) +rospy.Service('/torch/detect/face_features', TorchFaceFeatureDetectionDescription, detect) rospy.loginfo('Torch service started') rospy.spin() diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 5fcb001f7..3d662d9f7 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -251,7 +251,7 @@ def extract_mask_region(frame, mask, expand_x=0.5, expand_y=0.5): p = Predictor(model, torch.device('cpu'), CelebAMaskHQCategoriesAndAttributes) -def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): +def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask,): full_frame = cv2.cvtColor(full_frame, cv2.COLOR_BGR2RGB) head_frame = cv2.cvtColor(head_frame, cv2.COLOR_BGR2RGB) torso_frame = cv2.cvtColor(torso_frame, cv2.COLOR_BGR2RGB) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index e95341cd8..b4ea5620f 100755 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -83,7 +83,7 @@ def __init__(self): 'succeeded': 'FEATURE_EXTRACTION'}) smach.StateMachine.add('FEATURE_EXTRACTION', self.FeatureExtraction(), transitions={ 'succeeded': 'succeeded'}) - + class SegmentYolo(smach.State): ''' Segment using YOLO @@ -140,7 +140,7 @@ def execute(self, userdata): rospy.loginfo("COORD_XY:::%s" % str(neck_coord)) xyz = userdata.xyz # xyz = np.nanmean(xyz, axis=2) - rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) + # rospy.loginfo("COORD_Z:::%s" % str(xyz[neck_coord[0]][neck_coord[1]])) # point_head_client(xyz, neck_coord[0], neck_coord[1], client) return 'succeeded' except rospy.ServiceException as e: @@ -161,140 +161,140 @@ def __init__(self): '/torch/detect/face_features', TorchFaceFeatureDetectionDescription) def execute(self, userdata): - try: - if len(userdata.people_detections) == 0: - rospy.logerr("Couldn't find anyone!") - return 'failed' - elif len(userdata.people_detections) == 1: - rospy.logdebug("There is one person.") - else: - rospy.logdebug( - f"There are {len(userdata.people_detections)} people.") - - img = userdata.img - height, width, _ = img.shape - - people = [] - - for person in userdata.people_detections: - rospy.logdebug( - f"\n\nFound person with confidence {person.confidence}!") - - # mask for this person - mask_image = np.zeros((height, width), np.uint8) - contours = np.array(person.xyseg).reshape(-1, 2) - cv2.fillPoly(mask_image, pts=np.int32( - [contours]), color=(255, 255, 255)) - mask_bin = mask_image > 128 - - # # keep track - # features = [] - - # process part masks - for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): - part_mask = np.array(bodypix_mask.mask).reshape( - bodypix_mask.shape[0], bodypix_mask.shape[1]) - - # filter out part for current person segmentation - try: - part_mask[mask_bin == 0] = 0 - except Exception: - rospy.logdebug('|> Failed to check {part} is visible') - continue - - if part_mask.any(): - rospy.logdebug(f'|> Person has {part} visible') - else: - rospy.logdebug( - f'|> Person does not have {part} visible') - continue - - if part == 'torso': - torso_mask = part_mask - elif part == 'head': - head_mask = part_mask - - torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) - head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) - - full_frame = cv2_img.cv2_img_to_msg(img) - # features.extend(self.torch_face_features( - # full_frame, - # head_mask_data, head_mask_shape, head_mask_dtype, - # torso_mask_data, torso_mask_shape, torso_mask_dtype, - # ).detected_features) - - rst = self.torch_face_features( - full_frame, - head_mask_data, head_mask_shape, head_mask_dtype, - torso_mask_data, torso_mask_shape, torso_mask_dtype, - ).description - - # # process part masks - # for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): - # part_mask = np.array(bodypix_mask.mask).reshape( - # bodypix_mask.shape[0], bodypix_mask.shape[1]) - - # # filter out part for current person segmentation - # try: - # part_mask[mask_bin == 0] = 0 - # except Exception: - # rospy.logdebug('|> Failed to check {part} is visible') - # continue - - # if part_mask.any(): - # rospy.logdebug(f'|> Person has {part} visible') - # else: - # rospy.logdebug( - # f'|> Person does not have {part} visible') - # continue - - # # do colour processing on the torso - # if part == 'torso': - # try: - # features.append(FeatureWithColour("torso", [ - # ColourPrediction(colour, distance) - # for colour, distance - # in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) - # ])) - # except Exception as e: - # rospy.logerr(f"Failed to process colour: {e}") - - # # do feature extraction on the head - # if part == 'head': - # try: - # # crop out face - # face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( - # userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) - - # mask_image_only_face = mask_image.copy() - # mask_image_only_face[face_mask == 0] = 0 - - # face_region = cv2_img.extract_mask_region( - # img, mask_image_only_face) - # if face_region is None: - # raise Exception( - # "Failed to extract mask region") - - # msg = cv2_img.cv2_img_to_msg(face_region) - # features.extend(self.torch_face_features( - # msg, False).detected_features) - # except Exception as e: - # rospy.logerr(f"Failed to process extraction: {e}") - - people.append({ - 'detection': person, - 'features': rst - }) - - # Userdata: - # - people - # - - detection (YOLO) - # - parts - # - - part - # - mask - - userdata['people'] = people - except Exception: + #try: + if len(userdata.people_detections) == 0: + rospy.logerr("Couldn't find anyone!") return 'failed' - return 'succeeded' + elif len(userdata.people_detections) == 1: + rospy.logdebug("There is one person.") + else: + rospy.logdebug( + f"There are {len(userdata.people_detections)} people.") + + img = userdata.img + height, width, _ = img.shape + + people = [] + + for person in userdata.people_detections: + rospy.logdebug( + f"\n\nFound person with confidence {person.confidence}!") + + # mask for this person + mask_image = np.zeros((height, width), np.uint8) + contours = np.array(person.xyseg).reshape(-1, 2) + cv2.fillPoly(mask_image, pts=np.int32( + [contours]), color=(255, 255, 255)) + mask_bin = mask_image > 128 + + # # keep track + # features = [] + + # process part masks + for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): + part_mask = np.array(bodypix_mask.mask).reshape( + bodypix_mask.shape[0], bodypix_mask.shape[1]) + + # filter out part for current person segmentation + try: + part_mask[mask_bin == 0] = 0 + except Exception: + rospy.logdebug('|> Failed to check {part} is visible') + continue + + if part_mask.any(): + rospy.logdebug(f'|> Person has {part} visible') + else: + rospy.logdebug( + f'|> Person does not have {part} visible') + continue + + if part == 'torso': + torso_mask = part_mask + elif part == 'head': + head_mask = part_mask + + torso_mask_data, torso_mask_shape, torso_mask_dtype = numpy2message(torso_mask) + head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) + + full_frame = cv2_img.cv2_img_to_msg(img) + # features.extend(self.torch_face_features( + # full_frame, + # head_mask_data, head_mask_shape, head_mask_dtype, + # torso_mask_data, torso_mask_shape, torso_mask_dtype, + # ).detected_features) + + rst = self.torch_face_features( + full_frame, + head_mask_data, head_mask_shape, head_mask_dtype, + torso_mask_data, torso_mask_shape, torso_mask_dtype, + ).description + + # # process part masks + # for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): + # part_mask = np.array(bodypix_mask.mask).reshape( + # bodypix_mask.shape[0], bodypix_mask.shape[1]) + + # # filter out part for current person segmentation + # try: + # part_mask[mask_bin == 0] = 0 + # except Exception: + # rospy.logdebug('|> Failed to check {part} is visible') + # continue + + # if part_mask.any(): + # rospy.logdebug(f'|> Person has {part} visible') + # else: + # rospy.logdebug( + # f'|> Person does not have {part} visible') + # continue + + # # do colour processing on the torso + # if part == 'torso': + # try: + # features.append(FeatureWithColour("torso", [ + # ColourPrediction(colour, distance) + # for colour, distance + # in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) + # ])) + # except Exception as e: + # rospy.logerr(f"Failed to process colour: {e}") + + # # do feature extraction on the head + # if part == 'head': + # try: + # # crop out face + # face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( + # userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) + + # mask_image_only_face = mask_image.copy() + # mask_image_only_face[face_mask == 0] = 0 + + # face_region = cv2_img.extract_mask_region( + # img, mask_image_only_face) + # if face_region is None: + # raise Exception( + # "Failed to extract mask region") + + # msg = cv2_img.cv2_img_to_msg(face_region) + # features.extend(self.torch_face_features( + # msg, False).detected_features) + # except Exception as e: + # rospy.logerr(f"Failed to process extraction: {e}") + + people.append({ + 'detection': person, + 'features': rst + }) + + # Userdata: + # - people + # - - detection (YOLO) + # - parts + # - - part + # - mask + + userdata['people'] = people + # except Exception: + # return 'failed' + # return 'succeeded' From af28931ac908c1adbb0851b10fd9f69b56d14a59 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 23 Feb 2024 16:26:14 +0000 Subject: [PATCH 48/69] fixed a stupic typo --- common/vision/lasr_vision_torch/nodes/service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index ba5e8eb82..7d1e54e84 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -27,7 +27,7 @@ def detect(request: TorchFaceFeatureDetectionDescriptionRequest) -> TorchFaceFea # class_pred, colour_pred = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) rst_str = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask,) - response = TorchFaceFeatureDetectionDescriptionRequest() + response = TorchFaceFeatureDetectionDescriptionResponse() response.description = rst_str # response.detected_features = str(class_pred) + str(colour_pred) # response.detected_features = [] From b91b736301e435e447c1bb8fe6f42f9824fe2e67 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 23 Feb 2024 17:15:42 +0000 Subject: [PATCH 49/69] runnable version for full demo --- .../vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py | 2 +- .../src/lasr_vision_torch/image_with_masks_and_attributes.py | 2 +- skills/src/lasr_skills/describe_people.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index 3d662d9f7..af5a00448 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -259,7 +259,7 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask,): head_frame = pad_image_to_even_dims(head_frame) torso_frame = pad_image_to_even_dims(torso_frame) - rst = ImageOfPerson.from_parent_instance(p.predict(full_frame)) + rst = ImageOfPerson.from_parent_instance(p.predict(head_frame)) return rst.describe() diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py index b30724138..6a5e363e5 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py @@ -130,4 +130,4 @@ def describe(self) -> str: wearables.append('a necktie') description += ", ".join(wearables[:-2] + [" and ".join(wearables[-2:])]) + '. ' - return description + return description if description != "This customer has " else "" diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index b4ea5620f..1bbe83484 100755 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -297,4 +297,4 @@ def execute(self, userdata): userdata['people'] = people # except Exception: # return 'failed' - # return 'succeeded' + return 'succeeded' From d4a677ad1f3be8f690c2b69f257f570e44e0f5f7 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 23 Feb 2024 17:26:09 +0000 Subject: [PATCH 50/69] Recover the state machine for demo. --- tasks/receptionist/src/receptionist/sm.py | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tasks/receptionist/src/receptionist/sm.py b/tasks/receptionist/src/receptionist/sm.py index 3daddbfdf..91556c037 100755 --- a/tasks/receptionist/src/receptionist/sm.py +++ b/tasks/receptionist/src/receptionist/sm.py @@ -22,16 +22,16 @@ def __init__(self): self.userdata.area_polygon = [[1.94, 0.15], [2.98, 0.28], [3.08, -0.68], [2.06, -0.84]] self.userdata.depth_topic = "/xtion/depth_registered/points" with self: - # smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - # smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) - # smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) - # smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) - # smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) - # smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) - # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) - # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) - # smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) - # smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) - # smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) - smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) - smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('START', Start(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + smach.StateMachine.add("GO_TO_WAIT_FOR_PERSON",GoToWaitForPerson(self.default), transitions={'succeeded': 'WAIT_FOR_PERSON'}) + smach.StateMachine.add('WAIT_FOR_PERSON', WaitForPersonInArea() ,transitions={'succeeded' : 'GO_TO_PERSON', 'failed' : 'failed'}) + smach.StateMachine.add('GO_TO_PERSON', GoToPerson(self.default),transitions={'succeeded':'ASK_FOR_NAME'}) + smach.StateMachine.add('ASK_FOR_NAME', AskForName(self.default),transitions={'failed':'ASK_FOR_NAME','succeeded':'ASK_FOR_DRINK'}) + smach.StateMachine.add('ASK_FOR_DRINK', AskForDrink(self.default),transitions={'failed':'ASK_FOR_DRINK','succeeded':'DESCRIBE_PEOPLE'}) + smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'GO_TO_SEATING_AREA','succeeded':'GO_TO_SEATING_AREA'}) + smach.StateMachine.add('GO_TO_SEATING_AREA', GoToSeatingArea(self.default), transitions={'succeeded' : 'LOOK_FOR_SEATS'}) + smach.StateMachine.add('LOOK_FOR_SEATS', LookForSeats(self.default), transitions={'succeeded' : 'GO_TO_WAIT_FOR_PERSON'}) + smach.StateMachine.add('END', End(self.default),transitions={'succeeded':'succeeded'}) + # smach.StateMachine.add('DESCRIBE_PEOPLE', DescribePeople(),transitions={'succeeded':'SPEAK_DESCRIPTIONS','failed':'DESCRIBE_PEOPLE'}) + # smach.StateMachine.add('SPEAK_DESCRIPTIONS', SpeakDescriptions(self.default), transitions={'failed':'DESCRIBE_PEOPLE','succeeded':'DESCRIBE_PEOPLE'}) From 7d1d84b602f267f15a809fcfdf33fd8d64ac3a02 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Tue, 27 Feb 2024 17:20:10 +0000 Subject: [PATCH 51/69] Added a simple loop to refresh the frame taken, should work fine. --- skills/src/lasr_skills/vision/get_image.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/skills/src/lasr_skills/vision/get_image.py b/skills/src/lasr_skills/vision/get_image.py index c82ac26e4..3016c4859 100644 --- a/skills/src/lasr_skills/vision/get_image.py +++ b/skills/src/lasr_skills/vision/get_image.py @@ -69,10 +69,11 @@ def __init__(self, topic: str = None): def execute(self, userdata): try: - userdata.img_msg_2d = rospy.wait_for_message( - self.topic1, Image) - userdata.img_msg_3d = rospy.wait_for_message( - self.topic2, PointCloud2) + for _ in range(5): # This is a little change, see if helps avoid having delayed frame issue. + userdata.img_msg_2d = rospy.wait_for_message( + self.topic1, Image) + userdata.img_msg_3d = rospy.wait_for_message( + self.topic2, PointCloud2) except Exception as e: print(e) return 'failed' From 8db1cb378012bcec23131712aac6833aca4dea29 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 15:30:35 +0000 Subject: [PATCH 52/69] Cleaned some commented code. --- skills/src/lasr_skills/describe_people.py | 57 ----------------------- 1 file changed, 57 deletions(-) diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 1bbe83484..2cc2a5516 100755 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -218,11 +218,6 @@ def execute(self, userdata): head_mask_data, head_mask_shape, head_mask_dtype = numpy2message(head_mask) full_frame = cv2_img.cv2_img_to_msg(img) - # features.extend(self.torch_face_features( - # full_frame, - # head_mask_data, head_mask_shape, head_mask_dtype, - # torso_mask_data, torso_mask_shape, torso_mask_dtype, - # ).detected_features) rst = self.torch_face_features( full_frame, @@ -230,58 +225,6 @@ def execute(self, userdata): torso_mask_data, torso_mask_shape, torso_mask_dtype, ).description - # # process part masks - # for (bodypix_mask, part) in zip(userdata.bodypix_masks, ['torso', 'head']): - # part_mask = np.array(bodypix_mask.mask).reshape( - # bodypix_mask.shape[0], bodypix_mask.shape[1]) - - # # filter out part for current person segmentation - # try: - # part_mask[mask_bin == 0] = 0 - # except Exception: - # rospy.logdebug('|> Failed to check {part} is visible') - # continue - - # if part_mask.any(): - # rospy.logdebug(f'|> Person has {part} visible') - # else: - # rospy.logdebug( - # f'|> Person does not have {part} visible') - # continue - - # # do colour processing on the torso - # if part == 'torso': - # try: - # features.append(FeatureWithColour("torso", [ - # ColourPrediction(colour, distance) - # for colour, distance - # in closest_colours(np.median(img[part_mask == 1], axis=0), RGB_COLOURS) - # ])) - # except Exception as e: - # rospy.logerr(f"Failed to process colour: {e}") - - # # do feature extraction on the head - # if part == 'head': - # try: - # # crop out face - # face_mask = np.array(userdata.bodypix_masks[1].mask).reshape( - # userdata.bodypix_masks[1].shape[0], userdata.bodypix_masks[1].shape[1]) - - # mask_image_only_face = mask_image.copy() - # mask_image_only_face[face_mask == 0] = 0 - - # face_region = cv2_img.extract_mask_region( - # img, mask_image_only_face) - # if face_region is None: - # raise Exception( - # "Failed to extract mask region") - - # msg = cv2_img.cv2_img_to_msg(face_region) - # features.extend(self.torch_face_features( - # msg, False).detected_features) - # except Exception as e: - # rospy.logerr(f"Failed to process extraction: {e}") - people.append({ 'detection': person, 'features': rst From 5765e667174f632eb0dbb635b7b493208a522b66 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 16:25:16 +0000 Subject: [PATCH 53/69] removed loading the pretrained parameters --- .../helpers/torch_module/src/torch_module/modules/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/helpers/torch_module/src/torch_module/modules/__init__.py b/common/helpers/torch_module/src/torch_module/modules/__init__.py index 694f93924..334b94f35 100644 --- a/common/helpers/torch_module/src/torch_module/modules/__init__.py +++ b/common/helpers/torch_module/src/torch_module/modules/__init__.py @@ -35,7 +35,7 @@ class UNetWithResnetEncoder(nn.Module): def __init__(self, num_classes, in_channels=3, freeze_bn=False, sigmoid=True): super(UNetWithResnetEncoder, self).__init__() self.sigmoid = sigmoid - self.resnet = models.resnet34(pretrained=True) # Initialize with a ResNet model + self.resnet = models.resnet34(pretrained=False) # Initialize with a ResNet model if in_channels != 3: self.resnet.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) @@ -99,7 +99,7 @@ def unfreeze_bn(self): class MultiLabelResNet(nn.Module): def __init__(self, num_labels, input_channels=3, sigmoid=True, pretrained=False,): super(MultiLabelResNet, self).__init__() - self.model = models.resnet34(pretrained=pretrained) + self.model = models.resnet34(pretrained=False) self.sigmoid = sigmoid if input_channels != 3: From dc3868eb50318257570b3cf605f69f85fc891e1b Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 16:26:37 +0000 Subject: [PATCH 54/69] removed load pretrained parameter. --- .../helpers/torch_module/src/torch_module/modules/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/helpers/torch_module/src/torch_module/modules/__init__.py b/common/helpers/torch_module/src/torch_module/modules/__init__.py index 334b94f35..90d65f61b 100644 --- a/common/helpers/torch_module/src/torch_module/modules/__init__.py +++ b/common/helpers/torch_module/src/torch_module/modules/__init__.py @@ -97,7 +97,7 @@ def unfreeze_bn(self): class MultiLabelResNet(nn.Module): - def __init__(self, num_labels, input_channels=3, sigmoid=True, pretrained=False,): + def __init__(self, num_labels, input_channels=3, sigmoid=True): super(MultiLabelResNet, self).__init__() self.model = models.resnet34(pretrained=False) self.sigmoid = sigmoid From 703b3e841186a471f1c5ba2f45abb4bfd9ce6553 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 16:32:06 +0000 Subject: [PATCH 55/69] renamed torch_module into feature_extractor (Recompile needed!!!) --- common/helpers/numpy2message/CMakeLists.txt | 2 +- common/helpers/numpy2message/package.xml | 2 +- common/helpers/torch_module/CMakeLists.txt | 10 +++++----- common/helpers/torch_module/package.xml | 4 ++-- common/helpers/torch_module/setup.py | 2 +- common/vision/lasr_vision_torch/nodes/service | 2 +- common/vision/lasr_vision_torch/package.xml | 2 +- .../src/lasr_vision_torch/__init__.py | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/common/helpers/numpy2message/CMakeLists.txt b/common/helpers/numpy2message/CMakeLists.txt index b5898aff7..fa6585225 100644 --- a/common/helpers/numpy2message/CMakeLists.txt +++ b/common/helpers/numpy2message/CMakeLists.txt @@ -193,7 +193,7 @@ include_directories( ############# ## Add gtest based cpp test target and link libraries -# catkin_add_gtest(${PROJECT_NAME}-test test/test_torch_module.cpp) +# catkin_add_gtest(${PROJECT_NAME}-test test/test_feature_extractor.cpp) # if(TARGET ${PROJECT_NAME}-test) # target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) # endif() diff --git a/common/helpers/numpy2message/package.xml b/common/helpers/numpy2message/package.xml index aa9384c64..0146eb113 100644 --- a/common/helpers/numpy2message/package.xml +++ b/common/helpers/numpy2message/package.xml @@ -19,7 +19,7 @@ - + diff --git a/common/helpers/torch_module/CMakeLists.txt b/common/helpers/torch_module/CMakeLists.txt index 30963cd1d..5c5d54e74 100644 --- a/common/helpers/torch_module/CMakeLists.txt +++ b/common/helpers/torch_module/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.0.2) -project(torch_module) +project(feature_extractor) ## Compile as C++11, supported in ROS Kinetic and newer # add_compile_options(-std=c++11) @@ -100,7 +100,7 @@ catkin_python_setup() ## DEPENDS: system dependencies of this project that dependent projects also need catkin_package( # INCLUDE_DIRS include -# LIBRARIES torch_module +# LIBRARIES feature_extractor # CATKIN_DEPENDS other_catkin_pkg # DEPENDS system_lib ) @@ -118,7 +118,7 @@ include_directories( ## Declare a C++ library # add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/torch_module.cpp +# src/${PROJECT_NAME}/feature_extractor.cpp # ) ## Add cmake target dependencies of the library @@ -129,7 +129,7 @@ include_directories( ## Declare a C++ executable ## With catkin_make all packages are built within a single CMake context ## The recommended prefix ensures that target names across packages don't collide -# add_executable(${PROJECT_NAME}_node src/torch_module_node.cpp) +# add_executable(${PROJECT_NAME}_node src/feature_extractor_node.cpp) ## Rename C++ executable without prefix ## The above recommended prefix causes long target names, the following renames the @@ -193,7 +193,7 @@ include_directories( ############# ## Add gtest based cpp test target and link libraries -# catkin_add_gtest(${PROJECT_NAME}-test test/test_torch_module.cpp) +# catkin_add_gtest(${PROJECT_NAME}-test test/test_feature_extractor.cpp) # if(TARGET ${PROJECT_NAME}-test) # target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) # endif() diff --git a/common/helpers/torch_module/package.xml b/common/helpers/torch_module/package.xml index 622e78778..aec2fd25f 100644 --- a/common/helpers/torch_module/package.xml +++ b/common/helpers/torch_module/package.xml @@ -1,6 +1,6 @@ - torch_module + feature_extractor 0.0.0 Various PyTorch helpers and utilties @@ -19,7 +19,7 @@ - + diff --git a/common/helpers/torch_module/setup.py b/common/helpers/torch_module/setup.py index 2151223c9..77ae31a50 100644 --- a/common/helpers/torch_module/setup.py +++ b/common/helpers/torch_module/setup.py @@ -4,7 +4,7 @@ from catkin_pkg.python_setup import generate_distutils_setup setup_args = generate_distutils_setup( - packages=['torch_module'], + packages=['feature_extractor'], package_dir={'': 'src'} ) diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_torch/nodes/service index 7d1e54e84..b6cf0f392 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_torch/nodes/service @@ -1,7 +1,7 @@ from lasr_vision_msgs.srv import TorchFaceFeatureDetection, TorchFaceFeatureDetectionRequest, TorchFaceFeatureDetectionResponse, TorchFaceFeatureDetectionDescription, TorchFaceFeatureDetectionDescriptionRequest, TorchFaceFeatureDetectionDescriptionResponse from lasr_vision_msgs.msg import FeatureWithColour, ColourPrediction from cv2_img import msg_to_cv2_img -from torch_module.helpers import binary_erosion_dilation, median_color_float +from feature_extractor.helpers import binary_erosion_dilation, median_color_float from numpy2message import message2numpy import numpy as np diff --git a/common/vision/lasr_vision_torch/package.xml b/common/vision/lasr_vision_torch/package.xml index 975aa03e4..23c130106 100644 --- a/common/vision/lasr_vision_torch/package.xml +++ b/common/vision/lasr_vision_torch/package.xml @@ -52,7 +52,7 @@ catkin_virtualenv lasr_vision_msgs cv2_img - torch_module + feature_extractor colour_estimation diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py index af5a00448..beb1335f4 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py @@ -1,5 +1,5 @@ -from torch_module.modules import UNetWithResnetEncoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression -from torch_module.helpers import load_torch_model, binary_erosion_dilation +from feature_extractor.modules import UNetWithResnetEncoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression +from feature_extractor.helpers import load_torch_model, binary_erosion_dilation from colour_estimation import load_images_to_dict, generate_colour_table, count_colours_in_masked_area, compare_colour_distributions from colour_estimation import SPESIFIC_COLOURS, DETAILED_COLOURS From 5480abc61878d6ea9a545680f11933cc9b283389 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 16:33:32 +0000 Subject: [PATCH 56/69] renamed torch_module into feature_extractor --- common/helpers/{torch_module => feature_extractor}/CMakeLists.txt | 0 .../{torch_module => feature_extractor}/doc/PREREQUISITES.md | 0 common/helpers/{torch_module => feature_extractor}/package.xml | 0 common/helpers/{torch_module => feature_extractor}/setup.py | 0 .../src/torch_module/__init__.py | 0 .../src/torch_module/helpers/__init__.py | 0 .../src/torch_module/modules/__init__.py | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename common/helpers/{torch_module => feature_extractor}/CMakeLists.txt (100%) rename common/helpers/{torch_module => feature_extractor}/doc/PREREQUISITES.md (100%) rename common/helpers/{torch_module => feature_extractor}/package.xml (100%) rename common/helpers/{torch_module => feature_extractor}/setup.py (100%) rename common/helpers/{torch_module => feature_extractor}/src/torch_module/__init__.py (100%) rename common/helpers/{torch_module => feature_extractor}/src/torch_module/helpers/__init__.py (100%) rename common/helpers/{torch_module => feature_extractor}/src/torch_module/modules/__init__.py (100%) diff --git a/common/helpers/torch_module/CMakeLists.txt b/common/helpers/feature_extractor/CMakeLists.txt similarity index 100% rename from common/helpers/torch_module/CMakeLists.txt rename to common/helpers/feature_extractor/CMakeLists.txt diff --git a/common/helpers/torch_module/doc/PREREQUISITES.md b/common/helpers/feature_extractor/doc/PREREQUISITES.md similarity index 100% rename from common/helpers/torch_module/doc/PREREQUISITES.md rename to common/helpers/feature_extractor/doc/PREREQUISITES.md diff --git a/common/helpers/torch_module/package.xml b/common/helpers/feature_extractor/package.xml similarity index 100% rename from common/helpers/torch_module/package.xml rename to common/helpers/feature_extractor/package.xml diff --git a/common/helpers/torch_module/setup.py b/common/helpers/feature_extractor/setup.py similarity index 100% rename from common/helpers/torch_module/setup.py rename to common/helpers/feature_extractor/setup.py diff --git a/common/helpers/torch_module/src/torch_module/__init__.py b/common/helpers/feature_extractor/src/torch_module/__init__.py similarity index 100% rename from common/helpers/torch_module/src/torch_module/__init__.py rename to common/helpers/feature_extractor/src/torch_module/__init__.py diff --git a/common/helpers/torch_module/src/torch_module/helpers/__init__.py b/common/helpers/feature_extractor/src/torch_module/helpers/__init__.py similarity index 100% rename from common/helpers/torch_module/src/torch_module/helpers/__init__.py rename to common/helpers/feature_extractor/src/torch_module/helpers/__init__.py diff --git a/common/helpers/torch_module/src/torch_module/modules/__init__.py b/common/helpers/feature_extractor/src/torch_module/modules/__init__.py similarity index 100% rename from common/helpers/torch_module/src/torch_module/modules/__init__.py rename to common/helpers/feature_extractor/src/torch_module/modules/__init__.py From 109201aaa88152c0c8d94b11294922bd52326b23 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 16:38:51 +0000 Subject: [PATCH 57/69] renamed lasr_vision_torch to lasr_vision_feature_extraction --- .../.gitignore | 0 .../CMakeLists.txt | 10 +++++----- .../launch/service.launch | 2 +- .../models/.gitkeep | 0 .../nodes/service | 12 ++++++------ .../package.xml | 4 ++-- .../requirements.in | 0 .../requirements.txt | 0 .../setup.py | 2 +- .../src/lasr_vision_torch/__init__.py | 16 ++++++++-------- .../categories_and_attributes.py | 0 .../image_with_masks_and_attributes.py | 2 +- skills/launch/unit_test_describe_people.launch | 2 +- tasks/receptionist/launch/setup.launch | 2 +- 14 files changed, 26 insertions(+), 26 deletions(-) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/.gitignore (100%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/CMakeLists.txt (95%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/launch/service.launch (52%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/models/.gitkeep (100%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/nodes/service (82%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/package.xml (95%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/requirements.in (100%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/requirements.txt (100%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/setup.py (81%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/src/lasr_vision_torch/__init__.py (95%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/src/lasr_vision_torch/categories_and_attributes.py (100%) rename common/vision/{lasr_vision_torch => lasr_vision_feature_extraction}/src/lasr_vision_torch/image_with_masks_and_attributes.py (98%) diff --git a/common/vision/lasr_vision_torch/.gitignore b/common/vision/lasr_vision_feature_extraction/.gitignore similarity index 100% rename from common/vision/lasr_vision_torch/.gitignore rename to common/vision/lasr_vision_feature_extraction/.gitignore diff --git a/common/vision/lasr_vision_torch/CMakeLists.txt b/common/vision/lasr_vision_feature_extraction/CMakeLists.txt similarity index 95% rename from common/vision/lasr_vision_torch/CMakeLists.txt rename to common/vision/lasr_vision_feature_extraction/CMakeLists.txt index da57acfe7..1d4613622 100644 --- a/common/vision/lasr_vision_torch/CMakeLists.txt +++ b/common/vision/lasr_vision_feature_extraction/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.0.2) -project(lasr_vision_torch) +project(lasr_vision_feature_extraction) ## Compile as C++11, supported in ROS Kinetic and newer # add_compile_options(-std=c++11) @@ -104,7 +104,7 @@ catkin_generate_virtualenv( ## DEPENDS: system dependencies of this project that dependent projects also need catkin_package( # INCLUDE_DIRS include -# LIBRARIES lasr_vision_torch +# LIBRARIES lasr_vision_feature_extraction # CATKIN_DEPENDS other_catkin_pkg # DEPENDS system_lib ) @@ -122,7 +122,7 @@ include_directories( ## Declare a C++ library # add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/lasr_vision_torch.cpp +# src/${PROJECT_NAME}/lasr_vision_feature_extraction.cpp # ) ## Add cmake target dependencies of the library @@ -133,7 +133,7 @@ include_directories( ## Declare a C++ executable ## With catkin_make all packages are built within a single CMake context ## The recommended prefix ensures that target names across packages don't collide -# add_executable(${PROJECT_NAME}_node src/lasr_vision_torch_node.cpp) +# add_executable(${PROJECT_NAME}_node src/lasr_vision_feature_extraction_node.cpp) ## Rename C++ executable without prefix ## The above recommended prefix causes long target names, the following renames the @@ -197,7 +197,7 @@ catkin_install_python(PROGRAMS ############# ## Add gtest based cpp test target and link libraries -# catkin_add_gtest(${PROJECT_NAME}-test test/test_lasr_vision_torch.cpp) +# catkin_add_gtest(${PROJECT_NAME}-test test/test_lasr_vision_feature_extraction.cpp) # if(TARGET ${PROJECT_NAME}-test) # target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) # endif() diff --git a/common/vision/lasr_vision_torch/launch/service.launch b/common/vision/lasr_vision_feature_extraction/launch/service.launch similarity index 52% rename from common/vision/lasr_vision_torch/launch/service.launch rename to common/vision/lasr_vision_feature_extraction/launch/service.launch index 96af5a527..11bdbbebb 100644 --- a/common/vision/lasr_vision_torch/launch/service.launch +++ b/common/vision/lasr_vision_feature_extraction/launch/service.launch @@ -2,5 +2,5 @@ Start the torch service - + \ No newline at end of file diff --git a/common/vision/lasr_vision_torch/models/.gitkeep b/common/vision/lasr_vision_feature_extraction/models/.gitkeep similarity index 100% rename from common/vision/lasr_vision_torch/models/.gitkeep rename to common/vision/lasr_vision_feature_extraction/models/.gitkeep diff --git a/common/vision/lasr_vision_torch/nodes/service b/common/vision/lasr_vision_feature_extraction/nodes/service similarity index 82% rename from common/vision/lasr_vision_torch/nodes/service rename to common/vision/lasr_vision_feature_extraction/nodes/service index b6cf0f392..0c896a64e 100644 --- a/common/vision/lasr_vision_torch/nodes/service +++ b/common/vision/lasr_vision_feature_extraction/nodes/service @@ -9,7 +9,7 @@ import cv2 import torch import rospy import rospkg -import lasr_vision_torch +import lasr_vision_feature_extraction from os import path @@ -21,11 +21,11 @@ def detect(request: TorchFaceFeatureDetectionDescriptionRequest) -> TorchFaceFea head_mask_data, head_mask_shape, head_mask_dtype = request.head_mask_data, request.head_mask_shape, request.head_mask_dtype torso_mask = message2numpy(torso_mask_data, torso_mask_shape, torso_mask_dtype) head_mask = message2numpy(head_mask_data, head_mask_shape, head_mask_dtype) - head_frame = lasr_vision_torch.extract_mask_region(full_frame, head_mask.astype(np.uint8), expand_x=0.4, expand_y=0.5) - torso_frame = lasr_vision_torch.extract_mask_region(full_frame, torso_mask.astype(np.uint8), expand_x=0.2, expand_y=0.0) + head_frame = lasr_vision_feature_extraction.extract_mask_region(full_frame, head_mask.astype(np.uint8), expand_x=0.4, expand_y=0.5) + torso_frame = lasr_vision_feature_extraction.extract_mask_region(full_frame, torso_mask.astype(np.uint8), expand_x=0.2, expand_y=0.0) - # class_pred, colour_pred = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_torch.model, lasr_vision_torch.thresholds_mask, lasr_vision_torch.erosion_iterations, lasr_vision_torch.dilation_iterations, lasr_vision_torch.thresholds_pred) - rst_str = lasr_vision_torch.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask,) + # class_pred, colour_pred = lasr_vision_feature_extraction.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, lasr_vision_feature_extraction.model, lasr_vision_feature_extraction.thresholds_mask, lasr_vision_feature_extraction.erosion_iterations, lasr_vision_feature_extraction.dilation_iterations, lasr_vision_feature_extraction.thresholds_pred) + rst_str = lasr_vision_feature_extraction.predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask,) response = TorchFaceFeatureDetectionDescriptionResponse() response.description = rst_str @@ -51,7 +51,7 @@ def detect(request: TorchFaceFeatureDetectionDescriptionRequest) -> TorchFaceFea # # 'hair', 'hat', 'glasses', 'face' # input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() # input_image /= 255.0 -# masks_batch_pred, pred_classes = lasr_vision_torch.model(input_image) +# masks_batch_pred, pred_classes = lasr_vision_feature_extraction.model(input_image) # thresholds_mask = [ # 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, diff --git a/common/vision/lasr_vision_torch/package.xml b/common/vision/lasr_vision_feature_extraction/package.xml similarity index 95% rename from common/vision/lasr_vision_torch/package.xml rename to common/vision/lasr_vision_feature_extraction/package.xml index 23c130106..4019a147a 100644 --- a/common/vision/lasr_vision_torch/package.xml +++ b/common/vision/lasr_vision_feature_extraction/package.xml @@ -1,6 +1,6 @@ - lasr_vision_torch + lasr_vision_feature_extraction 0.0.0 Serivce providing custom vision models using PyTorch @@ -19,7 +19,7 @@ - + diff --git a/common/vision/lasr_vision_torch/requirements.in b/common/vision/lasr_vision_feature_extraction/requirements.in similarity index 100% rename from common/vision/lasr_vision_torch/requirements.in rename to common/vision/lasr_vision_feature_extraction/requirements.in diff --git a/common/vision/lasr_vision_torch/requirements.txt b/common/vision/lasr_vision_feature_extraction/requirements.txt similarity index 100% rename from common/vision/lasr_vision_torch/requirements.txt rename to common/vision/lasr_vision_feature_extraction/requirements.txt diff --git a/common/vision/lasr_vision_torch/setup.py b/common/vision/lasr_vision_feature_extraction/setup.py similarity index 81% rename from common/vision/lasr_vision_torch/setup.py rename to common/vision/lasr_vision_feature_extraction/setup.py index b59bbda5e..9df7d2505 100644 --- a/common/vision/lasr_vision_torch/setup.py +++ b/common/vision/lasr_vision_feature_extraction/setup.py @@ -4,7 +4,7 @@ from catkin_pkg.python_setup import generate_distutils_setup setup_args = generate_distutils_setup( - packages=['lasr_vision_torch'], + packages=['lasr_vision_feature_extraction'], package_dir={'': 'src'} ) diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py similarity index 95% rename from common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py rename to common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py index beb1335f4..86321d294 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py @@ -3,15 +3,15 @@ from colour_estimation import load_images_to_dict, generate_colour_table, count_colours_in_masked_area, compare_colour_distributions from colour_estimation import SPESIFIC_COLOURS, DETAILED_COLOURS -from lasr_vision_torch.categories_and_attributes import CategoriesAndAttributes, CelebAMaskHQCategoriesAndAttributes -from lasr_vision_torch.image_with_masks_and_attributes import ImageWithMasksAndAttributes, ImageOfPerson +from lasr_vision_feature_extraction.categories_and_attributes import CategoriesAndAttributes, CelebAMaskHQCategoriesAndAttributes +from lasr_vision_feature_extraction.image_with_masks_and_attributes import ImageWithMasksAndAttributes, ImageOfPerson import numpy as np import cv2 import torch import rospy import rospkg -import lasr_vision_torch +import lasr_vision_feature_extraction from os import path # import matplotlib.pyplot as plt @@ -71,7 +71,7 @@ def load_face_classifier_model(): r = rospkg.RosPack() model, _, _, _ = load_torch_model(model, None, path=path.join(r.get_path( - "lasr_vision_torch"), "models", "model.pth"), cpu_only=True) + "lasr_vision_feature_extraction"), "models", "model.pth"), cpu_only=True) return model @@ -174,7 +174,7 @@ def extract_mask_region(frame, mask, expand_x=0.5, expand_y=0.5): # # try: # # r = rospkg.RosPack() # # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) -# # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) +# # cv2.imwrite(path.join(r.get_path("lasr_vision_feature_extraction"), 'head_frame.jpg'), _head_frame_bgr) # # except Exception as ignore: # # pass @@ -307,11 +307,11 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask,): # # try: # # r = rospkg.RosPack() # # _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) -# # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'full_frame.jpg'), _full_frame_bgr) +# # cv2.imwrite(path.join(r.get_path("lasr_vision_feature_extraction"), 'full_frame.jpg'), _full_frame_bgr) # # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) -# # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'head_frame.jpg'), _head_frame_bgr) +# # cv2.imwrite(path.join(r.get_path("lasr_vision_feature_extraction"), 'head_frame.jpg'), _head_frame_bgr) # # _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) -# # cv2.imwrite(path.join(r.get_path("lasr_vision_torch"), 'torso_frame.jpg'), _torso_frame_bgr) +# # cv2.imwrite(path.join(r.get_path("lasr_vision_feature_extraction"), 'torso_frame.jpg'), _torso_frame_bgr) # # except Exception as ignore: # # pass diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/categories_and_attributes.py b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/categories_and_attributes.py similarity index 100% rename from common/vision/lasr_vision_torch/src/lasr_vision_torch/categories_and_attributes.py rename to common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/categories_and_attributes.py diff --git a/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/image_with_masks_and_attributes.py similarity index 98% rename from common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py rename to common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/image_with_masks_and_attributes.py index 6a5e363e5..56e2efe0f 100644 --- a/common/vision/lasr_vision_torch/src/lasr_vision_torch/image_with_masks_and_attributes.py +++ b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/image_with_masks_and_attributes.py @@ -1,5 +1,5 @@ import numpy as np -from lasr_vision_torch.categories_and_attributes import CategoriesAndAttributes +from lasr_vision_feature_extraction.categories_and_attributes import CategoriesAndAttributes def _softmax(x: list[float]) -> list[float]: diff --git a/skills/launch/unit_test_describe_people.launch b/skills/launch/unit_test_describe_people.launch index 978faaa7b..0e9b2cfbd 100644 --- a/skills/launch/unit_test_describe_people.launch +++ b/skills/launch/unit_test_describe_people.launch @@ -9,7 +9,7 @@ - + diff --git a/tasks/receptionist/launch/setup.launch b/tasks/receptionist/launch/setup.launch index ff9b7b015..94b78e340 100644 --- a/tasks/receptionist/launch/setup.launch +++ b/tasks/receptionist/launch/setup.launch @@ -56,7 +56,7 @@ - + From a274cdcaddf6c7c83b13b522037b00c24b730dec Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 16:40:29 +0000 Subject: [PATCH 58/69] removed some unused code comments --- .../src/lasr_vision_torch/__init__.py | 269 ------------------ 1 file changed, 269 deletions(-) diff --git a/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py index 86321d294..b7d0d6006 100644 --- a/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py @@ -77,26 +77,6 @@ def load_face_classifier_model(): model = load_face_classifier_model() -# # setups -# face_th_rate = 0.05 -# thresholds_mask = [ -# 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, -# ] -# thresholds_pred = [ -# 0.6, 0.8, 0.1, 0.5, -# ] -# erosion_iterations = 1 -# dilation_iterations = 1 -# colour_distance_rate = 1.2 -# categories = ['hair', 'hat', 'glasses', 'face',] -# cat_layers = 4 - -# # prepare hair colour table -# r = rospkg.RosPack() -# image_dict = load_images_to_dict(path.join(r.get_path( -# "colour_estimation"), "hair_colours")) -# hair_colour_table = generate_colour_table(image_dict, SPESIFIC_COLOURS) - def pad_image_to_even_dims(image): # Get the current shape of the image @@ -144,110 +124,6 @@ def extract_mask_region(frame, mask, expand_x=0.5, expand_y=0.5): return None -# def process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): -# """ -# Processes the head frame to extract class counts and color information for head-related classes. - -# Args: -# - head_frame (np.ndarray): The head frame extracted by the BodyPix model. -# - model: A PyTorch model instance for classifying and predicting masks for head features. -# - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. -# - thresholds_pred: A list of prediction thresholds. - -# Returns: -# - Tuple[dict, dict]: A tuple containing two dictionaries: -# - head_class_count: A dictionary with counts for each head-related class. -# - head_class_colours: A dictionary with color information for each head-related class. -# """ -# head_class_count = { -# 'hair': 0, -# 'hat': 0, -# 'glasses': 0, -# } -# head_class_colours = { -# 'hair': {}, -# 'hat': {}, -# 'glasses': {}, -# } - -# if head_frame is not None: -# # try: -# # r = rospkg.RosPack() -# # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) -# # cv2.imwrite(path.join(r.get_path("lasr_vision_feature_extraction"), 'head_frame.jpg'), _head_frame_bgr) -# # except Exception as ignore: -# # pass - -# # Convert head frame to PyTorch tensor and normalize -# head_frame_tensor = torch.from_numpy(head_frame).permute(2, 0, 1).unsqueeze(0).float() / 255.0 -# masks_batch_pred, pred_classes = model(head_frame_tensor) - -# # Apply binary erosion and dilation to the masks -# processed_masks = binary_erosion_dilation( -# masks_batch_pred, thresholds=thresholds_mask, -# erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations -# ) -# masks = processed_masks.detach().squeeze(0).numpy().astype(np.uint8) -# mask_list = [masks[i,:,:] for i in range(masks.shape[0])] -# pred_classes = pred_classes.detach().squeeze(0).numpy() - -# # Determine if each class is present -# class_list = [pred_classes[i].item() > thresholds_pred[i] for i in range(pred_classes.shape[0])] - -# # Update class count -# for each_class, k in zip(class_list[0:3], ['hair', 'hat', 'glasses']): -# head_class_count[k] = int(each_class) - -# # Update class colours -# for f, each_mask, k, c_map in zip([head_frame, head_frame, head_frame], mask_list[0:2], ['hair', 'hat', 'glasses'], [SPESIFIC_COLOURS, DETAILED_COLOURS, DETAILED_COLOURS]): -# colours = count_colours_in_masked_area(f, each_mask, c_map, sort=True)[1] -# # colours = [c in ] -# for colour in colours: -# head_class_colours[k][colour[0]] = colour[1] -# # if colour[0] not in head_class_colours[k]: -# # head_class_colours[k][colour[0]] = [colour[1]] -# # else: -# # head_class_colours[k][colour[0]].append(colour[1]) - -# return head_class_count, head_class_colours - - -# def process_cloth(full_frame, torso_mask): -# """ -# Processes the full frame with the torso mask to extract class counts and color information for cloth. - -# Args: -# - full_frame (np.ndarray): The full original frame from the video source. -# - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. - -# Returns: -# - Tuple[dict, dict]: A tuple containing two dictionaries: -# - cloth_class_count: A dictionary with counts for the cloth class. -# - cloth_class_colours: A dictionary with color information for the cloth class. -# """ -# cloth_class_count = { -# 'cloth': 0, -# } -# cloth_class_colours = { -# 'cloth': {}, -# } - -# # Check if cloth is detected -# if torso_mask is not None and np.sum(torso_mask) >= 50: -# cloth_class_count['cloth'] = 1 - -# # Update cloth colours -# colours = count_colours_in_masked_area(full_frame, torso_mask, DETAILED_COLOURS, sort=True)[1] -# for colour in colours: -# cloth_class_colours['cloth'][colour[0]] = colour[1] -# # if colour[0] not in cloth_class_colours['cloth']: -# # cloth_class_colours['cloth'][colour[0]] = [colour[1]] -# # else: -# # cloth_class_colours['cloth'][colour[0]].append(colour[1]) - -# return cloth_class_count, cloth_class_colours - - p = Predictor(model, torch.device('cpu'), CelebAMaskHQCategoriesAndAttributes) @@ -262,148 +138,3 @@ def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask,): rst = ImageOfPerson.from_parent_instance(p.predict(head_frame)) return rst.describe() - - -# # you can use this function directly for prediction. -# def predict_frame(head_frame, torso_frame, full_frame, head_mask, torso_mask, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred): -# """ -# Predicts classes and color information for a single processed video frame. - -# Args: -# - head_frame (np.ndarray): The head frame extracted by the BodyPix model. -# - full_frame (np.ndarray): The full original frame from the video source. -# - head_mask (np.ndarray): The head mask extracted by the BodyPix model. -# - torso_mask (np.ndarray): The torso mask extracted by the BodyPix model. -# - model: A PyTorch model instance for classifying and predicting masks for head features. -# - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. -# - thresholds_pred: A list of prediction thresholds. - -# Returns: -# - Tuple[dict, dict]: A tuple containing: -# - class_pred: A dictionary with predicted classes for the single frame. -# - colour_pred: A dictionary with predicted colors for the single frame. -# """ -# class_count = { -# 'hair': 0, -# 'hat': 0, -# 'glasses': 0, -# 'cloth': 0, -# } -# class_colours = { -# 'hair': {}, -# 'hat': {}, -# 'glasses': {}, -# 'cloth': {}, -# } - -# full_frame = cv2.cvtColor(full_frame, cv2.COLOR_BGR2RGB) -# head_frame = cv2.cvtColor(head_frame, cv2.COLOR_BGR2RGB) -# torso_frame = cv2.cvtColor(torso_frame, cv2.COLOR_BGR2RGB) - -# head_frame = pad_image_to_even_dims(head_frame) -# torso_frame = pad_image_to_even_dims(torso_frame) - -# # cv2 imshow is currently not working, not knowing why... -# # try: -# # r = rospkg.RosPack() -# # _full_frame_bgr = cv2.cvtColor(full_frame, cv2.COLOR_RGB2BGR) -# # cv2.imwrite(path.join(r.get_path("lasr_vision_feature_extraction"), 'full_frame.jpg'), _full_frame_bgr) -# # _head_frame_bgr = cv2.cvtColor(head_frame, cv2.COLOR_RGB2BGR) -# # cv2.imwrite(path.join(r.get_path("lasr_vision_feature_extraction"), 'head_frame.jpg'), _head_frame_bgr) -# # _torso_frame_bgr = cv2.cvtColor(torso_frame, cv2.COLOR_RGB2BGR) -# # cv2.imwrite(path.join(r.get_path("lasr_vision_feature_extraction"), 'torso_frame.jpg'), _torso_frame_bgr) -# # except Exception as ignore: -# # pass - -# # Process head and cloth separately for the single frame -# head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) -# cloth_class_count, cloth_class_colours = process_cloth(full_frame, torso_mask) - -# # Update class counts and colours -# for k in head_class_count: -# class_count[k] = head_class_count[k] -# class_colours[k] = head_class_colours[k] - -# class_count['cloth'] = cloth_class_count['cloth'] -# class_colours['cloth'] = cloth_class_colours['cloth'] - -# # Compute final class predictions and colors for the single frame -# class_pred = {k: bool(class_count[k]) for k in class_count} -# colour_pred = {k: v for k, v in class_colours.items()} - -# rospy.loginfo(str(class_colours['hair'])) -# rospy.loginfo(str(hair_colour_table)) - -# # compare_colour_distributions([k,v class_colours['hair']], hair_colour_table) -# colour_pred['hair'] = compare_colour_distributions(class_colours['hair'], hair_colour_table) - -# # class_pred, colour_pred = None, None - -# return class_pred, colour_pred - - -# # if able to provide multiple frames (see __main__ seciton), then this should work better than the single frame version. -# def predict_frames(head_frames, torso_frames, full_frames, head_masks, torso_masks, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred, SPESIFIC_COLOURS): -# """ -# Predicts classes and color information for a sequence of processed video frames. - -# Args: -# - head_frames (list[np.ndarray]): List of head frames extracted by the BodyPix model. -# - torso_frames (list[np.ndarray]): List of body frames extracted by the BodyPix model. -# - full_frames (list[np.ndarray]): List of full original frames from the video source. -# - head_masks (list[np.ndarray]): List of head masks extracted by the BodyPix model. -# - torso_masks (list[np.ndarray]): List of torso masks extracted by the BodyPix model. -# - model: A PyTorch model instance for classifying and predicting masks for head features. -# - thresholds_mask, erosion_iterations, dilation_iterations: Thresholds and iteration counts for binary erosion and dilation. -# - thresholds_pred: A list of prediction thresholds. -# - SPESIFIC_COLOURS: A dictionary of specific colors. - -# Returns: -# - Tuple[dict, dict]: A tuple containing: -# - class_pred: A dictionary with predicted classes. -# - colour_pred: A dictionary with predicted colors. -# """ -# total_class_count = { -# 'hair': [], -# 'hat': [], -# 'glasses': [], -# 'cloth': [], -# } -# total_class_colours = { -# 'hair': {}, -# 'hat': {}, -# 'glasses': {}, -# 'cloth': {}, -# } - -# for head_frame, torso_frame, full_frame, head_mask, torso_mask in zip(head_frames, torso_frames, full_frames, head_masks, torso_masks): -# head_frame = pad_image_to_even_dims(head_frame) -# torso_frame = pad_image_to_even_dims(torso_frame) - -# # Process head and cloth separately -# head_class_count, head_class_colours = process_head(head_frame, model, thresholds_mask, erosion_iterations, dilation_iterations, thresholds_pred) -# cloth_class_count, cloth_class_colours = process_cloth(full_frame, torso_mask) - -# # Accumulate class counts and colours -# for k in head_class_count: -# total_class_count[k].append(head_class_count[k]) -# if k in head_class_colours: -# for colour, count in head_class_colours[k].items(): -# if colour not in total_class_colours[k]: -# total_class_colours[k][colour] = count -# else: -# total_class_colours[k][colour].extend(count) - -# total_class_count['cloth'].append(cloth_class_count['cloth']) -# for colour, count in cloth_class_colours['cloth'].items(): -# if colour not in total_class_colours['cloth']: -# total_class_colours['cloth'][colour] = count -# else: -# total_class_colours['cloth'][colour].extend(count) - -# # Compute final class predictions and colors -# class_pred = {k: sum(v) >= len(v) / 2 for k, v in total_class_count.items()} -# colour_pred = average_colours_by_label(total_class_count, total_class_colours) - -# return class_pred, colour_pred - From d967c5150972c57a7baa3a8b45d1f35c56022535 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 16:44:09 +0000 Subject: [PATCH 59/69] removed colour estimation module --- .../helpers/colour_estimation/CMakeLists.txt | 202 ----------- common/helpers/colour_estimation/README.md | 63 ---- .../helpers/colour_estimation/doc/EXAMPLE.md | 10 - .../colour_estimation/doc/PREREQUISITES.md | 1 - common/helpers/colour_estimation/doc/USAGE.md | 12 - .../colour_estimation/hair_colours/black.jpg | Bin 4209 -> 0 bytes .../colour_estimation/hair_colours/blond.jpg | Bin 5211 -> 0 bytes .../colour_estimation/hair_colours/brown .jpg | Bin 6291 -> 0 bytes .../colour_estimation/hair_colours/brown.jpg | Bin 4041 -> 0 bytes .../colour_estimation/hair_colours/gray.png | Bin 54379 -> 0 bytes .../hair_colours/temp/beeline honey.jpg | Bin 5211 -> 0 bytes .../hair_colours/temp/blowout burgundy.jpg | Bin 6516 -> 0 bytes .../hair_colours/temp/butter scotch.jpg | Bin 4525 -> 0 bytes .../hair_colours/temp/caramel.jpg | Bin 5811 -> 0 bytes .../hair_colours/temp/chocolate brown.jpg | Bin 5239 -> 0 bytes .../hair_colours/temp/chocolate-cherry.jpg | Bin 5272 -> 0 bytes .../hair_colours/temp/copper-shimmer.jpg | Bin 6993 -> 0 bytes .../hair_colours/temp/crushedgarnet.jpg | Bin 5786 -> 0 bytes .../hair_colours/temp/dark golden brown.jpg | Bin 4041 -> 0 bytes .../hair_colours/temp/espresso.jpg | Bin 7104 -> 0 bytes .../hair_colours/temp/expresso.jpg | Bin 3804 -> 0 bytes .../hair_colours/temp/french-roast.jpg | Bin 6291 -> 0 bytes .../hair_colours/temp/gray.png | Bin 54379 -> 0 bytes .../hair_colours/temp/havanabrown.jpg | Bin 7081 -> 0 bytes .../hair_colours/temp/hot-toffee.jpg | Bin 7452 -> 0 bytes .../hair_colours/temp/jet black.jpg | Bin 3536 -> 0 bytes .../hair_colours/temp/leatherblack.jpg | Bin 5887 -> 0 bytes .../hair_colours/temp/light ash blonde.jpg | Bin 5223 -> 0 bytes .../hair_colours/temp/light auburn.jpg | Bin 4432 -> 0 bytes .../hair_colours/temp/light blonde.jpg | Bin 5039 -> 0 bytes .../hair_colours/temp/light brown.jpg | Bin 3611 -> 0 bytes .../hair_colours/temp/light cool brown.jpg | Bin 5323 -> 0 bytes .../hair_colours/temp/light golden blonde.jpg | Bin 5005 -> 0 bytes .../hair_colours/temp/light golden brown.jpg | Bin 4205 -> 0 bytes .../hair_colours/temp/medium ash brown.jpg | Bin 4209 -> 0 bytes .../hair_colours/temp/medium auburn.jpg | Bin 4801 -> 0 bytes .../hair_colours/temp/medium champagne.jpg | Bin 5302 -> 0 bytes .../hair_colours/temp/midnighrruby.jpg | Bin 5809 -> 0 bytes .../hair_colours/temp/pure-diamond.jpg | Bin 6282 -> 0 bytes .../hair_colours/temp/red hot cinnamon.jpg | Bin 3878 -> 0 bytes .../hair_colours/temp/reddish blonde.jpg | Bin 5022 -> 0 bytes .../hair_colours/temp/rubyfusion.jpg | Bin 5129 -> 0 bytes .../hair_colours/temp/sparkling-amber.jpg | Bin 6345 -> 0 bytes .../hair_colours/temp/sunflower-blonde.jpg | Bin 6002 -> 0 bytes common/helpers/colour_estimation/package.xml | 59 ---- common/helpers/colour_estimation/setup.py | 11 - .../src/colour_estimation/__init__.py | 324 ------------------ .../src/colour_estimation/rgb.py | 190 ---------- .../src/lasr_vision_torch/__init__.py | 3 - skills/src/lasr_skills/describe_people.py | 1 - 50 files changed, 876 deletions(-) delete mode 100644 common/helpers/colour_estimation/CMakeLists.txt delete mode 100644 common/helpers/colour_estimation/README.md delete mode 100644 common/helpers/colour_estimation/doc/EXAMPLE.md delete mode 100644 common/helpers/colour_estimation/doc/PREREQUISITES.md delete mode 100644 common/helpers/colour_estimation/doc/USAGE.md delete mode 100644 common/helpers/colour_estimation/hair_colours/black.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/blond.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/brown .jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/brown.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/gray.png delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/beeline honey.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/blowout burgundy.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/butter scotch.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/caramel.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/chocolate brown.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/chocolate-cherry.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/copper-shimmer.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/crushedgarnet.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/dark golden brown.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/espresso.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/expresso.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/french-roast.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/gray.png delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/havanabrown.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/hot-toffee.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/jet black.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/leatherblack.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/light ash blonde.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/light auburn.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/light blonde.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/light brown.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/light cool brown.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/light golden blonde.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/light golden brown.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/medium ash brown.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/medium auburn.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/medium champagne.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/midnighrruby.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/pure-diamond.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/red hot cinnamon.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/reddish blonde.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/rubyfusion.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/sparkling-amber.jpg delete mode 100644 common/helpers/colour_estimation/hair_colours/temp/sunflower-blonde.jpg delete mode 100644 common/helpers/colour_estimation/package.xml delete mode 100644 common/helpers/colour_estimation/setup.py delete mode 100644 common/helpers/colour_estimation/src/colour_estimation/__init__.py delete mode 100644 common/helpers/colour_estimation/src/colour_estimation/rgb.py diff --git a/common/helpers/colour_estimation/CMakeLists.txt b/common/helpers/colour_estimation/CMakeLists.txt deleted file mode 100644 index e693284eb..000000000 --- a/common/helpers/colour_estimation/CMakeLists.txt +++ /dev/null @@ -1,202 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2) -project(colour_estimation) - -## Compile as C++11, supported in ROS Kinetic and newer -# add_compile_options(-std=c++11) - -## Find catkin macros and libraries -## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) -## is used, also find other catkin packages -find_package(catkin REQUIRED) - -## System dependencies are found with CMake's conventions -# find_package(Boost REQUIRED COMPONENTS system) - - -## Uncomment this if the package has a setup.py. This macro ensures -## modules and global scripts declared therein get installed -## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html -catkin_python_setup() - -################################################ -## Declare ROS messages, services and actions ## -################################################ - -## To declare and build messages, services or actions from within this -## package, follow these steps: -## * Let MSG_DEP_SET be the set of packages whose message types you use in -## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). -## * In the file package.xml: -## * add a build_depend tag for "message_generation" -## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET -## * If MSG_DEP_SET isn't empty the following dependency has been pulled in -## but can be declared for certainty nonetheless: -## * add a exec_depend tag for "message_runtime" -## * In this file (CMakeLists.txt): -## * add "message_generation" and every package in MSG_DEP_SET to -## find_package(catkin REQUIRED COMPONENTS ...) -## * add "message_runtime" and every package in MSG_DEP_SET to -## catkin_package(CATKIN_DEPENDS ...) -## * uncomment the add_*_files sections below as needed -## and list every .msg/.srv/.action file to be processed -## * uncomment the generate_messages entry below -## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) - -## Generate messages in the 'msg' folder -# add_message_files( -# FILES -# Message1.msg -# Message2.msg -# ) - -## Generate services in the 'srv' folder -# add_service_files( -# FILES -# Service1.srv -# Service2.srv -# ) - -## Generate actions in the 'action' folder -# add_action_files( -# FILES -# Action1.action -# Action2.action -# ) - -## Generate added messages and services with any dependencies listed here -# generate_messages( -# DEPENDENCIES -# std_msgs # Or other packages containing msgs -# ) - -################################################ -## Declare ROS dynamic reconfigure parameters ## -################################################ - -## To declare and build dynamic reconfigure parameters within this -## package, follow these steps: -## * In the file package.xml: -## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" -## * In this file (CMakeLists.txt): -## * add "dynamic_reconfigure" to -## find_package(catkin REQUIRED COMPONENTS ...) -## * uncomment the "generate_dynamic_reconfigure_options" section below -## and list every .cfg file to be processed - -## Generate dynamic reconfigure parameters in the 'cfg' folder -# generate_dynamic_reconfigure_options( -# cfg/DynReconf1.cfg -# cfg/DynReconf2.cfg -# ) - -################################### -## catkin specific configuration ## -################################### -## The catkin_package macro generates cmake config files for your package -## Declare things to be passed to dependent projects -## INCLUDE_DIRS: uncomment this if your package contains header files -## LIBRARIES: libraries you create in this project that dependent projects also need -## CATKIN_DEPENDS: catkin_packages dependent projects also need -## DEPENDS: system dependencies of this project that dependent projects also need -catkin_package( -# INCLUDE_DIRS include -# LIBRARIES colour_estimation -# CATKIN_DEPENDS other_catkin_pkg -# DEPENDS system_lib -) - -########### -## Build ## -########### - -## Specify additional locations of header files -## Your package locations should be listed before other locations -include_directories( -# include -# ${catkin_INCLUDE_DIRS} -) - -## Declare a C++ library -# add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/colour_estimation.cpp -# ) - -## Add cmake target dependencies of the library -## as an example, code may need to be generated before libraries -## either from message generation or dynamic reconfigure -# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Declare a C++ executable -## With catkin_make all packages are built within a single CMake context -## The recommended prefix ensures that target names across packages don't collide -# add_executable(${PROJECT_NAME}_node src/colour_estimation_node.cpp) - -## Rename C++ executable without prefix -## The above recommended prefix causes long target names, the following renames the -## target back to the shorter version for ease of user use -## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" -# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") - -## Add cmake target dependencies of the executable -## same as for the library above -# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Specify libraries to link a library or executable target against -# target_link_libraries(${PROJECT_NAME}_node -# ${catkin_LIBRARIES} -# ) - -############# -## Install ## -############# - -# all install targets should use catkin DESTINATION variables -# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html - -## Mark executable scripts (Python etc.) for installation -## in contrast to setup.py, you can choose the destination -# catkin_install_python(PROGRAMS -# scripts/my_python_script -# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark executables for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html -# install(TARGETS ${PROJECT_NAME}_node -# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark libraries for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html -# install(TARGETS ${PROJECT_NAME} -# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} -# ) - -## Mark cpp header files for installation -# install(DIRECTORY include/${PROJECT_NAME}/ -# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -# FILES_MATCHING PATTERN "*.h" -# PATTERN ".svn" EXCLUDE -# ) - -## Mark other files for installation (e.g. launch and bag files, etc.) -# install(FILES -# # myfile1 -# # myfile2 -# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} -# ) - -############# -## Testing ## -############# - -## Add gtest based cpp test target and link libraries -# catkin_add_gtest(${PROJECT_NAME}-test test/test_colour_estimation.cpp) -# if(TARGET ${PROJECT_NAME}-test) -# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) -# endif() - -## Add folders to be run by python nosetests -# catkin_add_nosetests(test) diff --git a/common/helpers/colour_estimation/README.md b/common/helpers/colour_estimation/README.md deleted file mode 100644 index 0d579ad70..000000000 --- a/common/helpers/colour_estimation/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# colour_estimation - -Python utilities for estimating the name of given colours. - -This package is maintained by: -- [Paul Makles](mailto:me@insrt.uk) - -## Prerequisites - -This package depends on the following ROS packages: -- catkin (buildtool) - -Ensure numpy is available wherever this package is imported. - -## Usage - -Find the closest colours to a given colour: - -```python -import numpy as np -from colour_estimation import closest_colours, RGB_COLOURS, RGB_HAIR_COLOURS - -# find the closest colour from RGB_COLOURS dict -closest_colours(np.array([255, 0, 0]), RGB_COLOURS) - -# find the closest colour from RGB_HAIR_COLOURS dict -closest_colours(np.array([200, 150, 0]), RGB_HAIR_COLOURS) -``` - -## Example - -Find the name of the median colour in an image: - -```python -import numpy as np -from colour_estimation import closest_colours, RGB_COLOURS - -# let `img` be a cv2 image / numpy array - -closest_colours(np.median(img, axis=0), RGB_COLOURS) -``` - -## Technical Overview - -Ask the package maintainer to write a `doc/TECHNICAL.md` for their package! - -## ROS Definitions - -### Launch Files - -This package has no launch files. - -### Messages - -This package has no messages. - -### Services - -This package has no services. - -### Actions - -This package has no actions. diff --git a/common/helpers/colour_estimation/doc/EXAMPLE.md b/common/helpers/colour_estimation/doc/EXAMPLE.md deleted file mode 100644 index 5092381b8..000000000 --- a/common/helpers/colour_estimation/doc/EXAMPLE.md +++ /dev/null @@ -1,10 +0,0 @@ -Find the name of the median colour in an image: - -```python -import numpy as np -from colour_estimation import closest_colours, RGB_COLOURS - -# let `img` be a cv2 image / numpy array - -closest_colours(np.median(img, axis=0), RGB_COLOURS) -``` diff --git a/common/helpers/colour_estimation/doc/PREREQUISITES.md b/common/helpers/colour_estimation/doc/PREREQUISITES.md deleted file mode 100644 index 693e4d848..000000000 --- a/common/helpers/colour_estimation/doc/PREREQUISITES.md +++ /dev/null @@ -1 +0,0 @@ -Ensure numpy is available wherever this package is imported. diff --git a/common/helpers/colour_estimation/doc/USAGE.md b/common/helpers/colour_estimation/doc/USAGE.md deleted file mode 100644 index 20741b2f2..000000000 --- a/common/helpers/colour_estimation/doc/USAGE.md +++ /dev/null @@ -1,12 +0,0 @@ -Find the closest colours to a given colour: - -```python -import numpy as np -from colour_estimation import closest_colours, RGB_COLOURS, RGB_HAIR_COLOURS - -# find the closest colour from RGB_COLOURS dict -closest_colours(np.array([255, 0, 0]), RGB_COLOURS) - -# find the closest colour from RGB_HAIR_COLOURS dict -closest_colours(np.array([200, 150, 0]), RGB_HAIR_COLOURS) -``` diff --git a/common/helpers/colour_estimation/hair_colours/black.jpg b/common/helpers/colour_estimation/hair_colours/black.jpg deleted file mode 100644 index 1cfb60d55918ca2d27f62c62797742394f6b8260..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4209 zcmbu3`9IVR_r^c7*oH7;iEM*u#x6wm?amgm%}kb*#!e$5TO~sZNoJ<(B>Ns&3pH62 zW0%YzB+4==TjIWbyIzwPHqmM`P0RK62D{}w@0szn-0Y^;WF2MHx zu(Pvqa&mBTa>KZ|VBBz?V}Arc!7sr7r%oIf6BZH{J1&nD7e~sgVoqXIbu=_|EY4cE zyWa-=uK`Ci0L}>n11%7c3;>3MAaKx8H*g04z!1>Cul@%J6ace<*g5zCFbMJoFdGyM zV*BHQz;FN}4MnJ#I9w5s2~j7>nm((4%O>bZCX8zQb)7P{@F(XF{|WkcBHKa|;9Zl7MV>Y5Qr zSeFZLe4Wk4&J!xS1+Fa%JX8((utj~<=-7{Ad(8Fj*pO~=&`{phhcv(wx|F71Fn~XQ zP&dVEtYe6B2x@^fXM-Y;JU3f0wdlu0v#OiPZV0}q@pU=Z8kcarj=n<>&5%F}7;h7f z8iqVS0-jVDK71N~u_JsQ$PI&l^^zA0D_OaNh{$1Mg%%ZsV@0Yohs=_!SdCzcF9e>y zQ_eGh_>myt99y(5=RKM&D0crP4gAE{DDy`rui;K-_1TwC)++e@HhqM=eLPO*GD;W zJGTX40XxTFdG+RzxDA!)R6=;fi_1NNin{(KM)CMIV(+{39tL4xOzd>L1vhkDY zvZ3;Xz7UMqqwI_z|Eue`t9Al{oi8bsKBvBmK*J>HcxP&+L);9TIBn}(N3XX$(UgP? zBb%e%RK$OC>mQ0fq+0PgZg+Xc%?QlnDATW9uz7J2@PYh^elvUiyaJv*Lq)d-b&m8B zR3lJ^N#nSNPM-+KDiQdY+vmda%c#xpwy$G{Td)FD@@fz)P~Lul2^5fMRQ>JR1XMqY`mV4t))Ja1+IQM<{epMX zKKJm<2n1Hit;IQi-LJXJkWZ?|IGOs2OBS5l)%J#4J}~}RBr#TtlqJ=ji0j&D zoYqEg8<)Y;>(rE>smCEg8RacRn}p0Qf%9T!CAIbbiMcVQg&$vpUbpi=A@pHnMVt31 z|BXi{EAb_bqv##=YHcdou(L$>#ovzal!89BPh;-QL&h>qYoE<7aK$3~lNZS$SO6&i z1nXt1;X|(yWf&g3)pqB^IwMYenN2ny9pMG?ZP^!<*Pb$&(8}Ij@k6`l(Ft&>(zHg@ zeo!(yW@GG8>1e`bTc}4preM`(oZYn8waM?U7(4{&xkzsBn&~!P5D?$5ajPt*I1w9Z zgITAcR^Kul+EZPTN4k16I@a7HJA!ZBpV@T^Z=2y+-RoCJs z;zm4W?x(ho2uXr1Y9O4kh6vU9Rr4d|GMOg1ly5Z@S&HbF!cs-VK^8bO5m^XY$KY#n ziTMg#2l#pGL!*}qu~KD4L>4gjQ@)YJhy!)=2DGR&T#3@B9>4sXtoGdsopRpuI*Whv19ITU^5a-M8ARkK;c{dYnhlDL4g?&&|N;I{H(1@ycAM{8m z7savsg!_3u&P1JTo8;!_+s_m|Ec)D`ou2R}6ydz20(y#?FbE_0S!cCIiO0(0+d9tA z}BQ!tz$HA{(L=${)b;tfYxErCP!3Ljy6J%ah9zS^%NaWk%7 z^L^`zXQ#tlxLLB$+?B=3U?F_o`X`CCj9N84EWd1mX#P^N0;9nbMemxbAe#in#-Zf$ zH8ggs3zx@Z2yExRwdZWw#O%ns-wJeX6bi2pfMb$+37O>5`n5OQkI59PxI3#4%3icM z+uYSbg&s?0TXx46w*t;};RSy=k`2M<&GJ8H+ZpkaBpcsJq8&^)41MofWLUe0rU+2?N>o>S)2ICz>pIJt5x6avJ}R!DojJGbQ3LT0~$3uT>&LR zuF~M?nt@tk{wTX^YOY*YryUxFLu2(n)a09^#+Ii_u?;~n9>Gn0qH)}!@5KA(VWUJH zGaM%LOl$tem>jp)y}PF@8lPfNqh>9f~2@Ys99V8?wcoLcTsgNrg(U zXrCQ8YkbAQdzR84pb>@?)SBs8dw}W^!X5_3Vnp!^GNg;8S!rFP_*Z6<)`+Zy*kv>0!gan zjFQ2#7remY%bY2brbXws`YY|X%SE6hN~9vKNSSgrzA@&SrtdV7%SM3KeV9En44@gv zjNeI%CCb4GdYLPwq1lhW@VUh7*Ovua`s^%!P`I&O=EK_sbtpdNiEN3}tdb2^kCc;G;XC`pZv08Q<;h1~{E^f&*&g|u zu0aM}@0_y^>1k-P+g#DWZDhX$SFWwIs@(OBU2AimwupXUnLPH5e$W+`rD3pG6V}8` zh_K1RG>87PHsY@&X0@GWx$;YJpQB0nEAx7690w>=Qtr9`Rq58En+`9TY=K% zbpU)Xc2z`;A6f}w$oTb66JO%bTZyM?OxzK=;ydaR42rFv5TMmOG95v$-B#>_%c6Q@ zM6b;rpEYj2yTK7>OtC#%lwQ}C>k$WNOf^Y|WMxv>wswsIe0IJ&)VdQu4zVV8IS>}1 zX5;=?xrokQkZ9`C$UEU0b+@Hq=#Tgj++8;@CuRQbO-{PejoXL^9cC+zW7EPEWc`-Q z1-A+BCJ#hkk^r!C4UVM@e)Q1*`e}F z(!x?w+TIKS#$A_IK@-+Otc?#*Ze1!-tn zF@<-Lo~8Nt?GA74rV^9Nv2_MqlqKpNB+wDdhWQoET}XeKUPXB|b{jY5G1Ceb`7kpqdZ>1S(-E zwX{jsMCD+P~U=2c-qE?nB<{ZEz7TRk6S*DWJ;)9a$JluR4 zDAkVSe(?zK^!y#3nO19VlaL#Xs^3(M(kfy@bD4VO7J?`-0nKK`$8OwpYkmOMhIw%Q z^wWy~Qb0FXZZ8ZX-?}5y5*;ogM+0)D}2oOOnY{sZ1Z@1+7PmL-;URgoX3QrN@*lU+}wH|M%LTTE@ z1e5YtH>?$}k&W!&XwQugl!i$6j>^~FX{MFo2}t9zgyn7LdW4S#KQ9*@nsZMH%O9a- z!$Y$A*4 zp!0WNiGkDWliZoeZC4qlRwC|B_@KpM{eja3p|CkhBI&A{goT5B8aJL4B?CA}ML#Jx z%`%ntwg}@LbmM&USPEStiZ{o0gHILFinF(vFQzUZ0h%8ecFrYk_9_zhXGlr1WtOLpd4HBZ zj^g>1JF17?m~k(#B4J+k$VX+d@|JS6=E);TG(o{|6N&qV0SYx!ds$`zkhnSjP0^;S zt3lCwNh_Np;UZ-j0oBN~xe1A3C+q4q{yt)TPOVNNP14rLPhPSrR{D0Ow%PJ?rn+%WZ&JZ`dK?e<4*vOYL6u~^mpOcoYl5ICNa z=qM9kJ@W68djv9H-1rmSO6gc%y!(AcvS326qy5JEJv8*8@YM;TjL zLUzCG*-Ipp-2UgDd+vRIpXdATIp5EDUOea1=ZgT&>j)$Q00aU6z`q8Z&jAtu4F4@K zn1PWI!pO+N%*4dZ0%c|UYp4L{1o2$cw7*>s|@BAH;Sw8M#Yngc_1pbp7@VT!2huR5A466z)%3) zUjZ5ZHv-cAC2<*wfoxD7cP}WP&jMIMz`wOXP=G#Q-S)xK%QS!R7~#=b)g^5L`l>Ff zUy6}YKBJunws=$uFB8k^UmLC1Fr1#s^{u;y8Dfv!#osT<+<#bJrmoCjppqpm7cTa+ zJ!VgQ>`6tgKlz1{4$BWEDjXMa}Chl8=@(}j4< zJc0>UU62RuYAa#5{%ms~{oi#mpXBPu9>x6toP9`F$v2Vfyb@g89EaGxXa%oVP@>hXFIpA#qv34O zirjej#yj+1xGg5;8(q>v);8xi-7dG;Gx2F@LDnC31k#d$oe2eTeb*Uy-;$HsI;>yU zp`WK)==oeXIvE9)Www=seOIhi2Qw*>J~v}Gb6v$zA>Q31(bga-4~OShzDUkIwq0E= zucP+`ClEL$U)I3JIuD&TK&+9yayO{L-S_Ko8H?8{D+Iq*F&Vsne{WBjc;>~2m}`5@;3bB zowG^rsMUG=h?TO_jZUGVh=LDJqli1Xghwj!mIjuIJx%}tS#JEOzj~T{b@*Uu|3r` zzd~iE7LymFw_PZ?Ug=ewd_sS8#$YTpkt_hTX7^6Wi@o`7MfJt>uETCBQm)BHTRvc# zaV7|1*!9^O%W{M%xZ5bCbH~_a*UPpP52P0%In!(iz^+el)1y2RW`uWlNJ%c#Yn|J5 zC%+D1*zNCrLX&OE;T_=PI|o>lQ*g>h$^g7|zDP=U6mN&_{7rsx6h^Xsm3Ymec-bJ}+RLQn5Z!tw1Jg#j{xmefSj+o)!{yU@L`Am5> zfVb_pn70jeWP=&krprU^BIUMzRX1>wKyi9f@k#l6oud8***U?D8TybRl=FPfvuS+U zU6NydL~@hm{H$xx37rKLYiZQ4F3cw4Z`Yu!?9p4q1`{t=^LK!?2JM3(=63%;7g0CU z9Hx1b3q6zWrpURoC>!Io0v*R0o;J+30FfVH1Wc3zb%NkkAjS)E6xSFqc7BN2LO@Z@z4{iagkYLhd$VKi|kCcqwUJWax&Qi*k#S01*j; zeqOG?>m195Jah)%)zc+*y+1TdQHO$9p7a|^QFGZ0Y6qA2a>J+qH|AC^ZpcUC8&N{Vat`{Fq=n*GuWqX1jl%ytws{Y#f!YQSh)fD9e zU(wGZs%OQm#;8<0N%~yB#?Pear4SVS?bI%O_8ITeZ`&yYlVGTfW-p_rhbwgFg)?<$ z)eU>)V~M#xk}pW#T);(xBUbJ06;1zY{Z)UCx|Vg2Nk9~lO-PA5O;>D5arg4vvxR=1 zw5;k1j>eYw!SyJ4DhBk-xV5{wCPCm*4K5y@!Mm1@;VaQ{fD}np)<|4H@Pou-F#!|D zB|qo6)EJgLbqH9!YclbB2TAP}l4PN@J+^SwH}=cFQ?CWhYFiMuyX6ju`=#BLV>20B zS0d8jm$GeZ3D8^blJ@2OnxO*;(w=?BcHb0^Qfn^=FA@)rsbTr9$`#W`zv5?I;d;49 z@KB@7$u^Q&gf&3sdSPbq%y3v#%Ae)R>WC5z|9Ue!b2E@f=A5+euO7`nC55iOOPXBh z*=XpARUW^yiuC2yc9U~J@G`4iK7FK8qOc%#BIZ*@UB4T~-H1RmC2UNjB|GKJ(VzO^jR!nvBcFUd<4t2c?$~yN9bR>=}A& zTKU-3b*e&n_Nlq_co}6EQUy9YP3J*)-_X4jCquNbfX0;N*``D_wjF?-ok{l38D6O` z!nGnjwz?4PC4TX~>3m*-so~Rwg>2xXDPF4&dBlC>i^^QlAyt#AVo13Tbp7f4w~bn+ zC{JFG+AA~E4By2=oDnkk@p^_@Wn3>Yv4QPh#}gn=XIHfUs_+`pF+tJ zi${T%K0c0=Fp%}9Mw0qZt-in6n0c9Z1*>>D#-=W&y_cVQ}Tb`gCJ;C^Qv1+rh` z$4PAVlrHMVYL@&enKc&u#NL^yVI{X9`-N+%SIT)=@MA`pmhdhu*t=OK(nSUl>9n}g z`d#kJ&R0Q(7fZjdUzGq_XYP>M9$XbDU2YfBXk=vx4^&Gy1v4z7r)U<_^FwdHE*83) zYAo!Je!U$cZ2F6PQyqESAiirw=O)fmE3)|KM+k6PKm&c& z_0`!PHy&guszJexzY79&D2e#BAkhaznwNl8`%mVOr+$ow2G6ZJ?AO}Ll4Q#}W0R^GRl zT;tSKBjXxgFU>o9+CLr7*#Kc@Hh=O%F34Cmg$!SuEYp33eD0jQu zt*DSib&$&7(Hlq?j_B=iKin&Q9#kml6|%mPu<$5!qQ?c|HdDnIxYWi~{ZEpLPhwx` z>Yv+r+%Kcd*;>zN`O5N-Yn~M_cLbc+{c;g<)DhmoCQG7N)6L*WN%p)?WkSE?81uH1 z%83I~W_Nd^9ksG~iPH++u&e=$&V^ahQffmDkHb&+$Zmj$CwpR^!VrMYW6Su=7)9wX ze;@9W4wTYz9NF<%y_jia5{y~#-bad&Wc63Zc5QaoCeqNwT1Z3A{2}F;MC8+!n+xkYtyA%XIARU6xow0#oFT+6}~uCf~C-`7@5zrF;(JwfEXZ z?htu(uu`id4@=KEU~_epV&N6k@IWPT^f!3hRb3v(6HGt+5}i(zj!R_fTkl#6oIo8t zNp=>$+Oa7XEQH1rfb;nL8he^tXy-@zg->rjsXUthHZ1B%!xe>sJQ0S)q7hcg?HNfy z+EA)rF(DCe9yk?T&y5z?cr9WE&)fJ2>G{M(^2r(ye=!Q}zPF zZ@5OacFOBSBOW)KAX%Ytw<_zHuy`}WI#w3-Wt6% zKn@Uw?PDY9n-A^Pp>iE!%&=Y}J{mP0fH~}GreV^w0eFZj$93uS4;|Fb(pI_Y^{GZ? zjtz|zIr^Z%+>EP?@8J_188WbQK%;yp&O|W71UX6?cnaip^GWHdBgR&}KjK6DAsPVGZd^H7ZUply#O)-!O zyVv|$S;qO3;a+U!pD=1>sK{r|YKmf7m|iYmizBwTNHZ($ReF=Sd?&l1c!hAZ-OIS; zw_;pI!Ti05xQ@dz^$yexPhLxGJEy5KXRPndvF}=pk5id60fdSZk^Zt#abCs}kHko) z)!0OG>F7zMM4+1*_Ic1zwMyX{Qw?F>Sa5WRwa3@8eB~-l)K;=l#9Y-}!`$Z}1>0d_ zChoJGXu0%;c&esWHl6QR1!?=|4I%i}O-|s5c3jy{X2{pN{%P&{dH>lX)!C(GvWlTj z&x)6XQs2YL^jk(Fq|5DQrt7!S)={h>0b$MFeO3K^r%!KBaVw-lba(kAVncpLd&hfv z9?|6816e8hecui993=(4_a<$ue6r({^T@^#4(y~d|;$clj`hZ(NLyi6sX|$NSn85 zaJl)f49Bka_x56bV;I&oTS%Mi%HsSPs`75_#4+}MG zTU|W5vpMl4ekndeJt}~;I;X64S4N%1RU5z{Y~y2=Bx?eP51KTGfZ6i4N5*#C5MF9V z7cRywrwijeZ>?VVQMt;gU*R{p{^&lifpJ}_e)w)1@f?scIVuZ3SxVi2%2g-vL9A>o z3-TzMPl3#ALphSmIQ0AUK~rLPB{r~_OqNIzZ%$fuu#oRvYA}8PKlPawUd|e4wouYw zUa`2x(D5BV4}26{rUZLf*tCan6J@P$v5B|8nQ}g_&80Bd*Gc^kwzr}raO$1G|=oD?6RLR#{ zyE_Fs`@}Y3y&$(Bag!+ZgzwTs=ulfrD|5-x*+-t=G(*jiUNTYjT}-y`d+pR)aB(@i z1J-bE9dK|KC?|ZhaQUTwAVGz};Rso7Q~ILZq9<5UJ($P@p^p%2lp(&ymm6JAU_S?- zGW30=b6xD|OnRfzA$zheW?f4I;(V;Hf5W$Ls}c^xuecb&HqncRsx|O2mO{>VeB-5| z;=jiZaB3eSrSa|RdTiV+;?GC}DAfr}8vT8>BZT-o++e!aT06x>jpYQhCSO82@}SB@ z29Q+xnbPnH{!uAd3=$#85PK%j>{54m;{!n2M4Ea}0L%kMmGT=z43`hJAFGk=7m5fQ Q9I~2vY+eFtJ?At31w#B?-v9sr diff --git a/common/helpers/colour_estimation/hair_colours/brown .jpg b/common/helpers/colour_estimation/hair_colours/brown .jpg deleted file mode 100644 index ac3368aa8884918b1775b5e78b5a712c91da2ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6291 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 Ly7zxbyITBzU#B&; diff --git a/common/helpers/colour_estimation/hair_colours/brown.jpg b/common/helpers/colour_estimation/hair_colours/brown.jpg deleted file mode 100644 index 8005d3391d7b206d3091c5d2a708e68f0b1328d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4041 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 Q9I~2vY+eFtJ?At31w#B?-v9sr diff --git a/common/helpers/colour_estimation/hair_colours/temp/blowout burgundy.jpg b/common/helpers/colour_estimation/hair_colours/temp/blowout burgundy.jpg deleted file mode 100644 index e2918952490abbf863be54f3bb1623c55207a483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6516 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 VJ~H3I$~hvu;2#^U&!l-X|6kqEm|g$? diff --git a/common/helpers/colour_estimation/hair_colours/temp/butter scotch.jpg b/common/helpers/colour_estimation/hair_colours/temp/butter scotch.jpg deleted file mode 100644 index 090d91ad1c669e5b250e9c6a37ac18eae4f6280d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4525 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 Ot0eW**vnF9v;POG92gA% diff --git a/common/helpers/colour_estimation/hair_colours/temp/caramel.jpg b/common/helpers/colour_estimation/hair_colours/temp/caramel.jpg deleted file mode 100644 index 1a26d62c67506143964b8eb2f9148116649dfac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5811 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 diff --git a/common/helpers/colour_estimation/hair_colours/temp/chocolate brown.jpg b/common/helpers/colour_estimation/hair_colours/temp/chocolate brown.jpg deleted file mode 100644 index 7db8c90c971dd03aca732c4f05a83f2d2d782592..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5239 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 diff --git a/common/helpers/colour_estimation/hair_colours/temp/chocolate-cherry.jpg b/common/helpers/colour_estimation/hair_colours/temp/chocolate-cherry.jpg deleted file mode 100644 index b7b9b2816182e6876311a494e2297eb156099aa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5272 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 diff --git a/common/helpers/colour_estimation/hair_colours/temp/crushedgarnet.jpg b/common/helpers/colour_estimation/hair_colours/temp/crushedgarnet.jpg deleted file mode 100644 index 3723ce8cfe41ffc92d410c98acab0eaab856b12a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5786 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 diff --git a/common/helpers/colour_estimation/hair_colours/temp/expresso.jpg b/common/helpers/colour_estimation/hair_colours/temp/expresso.jpg deleted file mode 100644 index 7c64850a6203298f14edd7cb37594668016a9fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3804 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 diff --git a/common/helpers/colour_estimation/hair_colours/temp/french-roast.jpg b/common/helpers/colour_estimation/hair_colours/temp/french-roast.jpg deleted file mode 100644 index ac3368aa8884918b1775b5e78b5a712c91da2ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6291 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 Ly7zxbyITBzU#B&; diff --git a/common/helpers/colour_estimation/hair_colours/temp/gray.png b/common/helpers/colour_estimation/hair_colours/temp/gray.png deleted file mode 100644 index 97b47262a1f0a345af179b6e378a382b6fdb1cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54379 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 aD*SPR)sBESC9-j6egSZ}Vtn-Z(*FUJ6p^6- diff --git a/common/helpers/colour_estimation/hair_colours/temp/jet black.jpg b/common/helpers/colour_estimation/hair_colours/temp/jet black.jpg deleted file mode 100644 index 2a56c66e494215d9f14e24c5b58148c1333b79a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3536 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 YTybjlT81jCwE_%OgD(qZ1g_@(3%#jFwEzGB diff --git a/common/helpers/colour_estimation/hair_colours/temp/light auburn.jpg b/common/helpers/colour_estimation/hair_colours/temp/light auburn.jpg deleted file mode 100644 index 7dd3c79f091360df0cd9e41374e5f1a9c2e3c1a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4432 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 S>UBIZJ>A~vU#*7A&;JFsdhT!l diff --git a/common/helpers/colour_estimation/hair_colours/temp/light blonde.jpg b/common/helpers/colour_estimation/hair_colours/temp/light blonde.jpg deleted file mode 100644 index bb8fe425d36573a5fe5082fbcb5667506d76fd16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5039 zcmbtXX*d*)w;pD!5o2qNouS5--3-Fm*D#m}zw9FGXk__W$Ck!2)@0wZgiM8@?8}TL zCDg=-P$J0|igLUE``qWb-|u*r&CKRuvoky5TA~Tvu;xnikn3jU63V32y43j=G0RFQ5 zAG-gPF@wPWAp`xNP7Gj131uFX9nd2zQBsA79ypr^Z~z(pN&|ucdH{ZpYofu3>cUA4 zMv)WVf112Gome_Juild^eSH5KGjO z<(+w>2iY4|o7k^SD9z3ZC>!dZ7pynTj845{Li>|iYN-CA-{)WWl`#O=qUr%MN3}9n zbxdgWN>9T;uo6c&Gg{-?T8!^QkdC!Jw@pcDDA$Mx-#~#OVV$tbGAsP%T*L#_+NgYN z=6D6(x~kZlg)K+7R;@L8w)*)ozIx=*aWWw%yuo`7`ltkPkj(8bRVW{p9r(_HOK8-N zdXpZwj;+spX|I)e&zV;O&49QqIG8uUvey~Vk%yLb8S-%s^3KdxixQ!Nz8zMlJgd4_ z-S~qlz8sSwiEMEN#fIT4(6t#Fh#=pI0U4(bR*di)QqWWRZ9JD&E^5IXM2MiM?VU^L z=hI3Y5PZe*`b~|$WQa^9B`8=4b$Deng!v{-Gp!-<8Hw{^oI1Ro@u|rDmbG6t$u?56 zCj|G`ofvb8Oh^F|$|h)X*rKrgLSByhd|c&u-A(@|)`FrqW{vl|Wf#|=2A(!Y5wO~^ zmHxQug=N3q_-Mai%d&_k0d{?<6c|^4w}OXq1#4nv+whZBI@ofpJ!`SuUt?SIZJNW4 zFbAv09-JKEIW2;&?x|wqv8cNJgS`x#qP@1R>cbLL=t$q(4Q_&`(b{^&138QCq7+N!3$sw6B%SdOt9(4Xw?Y$A{Ml}p{28{h z_P-TccPgAWW}nK}6Eqz3NsHo6CvLLVe0*D}d6$F$m2FtEdaE9E8AcX1&kt@nCXqyw zL+3<#4%##nub~7vjwM{;Ki~MIyHaj4{<1Dr%&TP$$Hb|x{srs1-R|1TdhWaHKK1w_gg4;fewWW<^CwP~Y?h(NJEMat7d4Yd{)iS{fmqlLfyk@dhyww5Lh5x!LfbyQk|iq+e8 zS0}jE?J9rolA4<@+?ClIq+|7ee}#_=lvBn-|Dn(4OtMPh4<2;Tew;+L71p?jqxt#hEx+y#3du>Yg=VQ_Cb8+Mf9sjJj%OO|$o?eHCLW499r`uf z1{nmnKWRj3h^7TA8yjJyQpXHC@YLg$Yi0zc{Sg{R>G@%35jM@@D`8uoPQV(QG1s*B zid-8`>5#qCf2`KKH+h$HuEX4;p>?@5{DI11sVsSz7)B(`-@AvKgMK>y3kzg!fk#NZ zr!f!y^dXFh%c!Vz3v>8yU-{~r0O(8a#Qjb

1c=c7lRuKk zkcX$jyg)m~A)v&Btz8}!B(N0f;P@2Y(2Wc_GTs!h=lAjLr_PY2W_fK5=PqwSR0PVt$kLpRczr>aVpzIG#@%s?&9 zgO%zd&E<&@kH$=HH#rY@mIzEiVn-aJ<5z42F`G)s!aQ6BiNBi`I6t+l#czz|==X~} zhXyQD>&U6->juC}kYW?|6D6@8)M@tgq1pd3>P;w+FDoE=SELrrVU@A7#=Nj~!cK&X3(9Do{;FVq+Am*o& zH^!D5n=WX=JD4w);Qyn+ZoCV&zhT(qBFqc)BEjrq97(j2zzi&>_(?>%7xz3)+oMSzTUwk+!6f_Y@UPwZ335=)AJ2mHQ@@Ji^&ga zq^mwnzo^$;J<0G0(Xtvzl+~vQWfL*}l|iykjbI`P;~Kw5t)FBNW^9h>M5<=iF)+Q<$D~bY7E@CyVH2y#q{LR3&&6X5rjfNkI^Lf>%> zcr8Re19TM7=+eWSp!cJpVtaX}`lCziKY^k3WQzFPS#>`WKO8O+Qu(sUWt*5MvG~n= z?Fe2m-(cE2BzM16KrMDiu92l&lYddBGxNSqyk+Rsf9p%*S6%ma(>@Yss|ye1jAQPP zIT<@-Rsyg)1%BfZu&$$8h%bl8uK(nAAeimI`1ykNVVQMPCVoLIT@)gw2~=@ ztV^Bcw47E$@l`e{P?pK9BK1i{udouAf}q|0i#et}+G#D;Y>p4S3KoT157i$2%IAX@t{G+J*0WyCe~Ck%v_p- zm_1Hq{`0vx;;|g}n2t{ZU8TU?1|peaZ-P5m$8O7b11^BdCzT>9gFWvSO_ht9N)al; zEURxFFDUY5v7z;mTPQx~VvCPOgHlL3cWi%)`gk{nsiR`C-H9ofH3sKL=)2uc5LYR zqKioT&49clXwLcP$8z;Qd>{B^*4$qv8P*~x>eTLcAB7e)q`58n5aL-&>Ib=2nKduF zXqsLX8E&)PQL$)d>ROF^;!eQ4wdZitW6lbNc)>96&Sgn|{s@BwB}(AzBjuEom%Z0% zr55*TK$7n0b1~;r?U2}Wstf7&gqarvTkWH!zjwnXr<1;5TT4@~L&N+owL7eZ--?TN zVXNLBklgN~;Rl*)4=>jZvwpxpzb(b~sl-Q*Gje&3wp@(2@7pjnndW*~k>MgTZI}9* z<>A#??`ws0(i9SqF;|izW)wY{rrjkcugE1^!G()I z0Mqa}tbye%+7I{Z0(8h2D zHG!omLlTtMJ1soh$k0g#9!)ud_q#mxxcXsS_a4F$!iopA)$0K=}3DN`jdGh(fqP zo$G)wkgAJw%QlQluIA@*$Ke~(KC zP|nS$!Q7`xf@q8}&==%B7py-{X;QNiusQaTz-fZ1sL?Y(LDMwnhh|uYNu`6|Q_i-4 zL~gUcMIq7j3Wib~M!lFVtLJRHXA7B*t6 z-Hv|i1q`CqvAWJlKU2N{&j1qW=KW>F3l^I2?!MU_DW>r2YR=1l->ur2Su&prz35I8 zP>k8C;%QXY1^sfHkw|Ln3_ntQH zJazGC5R@)_Kc(`O5Og(u)5(B~`KL5fhp!AhJLrd0Tyk3-<{;%KO>n zD+JuF5{#+XW`aXS7+FnSB3rV~H*#EKSOg}r^L|9gOEW#a8JnAv#rpAG@NCV<833bl zs?6}JO340v*6Q)2M|YN)a=eI1D9I-yCM5!vnA`rg_`F>6bvWryfilC7KNxykF`r7? z1&Jl>L__@Ab7+aU+LwAMQ2mg1#_U9>dc0=Zgb51zyb%VrSAAj(8vl1%0BsW*19iSV z)rm^zhe<_qFLU2am*G(#>HT*&5Ggnsa3_HvpdC}C6PV_2%WM$kL0HM)S}_n7Q=;L& z(xDB_-`O&Zv>#4hX?n?lmnee5ex=pKpV)9ftmglbH><^OP!H7$HY+6Dvhwf`#^c8H H&ffnQ1u+Du diff --git a/common/helpers/colour_estimation/hair_colours/temp/light brown.jpg b/common/helpers/colour_estimation/hair_colours/temp/light brown.jpg deleted file mode 100644 index 3ae276b24a9b4f9a2f4417e4d8afce346a5d3c21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3611 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 Q3z;GdPP};Y^=SHk07tea00000 diff --git a/common/helpers/colour_estimation/hair_colours/temp/light cool brown.jpg b/common/helpers/colour_estimation/hair_colours/temp/light cool brown.jpg deleted file mode 100644 index 3c59c7ace3b0f4b229ea2ce6ff4f6bfab8794953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5323 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 diff --git a/common/helpers/colour_estimation/hair_colours/temp/light golden blonde.jpg b/common/helpers/colour_estimation/hair_colours/temp/light golden blonde.jpg deleted file mode 100644 index f02c77e3921ec48dff9d0583d8e91bbd7d2046ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5005 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 PKZa2hpDa%{d^7zYwN@Gn diff --git a/common/helpers/colour_estimation/hair_colours/temp/light golden brown.jpg b/common/helpers/colour_estimation/hair_colours/temp/light golden brown.jpg deleted file mode 100644 index 6592a4f7d09fb78503580173849af0586173515c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4205 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 WHQsBDAzN3-U!MHMZ~+Wm%>4(srKscp diff --git a/common/helpers/colour_estimation/hair_colours/temp/medium champagne.jpg b/common/helpers/colour_estimation/hair_colours/temp/medium champagne.jpg deleted file mode 100644 index 5c10df03711037976c279a48fbb8c292c06f0505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5302 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 C5L(s% diff --git a/common/helpers/colour_estimation/hair_colours/temp/midnighrruby.jpg b/common/helpers/colour_estimation/hair_colours/temp/midnighrruby.jpg deleted file mode 100644 index c057e82bc280c92704c28e6e05db180217625682..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5809 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 diff --git a/common/helpers/colour_estimation/hair_colours/temp/pure-diamond.jpg b/common/helpers/colour_estimation/hair_colours/temp/pure-diamond.jpg deleted file mode 100644 index 80da260a644733efe92bc425c6622448d037f1e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6282 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 G+5ZBJ_J!>L diff --git a/common/helpers/colour_estimation/hair_colours/temp/red hot cinnamon.jpg b/common/helpers/colour_estimation/hair_colours/temp/red hot cinnamon.jpg deleted file mode 100644 index 3b5185bbed6a7185136653ac794a5dedeec8d2df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3878 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 diff --git a/common/helpers/colour_estimation/hair_colours/temp/rubyfusion.jpg b/common/helpers/colour_estimation/hair_colours/temp/rubyfusion.jpg deleted file mode 100644 index 4c2174cc2753066291254b1e9945a8eb5e39ab85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5129 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 aYh5+X&K%zBNJp5)<<+1n$O6-^=Km9CBpd1g diff --git a/common/helpers/colour_estimation/hair_colours/temp/sparkling-amber.jpg b/common/helpers/colour_estimation/hair_colours/temp/sparkling-amber.jpg deleted file mode 100644 index e36223b9cd3bcf29e1aa3af9f8851ccc48e53fa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6345 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 F{|mBFUmE}b diff --git a/common/helpers/colour_estimation/hair_colours/temp/sunflower-blonde.jpg b/common/helpers/colour_estimation/hair_colours/temp/sunflower-blonde.jpg deleted file mode 100644 index 48b0181bfbb707a1e7e1862dd4809a0eb096334c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6002 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 YGGYn%+~s^_A>#@)hqa*H@XLk&0k$&Mng9R* diff --git a/common/helpers/colour_estimation/package.xml b/common/helpers/colour_estimation/package.xml deleted file mode 100644 index ad3ef2d8b..000000000 --- a/common/helpers/colour_estimation/package.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - colour_estimation - 0.0.0 - Python utilities for estimating the name of given colours. - - - - - Paul Makles - - - - - - MIT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - catkin - - - - - - - - diff --git a/common/helpers/colour_estimation/setup.py b/common/helpers/colour_estimation/setup.py deleted file mode 100644 index 55caf62e8..000000000 --- a/common/helpers/colour_estimation/setup.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python3 - -from distutils.core import setup -from catkin_pkg.python_setup import generate_distutils_setup - -setup_args = generate_distutils_setup( - packages=['colour_estimation'], - package_dir={'': 'src'} -) - -setup(**setup_args) diff --git a/common/helpers/colour_estimation/src/colour_estimation/__init__.py b/common/helpers/colour_estimation/src/colour_estimation/__init__.py deleted file mode 100644 index fca2fdc13..000000000 --- a/common/helpers/colour_estimation/src/colour_estimation/__init__.py +++ /dev/null @@ -1,324 +0,0 @@ -import numpy as np -import os -import cv2 -# import torch -# from scipy.ndimage import convolve - -from .rgb import * - - -def closest_colours(requested_colour, colours): - ''' - Find the closest colours to the requested colour - - This returns the closest three matches - ''' - - distances = {color: np.linalg.norm( - np.array(rgb_val) - requested_colour) for color, rgb_val in colours.items()} - sorted_colors = sorted(distances.items(), key=lambda x: x[1]) - top_three_colors = sorted_colors[:3] - formatted_colors = [(color_name, distance) - for color_name, distance in top_three_colors] - - return formatted_colors - - -# def avg_color_float(rgb_image: torch.Tensor, mask: torch.Tensor) -> torch.Tensor: -# mask = mask.bool() -# avg_colors = torch.zeros((rgb_image.size(0), mask.size(1), rgb_image.size(1)), device=rgb_image.device) -# for i in range(rgb_image.size(0)): -# for j in range(mask.size(1)): -# for k in range(rgb_image.size(1)): -# valid_pixels = torch.masked_select(rgb_image[i, k], mask[i, j]) -# avg_color = valid_pixels.float().mean() if valid_pixels.numel() > 0 else torch.tensor(0.0) -# avg_colors[i, j, k] = avg_color - -# return avg_colors # / 255.0 - - -# def median_color_float(rgb_image: torch.Tensor, mask: torch.Tensor) -> torch.Tensor: -# mask = mask.bool() -# median_colors = torch.zeros((rgb_image.size(0), mask.size(1), rgb_image.size(1)), device=rgb_image.device) -# for i in range(rgb_image.size(0)): -# for j in range(mask.size(1)): -# for k in range(rgb_image.size(1)): -# valid_pixels = torch.masked_select(rgb_image[i, k], mask[i, j]) -# if valid_pixels.numel() > 0: -# median_value = valid_pixels.median() -# else: -# median_value = torch.tensor(0.0, device=rgb_image.device) -# median_colors[i, j, k] = median_value -# return median_colors # / 255.0 - - -# def plot_with_matplotlib(frame, categories, masks, predictions, colours): -# """Generate an image with matplotlib, showing the original frame and masks with titles and color overlays.""" -# assert len(masks) == len(categories) == len(predictions), "Length of masks, categories, and predictions must match." - -# num_masks = len(masks) -# cols = 3 -# rows = (num_masks + 1) // cols + ((num_masks + 1) % cols > 0) # Adding 1 for the frame -# position = range(1, num_masks + 2) # +2 to include the frame in the count - -# fig = plt.figure(figsize=(15, rows * 3)) # Adjust the size as needed - -# # Add the frame as the first image -# ax = fig.add_subplot(rows, cols, 1) -# # frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) -# ax.imshow(frame) -# ax.set_title('Original Frame') -# ax.axis('off') - -# # Iterate over the masks -# for i, idx in enumerate(position[1:], start=1): # Skip 1 for the frame -# ax = fig.add_subplot(rows, cols, idx) - -# # Create an RGB image for the colored mask -# colored_mask = np.stack([masks[i-1]]*3, axis=-1) # i-1 because we skip the frame in position - -# # Apply color if category is detected and color is provided -# if predictions[i-1]: -# if (i-1) < len(colours): -# color = np.array(colours[i-1], dtype=np.uint8) # Convert color to uint8 -# color_mask = np.zeros_like(colored_mask) # Initialize color_mask with the same shape as colored_mask -# color_mask[..., 0] = masks[i-1] * color[0] # Apply color channel 0 -# color_mask[..., 1] = masks[i-1] * color[1] # Apply color channel 1 -# color_mask[..., 2] = masks[i-1] * color[2] # Apply color channel 2 -# # Now combine the colored mask with the original grayscale mask -# colored_mask = np.where(masks[i-1][:, :, None], color_mask, colored_mask).astype(np.uint8) -# # Show the colored mask -# ax.imshow(colored_mask) -# # print(np.max(mask_image)) -# # mask_image = masks[i-1] -# # ax.imshow(mask_image, cmap="gray") -# else: -# # If there's no color provided for this category, use white color -# mask_image = masks[i-1] -# ax.imshow(mask_image, cmap="gray") -# else: -# # If the category is not detected, keep the mask black -# mask_image = masks[i-1] -# ax.imshow(mask_image, cmap="gray") - - -# # mask_image = masks[i-1] -# # ax.imshow(mask_image, cmap="gray") - -# # Set title with the detection status -# detection_status = 'yes' if predictions[i-1] else 'no' -# ax.set_title(f"{categories[i-1]} - {detection_status}") -# ax.axis('off') - -# plt.tight_layout() -# fig.canvas.draw() - -# # Retrieve buffer and close the plot to avoid memory issues -# data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) -# data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) -# plt.close(fig) - -# return data - - -def count_colours_in_masked_area(img, mask, colours, filter_size=3, sort=False): - """ - Counts the number of pixels of each color within the masked area of an image. - - Parameters: - img (numpy.ndarray): An RGB image, with the shape (height, width, 3). - mask (numpy.ndarray): A binary mask, with the shape (height, width), where 1 indicates the area of interest. - colours (dict): A dictionary where keys are color names and values are the corresponding RGB values. - filter_size (int): The size of the convolution filter to apply for smoothing the image, default is 3. - sort (bool): Whether to return a sorted list of colors based on pixel count, default is False. - - Returns: - dict: A dictionary containing the count of pixels for each color in the masked area. - If sort is True, it also returns a list of tuples, each containing a color name, its proportion in the masked area, and the pixel count. This list is sorted in descending order based on pixel count. - - The function first applies an averaging filter to the image for smoothing. Then, it calculates the Euclidean distance of each pixel in the masked area to the predefined colors. It identifies the closest color for each pixel, counts the occurrences of each color, and creates a dictionary mapping colors to their respective counts. If sorting is requested, it also calculates the proportion of each color and returns a sorted list of colors based on their pixel count. - """ - avg_filter = np.ones((filter_size, filter_size, 3)) / (filter_size ** 2) - img_filtered = img - # img_filtered = convolve(img, avg_filter, mode='constant', cval=0.0) - colours_array = np.array(list(colours.values())) - masked_img = img_filtered[mask == 1] - distances = np.linalg.norm(masked_img[:, None] - colours_array, axis=2) - closest_colours = np.argmin(distances, axis=1) - unique, counts = np.unique(closest_colours, return_counts=True) - colour_counts = {list(colours.keys())[i]: count for i, count in zip(unique, counts)} - if sort: - total_pixels = sum(counts) - sorted_colours = sorted(((list(colours.keys())[i], count / total_pixels, count) - for i, count in zip(unique, counts)), key=lambda item: item[2], reverse=True) - return colour_counts, sorted_colours - - return colour_counts - - -def average_colours_by_label(labels, colours): - """ - Computes the average values of colours associated with each label. - - Parameters: - labels (dict): A dictionary where keys are label names and values are lists of binary values (0 or 1). Each list represents whether a certain feature (labelled by the key) is present (1) or not (0) in a set of instances. - colours (dict): A dictionary where keys are label names and values are dictionaries. Each inner dictionary maps colour names to lists of values (e.g., pixel counts or intensities) associated with that colour for each instance. - - Returns: - dict: A dictionary where keys are label names and values are sorted lists of tuples. Each tuple contains a colour name and its average value calculated only from instances where the label is present (1). The tuples are sorted by average values in descending order. - - The function iterates through each label, calculating the average value for each colour only from instances where the label value is 1 (present). It then sorts these average values in descending order for each label and returns this sorted list along with the label name in a dictionary. - """ - averaged_colours = {} - - for label, label_values in labels.items(): - if label not in colours.keys(): - continue - - colour_values = colours[label] - averages = {} - - for colour, values in colour_values.items(): - valid_values = [value for value, label_value in zip(values, label_values) if label_value == 1] - if valid_values: - averages[colour] = sum(valid_values) / len(valid_values) - - sorted_colours = sorted(averages.items(), key=lambda item: item[1], reverse=True) - averaged_colours[label] = sorted_colours - - return averaged_colours - - -def load_images_to_dict(root_dir): - """ - Load images from a specified directory into a dictionary, removing file extensions from the keys. - - Parameters: - root_dir (str): The root directory containing the images. - - Returns: - dict: A dictionary with image names (without extensions) as keys and their corresponding numpy arrays as values. - """ - image_dict = {} - for filename in os.listdir(root_dir): - if filename.lower().endswith(('.png', '.jpg', '.jpeg')): - img_path = os.path.join(root_dir, filename) - # Read the image using OpenCV - img = cv2.imread(img_path) - # Convert it from BGR to RGB color space - img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) - # Remove the file extension from the filename - name_without_extension = os.path.splitext(filename)[0] - image_dict[name_without_extension] = img - - return image_dict - - -def generate_colour_table(image_dict: dict, colour_map: dict): - """ - Generates a colour table for each image in the given dictionary, counting the colours in each image. - - Parameters: - image_dict (dict): A dictionary where keys are image identifiers and values are image arrays in the format (height, width, 3). - colour_map (dict): A dictionary mapping colour names to their respective RGB values. - - Returns: - dict: A dictionary where keys are image identifiers and values are colour tables. Each colour table is generated by the 'count_colours_in_masked_area' function and contains a count of how many times each colour (as defined in colour_map) appears in the corresponding image. - - For each image in the image_dict, this function creates a mask that covers the entire image and uses 'count_colours_in_masked_area' to count the occurrences of each colour in the colour_map within the image. The results are stored in a new dictionary, mapping each image identifier to its corresponding colour table. - """ - colour_table = {} - for k in image_dict.keys(): - colour_table[k] = count_colours_in_masked_area(image_dict[k], np.ones((image_dict[k].shape[0], image_dict[k].shape[1])), colour_map, sort=True) - return colour_table - - -def compare_colour_distributions(avg_colours_dict, colour_table_dict): - """ - Compares colour distributions between a dictionary of averaged colours and a dictionary of colour tables for individual images. - The comparison is based on calculating the Euclidean distance between the colour proportions in avg_colours_dict and each image's colour distribution in the colour_table_dict. - - Parameters: - avg_colours_dict (dict): A dictionary where keys are colour names and values are their averaged proportions. - This dictionary represents the averaged colour distribution over a set of images or a specific category. - colour_table_dict (dict): A dictionary where keys are image identifiers and values are colour tables for each image. - Each colour table is a list of tuples, with each tuple containing a colour name, its proportion in that specific image, and the pixel count. - - Returns: - dict: A dictionary where keys are image identifiers and values are the Euclidean distances between the averaged colour distribution and the image's colour distribution. - - The function calculates the Euclidean distance between the colour proportions in avg_colours_dict and those in each image's colour table within the colour_table_dict. - It accounts for common colours between the averaged dictionary and each image's table, using zero for missing colour proportions in either distribution. - The distances are stored in a dictionary, mapping each image identifier to the calculated distance. These distances represent how similar or different each image's colour distribution is compared to the averaged colour distribution. - """ - distances = {} - - # avg_colours_dict = {colour: proportion for colour, proportion in averaged_colours_list} - - for image_name, colour_data in colour_table_dict.items(): - colour_proportions = {colour: proportion for colour, proportion, _ in colour_data[1]} - - common_colours = set(avg_colours_dict.keys()) & set(colour_proportions.keys()) - avg_values = [avg_colours_dict.get(colour, 0) for colour in common_colours] - prop_values = [colour_proportions.get(colour, 0) for colour in common_colours] - - distances[image_name] = np.linalg.norm(np.array(avg_values) - np.array(prop_values)) - - # sorted_distances = sorted(distances.items(), key=lambda item: item[1]) - - return distances - -# Example usage -# sorted_distances = compare_colour_distributions(averaged_colours, colour_table) - -def extract_top_colours_by_threshold(colour_list, threshold): - """ - Extracts top colours based on a cumulative proportion threshold. - - Parameters: - colour_list (list): A list of tuples, each being a 2-element (colour, proportion) or - a 3-element (colour, proportion, count) tuple. - threshold (float): A float between 0 and 1, representing the threshold for the cumulative proportion. - - Returns: - list: A list of tuples (colour, proportion), sorted by proportion in descending order, - whose cumulative proportion just exceeds the threshold. - """ - # Sort the list by proportion in descending order - sorted_colours = sorted(colour_list, key=lambda x: x[1], reverse=True) - - # Extract top colours based on the cumulative proportion threshold - cumulative_proportion = 0.0 - top_colours = [] - for colour in sorted_colours: - cumulative_proportion += colour[1] - top_colours.append((colour[0], colour[1])) - if cumulative_proportion >= threshold: - break - - return top_colours - - -def find_nearest_colour_family(colour, colour_families): - """ - Determines the nearest colour family for a given colour. - - Parameters: - colour (tuple): The colour in RGB format. - colour_families (dict): A dictionary where keys are family names and values are lists of representative RGB colours for each family. - - Returns: - str: The name of the nearest colour family. - """ - min_distance = float('inf') - nearest_family = None - - for family, representative_colours in colour_families.items(): - for rep_colour in representative_colours: - distance = np.linalg.norm(np.array(colour) - np.array(rep_colour)) - if distance < min_distance: - min_distance = distance - nearest_family = family - - return nearest_family - diff --git a/common/helpers/colour_estimation/src/colour_estimation/rgb.py b/common/helpers/colour_estimation/src/colour_estimation/rgb.py deleted file mode 100644 index 40d018fdc..000000000 --- a/common/helpers/colour_estimation/src/colour_estimation/rgb.py +++ /dev/null @@ -1,190 +0,0 @@ -import numpy as np - -COLOURS = { - "red": [255, 0, 0], - "green": [0, 255, 0], - "blue": [0, 0, 255], - "white": [255, 255, 255], - "black": [0, 0, 0], - "yellow": [255, 255, 0], - "cyan": [0, 255, 255], - "magenta": [255, 0, 255], - "gray": [128, 128, 128], - "orange": [255, 165, 0], - "purple": [128, 0, 128], - "brown": [139, 69, 19], - "pink": [255, 182, 193], - "beige": [245, 245, 220], - "maroon": [128, 0, 0], - "olive": [128, 128, 0], - "navy": [0, 0, 128], - "lime": [50, 205, 50], - "golden": [255, 223, 0], - "teal": [0, 128, 128], - "coral": [255, 127, 80], - "salmon": [250, 128, 114], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "platinum": [229, 228, 226], - "ochre": [204, 119, 34], - "burntsienna": [233, 116, 81], - "chocolate": [210, 105, 30], - "tan": [210, 180, 140], - "ivory": [255, 255, 240], - "goldenrod": [218, 165, 32], - "orchid": [218, 112, 214], - "honey": [238, 220, 130] - } - -SPESIFIC_COLOURS = { - "red": [255, 0, 0], - "green": [0, 255, 0], - "blue": [0, 0, 255], - "white": [255, 255, 255], - "black": [0, 0, 0], - "yellow": [255, 255, 0], - "cyan": [0, 255, 255], - "magenta": [255, 0, 255], - "gray": [128, 128, 128], - "orange": [255, 165, 0], - "purple": [128, 0, 128], - "brown": [139, 69, 19], - "pink": [255, 182, 193], - "beige": [245, 245, 220], - "maroon": [128, 0, 0], - "olive": [128, 128, 0], - "navy": [0, 0, 128], - "lime": [50, 205, 50], - "golden": [255, 223, 0], - "teal": [0, 128, 128], - "coral": [255, 127, 80], - "salmon": [250, 128, 114], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "platinum": [229, 228, 226], - "ochre": [204, 119, 34], - "burntsienna": [233, 116, 81], - "chocolate": [210, 105, 30], - "tan": [210, 180, 140], - "ivory": [255, 255, 240], - "goldenrod": [218, 165, 32], - "orchid": [218, 112, 214], - "honey": [238, 220, 130], - "lavender": [230, 230, 250], - "mint": [189, 252, 201], - "peach": [255, 229, 180], - "ruby": [224, 17, 95], - "indigo": [75, 0, 130], - "amber": [255, 191, 0], - "emerald": [80, 200, 120], - "sapphire": [15, 82, 186], - "aquamarine": [127, 255, 212], - "periwinkle": [204, 204, 255], - "fuchsia": [255, 0, 255], - "raspberry": [227, 11, 92], - "slate": [112, 128, 144], - "charcoal": [54, 69, 79] - } - -DETAILED_COLOURS = { - "light_red": [255, 204, 204], - "bright_red": [255, 0, 0], - "dark_red": [139, 0, 0], - "light_green": [204, 255, 204], - "bright_green": [0, 255, 0], - "dark_green": [0, 100, 0], - "light_blue": [204, 204, 255], - "bright_blue": [0, 0, 255], - "dark_blue": [0, 0, 139], - "light_yellow": [255, 255, 204], - "bright_yellow": [255, 255, 0], - "dark_yellow": [204, 204, 0], - "light_cyan": [204, 255, 255], - "bright_cyan": [0, 255, 255], - "dark_cyan": [0, 139, 139], - "light_magenta": [255, 204, 255], - "bright_magenta": [255, 0, 255], - "dark_magenta": [139, 0, 139], - "light_orange": [255, 229, 204], - "bright_orange": [255, 165, 0], - "dark_orange": [255, 140, 0], - "light_purple": [229, 204, 255], - "bright_purple": [128, 0, 128], - "dark_purple": [102, 0, 102], - "light_pink": [255, 204, 229], - "bright_pink": [255, 105, 180], - "dark_pink": [255, 20, 147], - "light_brown": [210, 180, 140], - "medium_brown": [165, 42, 42], - "dark_brown": [101, 67, 33], - # ... -} - -COLOUR_FAMILIES = { - "light_reds": [[255, 182, 193], [255, 192, 203], [255, 160, 122]], - "dark_reds": [[139, 0, 0], [178, 34, 34], [165, 42, 42]], - "light_blues": [[173, 216, 230], [135, 206, 250], [176, 224, 230]], - "dark_blues": [[0, 0, 139], [25, 25, 112], [0, 0, 128]], - "bluish_greens": [[102, 205, 170], [32, 178, 170], [72, 209, 204]], - "light_greens": [[144, 238, 144], [152, 251, 152], [143, 188, 143]], - "dark_greens": [[0, 100, 0], [34, 139, 34], [47, 79, 79]], - "yellows": [[255, 255, 0], [255, 255, 102], [255, 215, 0]], - "oranges": [[255, 165, 0], [255, 140, 0], [255, 69, 0]], - "purples": [[128, 0, 128], [147, 112, 219], [138, 43, 226]], - "pinks": [[255, 192, 203], [255, 182, 193], [255, 105, 180]], - "browns": [[165, 42, 42], [139, 69, 19], [160, 82, 45]], - "cyans": [[0, 255, 255], [0, 139, 139], [72, 209, 204]], - "greys": [[128, 128, 128], [169, 169, 169], [192, 192, 192]], - # ... -} - -SIMPLIFIED_COLOURS = { - "red": [255, 0, 0], - "green": [0, 255, 0], - "blue": [0, 0, 255], - "white": [255, 255, 255], - "black": [0, 0, 0], - "yellow": [255, 255, 0], - "gray": [128, 128, 128], - "orange": [255, 165, 0], - "purple": [128, 0, 128], - "pink": [255, 182, 193], - "light blue": [173, 216, 230], - "dark green": [0, 100, 0], - "light gray": [211, 211, 211], - "dark red": [139, 0, 0], - "beige": [245, 245, 220], - "navy": [0, 0, 128] -} - -HAIR_COLOURS = { - 'midnight black': (9, 8, 6), - 'off black': (44, 34, 43), - 'strong dark brown': (58, 48, 36), - 'medium dark brown': (78, 67, 63), - - 'chestnut brown': (106, 78, 66), - 'light chestnut brown': (106, 78, 66), - 'dark golden brown': (95, 72, 56), - 'light golden brown': (167, 133, 106), - - 'dark honey blonde': (184, 151, 128), - 'bleached blonde': (220, 208, 186), - 'light ash blonde': (222, 288, 153), - 'light ash brown': (151, 121, 97), - - 'lightest blonde': (230, 206, 168), - 'pale golden blonde': (229, 200, 168), - 'strawberry blonde': (165, 137, 70), - 'light auburn': (145, 85, 61), - - 'dark auburn': (83, 61, 53), - 'darkest gray': (113, 99, 93), - 'medium gray': (183, 166, 158), - 'light gray': (214, 196, 194), - - 'white blonde': (255, 24, 225), - 'platinum blonde': (202, 191, 177), - 'russet red': (145, 74, 67), - 'terra cotta': (181, 82, 57) - } \ No newline at end of file diff --git a/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py index b7d0d6006..4d3adfecb 100644 --- a/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py +++ b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/__init__.py @@ -1,8 +1,5 @@ from feature_extractor.modules import UNetWithResnetEncoder, MultiLabelResNet, CombinedModel # DeepLabV3PlusMobileNetV3, MultiLabelMobileNetV3Large, CombinedModelNoRegression from feature_extractor.helpers import load_torch_model, binary_erosion_dilation - -from colour_estimation import load_images_to_dict, generate_colour_table, count_colours_in_masked_area, compare_colour_distributions -from colour_estimation import SPESIFIC_COLOURS, DETAILED_COLOURS from lasr_vision_feature_extraction.categories_and_attributes import CategoriesAndAttributes, CelebAMaskHQCategoriesAndAttributes from lasr_vision_feature_extraction.image_with_masks_and_attributes import ImageWithMasksAndAttributes, ImageOfPerson diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index 2cc2a5516..c87cf6504 100755 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -6,7 +6,6 @@ import cv2_img import numpy as np -# from colour_estimation import closest_colours, RGB_COLOURS from lasr_vision_msgs.msg import BodyPixMaskRequest, ColourPrediction, FeatureWithColour from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection, TorchFaceFeatureDetectionDescription from numpy2message import numpy2message From d43e5ab19862387c7c513292c0a8c7e3827fb8bc Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 16:58:20 +0000 Subject: [PATCH 60/69] removed colour_estimation dependence --- common/vision/lasr_vision_feature_extraction/package.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/common/vision/lasr_vision_feature_extraction/package.xml b/common/vision/lasr_vision_feature_extraction/package.xml index 4019a147a..a9c995e2d 100644 --- a/common/vision/lasr_vision_feature_extraction/package.xml +++ b/common/vision/lasr_vision_feature_extraction/package.xml @@ -53,7 +53,6 @@ lasr_vision_msgs cv2_img feature_extractor - colour_estimation From feb4e80d62a051c76047757eade551a6470a1261 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 17:03:05 +0000 Subject: [PATCH 61/69] cleaned usused comments --- .../nodes/service | 64 ------------------- 1 file changed, 64 deletions(-) diff --git a/common/vision/lasr_vision_feature_extraction/nodes/service b/common/vision/lasr_vision_feature_extraction/nodes/service index 0c896a64e..7d3357729 100644 --- a/common/vision/lasr_vision_feature_extraction/nodes/service +++ b/common/vision/lasr_vision_feature_extraction/nodes/service @@ -29,73 +29,9 @@ def detect(request: TorchFaceFeatureDetectionDescriptionRequest) -> TorchFaceFea response = TorchFaceFeatureDetectionDescriptionResponse() response.description = rst_str - # response.detected_features = str(class_pred) + str(colour_pred) - # response.detected_features = [] - # for c in ['hair', 'hat', 'glasses', 'cloth',]: - # # colour_pred[c] = {k: v[0] for k, v in colour_pred[c].items()} - # sorted_list = sorted(colour_pred[c].items(), key=lambda item: item[1], reverse=True) - # # rospy.loginfo(str(sorted_list)) - # if len(sorted_list) > 3: - # sorted_list = sorted_list[0:3] - # sorted_list = [k for k, v in sorted_list] - # # rospy.loginfo(str(colour_pred[c])) - # response.detected_features.append(FeatureWithColour(c, class_pred[c], sorted_list)) return response -# def detect(request: TorchFaceFeatureDetectionRequest) -> TorchFaceFeatureDetectionResponse: -# # decode the image -# rospy.loginfo('Decoding') -# frame = msg_to_cv2_img(request.image_raw) - -# # 'hair', 'hat', 'glasses', 'face' -# input_image = torch.from_numpy(frame).permute(2, 0, 1).unsqueeze(0).float() -# input_image /= 255.0 -# masks_batch_pred, pred_classes = lasr_vision_feature_extraction.model(input_image) - -# thresholds_mask = [ -# 0.5, 0.75, 0.25, 0.5, # 0.5, 0.5, 0.5, 0.5, -# ] -# thresholds_pred = [ -# 0.6, 0.8, 0.1, 0.5, -# ] -# erosion_iterations = 1 -# dilation_iterations = 1 -# categories = ['hair', 'hat', 'glasses', 'face',] - -# masks_batch_pred = binary_erosion_dilation( -# masks_batch_pred, thresholds=thresholds_mask, -# erosion_iterations=erosion_iterations, dilation_iterations=dilation_iterations -# ) - -# median_colours = (median_color_float( -# input_image, masks_batch_pred).detach().squeeze(0)*255).numpy().astype(np.uint8) - -# # discarded: masks = masks_batch_pred.detach().squeeze(0).numpy().astype(np.uint8) -# # discarded: mask_list = [masks[i,:,:] for i in range(masks.shape[0])] - -# pred_classes = pred_classes.detach().squeeze(0).numpy() -# # discarded: class_list = [categories[i] for i in range( -# # pred_classes.shape[0]) if pred_classes[i].item() > thresholds_pred[i]] -# colour_list = [median_colours[i, :] -# for i in range(median_colours.shape[0])] - -# response = TorchFaceFeatureDetectionResponse() -# # response.detected_features = [ -# # FeatureWithColour(categories[i], [ -# # ColourPrediction(colour, distance) -# # for colour, distance -# # in closest_colours(colour_list[i], HAIR_COLOURS if categories[i] == 'hair' else COLOURS) -# # ]) -# # for i -# # in range(pred_classes.shape[0]) -# # if pred_classes[i].item() > thresholds_pred[i] -# # ] -# response.detected_features = "feature" - -# return response -# test test - rospy.init_node('torch_service') rospy.Service('/torch/detect/face_features', TorchFaceFeatureDetectionDescription, detect) rospy.loginfo('Torch service started') From d7c7a007748d8346bf8fa9218b52f4c87195691c Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 17:05:39 +0000 Subject: [PATCH 62/69] cleaned comments --- .../src/receptionist/states/speakdescriptions.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py index 2ae42a465..45090e389 100644 --- a/tasks/receptionist/src/receptionist/states/speakdescriptions.py +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -8,20 +8,8 @@ def __init__(self, default): self.default = default def execute(self, userdata): - + # don't worry, this works. for person in userdata['people']: self.default.voice.speak(person['features']) - # for person in userdata['people']: - # self.default.voice.speak('I see a person') - # self.default.voice.speak('Yes I do see you. I am trying to turn to you. But if I do not move my head, it is your own issue, not mine.') - # for feature in person['features']: - # if feature.label: - # if len(feature.colours) == 0: - # self.default.voice.speak(f'They have {feature.name}.') - # continue - - # self.default.voice.speak(f'They have {feature.name} and it has the colour {feature.colours[0]}') - - return 'succeeded' From 4b626e99bba0fac08f3f87050ebfded05ea2a1fb Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 17:07:41 +0000 Subject: [PATCH 63/69] renamed torch_module to feature_extractor --- .../src/{torch_module => feature_extractor}/__init__.py | 0 .../src/{torch_module => feature_extractor}/helpers/__init__.py | 0 .../src/{torch_module => feature_extractor}/modules/__init__.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename common/helpers/feature_extractor/src/{torch_module => feature_extractor}/__init__.py (100%) rename common/helpers/feature_extractor/src/{torch_module => feature_extractor}/helpers/__init__.py (100%) rename common/helpers/feature_extractor/src/{torch_module => feature_extractor}/modules/__init__.py (100%) diff --git a/common/helpers/feature_extractor/src/torch_module/__init__.py b/common/helpers/feature_extractor/src/feature_extractor/__init__.py similarity index 100% rename from common/helpers/feature_extractor/src/torch_module/__init__.py rename to common/helpers/feature_extractor/src/feature_extractor/__init__.py diff --git a/common/helpers/feature_extractor/src/torch_module/helpers/__init__.py b/common/helpers/feature_extractor/src/feature_extractor/helpers/__init__.py similarity index 100% rename from common/helpers/feature_extractor/src/torch_module/helpers/__init__.py rename to common/helpers/feature_extractor/src/feature_extractor/helpers/__init__.py diff --git a/common/helpers/feature_extractor/src/torch_module/modules/__init__.py b/common/helpers/feature_extractor/src/feature_extractor/modules/__init__.py similarity index 100% rename from common/helpers/feature_extractor/src/torch_module/modules/__init__.py rename to common/helpers/feature_extractor/src/feature_extractor/modules/__init__.py From f5b3cda13d9edea59185b1ea8b92c35c7a0b74f2 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 17:51:01 +0000 Subject: [PATCH 64/69] removed unused import, launch file and functions. --- .../nodes/service | 4 +- skills/src/lasr_skills/describe_people.py | 53 ++++++++++--------- tasks/receptionist/launch/test.launch | 5 -- 3 files changed, 28 insertions(+), 34 deletions(-) delete mode 100644 tasks/receptionist/launch/test.launch diff --git a/common/vision/lasr_vision_feature_extraction/nodes/service b/common/vision/lasr_vision_feature_extraction/nodes/service index 7d3357729..bd67bbf38 100644 --- a/common/vision/lasr_vision_feature_extraction/nodes/service +++ b/common/vision/lasr_vision_feature_extraction/nodes/service @@ -1,7 +1,5 @@ -from lasr_vision_msgs.srv import TorchFaceFeatureDetection, TorchFaceFeatureDetectionRequest, TorchFaceFeatureDetectionResponse, TorchFaceFeatureDetectionDescription, TorchFaceFeatureDetectionDescriptionRequest, TorchFaceFeatureDetectionDescriptionResponse -from lasr_vision_msgs.msg import FeatureWithColour, ColourPrediction +from lasr_vision_msgs.srv import TorchFaceFeatureDetectionDescription, TorchFaceFeatureDetectionDescriptionRequest, TorchFaceFeatureDetectionDescriptionResponse from cv2_img import msg_to_cv2_img -from feature_extractor.helpers import binary_erosion_dilation, median_color_float from numpy2message import message2numpy import numpy as np diff --git a/skills/src/lasr_skills/describe_people.py b/skills/src/lasr_skills/describe_people.py index c87cf6504..0960f3403 100755 --- a/skills/src/lasr_skills/describe_people.py +++ b/skills/src/lasr_skills/describe_people.py @@ -6,8 +6,8 @@ import cv2_img import numpy as np -from lasr_vision_msgs.msg import BodyPixMaskRequest, ColourPrediction, FeatureWithColour -from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetection, TorchFaceFeatureDetectionDescription +from lasr_vision_msgs.msg import BodyPixMaskRequest +from lasr_vision_msgs.srv import YoloDetection, BodyPixDetection, TorchFaceFeatureDetectionDescription from numpy2message import numpy2message from .vision import GetImage, ImageMsgToCv2, Get3DImage, PclMsgToCv2, Get2DAnd3DImages @@ -24,30 +24,31 @@ client = actionlib.SimpleActionClient("/head_controller/point_head_action", PointHeadAction) # rospy.logwarn('making client') -def point_head_client(xyz_array, u, v, client): - u = 480 - 1 if u > 480 else u - v = 640 - 1 if v > 640 else u - target_point = xyz_array[v, u] - - point_camera = PointStamped() - point_camera.header.frame_id = "xtion_rgb_optical_frame" - # point_camera.header.stamp = rospy.Time.now() - point_camera.point.x = target_point[0] if target_point[0] != np.nan else 0 - point_camera.point.y = target_point[1] if target_point[1] != np.nan else 0 - point_camera.point.z = target_point[2] if target_point[2] != np.nan else 0 - - goal = PointHeadGoal() - goal.target = point_camera - goal.max_velocity = 0.3 - # goal.min_duration = rospy.Duration(1.0) - goal.pointing_frame = "head_2_link" - goal.pointing_axis.x = 1.0 - goal.pointing_axis.y = 0.0 - goal.pointing_axis.z = 0.0 - - rospy.logwarn('sending the goal and waiting, moving to: %s' % str(list(target_point))) - client.send_goal(goal) - rospy.logwarn('end') +# Todo: This one not cleaned for now because it might be moved somewhere else. +# def point_head_client(xyz_array, u, v, client): +# u = 480 - 1 if u > 480 else u +# v = 640 - 1 if v > 640 else u +# target_point = xyz_array[v, u] + +# point_camera = PointStamped() +# point_camera.header.frame_id = "xtion_rgb_optical_frame" +# # point_camera.header.stamp = rospy.Time.now() +# point_camera.point.x = target_point[0] if target_point[0] != np.nan else 0 +# point_camera.point.y = target_point[1] if target_point[1] != np.nan else 0 +# point_camera.point.z = target_point[2] if target_point[2] != np.nan else 0 + +# goal = PointHeadGoal() +# goal.target = point_camera +# goal.max_velocity = 0.3 +# # goal.min_duration = rospy.Duration(1.0) +# goal.pointing_frame = "head_2_link" +# goal.pointing_axis.x = 1.0 +# goal.pointing_axis.y = 0.0 +# goal.pointing_axis.z = 0.0 + +# rospy.logwarn('sending the goal and waiting, moving to: %s' % str(list(target_point))) +# client.send_goal(goal) +# rospy.logwarn('end') class DescribePeople(smach.StateMachine): diff --git a/tasks/receptionist/launch/test.launch b/tasks/receptionist/launch/test.launch deleted file mode 100644 index f7bab932d..000000000 --- a/tasks/receptionist/launch/test.launch +++ /dev/null @@ -1,5 +0,0 @@ - - - - - From 216aba01b3bd1bd20c3f62f771bafb9d064168c6 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Mon, 11 Mar 2024 18:48:07 +0000 Subject: [PATCH 65/69] reset --- tasks/receptionist/launch/setup.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/receptionist/launch/setup.launch b/tasks/receptionist/launch/setup.launch index 94b78e340..71bce994b 100644 --- a/tasks/receptionist/launch/setup.launch +++ b/tasks/receptionist/launch/setup.launch @@ -24,7 +24,7 @@ - + From 45f8334642a7f59b798814ed94719c33421e8c9d Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 22 Mar 2024 14:51:22 +0000 Subject: [PATCH 66/69] Remade to achieve easier bodipix model loading --- common/vision/lasr_vision_bodypix/.gitignore | 2 ++ .../src/lasr_vision_bodypix/bodypix.py | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 common/vision/lasr_vision_bodypix/.gitignore diff --git a/common/vision/lasr_vision_bodypix/.gitignore b/common/vision/lasr_vision_bodypix/.gitignore new file mode 100644 index 000000000..2de3a7027 --- /dev/null +++ b/common/vision/lasr_vision_bodypix/.gitignore @@ -0,0 +1,2 @@ +models/* +!models/.gitkeep \ No newline at end of file diff --git a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py index d5aa6c518..b366b7af4 100644 --- a/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py +++ b/common/vision/lasr_vision_bodypix/src/lasr_vision_bodypix/bodypix.py @@ -12,8 +12,12 @@ from lasr_vision_msgs.msg import BodyPixMask, BodyPixPose from lasr_vision_msgs.srv import BodyPixDetectionRequest, BodyPixDetectionResponse +import rospkg +from os import path + # model cache loaded_models = {} +r = rospkg.RosPack() def load_model_cached(dataset: str) -> None: ''' @@ -26,9 +30,9 @@ def load_model_cached(dataset: str) -> None: else: if dataset == 'resnet50': # name = download_model(BodyPixModelPaths.RESNET50_FLOAT_STRIDE_16) -# rospy.logwarn(name) +# rospy.logwarn(name) /home/bentengma/keras_model/tf-bodypix/tfjs-models-savedmodel-bodypix-resnet50-float-model-stride16 # model = load_model(name) - model = load_model('/home/rexy/.keras/tf-bodypix/3fe1b130a0f20e98340612c099b50c18--tfjs-models-savedmodel-bodypix-resnet50-float-model-stride16') + model = load_model(path.join(r.get_path("lasr_vision_bodypix"), "models", "keras_model", "tf-bodypix", "tfjs-models-savedmodel-bodypix-resnet50-float-model-stride16")) # model = load_model(download_model(BodyPixModelPaths.RESNET50_FLOAT_STRIDE_16)) elif dataset == 'mobilenet50': name = download_model(BodyPixModelPaths.MOBILENET_FLOAT_50_STRIDE_16) From 672136175daa95d87c262d6e959c629a0b6a4f0c Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Fri, 22 Mar 2024 14:54:35 +0000 Subject: [PATCH 67/69] added a break in the loop --- tasks/receptionist/src/receptionist/states/speakdescriptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/receptionist/src/receptionist/states/speakdescriptions.py b/tasks/receptionist/src/receptionist/states/speakdescriptions.py index 45090e389..5963195dd 100644 --- a/tasks/receptionist/src/receptionist/states/speakdescriptions.py +++ b/tasks/receptionist/src/receptionist/states/speakdescriptions.py @@ -8,8 +8,8 @@ def __init__(self, default): self.default = default def execute(self, userdata): - # don't worry, this works. for person in userdata['people']: self.default.voice.speak(person['features']) + break # only speak for the first person in the frame return 'succeeded' From 0fbe28f120c83595d78199e4c758da7a8c1718e6 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 18 Apr 2024 00:22:34 +0100 Subject: [PATCH 68/69] I don't really understand why this is in my branch, please ignore this commit when merge. --- legacy/object_interest_tracking/README.MD | 70 +++++++++---- legacy/object_interest_tracking/README.md | 66 ------------- tasks/coffee_shop/config/config:=full.yaml | 108 --------------------- 3 files changed, 53 insertions(+), 191 deletions(-) delete mode 100644 legacy/object_interest_tracking/README.md delete mode 100644 tasks/coffee_shop/config/config:=full.yaml diff --git a/legacy/object_interest_tracking/README.MD b/legacy/object_interest_tracking/README.MD index 07c8a7258..d63ea8343 100644 --- a/legacy/object_interest_tracking/README.MD +++ b/legacy/object_interest_tracking/README.MD @@ -1,30 +1,66 @@ -## Under Development -# -This repo aims to provide a solution to who the robot should engage with in a human-like social environment in ROS. The package currently works only in Noetic. Due to mediapipe requirements of python > 3.8, the package won't run in melodic. +# object_interest_tracking -The current process takes an image frame, then detect people on the frame, then separate them to apply the scoring pipeline. Currently, the service will output the frame of the person [xywh] to engage with. It will always output a person, even if the person has a low engagement score. +The object_interest_tracking package -# Services -## engagementScore -Input: Nothing +This package is maintained by: +- [yousef](mailto:yousef@todo.todo) -Output: A list that has the frame part of the person to engage with [xywh] +## Prerequisites -### Scoring +This package depends on the following ROS packages: +- catkin (buildtool) +- geometry_msgs (build) +- message_generation (build) +- rospy (build) +- sensor_msgs (build) +- std_msgs (build) +- message_runtime (build) +- geometry_msgs (exec) +- message_runtime (exec) +- rospy (exec) +- sensor_msgs (exec) +- std_msgs (exec) +- message_generation (exec) -The current scoring takes into account emotions, head position, and availability of distractions. It will be extended to include more criteria. +Ask the package maintainer to write or create a blank `doc/PREREQUISITES.md` for their package! +## Usage -# Future updates (todo list) +Ask the package maintainer to write a `doc/USAGE.md` for their package! -Add distance and the change in distance to the scoring pipeline +## Example -Add gesture detection +Ask the package maintainer to write a `doc/EXAMPLE.md` for their package! -# References +## Technical Overview -A. M. Al-Nuimi and G. J. Mohammed, "Face Direction Estimation based on Mediapipe Landmarks," 2021 7th International Conference on Contemporary Information Technology and Mathematics (ICCITM), Mosul, Iraq, 2021, pp. 185-190, doi: 10.1109/ICCITM53167.2021.9677878. +Ask the package maintainer to write a `doc/TECHNICAL.md` for their package! +## ROS Definitions -# -## Tested only in simulation, yet to be tested in a robot +### Launch Files + +This package has no launch files. + +### Messages + +This package has no messages. + +### Services + +#### `Tdr` + +Request + +| Field | Type | Description | +|:-:|:-:|---| + +Response + +| Field | Type | Description | +|:-:|:-:|---| + + +### Actions + +This package has no actions. diff --git a/legacy/object_interest_tracking/README.md b/legacy/object_interest_tracking/README.md deleted file mode 100644 index d63ea8343..000000000 --- a/legacy/object_interest_tracking/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# object_interest_tracking - -The object_interest_tracking package - -This package is maintained by: -- [yousef](mailto:yousef@todo.todo) - -## Prerequisites - -This package depends on the following ROS packages: -- catkin (buildtool) -- geometry_msgs (build) -- message_generation (build) -- rospy (build) -- sensor_msgs (build) -- std_msgs (build) -- message_runtime (build) -- geometry_msgs (exec) -- message_runtime (exec) -- rospy (exec) -- sensor_msgs (exec) -- std_msgs (exec) -- message_generation (exec) - -Ask the package maintainer to write or create a blank `doc/PREREQUISITES.md` for their package! - -## Usage - -Ask the package maintainer to write a `doc/USAGE.md` for their package! - -## Example - -Ask the package maintainer to write a `doc/EXAMPLE.md` for their package! - -## Technical Overview - -Ask the package maintainer to write a `doc/TECHNICAL.md` for their package! - -## ROS Definitions - -### Launch Files - -This package has no launch files. - -### Messages - -This package has no messages. - -### Services - -#### `Tdr` - -Request - -| Field | Type | Description | -|:-:|:-:|---| - -Response - -| Field | Type | Description | -|:-:|:-:|---| - - -### Actions - -This package has no actions. diff --git a/tasks/coffee_shop/config/config:=full.yaml b/tasks/coffee_shop/config/config:=full.yaml deleted file mode 100644 index 2de30b413..000000000 --- a/tasks/coffee_shop/config/config:=full.yaml +++ /dev/null @@ -1,108 +0,0 @@ -counter: - cuboid: - - [0.11478881255836193, 2.8703450451171575] - - [0.044620891454333886, 3.7672813608081324] - - [-0.722736944640509, 3.707870872696769] - - [-0.6525690235364809, 2.810934557005794] - last_updated: '2023-09-19 14:20:13.331419' - location: - orientation: {w: 0.05378161245420122, x: 0.0, y: 0.0, z: 0.998552721773781} - position: {x: 0.7923260692997367, y: 3.1698751043324664, z: 0.0} -tables: - table0: - last_updated: '2023-09-19 14:12:11.785287' - location: - orientation: {w: 0.6981442535161398, x: 0.0, y: 0.0, z: -0.7159571225166993} - position: {x: 3.4185893265341467, y: 1.5007719904983003, z: 0.0} - semantic: end - num_persons: 0 - objects_cuboid: - - [3.872702193443944, 0.6559161243738907] - - [2.97325624499618, 0.6392973444633933] - - [2.9822439064193755, 0.13944712694630035] - - [3.8816898548671395, 0.15606590685679772] - order: [] - persons_cuboid: - - [4.6578294448981765, 1.4704487212105706] - - [2.159368476987721, 1.424285443681411] - - [2.1971166549651433, -0.6750854698903794] - - [4.695577622875598, -0.6289221923612198] - pre_location: - orientation: {w: 0.6981442535161398, x: 0.0, y: 0.0, z: -0.7159571225166993} - position: {x: 3.4185893265341467, y: 1.5007719904983003, z: 0.0} - status: unvisited - table1: - last_updated: '2023-09-19 14:14:23.654079' - location: - orientation: {w: 0.679755237535674, x: 0.0, y: 0.0, z: -0.7334390343053875} - position: {x: 6.294876273276469, y: 2.3564053436919483, z: 0.0} - objects_cuboid: - - [5.975099899520781, 1.6171292380625146] - - [5.916117157155604, 0.04866821248209674] - - [6.682256235074643, 0.021546325976471215] - - [6.74123897743982, 1.590007351556889] - persons_cuboid: - - [5.496391304636297, 2.134250733434652] - - [5.3998399365608165, -0.433230053661956] - - [7.160964829959127, -0.49557516939566626] - - [7.257516198034608, 2.071905617700941] - pre_location: - orientation: {w: 0.679755237535674, x: 0.0, y: 0.0, z: -0.7334390343053875} - position: {x: 6.294876273276469, y: 2.3564053436919483, z: 0.0} - table2: - last_updated: '2023-09-19 14:16:18.722673' - location: - orientation: {w: 0.6988937950671122, x: 0.0, y: 0.0, z: 0.7152254632049179} - position: {x: 6.4837847765967505, y: 3.3319861177542167, z: 0.0} - objects_cuboid: - - [6.182153357080189, 4.241042314587973] - - [6.248667753720983, 4.460477068504972] - - [6.4505652887727765, 4.568103825639009] - - [6.669577124411927, 4.5008762913352] - - [6.777409097641248, 4.298175443423813] - - [6.710894701000455, 4.078740689506813] - - [6.508997165948661, 3.9711139323727758] - - [6.28998533030951, 4.038341466676585] - persons_cuboid: - - [5.487688326425621, 4.174386997612826] - - [5.486032199694549, 5.0903099603404325] - - [6.382394765400911, 5.264592034449616] - - [7.295871631694631, 5.2640198171209525] - - [7.471874128295816, 4.364830760398959] - - [7.473530255026889, 3.4489077976713536] - - [6.577167689320526, 3.2746257235621696] - - [5.663690823026807, 3.2751979408908327] - pre_location: - orientation: {w: 0.6988937950671122, x: 0.0, y: 0.0, z: 0.7152254632049179} - position: {x: 6.4837847765967505, y: 3.3319861177542167, z: 0.0} - table3: - last_updated: '2023-09-19 14:18:50.691359' - location: - orientation: {w: 0.632821856784876, x: 0.0, y: 0.0, z: 0.7742974219092699} - position: {x: 3.7567571172300678, y: 2.983492576363372, z: 0.0} - objects_cuboid: - - [2.9502728886424308, 3.682447992569198] - - [4.519891622610968, 3.715626804870335] - - [4.5034995842988685, 4.485192995360613] - - [2.933880850330331, 4.452014183059477] - persons_cuboid: - - [2.461038491667587, 3.1721631863231843] - - [5.0304143810300985, 3.226475000090013] - - [4.992733981273712, 4.9954778016066275] - - [2.423358091911201, 4.941165987839798] - pre_location: - orientation: {w: 0.632821856784876, x: 0.0, y: 0.0, z: 0.7742974219092699} - position: {x: 3.7567571172300678, y: 2.983492576363372, z: 0.0} -wait: - cuboid: - - [1.9877075290272157, 0.5417149995170536] - - [0.38914681856697353, 0.47853785625496126] - - [0.44870023065244924, -1.020133288151187] - - [2.0472609411126914, -0.9569561448890949] - last_updated: '2023-09-19 14:21:53.764799' - location: - orientation: {w: 0.733502658301428, x: 0.0, y: 0.0, z: -0.6796865823780388} - position: {x: 1.3003716926945177, y: 4.293212965356256, z: 0.0} - pose: - orientation: {w: 0.992020738813, x: 0.0, y: 0.0, z: 0.126074794327} - position: {x: 10.3656408799, y: 25.7369664143, z: 0.0} From 643bf892c197228d48518e5da5c5213dbd129699 Mon Sep 17 00:00:00 2001 From: Benteng Ma Date: Thu, 18 Apr 2024 00:48:01 +0100 Subject: [PATCH 69/69] Replace string return with json string return. --- .../image_with_masks_and_attributes.py | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/image_with_masks_and_attributes.py b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/image_with_masks_and_attributes.py index 56e2efe0f..2180bc297 100644 --- a/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/image_with_masks_and_attributes.py +++ b/common/vision/lasr_vision_feature_extraction/src/lasr_vision_torch/image_with_masks_and_attributes.py @@ -1,5 +1,6 @@ import numpy as np from lasr_vision_feature_extraction.categories_and_attributes import CategoriesAndAttributes +import json def _softmax(x: list[float]) -> list[float]: @@ -91,20 +92,26 @@ def describe(self) -> str: self.attributes['Wearing_Necktie']) description = "This customer has " + hair_colour_str = 'None' + hair_shape_str = 'None' if has_hair[0]: hair_shape_str = '' if hair_shape[0] == 'Straight_Hair': - hair_shape_str = ' straight' + hair_shape_str = 'straight' elif hair_shape[0] == 'Wavy_Hair': - hair_shape_str = ' wavy' + hair_shape_str = 'wavy' if hair_colour[0] == 'Black_Hair': - description += 'black%s hair, ' % hair_shape_str + description += 'black %s hair, ' % hair_shape_str + hair_colour_str = 'black' elif hair_colour[0] == 'Blond_Hair': - description += 'blond%s hair, ' % hair_shape_str + description += 'blond %s hair, ' % hair_shape_str + hair_colour_str = 'blond' elif hair_colour[0] == 'Brown_Hair': - description += 'brown%s hair, ' % hair_shape_str + description += 'brown %s hair, ' % hair_shape_str + hair_colour_str = 'brown' elif hair_colour[0] == 'Gray_Hair': - description += 'gray%s hair, ' % hair_shape_str + description += 'gray %s hair, ' % hair_shape_str + hair_colour_str = 'gray' if male: # here 'male' is only used to determine whether it is confident to decide whether the person has beard if not facial_hair[0] == 'No_Beard': @@ -130,4 +137,25 @@ def describe(self) -> str: wearables.append('a necktie') description += ", ".join(wearables[:-2] + [" and ".join(wearables[-2:])]) + '. ' - return description if description != "This customer has " else "" + if description != "This customer has ": + description = "I didn't manage to get any attributes from this customer, I'm sorry." + + result = { + 'attributes': { + 'has_hair': has_hair[0], + 'hair_colour': hair_colour_str, + 'hair_shape': hair_shape_str, + 'male': male[0], + 'facial_hair': facial_hair[0], + 'hat': hat[0], + 'glasses': glasses[0], + 'earrings': earrings[0], + 'necklace': necklace[0], + 'necktie': necktie[0], + }, + 'description': description + } + + result = json.dumps(result, indent=4) + + return result