diff --git a/.gitignore b/.gitignore index 72408e29d..755be262b 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,9 @@ target/ .python-version .idea/ + +# The ayes training model image +ayes_model/train_files +ayes_model/test_files +ayes_model/venv +ayes_model/encodings.json diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 8f889db18..000000000 --- a/Dockerfile +++ /dev/null @@ -1,52 +0,0 @@ -# This is a sample Dockerfile you can modify to deploy your own app based on face_recognition - -FROM python:3.10.3-slim-bullseye - -RUN apt-get -y update -RUN apt-get install -y --fix-missing \ - build-essential \ - cmake \ - gfortran \ - git \ - wget \ - curl \ - graphicsmagick \ - libgraphicsmagick1-dev \ - libatlas-base-dev \ - libavcodec-dev \ - libavformat-dev \ - libgtk2.0-dev \ - libjpeg-dev \ - liblapack-dev \ - libswscale-dev \ - pkg-config \ - python3-dev \ - python3-numpy \ - software-properties-common \ - zip \ - && apt-get clean && rm -rf /tmp/* /var/tmp/* - -RUN cd ~ && \ - mkdir -p dlib && \ - git clone -b 'v19.9' --single-branch https://github.com/davisking/dlib.git dlib/ && \ - cd dlib/ && \ - python3 setup.py install --yes USE_AVX_INSTRUCTIONS - - -# The rest of this file just runs an example script. - -# If you wanted to use this Dockerfile to run your own app instead, maybe you would do this: -# COPY . /root/your_app_or_whatever -# RUN cd /root/your_app_or_whatever && \ -# pip3 install -r requirements.txt -# RUN whatever_command_you_run_to_start_your_app - -COPY . /root/face_recognition -RUN cd /root/face_recognition && \ - pip3 install -r requirements.txt && \ - python3 setup.py install - -# Add pip3 install opencv-python==4.1.2.30 if you want to run the live webcam examples - -CMD cd /root/face_recognition/examples && \ - python3 recognize_faces_in_pictures.py diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 000000000..ee2f4d14c --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,89 @@ +# Use a multi-architecture base image +FROM python:3.10.3-slim + +RUN echo "Face recognition app dependencies - need to be reduced" +# Set the architecture-specific dependencies +RUN apt-get update && apt-get install -y --fix-missing \ + build-essential \ + cmake \ + gfortran \ + git \ + wget \ + curl \ + graphicsmagick \ + libgraphicsmagick1-dev \ + libatlas-base-dev \ + libavcodec-dev \ + libavformat-dev \ + libgtk2.0-dev \ + libjpeg-dev \ + liblapack-dev \ + libswscale-dev \ + pkg-config \ + python3-dev \ + python3-numpy \ + software-properties-common \ + zip + + +RUN echo "x11 server forwarding dependencies - need to scale up the containers architecture" +RUN apt-get update && apt-get install -y --fix-missing \ + libx11-dev \ + libgtk-3-dev \ + libboost-python-dev \ + x11-apps \ + xauth \ + imagemagick + +RUN echo "The specific CPU $(uname -m)" +# Additional dependencies for Raspberry Pi (ARM) +RUN if [ '$(uname -m)' = "armv7l" ]; then \ + echo "Installing ARM-specific dependencies"; \ + apt-get update && apt-get install -y --fix-missing \ + libopenblas-dev; \ +fi + +# Additional dependencies for x86 (Windows/Mac) +RUN if [ '$(uname -m)' = "x86_64" ]; then \ + echo "Installing x86_64-specific dependencies"; \ + apt-get update && apt-get install -y --fix-missing \ + libopenblas-dev; \ +fi + + + + +# Install dlib +RUN cd ~ && \ + mkdir -p dlib && \ + git clone -b 'v19.9' --single-branch https://github.com/davisking/dlib.git dlib/ && \ + cd dlib/ && \ + # Downgrade NumPy and upgrade pybind11 https://github.com/pybind/pybind11/issues/5009 + pip install numpy==1.26.4 && \ + pip install pybind11==2.12.0 && \ + python3 setup.py install --yes USE_AVX_INSTRUCTIONS + + +# Copy the face recognition app +COPY . /face_recognition +RUN cd face_recognition && \ + pip3 install -r requirements.txt && \ + python3 setup.py install + + +WORKDIR /face_recognition + +RUN echo "Installing opencv" +RUN pip3 install opencv-python==4.9.0.80 + +RUN echo "Download the mqtt_client_ayes.py file" +# Download the mqtt_client_ayes.py file +RUN curl -o /face_recognition/ayes_model/mqtt_client_ayes.py https://raw.githubusercontent.com/AndreaCalabro-AYES/MQTT_Broker/main/mqtt_client_ayes.py + +RUN echo "Ensure the current directory is in the PYTHONPATH" +# Ensure the current directory is in the PYTHONPATH +ENV PYTHONPATH "${PYTHONPATH}:/face_recognition/ayes_model" + + + + diff --git a/Dockerfile.gpu b/Dockerfile.gpu index 80e0f8166..67d960009 100644 --- a/Dockerfile.gpu +++ b/Dockerfile.gpu @@ -1,7 +1,7 @@ # This is a sample Dockerfile you can modify to deploy your own app based on face_recognition on the GPU # In order to run Docker in the GPU you will need to install Nvidia-Docker: https://github.com/NVIDIA/nvidia-docker -FROM nvidia/cuda:9.0-cudnn7-devel +FROM nvidia/cuda:12.4.1-runtime-rockylinux9 # Install face recognition dependencies diff --git a/Dockerfile.rasp b/Dockerfile.rasp new file mode 100644 index 000000000..32012e327 --- /dev/null +++ b/Dockerfile.rasp @@ -0,0 +1,79 @@ +# Use the official Python image for ARM +FROM arm32v7/python:3.10-slim-bullseye + +# Install build essentials and tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + cmake \ + gfortran \ + gcc \ + python3 \ + python3-dev \ + musl-dev \ + git \ + wget \ + curl \ + software-properties-common \ + zip \ + graphicsmagick \ + libgraphicsmagick1-dev \ + libatlas-base-dev \ + libavcodec-dev \ + libavformat-dev \ + libgtk2.0-dev \ + libjpeg-dev \ + liblapack-dev \ + libswscale-dev \ + pkg-config \ + v4l-utils \ + ffmpeg \ + && rm -rf /var/lib/apt/lists/* + +# Install OpenBLAS +RUN apt-get update && apt-get install -y libopenblas-dev && rm -rf /var/lib/apt/lists/* + +# Install OpenSSL development package +RUN apt-get update && apt-get install -y libssl-dev && rm -rf /var/lib/apt/lists/* + +# Set environment variables for OpenBLAS +ENV LD_LIBRARY_PATH=/usr/lib/openblas:$LD_LIBRARY_PATH +ENV OPENBLAS_NUM_THREADS=1 + +# Install numpy and pybind11 +RUN pip install numpy==1.26.4 pybind11==2.12.0 + +# Clone dlib repository +RUN cd /root && git clone -b 'v19.22' --single-branch https://github.com/davisking/dlib.git dlib + +# Install dlib dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ + python3-dev \ + && rm -rf /var/lib/apt/lists/* + +# Build and install dlib +RUN cd /root/dlib && python3 setup.py install + +# Set working directory +WORKDIR /root/face_recognition + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY setup.py . +COPY setup.cfg . +COPY pyproject.toml . +COPY README.rst . +COPY HISTORY.rst . +COPY face_recognition/ . +COPY . . +RUN pip install --no-cache-dir . + +RUN pip install --no-cache-dir opencv-python==4.9.0.80 + +# Import files +COPY mm_application/ ./mm_application/ +RUN curl -o /root/face_recognition/mm_application/mqtt_client_ayes.py https://raw.githubusercontent.com/AndreaCalabro-AYES/MQTT_Broker/main/mqtt_client_ayes.py + +# Ensure the current directory is in the PYTHONPATH +ENV PYTHONPATH "${PYTHONPATH}:/root/face_recognition/mm_application" + diff --git a/README.md b/README.md index 23ac8647d..bb9b0842d 100644 --- a/README.md +++ b/README.md @@ -1,415 +1,92 @@ -# Face Recognition +# AYES Face Recognition Project +The first application of the AYES-MagicMirror project is based on computer vision. +The expected output is to have a face recognition algorithm to recognize the people +of the office (obviously only the ones that accepted to have their encodings taken). -_You can also read a translated version of this file [in Chinese 简体中文版](https://github.com/ageitgey/face_recognition/blob/master/README_Simplified_Chinese.md) or [in Korean 한국어](https://github.com/ageitgey/face_recognition/blob/master/README_Korean.md) or [in Japanese 日本語](https://github.com/m-i-k-i/face_recognition/blob/master/README_Japanese.md)._ - -Recognize and manipulate faces from Python or from the command line with -the world's simplest face recognition library. - -Built using [dlib](http://dlib.net/)'s state-of-the-art face recognition +To start, we decided to create a fork from this [face recognition project](https://github.com/ageitgey/face_recognition), +in the future we will move towards a fully in-house application. This means that the model is based on the [dlib](http://dlib.net/)'s state-of-the-art face recognition built with deep learning. The model has an accuracy of 99.38% on the [Labeled Faces in the Wild](http://vis-www.cs.umass.edu/lfw/) benchmark. -This also provides a simple `face_recognition` command line tool that lets -you do face recognition on a folder of images from the command line! - - -[![PyPI](https://img.shields.io/pypi/v/face_recognition.svg)](https://pypi.python.org/pypi/face_recognition) -[![Build Status](https://github.com/ageitgey/face_recognition/workflows/CI/badge.svg?branch=master&event=push)](https://github.com/ageitgey/face_recognition/actions?query=workflow%3ACI) -[![Documentation Status](https://readthedocs.org/projects/face-recognition/badge/?version=latest)](http://face-recognition.readthedocs.io/en/latest/?badge=latest) - -## Features +If the following README file is missing something you're looking for, the first could be referring to the [original project README](https://github.com/ageitgey/face_recognition)! (This file, like all the rest of the application, is built on that fundamentals.) -#### Find faces in pictures -Find all the faces that appear in a picture: +## Prerequisites +- Docker Desktop (ADD LINK TO THE INTERNAL DOCUMENTATION ABOUT IT) +- x11 server forwarding (ADD LINK TO THE INTERNAL DOCUMENTATION) - only if in development you *really want* semi-live screen forwarding of the result of whatever you are developing. All the necessary dependencies will be commented out in both the dockerfile and docker-compose development files, if *really want* it uncomment the section. -![](https://cloud.githubusercontent.com/assets/896692/23625227/42c65360-025d-11e7-94ea-b12f28cb34b4.png) - -```python -import face_recognition -image = face_recognition.load_image_file("your_file.jpg") -face_locations = face_recognition.face_locations(image) +**CLONE REPOSITORY** +As always , go into the folder where you want to create the project, open the terminal, and type the following command ``` - -#### Find and manipulate facial features in pictures - -Get the locations and outlines of each person's eyes, nose, mouth and chin. - -![](https://cloud.githubusercontent.com/assets/896692/23625282/7f2d79dc-025d-11e7-8728-d8924596f8fa.png) - -```python -import face_recognition -image = face_recognition.load_image_file("your_file.jpg") -face_landmarks_list = face_recognition.face_landmarks(image) -``` - -Finding facial features is super useful for lots of important stuff. But you can also use it for really stupid stuff -like applying [digital make-up](https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py) (think 'Meitu'): - -![](https://cloud.githubusercontent.com/assets/896692/23625283/80638760-025d-11e7-80a2-1d2779f7ccab.png) - -#### Identify faces in pictures - -Recognize who appears in each photo. - -![](https://cloud.githubusercontent.com/assets/896692/23625229/45e049b6-025d-11e7-89cc-8a71cf89e713.png) - -```python -import face_recognition -known_image = face_recognition.load_image_file("biden.jpg") -unknown_image = face_recognition.load_image_file("unknown.jpg") - -biden_encoding = face_recognition.face_encodings(known_image)[0] -unknown_encoding = face_recognition.face_encodings(unknown_image)[0] - -results = face_recognition.compare_faces([biden_encoding], unknown_encoding) +git clone https://github.com/AndreaCalabro-AYES/face_recognition.git ``` +## Project structure +To enable a lean development of the MagicMirror project, we decided to opt for fully containerized applications. As you may know, the target of the MagicMirror is a Raspberry Pi, and containers go as far as the Host HW (REFRESH LINK). The workaround, that allowed also to opt for lighter containers on target, has been to create different images and work environments +- Development, intended for Win/Mac applications + * The Container + + The *Dockerfile.dev* contains the dependencies to run the face recognition and eventually the x11 server on Windows machines + + The *docker-compose.dev.yml* runs the relative dockerfile, connects to the custom Ayes-MM bridge network, sets the logging not to be buffered (quite useful during the dev phase of the face recognition), and creates a specifc volume allowing to work on the algorithm without needing to re-build each time. Why no TTY? We'll see if in the future we'll create different branches for dev and target. As the name is not the conventional one, you will need to run it in a different way (look below) + * The work environment + + The volume is based on the *ayes_model* sub directory, so you should work in there + + You will be able to perform the actions described here +- GPU, intended for GPU-provided host machines - it builds and runs, no more work performed but kept as you never know + * The Container + + Image Content + + Docker-compose + * The work environment +- Target, lightest image designed to be integrated on target within the full MagicMirror Project + * The Container + + The *Dockerfile.rasp* contains the dependencies to run the face recognition on the Raspberry Pi (ARM32 CPU) + + The *docker-compose.yml* RE-WORKS NEEDED --> no network, incorrect volume (do we even need one?) + * The work environment + + The folder is *mm_application*, this contains a json db and two python scripts + + Find here what is perfomed in there -You can even use this library with other Python libraries to do real-time face recognition: - -![](https://cloud.githubusercontent.com/assets/896692/24430398/36f0e3f0-13cb-11e7-8258-4d0c9ce1e419.gif) - -See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam_faster.py) for the code. - -## Online Demos - -User-contributed shared Jupyter notebook demo (not officially supported): [![Deepnote](https://beta.deepnote.org/buttons/try-in-a-jupyter-notebook.svg)](https://beta.deepnote.org/launch?template=face_recognition) - -## Installation - -### Requirements - - * Python 3.3+ or Python 2.7 - * macOS or Linux (Windows not officially supported, but might work) - -### Installation Options: - -#### Installing on Mac or Linux - -First, make sure you have dlib already installed with Python bindings: - - * [How to install dlib from source on macOS or Ubuntu](https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf) - -Then, make sure you have cmake installed: -```brew install cmake``` - -Finally, install this module from pypi using `pip3` (or `pip2` for Python 2): - -```bash -pip3 install face_recognition -``` - -Alternatively, you can try this library with [Docker](https://www.docker.com/), see [this section](#deployment). - -If you are having trouble with installation, you can also try out a -[pre-configured VM](https://medium.com/@ageitgey/try-deep-learning-in-python-now-with-a-fully-pre-configured-vm-1d97d4c3e9b). - -#### Installing on an Nvidia Jetson Nano board - - * [Jetson Nano installation instructions](https://medium.com/@ageitgey/build-a-hardware-based-face-recognition-system-for-150-with-the-nvidia-jetson-nano-and-python-a25cb8c891fd) - * Please follow the instructions in the article carefully. There is current a bug in the CUDA libraries on the Jetson Nano that will cause this library to fail silently if you don't follow the instructions in the article to comment out a line in dlib and recompile it. - -#### Installing on Raspberry Pi 2+ - - * [Raspberry Pi 2+ installation instructions](https://gist.github.com/ageitgey/1ac8dbe8572f3f533df6269dab35df65) - -#### Installing on FreeBSD - -```bash -pkg install graphics/py-face_recognition +### Target (Raspberry Pi) Work Environment +The *mm_application* folder contains the following files: +1. facerec_on_rasp_usb_camera.py, the python script where we implement the final application algorithm + - Read the camera input + - Perform face recognition, using the algorithm implemented in the development work environment + - Send the information via our MQTT communication - find here its [README](README.md) file +2. facerec_on_rasp.py, the python script that shall be used in case of pycamera module instead of usb webcam (still untouched) +3. Encodings json file where we store "name": 128-np.array of encodings generated running the correct algorithm. This process +is yet to be defined, soon we will migrate everything to AWS so tune back for more info. + +### Development Work Environment +The *ayes_model* folder contains all the files that are needed to perform two main actions: +1. **Tune the model** +Done with +In the ayes_model folder there are two subfolders +- test_files +- train_files + +In both you will need to put a different picture of you, the one in train_files will be used to tune the model and the one in test_files to test the encoding ! If the test will be passed, the encoding will be created in the encodings db. In this way, you can really work on your local machine to create your encoding, and this is probably the most data-wise option we have! + +> [!IMPORTANT] +> Give the correct name to both: the name of the tuning image will be used as identifier for your face encoding from now on, and to look for the correct test file! + +In the docker-compose file launch the command ``` - -#### Installing on Windows - -While Windows isn't officially supported, helpful users have posted instructions on how to install this library: - - * [@masoudr's Windows 10 installation guide (dlib + face_recognition)](https://github.com/ageitgey/face_recognition/issues/175#issue-257710508) - -#### Installing a pre-configured Virtual Machine image - - * [Download the pre-configured VM image](https://medium.com/@ageitgey/try-deep-learning-in-python-now-with-a-fully-pre-configured-vm-1d97d4c3e9b) (for VMware Player or VirtualBox). - -## Usage - -### Command-Line Interface - -When you install `face_recognition`, you get two simple command-line -programs: - -* `face_recognition` - Recognize faces in a photograph or folder full for - photographs. -* `face_detection` - Find faces in a photograph or folder full for photographs. - -#### `face_recognition` command line tool - -The `face_recognition` command lets you recognize faces in a photograph or -folder full for photographs. - -First, you need to provide a folder with one picture of each person you -already know. There should be one image file for each person with the -files named according to who is in the picture: - -![known](https://cloud.githubusercontent.com/assets/896692/23582466/8324810e-00df-11e7-82cf-41515eba704d.png) - -Next, you need a second folder with the files you want to identify: - -![unknown](https://cloud.githubusercontent.com/assets/896692/23582465/81f422f8-00df-11e7-8b0d-75364f641f58.png) - -Then in you simply run the command `face_recognition`, passing in -the folder of known people and the folder (or single image) with unknown -people and it tells you who is in each image: - -```bash -$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ - -/unknown_pictures/unknown.jpg,Barack Obama -/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person -``` - -There's one line in the output for each face. The data is comma-separated -with the filename and the name of the person found. - -An `unknown_person` is a face in the image that didn't match anyone in -your folder of known people. - -#### `face_detection` command line tool - -The `face_detection` command lets you find the location (pixel coordinatates) -of any faces in an image. - -Just run the command `face_detection`, passing in a folder of images -to check (or a single image): - -```bash -$ face_detection ./folder_with_pictures/ - -examples/image1.jpg,65,215,169,112 -examples/image2.jpg,62,394,211,244 -examples/image2.jpg,95,941,244,792 -``` - -It prints one line for each face that was detected. The coordinates -reported are the top, right, bottom and left coordinates of the face (in pixels). - -##### Adjusting Tolerance / Sensitivity - -If you are getting multiple matches for the same person, it might be that -the people in your photos look very similar and a lower tolerance value -is needed to make face comparisons more strict. - -You can do that with the `--tolerance` parameter. The default tolerance -value is 0.6 and lower numbers make face comparisons more strict: - -```bash -$ face_recognition --tolerance 0.54 ./pictures_of_people_i_know/ ./unknown_pictures/ - -/unknown_pictures/unknown.jpg,Barack Obama -/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person +python3 create_face_encoding_db ``` +This will automatically manage the update of a database (now json, need optimization here as well). +After this you will have to delete both pictures from the folder - once we will move to AWS we will also manage the automatic deletion of the pictures. + +2. **Develop the algorithm** +This can be done with screen forwarding, or without. Here we will only explain the latter case, as the former solution is a mix between this and what is explained here (LINK TO X11 SCREEN FORWARDING) + +The algorithm is implemented in a script that mocks the raspberry pi use case. +The setup is +- A video, called "Video Test", shall be used as input. Not using live recording makes things + - faster + - repeatable + - simpler +- An MQTT client, more info [here](https://github.com/AndreaCalabro-AYES/MQTT_Broker/blob/development/README.md#client) +- The algorithm that looks for faces in a frame, and recognizes any encodings corresponding to one in its database (the encodings.js). + +## Next Steps +Many improvements are on the timeline +1. Optimization of this heavy task +2. Migrate towards a self developed ML model, reducing the amount of dependencies -If you want to see the face distance calculated for each match in order -to adjust the tolerance setting, you can use `--show-distance true`: - -```bash -$ face_recognition --show-distance true ./pictures_of_people_i_know/ ./unknown_pictures/ - -/unknown_pictures/unknown.jpg,Barack Obama,0.378542298956785 -/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person,None -``` - -##### More Examples - -If you simply want to know the names of the people in each photograph but don't -care about file names, you could do this: - -```bash -$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2 - -Barack Obama -unknown_person -``` - -##### Speeding up Face Recognition - -Face recognition can be done in parallel if you have a computer with -multiple CPU cores. For example, if your system has 4 CPU cores, you can -process about 4 times as many images in the same amount of time by using -all your CPU cores in parallel. - -If you are using Python 3.4 or newer, pass in a `--cpus ` parameter: - -```bash -$ face_recognition --cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/ -``` - -You can also pass in `--cpus -1` to use all CPU cores in your system. - -#### Python Module - -You can import the `face_recognition` module and then easily manipulate -faces with just a couple of lines of code. It's super easy! - -API Docs: [https://face-recognition.readthedocs.io](https://face-recognition.readthedocs.io/en/latest/face_recognition.html). - -##### Automatically find all the faces in an image - -```python -import face_recognition - -image = face_recognition.load_image_file("my_picture.jpg") -face_locations = face_recognition.face_locations(image) - -# face_locations is now an array listing the co-ordinates of each face! -``` - -See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py) - to try it out. - -You can also opt-in to a somewhat more accurate deep-learning-based face detection model. - -Note: GPU acceleration (via NVidia's CUDA library) is required for good -performance with this model. You'll also want to enable CUDA support -when compliling `dlib`. - -```python -import face_recognition - -image = face_recognition.load_image_file("my_picture.jpg") -face_locations = face_recognition.face_locations(image, model="cnn") - -# face_locations is now an array listing the co-ordinates of each face! -``` - -See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture_cnn.py) - to try it out. - -If you have a lot of images and a GPU, you can also -[find faces in batches](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_batches.py). - -##### Automatically locate the facial features of a person in an image - -```python -import face_recognition - -image = face_recognition.load_image_file("my_picture.jpg") -face_landmarks_list = face_recognition.face_landmarks(image) - -# face_landmarks_list is now an array with the locations of each facial feature in each face. -# face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye. -``` - -See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/find_facial_features_in_picture.py) - to try it out. - -##### Recognize faces in images and identify who they are - -```python -import face_recognition - -picture_of_me = face_recognition.load_image_file("me.jpg") -my_face_encoding = face_recognition.face_encodings(picture_of_me)[0] - -# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face! - -unknown_picture = face_recognition.load_image_file("unknown.jpg") -unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0] - -# Now we can see the two face encodings are of the same person with `compare_faces`! - -results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding) - -if results[0] == True: - print("It's a picture of me!") -else: - print("It's not a picture of me!") -``` - -See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py) - to try it out. - -## Python Code Examples - -All the examples are available [here](https://github.com/ageitgey/face_recognition/tree/master/examples). - - -#### Face Detection - -* [Find faces in a photograph](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py) -* [Find faces in a photograph (using deep learning)](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture_cnn.py) -* [Find faces in batches of images w/ GPU (using deep learning)](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_batches.py) -* [Blur all the faces in a live video using your webcam (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/blur_faces_on_webcam.py) - -#### Facial Features - -* [Identify specific facial features in a photograph](https://github.com/ageitgey/face_recognition/blob/master/examples/find_facial_features_in_picture.py) -* [Apply (horribly ugly) digital make-up](https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py) - -#### Facial Recognition - -* [Find and recognize unknown faces in a photograph based on photographs of known people](https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py) -* [Identify and draw boxes around each person in a photo](https://github.com/ageitgey/face_recognition/blob/master/examples/identify_and_draw_boxes_on_faces.py) -* [Compare faces by numeric face distance instead of only True/False matches](https://github.com/ageitgey/face_recognition/blob/master/examples/face_distance.py) -* [Recognize faces in live video using your webcam - Simple / Slower Version (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam.py) -* [Recognize faces in live video using your webcam - Faster Version (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam_faster.py) -* [Recognize faces in a video file and write out new video file (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_video_file.py) -* [Recognize faces on a Raspberry Pi w/ camera](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_on_raspberry_pi.py) -* [Run a web service to recognize faces via HTTP (Requires Flask to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/web_service_example.py) -* [Recognize faces with a K-nearest neighbors classifier](https://github.com/ageitgey/face_recognition/blob/master/examples/face_recognition_knn.py) -* [Train multiple images per person then recognize faces using a SVM](https://github.com/ageitgey/face_recognition/blob/master/examples/face_recognition_svm.py) - -## Creating a Standalone Executable -If you want to create a standalone executable that can run without the need to install `python` or `face_recognition`, you can use [PyInstaller](https://github.com/pyinstaller/pyinstaller). However, it requires some custom configuration to work with this library. See [this issue](https://github.com/ageitgey/face_recognition/issues/357) for how to do it. - -## Articles and Guides that cover `face_recognition` - -- My article on how Face Recognition works: [Modern Face Recognition with Deep Learning](https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78) - - Covers the algorithms and how they generally work -- [Face recognition with OpenCV, Python, and deep learning](https://www.pyimagesearch.com/2018/06/18/face-recognition-with-opencv-python-and-deep-learning/) by Adrian Rosebrock - - Covers how to use face recognition in practice -- [Raspberry Pi Face Recognition](https://www.pyimagesearch.com/2018/06/25/raspberry-pi-face-recognition/) by Adrian Rosebrock - - Covers how to use this on a Raspberry Pi -- [Face clustering with Python](https://www.pyimagesearch.com/2018/07/09/face-clustering-with-python/) by Adrian Rosebrock - - Covers how to automatically cluster photos based on who appears in each photo using unsupervised learning - -## How Face Recognition Works - -If you want to learn how face location and recognition work instead of -depending on a black box library, [read my article](https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78). - -## Caveats - -* The face recognition model is trained on adults and does not work very well on children. It tends to mix - up children quite easy using the default comparison threshold of 0.6. -* Accuracy may vary between ethnic groups. Please see [this wiki page](https://github.com/ageitgey/face_recognition/wiki/Face-Recognition-Accuracy-Problems#question-face-recognition-works-well-with-european-individuals-but-overall-accuracy-is-lower-with-asian-individuals) for more details. - -## Deployment to Cloud Hosts (Heroku, AWS, etc) - -Since `face_recognition` depends on `dlib` which is written in C++, it can be tricky to deploy an app -using it to a cloud hosting provider like Heroku or AWS. - -To make things easier, there's an example Dockerfile in this repo that shows how to run an app built with -`face_recognition` in a [Docker](https://www.docker.com/) container. With that, you should be able to deploy -to any service that supports Docker images. - -You can try the Docker image locally by running: `docker-compose up --build` - -There are also [several prebuilt Docker images.](docker/README.md) - -Linux users with a GPU (drivers >= 384.81) and [Nvidia-Docker](https://github.com/NVIDIA/nvidia-docker) installed can run the example on the GPU: Open the [docker-compose.yml](docker-compose.yml) file and uncomment the `dockerfile: Dockerfile.gpu` and `runtime: nvidia` lines. - -## Having problems? - -If you run into problems, please read the [Common Errors](https://github.com/ageitgey/face_recognition/wiki/Common-Errors) section of the wiki before filing a github issue. - -## Thanks - -* Many, many thanks to [Davis King](https://github.com/davisking) ([@nulhom](https://twitter.com/nulhom)) - for creating dlib and for providing the trained facial feature detection and face encoding models - used in this library. For more information on the ResNet that powers the face encodings, check out - his [blog post](http://blog.dlib.net/2017/02/high-quality-face-recognition-with-deep.html). -* Thanks to everyone who works on all the awesome Python data science libraries like numpy, scipy, scikit-image, - pillow, etc, etc that makes this kind of stuff so easy and fun in Python. -* Thanks to [Cookiecutter](https://github.com/audreyr/cookiecutter) and the - [audreyr/cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage) project template - for making Python project packaging way more tolerable. diff --git a/Wait-docker-compose.txt b/Wait-docker-compose.txt new file mode 100644 index 000000000..b2f279fc6 --- /dev/null +++ b/Wait-docker-compose.txt @@ -0,0 +1,41 @@ +version: '3' + +services: + face_recognition: + image: face_recognition + container_name: face_recognition + + build: + context: . + dockerfile: Dockerfile + args: + - NO_CACHE=1 + #Uncomment this line to run the example on the GPU (requires Nvidia-Docker) + # dockerfile: Dockerfile.gpu + + # working_dir: /face_recognition/examples + # command: python3 recognize_faces_in_pictures.py + + # Update the encodings + working_dir: /face_recognition/mm_application + command: python3 facerec_on_rasp_usb_camera.py + # command: python3 create_face_encoding_db.py + # Update the encodings + + # uncomment this if you want to see something via x11 forwarding + # environment: + # - DISPLAY= :0 + # Until here for x11 forwarding pt 1 + volumes: + - ./:/face_recognition + # uncomment this if you want to see something via x11 forwarding + # - /tmp/.X11-unix:/tmp/.X11-unix + devices: + # - /dev/dri:/dev/dri + - dev/video0:dev/video0 + network_mode: host + privileged: true + # Until here for x11 forwarding + + #Uncomment this line to run the example on the GPU (requires Nvidia-Docker) + # runtime: nvidia \ No newline at end of file diff --git a/ayes_model/add_face_encoding.py b/ayes_model/add_face_encoding.py new file mode 100644 index 000000000..7664053a9 --- /dev/null +++ b/ayes_model/add_face_encoding.py @@ -0,0 +1,35 @@ +import common +import os +import cv2 + + + +if __name__ == "__main__": + TRAIN_FOLDER = './train_files/' + ENCODINGS_PATH = './encodings.json' + + user_name = input("New encoding:") + + try : + os.mkdir(TRAIN_FOLDER + user_name) + except FileExistsError: + print("User name already exists") + exit() + + NUMBER_OF_PICTURES = 10 + + for i in range(1, NUMBER_OF_PICTURES + 1): + input("Press enter to take picture (" + str(i) + "/" + str(NUMBER_OF_PICTURES) + ")") + + camera = cv2.VideoCapture(0) + if not camera.isOpened(): break + ret, frame = camera.read() + camera.release() + if not ret: break + + cv2.imwrite(TRAIN_FOLDER + user_name + '/' + user_name + str(i) + ".png", frame) + + + new_encodings = common.process_encoding_folder(TRAIN_FOLDER + user_name, user_name) + common.append_encodings(ENCODINGS_PATH, new_encodings) + \ No newline at end of file diff --git a/ayes_model/common.py b/ayes_model/common.py new file mode 100644 index 000000000..fa4b83ffc --- /dev/null +++ b/ayes_model/common.py @@ -0,0 +1,61 @@ +import os +import json +import face_recognition + + + +def save_encodings(encodings_path, encodings): + """ + Save the new encodings in the encodings.json file + """ + with open(encodings_path, 'w') as file: + json.dump(encodings, file, indent=4) + +def load_encodings(encodings_path): + """ + Load the existing encodings json file, to get the existing encodings + """ + if os.path.exists(encodings_path): + with open(encodings_path, 'r') as file: + try: + return json.load(file) + except json.decoder.JSONDecodeError as e: + print(e) + + return [] + +def append_encodings(encodings_path, new_encodings): + """ + Load the existing encodings json file, and append the given list of new encodings + """ + old_encodings = load_encodings(encodings_path) + encodings = old_encodings + new_encodings + save_encodings(encodings_path, encodings) + +def create_encoding(image_path): + """ + Use the face recognition api to load the image and create the new encoding + """ + picture = face_recognition.load_image_file(file=image_path) + face_bounding_boxes = face_recognition.face_locations(picture) + + if len(face_bounding_boxes) == 1: + return face_recognition.face_encodings(picture, num_jitters=50, model="large")[0] + else: + print("Number of detected faces is not 1 in ", image_path, "(", len(face_bounding_boxes), ")") + return None + +def process_encoding_folder(encoding_folder, name): + """ + Process the images in the given folder and return a list of the encodings + """ + new_encodings = [] + + for file_name in os.listdir(encoding_folder): + image_path = os.path.join(encoding_folder, file_name) + new_encoding = create_encoding(image_path) + if new_encoding is not None: + print(f"New encoding created " + name) + new_encodings.append({'name': name, 'encoding': new_encoding.tolist()}) + + return new_encodings diff --git a/ayes_model/create_face_encoding_db.py b/ayes_model/create_face_encoding_db.py new file mode 100644 index 000000000..ffc11965e --- /dev/null +++ b/ayes_model/create_face_encoding_db.py @@ -0,0 +1,19 @@ +""" +This file is intended to create the database used to recognize the faces for the ayes application +""" + +import common +import os + + + +if __name__ == "__main__": + ENCODINGS_PATH = './encodings.json' + TRAIN_FOLDER = './train_files/' + + new_encodings = [] + + for sub_dir in os.listdir(TRAIN_FOLDER): + new_encodings = new_encodings + common.process_encoding_folder(TRAIN_FOLDER + sub_dir, sub_dir) + + common.save_encodings(ENCODINGS_PATH, new_encodings) diff --git a/ayes_model/facerec_on_rasp_mock.py b/ayes_model/facerec_on_rasp_mock.py new file mode 100644 index 000000000..ef0aa8ba8 --- /dev/null +++ b/ayes_model/facerec_on_rasp_mock.py @@ -0,0 +1,285 @@ +""" +Here we want to test the real scenario of the webcam stream on the raspberry py. +We will also add small delays to have a complete view of the process. Further analysis will improve the model. +""" +import os +import json +import face_recognition +import numpy as np +import cv2 +import time +from mqtt_client_ayes import AyesMqttClient +import logging + +log = logging.Logger("Face Recognition Logger") + + +def load_db(db_path): + """ + Load the existing encodings json file, to get the existing encodings + """ + if os.path.exists(db_path): + with open(db_path, 'r') as file: + try: + db = json.load(file) + except json.decoder.JSONDecodeError: + db = [] + + else: + db = [] + + # for encoding in encodings: + # encoding = np.array(encoding) + + return db + +def load_test_video(test_dir, filename): + for test_filename in os.listdir(test_dir): + test_name, test_ext = os.path.splitext(test_filename) + if test_name == filename: + video_path = os.path.join(test_dir, test_filename) + + return cv2.VideoCapture(video_path) + + +def find_true_indices(boolean_list): + """ + Find the indexes of the recognized persons + + """ + return_index = -1 + for index, value in enumerate(boolean_list): + if value: + return_index = index + + return return_index + +def preprocess_frame(frame,horizontal_resizing= 0.5, vertical_resizing= 0.5): + """ + Pre processing a frame, in particular + 1. Resize it to make it smaller, having a faster recognition process + - The horizontal and vertical resizing values shall be (0,1] + 2. Convert from BGR (OpenCV) to RGB (used by the face recognition model). + Returns the small frame in rgb + """ + + if (horizontal_resizing > 1) or (vertical_resizing > 1): + log.error("Accepted resizing values interval (0,1]") + + if (horizontal_resizing <= 0) or (vertical_resizing <= 0): + log.error("Accepted resizing values interval (0,1]") + + # Resize frame of video for faster face recognition processing + small_frame = cv2.resize(frame, (0, 0), fx=horizontal_resizing, fy=vertical_resizing) + + # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses) + rgb_small_frame = small_frame[:, :, ::-1] + return rgb_small_frame + + +def manage_face_recognition(rgb_small_frame, face_locations, retry_next_frame, prev_faces_nb, print_logs= False): + """ + Manages the face recognition process, updating the status of detected faces, and determining whether to retry + recognition in the next frame. + + Parameters: + - rgb_small_frame: The current video frame in RGB format, from which faces are to be recognized. + - face_locations: List of coordinates where faces are detected in the current frame. + - retry_next_frame: Boolean indicating whether to retry face recognition in the next frame due to a previous unknown face. + - prev_faces_nb: The number of faces detected in the previous frame. + - print_logs: Boolean to indicate whether to print log messages (default is False). + + Returns: + - publish_flag: Boolean indicating whether the results should be published. + - retry_next_frame: Updated boolean indicating whether to retry face recognition in the next frame. + - face_added_names: List of names of recognized faces. + - prev_faces_nb: Updated number of faces detected in the current frame. + """ + + face_added_names = [] + + + if len(face_locations) == 0: + + LOGGING_STRING = "No faces are being detected" + publish_flag = False + + + elif (len(face_locations) == prev_faces_nb) and (not retry_next_frame): + + LOGGING_STRING = "Still here?" + publish_flag = False + + + elif (len(face_locations) != prev_faces_nb) or retry_next_frame: + + publish_flag = True + face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) + indexes = [] + if not retry_next_frame: + + + # print(face_locations) + LOGGING_STRING = "I see someone" + for face_encoding in face_encodings: + # See if the face is a match for the known face(s) + matches = face_recognition.compare_faces(known_encodings, face_encoding) + index = find_true_indices(matches) + indexes.append(index) + # This if else condition is to give the algorithm time to recognize someone, so: + # the first time we see someone, if we don't recognize it we try again + if sum(indexes) >= 0: + LOGGING_STRING = "I know someone" + for index in indexes: + face_added_names.append(names[index]) + elif -1 in indexes: # -1 is the default value we give to unkonwn encodings + # If we don't recognize anyone, then we will redo everything the next frame we want to process! + LOGGING_STRING = "First Unknown Encounter" + publish_flag = False + retry_next_frame = True # Set flag to retry in the next processed frame + else: + log.error("You should not be here") + + elif retry_next_frame: + LOGGING_STRING = "I will retry to recognize again such unknown" + retry_next_frame = False + publish_flag = True + + for face_encoding in face_encodings: + matches = face_recognition.compare_faces(known_encodings, face_encoding) + index = find_true_indices(matches) + indexes.append(index) + if sum(indexes) >= 0: + LOGGING_STRING = "I know someone" + for index in indexes: + face_added_names.append(names[index]) + elif -1 in indexes: # -1 is the default value we give to unkonwn encodings + face_added_names.append("Unknown") + LOGGING_STRING = "Someone is not in my system" + else: + LOGGING_STRING = "We may have a problem here" + + else: + publish_flag = False + LOGGING_STRING = "You are in a situation not covered by the algorithm!!" + + if print_logs: + print(LOGGING_STRING) + + return publish_flag, retry_next_frame, face_added_names, prev_faces_nb + + +def publish_messages(previous_names, face_added_names): + """ + Send the messages to the MQTT broker + The function only activates if the publish flag is set to true, in such case: + 1. First send the names of the last recognized people on the face_removed topic + 2. Send the names of the newly recognized people on the face_added topic + Returns the recognized faces, to be then used at step 1 the next time the function is called + This is needed to have a quick and clean way to avoid having the names to be repeated multiple times. + """ + face_removed = json.dumps({"names" : previous_names}) + face_recognition_client.publish_message("greetings/face_removed", face_removed) + face_added_names = list(set(face_added_names)) + face_added = json.dumps({"names" : face_added_names}) + face_recognition_client.publish_message("greetings/face_added", face_added) + return face_added_names + + + +test_dir = './test_files' +input_movie = load_test_video(test_dir, "Video Test") +frames = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT)) +fps = input_movie.get(cv2.CAP_PROP_FPS) # get the FPS +width = int(input_movie.get(3)) +height = int(input_movie.get(4)) + + +db_path = './encodings.json' +db = load_db(db_path) +names = [encoding['name'] for encoding in db] +known_encodings = [np.array(encoding['encoding']) for encoding in db] + +print("Encodings have been loaded") +print(names) +MQTT_TOPICS = ["greetings/face_added", + "greetings/face_removed"] +CLIENT_ID = "FaceRecognition" +MQTT_BROKER_HOST = "localhost" +MQTT_BROKER_PORT = 1883 + +face_recognition_client = AyesMqttClient( + broker= MQTT_BROKER_HOST, + port= MQTT_BROKER_PORT, + topics_list= MQTT_TOPICS, + client_id= CLIENT_ID +) + + +# Initialize some variables +face_locations = [] +face_encodings = [] +sent_faces = [] +frame_nb = 1 +prev_faces_nb = 0 +count = 0 +retry_recognition = False # Flag to retry if we got a new encoding, and such encoding is unknown +publish_flag = False # Flag to publish on mqtt +retry_next_frame = False +new_unknown_detected = False +previous_names = [] + +FRAMES_JUMP = 10 + +print("Ready to start recognition") + +time.sleep(2) + +face_recognition_client.connect() + +while True: + + # Initialization + count += 1 + + # Only process every other FRAMES_JUMP of video to save time + if count % FRAMES_JUMP == 0: + print(f"second: {count/fps}") + + # Grab a single frame of video + ret, frame = input_movie.read() + frame_nb += 1 + if frame_nb > frames: + print("finished!") + break + + # Add the delay - based on the fps of the stream + time.sleep(1/fps) + + # Pre process frame + rgb_small_frame = preprocess_frame(frame, horizontal_resizing= 0.5, vertical_resizing= 0.5) + + # Find all the faces and face encodings in the current frame of video + # face_locations = face_recognition.face_locations(rgb_small_frame, model="cnn") + face_locations = face_recognition.face_locations(rgb_small_frame) + + # Main face rec AYES algo + publish_flag, retry_next_frame, face_added_names, prev_faces_nb = manage_face_recognition(rgb_small_frame, face_locations, retry_next_frame, prev_faces_nb, print_logs= True) + + + # Publish only when necessary + if publish_flag: + previous_names = publish_messages(previous_names, face_added_names) + + + + prev_faces_nb = len(face_locations) + else: + # Grab a single frame of video + ret, frame = input_movie.read() + frame_nb += 1 + if frame_nb > frames: + print("finished!") + break + + diff --git a/ayes_model/test_files/Video Test.mp4 b/ayes_model/test_files/Video Test.mp4 new file mode 100644 index 000000000..b2847fad7 Binary files /dev/null and b/ayes_model/test_files/Video Test.mp4 differ diff --git a/ayes_model/test_with_x11.py b/ayes_model/test_with_x11.py new file mode 100644 index 000000000..75255b26e --- /dev/null +++ b/ayes_model/test_with_x11.py @@ -0,0 +1,144 @@ +""" +In here I would like to test using the x11 server +We have as input a video that has been recorded offline, +As output the same video displayed on the x11 host with a box around the face and the name of the recognized person +""" + + + +import os +import json +import face_recognition +import numpy as np +import cv2 + +def load_db(db_path): + """ + Load the existing encodings json file, to get the existing encodings + """ + if os.path.exists(db_path): + with open(db_path, 'r') as file: + try: + db = json.load(file) + except json.decoder.JSONDecodeError: + db = [] + + else: + db = [] + + # for encoding in encodings: + # encoding = np.array(encoding) + + return db + +def load_test_video(test_dir, filename): + for test_filename in os.listdir(test_dir): + test_name, test_ext = os.path.splitext(test_filename) + if test_name == filename: + video_path = os.path.join(test_dir, test_filename) + + return cv2.VideoCapture(video_path) + + +def find_true_indices(boolean_list): + """ + Find the indexes of the recognized persons + """ + return [index for index, value in enumerate(boolean_list) if value] + + + + +test_dir = './test_files' +input_movie = load_test_video(test_dir, "Video Test") +# Open the input movie file +# input_movie = cv2.VideoCapture("hamilton_clip.mp4") +frames = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT)) +fps = input_movie.get(cv2.CAP_PROP_FPS) # get the FPS +width = int(input_movie.get(3)) +height = int(input_movie.get(4)) + +# Create an output movie file (make sure resolution/frame rate matches input video!) +# fourcc = cv2.VideoWriter_fourcc(*'XVID') # specify the video code +# output_movie = cv2.VideoWriter('output.avi', fourcc, fps, (width, height)) + +# # Load some sample pictures and learn how to recognize them. +# lmm_image = face_recognition.load_image_file("lin-manuel-miranda.png") +# lmm_face_encoding = face_recognition.face_encodings(lmm_image)[0] + +# al_image = face_recognition.load_image_file("alex-lacamoire.png") +# al_face_encoding = face_recognition.face_encodings(al_image)[0] + +db_path = '../mm_application/encodings.json' +db = load_db(db_path) +names = [encoding['name'] for encoding in db] +known_encodings = [np.array(encoding['encoding']) for encoding in db] + +# print(names) +# print(encodings) + +# Initialize some variables +face_locations = [] +face_encodings = [] +process_this_frame = True +frame_nb = 1 + + +while True: + # Grab a single frame of video + ret, frame = input_movie.read() + frame_nb += 1 + if frame_nb > frames: + print("finished!") + break + + face_names = [] + + # Only process every other frame of video to save time + if process_this_frame: + # Resize frame of video to 1/4 size for faster face recognition processing + small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) + + # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses) + rgb_small_frame = small_frame[:, :, ::-1] + + # Find all the faces and face encodings in the current frame of video + face_locations = face_recognition.face_locations(rgb_small_frame) + face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) + # print(face_locations) + + for face_encoding in face_encodings: + # See if the face is a match for the known face(s) + matches = face_recognition.compare_faces(known_encodings, face_encoding) + indexes = find_true_indices(matches) + [face_names.append(names[index]) for index in indexes] + + process_this_frame = not process_this_frame + + # Display the results + for (top, right, bottom, left), name in zip(face_locations, face_names): + # Scale back up face locations since the frame we detected in was scaled to 1/4 size + top *= 4 + right *= 4 + bottom *= 4 + left *= 4 + + # Draw a box around the face + cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) + + # Draw a label with a name below the face + cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED) + font = cv2.FONT_HERSHEY_DUPLEX + cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1) + + # Display the resulting image + cv2.imshow('Video', frame) + + # Hit 'q' on the keyboard to quit! + if cv2.waitKey(1) & 0xFF == ord('q'): + break + +cv2.destroyAllWindows() + + + diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 000000000..706b8d413 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,25 @@ +version: '3' + +services: + face_recognition_dev: + image: face_recognition_dev + container_name: face_recognition_dev + + build: + context: . + dockerfile: Dockerfile.dev + + volumes: + - ./ayes_model:/face_recognition/ayes_model_volume + network_mode: host + + working_dir: /face_recognition/ayes_model_volume + # command: python3 create_face_encoding_db.py + command: python3 facerec_on_rasp_mock.py + + + privileged: true + # direct logging to terminal, no buffering for logs + environment: + - PYTHONUNBUFFERED=1 + - PYTHONPATH=/face_recognition/ayes_model diff --git a/docker-compose.yml b/docker-compose.yml index c46125e96..7820d2b5d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,28 @@ -version: '2.3' +version: '3' services: face_recognition: - image: face_recognition + image: face_recognition_on_rasp container_name: face_recognition - working_dir: /face_recognition/examples + build: context: . - #Uncomment this line to run the example on the GPU (requires Nvidia-Docker) - # dockerfile: Dockerfile.gpu - command: python3 -u find_faces_in_picture_cnn.py + dockerfile: Dockerfile.rasp + volumes: - - ./:/face_recognition - #Uncomment this line to run the example on the GPU (requires Nvidia-Docker) - # runtime: nvidia \ No newline at end of file + - ./mm_application:/root/face_recognition/mm_application_volume + network_mode: host + + working_dir: /root/face_recognition/mm_application_volume + command: python3 facerec_on_rasp_usb_camera.py + + devices: + - /dev/video0:/dev/video0 + + privileged: true + # direct logging to terminal, no buffering for logs + environment: + - PYTHONUNBUFFERED=1 + - PYTHONPATH=/root/face_recognition/mm_application + + restart: unless-stopped diff --git a/docs/conf.py b/docs/conf.py old mode 100755 new mode 100644 diff --git a/examples/boxed_faces.png b/examples/boxed_faces.png new file mode 100644 index 000000000..fccc4c437 Binary files /dev/null and b/examples/boxed_faces.png differ diff --git a/examples/boxed_faces_cnn.png b/examples/boxed_faces_cnn.png new file mode 100644 index 000000000..e66e91e38 Binary files /dev/null and b/examples/boxed_faces_cnn.png differ diff --git a/examples/jane-goodall-monkey-1.jpg b/examples/jane-goodall-monkey-1.jpg new file mode 100644 index 000000000..3b357510a Binary files /dev/null and b/examples/jane-goodall-monkey-1.jpg differ diff --git a/examples/multiple_faces_image.jpg b/examples/multiple_faces_image.jpg new file mode 100644 index 000000000..5f5a4aed8 Binary files /dev/null and b/examples/multiple_faces_image.jpg differ diff --git a/examples/recognize_faces_in_pictures.py b/examples/recognize_faces_in_pictures.py index b56df46f5..c4a35e2e6 100644 --- a/examples/recognize_faces_in_pictures.py +++ b/examples/recognize_faces_in_pictures.py @@ -1,15 +1,18 @@ import face_recognition +import cv2 # Load the jpg files into numpy arrays biden_image = face_recognition.load_image_file("biden.jpg") obama_image = face_recognition.load_image_file("obama.jpg") unknown_image = face_recognition.load_image_file("obama2.jpg") +print("Running the modified version 0.1") + # Get the face encodings for each face in each image file # Since there could be more than one face in each image, it returns a list of encodings. # But since I know each image only has one face, I only care about the first encoding in each image, so I grab index 0. try: - biden_face_encoding = face_recognition.face_encodings(biden_image)[0] + biden_face_encoding = face_recognition.face_encodings(biden_image, num_jitters=50, model="large") obama_face_encoding = face_recognition.face_encodings(obama_image)[0] unknown_face_encoding = face_recognition.face_encodings(unknown_image)[0] except IndexError: @@ -21,9 +24,44 @@ obama_face_encoding ] +print(biden_face_encoding) +print(biden_face_encoding.shape) +print(unknown_face_encoding.shape) + # results is an array of True/False telling if the unknown face matched anyone in the known_faces array results = face_recognition.compare_faces(known_faces, unknown_face_encoding) +print(results[0]) +# print("Is the unknown face a picture of Biden? {}".format(results[0])) +# print("Is the unknown face a picture of Obama? {}".format(results[1])) +# print("Is the unknown face a new person that we've never seen before? {}".format(not True in results)) + +# multiple_faces_image = face_recognition.load_image_file("jane-goodall-monkey-1.jpg") +# faces_locations = face_recognition.face_locations(multiple_faces_image) +# faces_locations_cnn = face_recognition.face_locations(multiple_faces_image, model="cnn") +# print(f"These are the face locations {faces_locations}") +# print(f"These are the face locations found with the refined cnn model {faces_locations_cnn}") + +# new_image = cv2.imread("jane-goodall-monkey-1.jpg") +# for face in faces_locations: +# (top, right, bottom, left) = face +# cv2.rectangle(new_image, (left, top), (right, bottom), color=(0,255,0), thickness=2) + +# # save the image +# cv2.imwrite("boxed_faces.png", new_image) +# print("Boxed Image Created without cnn") + +# new_image = cv2.imread("jane-goodall-monkey-1.jpg") +# for face in faces_locations_cnn: +# (top, right, bottom, left) = face +# cv2.rectangle(new_image, (left, top), (right, bottom), color=(0,255,0), thickness=2) + +# # save the image +# cv2.imwrite("boxed_faces_cnn.png", new_image) +# print("Boxed Image Created with cnn") + -print("Is the unknown face a picture of Biden? {}".format(results[0])) -print("Is the unknown face a picture of Obama? {}".format(results[1])) -print("Is the unknown face a new person that we've never seen before? {}".format(not True in results)) +# # Display the image +# cv2.imshow('Face Detection', new_image) +# cv2.waitKey(0) +# cv2.destroyAllWindows() +# print("HERE I GOT") \ No newline at end of file diff --git a/mm_application/encodings.json b/mm_application/encodings.json new file mode 100644 index 000000000..79ca465b4 --- /dev/null +++ b/mm_application/encodings.json @@ -0,0 +1,5189 @@ +[ + { + "name": "Xander", + "encoding": [ + -0.14568231999874115, + 0.10806748270988464, + -0.08602549135684967, + -0.09572580456733704, + -0.16823822259902954, + -0.008424165658652782, + -0.05179867148399353, + -0.12487558275461197, + 0.06914947181940079, + -0.015275995247066021, + 0.1963294893503189, + -0.07996079325675964, + -0.2587807774543762, + -0.10723966360092163, + -0.04763675108551979, + 0.15101277828216553, + -0.07353487610816956, + -0.17127104103565216, + -0.1459425389766693, + -0.10386046767234802, + -0.022488228976726532, + 0.06731836497783661, + 0.020789099857211113, + 0.12349122762680054, + -0.06392060965299606, + -0.2800825834274292, + -0.07592904567718506, + -0.12156401574611664, + 0.03864314779639244, + -0.1220364198088646, + -0.02080005593597889, + 0.05760588124394417, + -0.1304357647895813, + -0.06966886669397354, + 0.057167280465364456, + 0.034342650324106216, + -0.07569549232721329, + -0.13452468812465668, + 0.29033026099205017, + 0.04180034250020981, + -0.13319119811058044, + -0.041029009968042374, + 0.05865504592657089, + 0.3214443624019623, + 0.16594068706035614, + -0.07263937592506409, + 0.06734675914049149, + -0.0748278796672821, + 0.09889534115791321, + -0.19347217679023743, + 0.12049239128828049, + 0.19929033517837524, + 0.1801508516073227, + 0.08339668065309525, + -0.00261966185644269, + -0.11050918698310852, + 0.014168388210237026, + 0.2432987093925476, + -0.25580546259880066, + 0.040470268577337265, + 0.06326010078191757, + -0.05146832391619682, + -0.11962373554706573, + -0.12611691653728485, + 0.1979881376028061, + 0.17859698832035065, + -0.10233451426029205, + -0.16912789642810822, + 0.19476346671581268, + -0.11472897976636887, + -0.11020082235336304, + 0.029340192675590515, + -0.18010582029819489, + -0.21710236370563507, + -0.25816792249679565, + 0.10312602669000626, + 0.29763850569725037, + 0.23711392283439636, + -0.16361480951309204, + 0.015388034284114838, + -0.055206526070833206, + -0.023512953892350197, + 0.002499950584024191, + 0.019186468794941902, + -0.1270284503698349, + -0.055309467017650604, + -0.020191000774502754, + 0.07002997398376465, + 0.14398957788944244, + -0.01878734491765499, + -0.07828687131404877, + 0.2061467468738556, + 0.06792425364255905, + -0.026653112843632698, + 0.05951516330242157, + 0.044925909489393234, + -0.004228375386446714, + -0.009075939655303955, + -0.09126200526952744, + 0.049873366951942444, + 0.03125002607703209, + -0.10906559973955154, + 0.07541963458061218, + 0.07216264307498932, + -0.14671558141708374, + 0.14401587843894958, + 0.03224778175354004, + -0.019709710031747818, + -0.07427533715963364, + -0.04200955480337143, + -0.08838330209255219, + -0.029910998418927193, + 0.17688052356243134, + -0.21793782711029053, + 0.20496207475662231, + 0.14739534258842468, + 0.11663579940795898, + 0.16901881992816925, + 0.1077740490436554, + 0.05713630095124245, + 0.04867745190858841, + -0.09869930148124695, + -0.13982325792312622, + -0.06441491097211838, + 0.15870176255702972, + 0.051079850643873215, + 0.05820663273334503, + 0.10702668875455856 + ] + }, + { + "name": "Xander", + "encoding": [ + -0.05052565410733223, + 0.0781831443309784, + -0.06702830642461777, + -0.08194305002689362, + -0.19490304589271545, + -0.0034459084272384644, + -0.027666572481393814, + -0.14889384806156158, + 0.05466100946068764, + -0.007491367869079113, + 0.26681283116340637, + -0.06810765713453293, + -0.2600792944431305, + -0.1252078413963318, + 0.01623111218214035, + 0.14676298201084137, + -0.056901540607213974, + -0.17663118243217468, + -0.13151802122592926, + -0.08877819031476974, + -0.027624063193798065, + -0.03345383703708649, + 0.06873984634876251, + 0.100007563829422, + -0.08100395649671555, + -0.2797534167766571, + -0.10220035165548325, + -0.09877847135066986, + 0.048181042075157166, + -0.10353007912635803, + -0.04650300368666649, + 0.12551239132881165, + -0.1305445432662964, + -0.08539877086877823, + 0.08126041293144226, + 0.03324481099843979, + -0.07358996570110321, + -0.12867490947246552, + 0.28276705741882324, + -0.01935894414782524, + -0.1439070701599121, + -0.014896616339683533, + 0.07816822081804276, + 0.2669738829135895, + 0.1789059191942215, + -0.020123668015003204, + 0.06732477247714996, + -0.04935932159423828, + 0.08403798937797546, + -0.1887819617986679, + 0.13742604851722717, + 0.16886848211288452, + 0.1689707487821579, + 0.07102260738611221, + -0.01574908196926117, + -0.1601681262254715, + 0.0610114187002182, + 0.22269552946090698, + -0.2691262662410736, + 0.0013097141636535525, + 0.042840998619794846, + -0.08774026483297348, + -0.11824335902929306, + -0.10365813225507736, + 0.2200128734111786, + 0.18969552218914032, + -0.09632199257612228, + -0.15989567339420319, + 0.157843217253685, + -0.06657416373491287, + -0.07807330042123795, + 0.05279364809393883, + -0.23216235637664795, + -0.21671046316623688, + -0.23368191719055176, + 0.09468212723731995, + 0.35362303256988525, + 0.19001077115535736, + -0.21576526761054993, + 0.0036959312856197357, + -0.017398901283740997, + -0.01864095963537693, + 0.031931761652231216, + 0.007604912389069796, + -0.09560006111860275, + -0.09110108762979507, + -0.10512629896402359, + 0.0477602481842041, + 0.1312204897403717, + -0.07538411766290665, + -0.07735703140497208, + 0.20480291545391083, + 0.05396546423435211, + 0.00809087697416544, + 0.06922513246536255, + 0.08955424278974533, + -0.016408579424023628, + 0.03170521557331085, + -0.1395103484392166, + 0.014569751918315887, + 0.04896533489227295, + -0.08470390737056732, + 0.017905913293361664, + 0.051512960344552994, + -0.14886930584907532, + 0.14103107154369354, + 0.024621618911623955, + -0.009258314967155457, + -0.09314538538455963, + -0.10861676931381226, + -0.05681099742650986, + -0.0198232252150774, + 0.1443430334329605, + -0.26400917768478394, + 0.1922857016324997, + 0.16391393542289734, + 0.09216329455375671, + 0.17228147387504578, + 0.09074278920888901, + 0.04181842878460884, + 0.06018097698688507, + -0.12224409729242325, + -0.1661302000284195, + -0.05730053782463074, + 0.16587024927139282, + 0.023671435192227364, + 0.05903375893831253, + 0.0934196189045906 + ] + }, + { + "name": "Xander", + "encoding": [ + -0.057167112827301025, + 0.06393241137266159, + -0.0760871171951294, + -0.0836777463555336, + -0.18231400847434998, + 0.0019738790579140186, + -0.0050150444731116295, + -0.12662987411022186, + 0.07830052077770233, + -0.005722381174564362, + 0.25088608264923096, + -0.05609756335616112, + -0.2507762610912323, + -0.13660326600074768, + 0.056106846779584885, + 0.14967849850654602, + -0.07343326508998871, + -0.1767321527004242, + -0.12947151064872742, + -0.07143473625183105, + -0.01905832625925541, + -0.018474897369742393, + 0.058947909623384476, + 0.11947499960660934, + -0.09386054426431656, + -0.2629130780696869, + -0.1282101571559906, + -0.10764230787754059, + 0.09611784666776657, + -0.0806814432144165, + -0.06495603173971176, + 0.10824241489171982, + -0.13626854121685028, + -0.0731816366314888, + 0.09634944051504135, + 0.021036552265286446, + -0.10951435565948486, + -0.14201253652572632, + 0.2637302577495575, + -0.03779546171426773, + -0.16360029578208923, + -0.005229460075497627, + 0.07165685296058655, + 0.24447321891784668, + 0.20422124862670898, + -0.017420528456568718, + 0.07166330516338348, + -0.058594685047864914, + 0.08197169005870819, + -0.19827967882156372, + 0.15555670857429504, + 0.1781686693429947, + 0.16520759463310242, + 0.08003287017345428, + -0.035680051892995834, + -0.15734392404556274, + 0.028056178241968155, + 0.23141366243362427, + -0.27596065402030945, + 0.023475008085370064, + 0.041489556431770325, + -0.10970869660377502, + -0.13870231807231903, + -0.09916528314352036, + 0.1923687905073166, + 0.21157696843147278, + -0.11137685179710388, + -0.22943922877311707, + 0.17615249752998352, + -0.11824320256710052, + -0.08695917576551437, + 0.07814831286668777, + -0.2265521138906479, + -0.20554675161838531, + -0.23628930747509003, + 0.08232375234365463, + 0.35725367069244385, + 0.17189227044582367, + -0.19310331344604492, + 0.02076081559062004, + -0.039125338196754456, + -0.017179960384964943, + 0.00158332206774503, + 0.03332725539803505, + -0.08610933274030685, + -0.12911279499530792, + -0.11178573220968246, + 0.04123443365097046, + 0.15606722235679626, + -0.10232041776180267, + -0.056920379400253296, + 0.2036934494972229, + 0.06127505004405975, + 0.0015160662587732077, + 0.04077400639653206, + 0.0906033143401146, + -0.014857292175292969, + 0.01740596815943718, + -0.10913760960102081, + -0.004511354491114616, + 0.041357215493917465, + -0.0665467232465744, + 0.012782187201082706, + 0.07574416697025299, + -0.1422038972377777, + 0.19117484986782074, + 0.03157081827521324, + 0.0003492918622214347, + -0.06528925150632858, + -0.11575639247894287, + -0.05745791271328926, + -0.023308170959353447, + 0.1323840469121933, + -0.2564338743686676, + 0.2114759385585785, + 0.1457584798336029, + 0.11656568199396133, + 0.15660956501960754, + 0.07649363577365875, + 0.062220942229032516, + 0.06203193962574005, + -0.1214568093419075, + -0.1977003812789917, + -0.04771534353494644, + 0.1629442572593689, + 0.015908900648355484, + 0.041751883924007416, + 0.08752831071615219 + ] + }, + { + "name": "Roberto", + "encoding": [ + -0.0640377476811409, + 0.12770488858222961, + -0.0691530629992485, + -0.09906232357025146, + -0.05999770015478134, + -0.04218514263629913, + -0.07812502980232239, + -0.04491075500845909, + 0.20848947763442993, + -0.07615332305431366, + 0.158074751496315, + -0.07195229083299637, + -0.30304771661758423, + 0.023307207971811295, + -0.06998955458402634, + 0.007755308412015438, + -0.21153512597084045, + -0.11026312410831451, + -0.032359957695007324, + -0.13260769844055176, + 0.08127982914447784, + 0.026958322152495384, + 0.021521009504795074, + 0.13039237260818481, + -0.21829946339130402, + -0.2816510498523712, + -0.09426736831665039, + -0.12478195130825043, + 0.09756647795438766, + -0.1874503344297409, + 0.04762260243296623, + 0.05293584614992142, + -0.1794874519109726, + -0.030686771497130394, + 0.008424756117165089, + 0.0590365007519722, + -0.06399167329072952, + -0.12404166907072067, + 0.20645397901535034, + 0.03222835436463356, + -0.07148054242134094, + -0.04862860590219498, + -0.005594827234745026, + 0.31786057353019714, + 0.12764140963554382, + 0.03605305030941963, + 0.04459644854068756, + -0.09133035689592361, + 0.16424602270126343, + -0.19737756252288818, + 0.08771216869354248, + 0.2579158544540405, + 0.07029556483030319, + 0.09719914197921753, + 0.0420977883040905, + -0.18015187978744507, + 0.02705737203359604, + 0.19083020091056824, + -0.16228187084197998, + 0.11145800352096558, + 0.08509225398302078, + 0.029820997267961502, + 0.0016930265119299293, + -0.04479030892252922, + 0.16393519937992096, + 0.02970557101070881, + -0.1465156376361847, + -0.0959220677614212, + 0.13692858815193176, + -0.18041498959064484, + -0.0032988095190376043, + 0.10751700401306152, + -0.11840303242206573, + -0.2214592695236206, + -0.13015170395374298, + 0.09217271953821182, + 0.3635880947113037, + 0.15828923881053925, + -0.027936939150094986, + 0.04182715713977814, + -0.08321494609117508, + -0.0921495258808136, + -0.011921592988073826, + 0.04568517580628395, + -0.1801745742559433, + -0.038060493767261505, + -0.05977482348680496, + 0.12756749987602234, + 0.22369138896465302, + 0.03435776010155678, + -0.032930776476860046, + 0.19619452953338623, + -0.00783470831811428, + 0.001863669604063034, + 0.03228074312210083, + 0.00583935622125864, + -0.2048063427209854, + 0.013291820883750916, + -0.03779153898358345, + 0.038502227514982224, + 0.03630724176764488, + -0.1600666046142578, + -0.07269640266895294, + 0.08942358940839767, + -0.1433926820755005, + 0.165329247713089, + 0.027284666895866394, + -0.06839968264102936, + -0.04030938073992729, + 0.028947101905941963, + -0.17897243797779083, + -0.06373972445726395, + 0.19324851036071777, + -0.27078792452812195, + 0.1825021654367447, + 0.15118731558322906, + 0.17794373631477356, + 0.16994309425354004, + 0.06147477403283119, + 0.06539134681224823, + 0.06516431272029877, + -0.019450485706329346, + -0.12272321432828903, + -0.0808340460062027, + 0.05989954248070717, + -0.00528008583933115, + 0.013386211358010769, + -0.06754573434591293 + ] + }, + { + "name": "Roberto", + "encoding": [ + -0.08410695195198059, + 0.11325643211603165, + -0.03983520716428757, + -0.11427947133779526, + -0.08370330929756165, + -0.0702335387468338, + -0.062020644545555115, + -0.059353627264499664, + 0.13204076886177063, + -0.05640210211277008, + 0.15332075953483582, + -0.06093427538871765, + -0.27249476313591003, + 0.03719419986009598, + -0.0626717358827591, + -0.015225923620164394, + -0.20253658294677734, + -0.08657508343458176, + -0.06308583915233612, + -0.13850709795951843, + 0.1317480206489563, + 0.037150658667087555, + 0.03711939975619316, + 0.11133156716823578, + -0.21660974621772766, + -0.26680439710617065, + -0.1127156913280487, + -0.1558951586484909, + 0.1193254217505455, + -0.167646124958992, + 0.04593808576464653, + -0.00620338786393404, + -0.15249565243721008, + -0.03217258304357529, + 0.012440793216228485, + 0.0707630142569542, + -0.05181865021586418, + -0.13049393892288208, + 0.19639325141906738, + -0.0057748290710151196, + -0.0906674712896347, + -0.01658647693693638, + 0.023676292970776558, + 0.3055245280265808, + 0.1438124030828476, + 0.048727307468652725, + 0.08322523534297943, + -0.0870126485824585, + 0.18976716697216034, + -0.22881464660167694, + 0.13451126217842102, + 0.19808313250541687, + 0.05181252211332321, + 0.10002702474594116, + 0.07564651221036911, + -0.2148531824350357, + 0.052309583872556686, + 0.15975703299045563, + -0.1643998920917511, + 0.1191231980919838, + 0.07707567512989044, + 0.04902901500463486, + 0.009194369427859783, + -0.019969630986452103, + 0.14409005641937256, + 0.034472424536943436, + -0.13554833829402924, + -0.11517345160245895, + 0.112948939204216, + -0.20398031175136566, + -0.004663560073822737, + 0.12640193104743958, + -0.14084738492965698, + -0.18898652493953705, + -0.15175078809261322, + 0.08084022253751755, + 0.4565632939338684, + 0.160891592502594, + -0.04156075417995453, + 0.044455088675022125, + -0.11585400253534317, + -0.08210096508264542, + 0.028466084972023964, + 0.023910406976938248, + -0.16066350042819977, + 0.007215479854494333, + -0.11247140914201736, + 0.15060676634311676, + 0.22915025055408478, + -0.021822070702910423, + -0.048678502440452576, + 0.20494358241558075, + 0.030783729627728462, + 0.031028298661112785, + 0.055818237364292145, + 0.049244172871112823, + -0.22695854306221008, + 0.002653594594448805, + -0.03674653172492981, + 0.022141441702842712, + 0.07570143789052963, + -0.146443173289299, + -0.07122553884983063, + 0.09046217799186707, + -0.16428858041763306, + 0.19892843067646027, + 0.010369888506829739, + -0.06052245572209358, + -0.07977623492479324, + -0.003048190614208579, + -0.16854149103164673, + -0.029008205980062485, + 0.19094014167785645, + -0.2500537931919098, + 0.15647006034851074, + 0.1857786774635315, + 0.15187563002109528, + 0.17303909361362457, + 0.0681496113538742, + 0.01927381381392479, + 0.06921941787004471, + -0.01021301094442606, + -0.13879448175430298, + -0.0672483891248703, + 0.04288064315915108, + 0.015378735959529877, + 0.009883010759949684, + -0.039216093719005585 + ] + }, + { + "name": "Roberto", + "encoding": [ + -0.06418728083372116, + 0.13707831501960754, + -0.04551176354289055, + -0.0980481207370758, + -0.054926056414842606, + -0.059812214225530624, + -0.07105713337659836, + -0.04316723719239235, + 0.19045959413051605, + -0.0752766951918602, + 0.16105718910694122, + -0.05894999951124191, + -0.2879004180431366, + 0.03196798264980316, + -0.07101767510175705, + -0.0015408670296892524, + -0.21374405920505524, + -0.08619319647550583, + -0.055789198726415634, + -0.13391517102718353, + 0.11230601370334625, + 0.038509562611579895, + 0.03294273465871811, + 0.11653140932321548, + -0.21770824491977692, + -0.2857710123062134, + -0.10834002494812012, + -0.1164182648062706, + 0.09694969654083252, + -0.1675003170967102, + 0.05522323027253151, + 0.038952458649873734, + -0.16659526526927948, + -0.023950977250933647, + 0.005214583594352007, + 0.06526444107294083, + -0.08630575984716415, + -0.12892621755599976, + 0.19746434688568115, + 0.03041205182671547, + -0.0693695992231369, + -0.024487726390361786, + 0.00032561918487772346, + 0.32096999883651733, + 0.1529119908809662, + 0.04222575202584267, + 0.07100336253643036, + -0.10502523928880692, + 0.1692151576280594, + -0.21793273091316223, + 0.09193000942468643, + 0.2593911290168762, + 0.05665849894285202, + 0.11144110560417175, + 0.06377936899662018, + -0.17995458841323853, + 0.04384538158774376, + 0.17807979881763458, + -0.1571304053068161, + 0.09588856250047684, + 0.08130203932523727, + 0.0395674929022789, + 0.001784039195626974, + -0.026219937950372696, + 0.1642051637172699, + 0.035212475806474686, + -0.15177276730537415, + -0.10724875330924988, + 0.12858779728412628, + -0.1907142549753189, + -0.009389469400048256, + 0.12284736335277557, + -0.13145260512828827, + -0.21783795952796936, + -0.1336415708065033, + 0.08940086513757706, + 0.41513925790786743, + 0.16116149723529816, + -0.023941228166222572, + 0.05664105340838432, + -0.12399101257324219, + -0.08773612976074219, + 0.005924959667026997, + 0.04392019286751747, + -0.17663317918777466, + -0.03191816434264183, + -0.08698920905590057, + 0.1428743153810501, + 0.22594121098518372, + 0.007424733601510525, + -0.04877569526433945, + 0.20365439355373383, + 0.02586834691464901, + 0.00889707263559103, + 0.03455859422683716, + 0.003954497165977955, + -0.21738183498382568, + 0.013760611414909363, + -0.04669709876179695, + 0.01658368855714798, + 0.04826623201370239, + -0.1407410055398941, + -0.08291108161211014, + 0.08258772641420364, + -0.14888374507427216, + 0.19798240065574646, + 0.03196021169424057, + -0.0626978874206543, + -0.042746447026729584, + 0.0021015817765146494, + -0.18724529445171356, + -0.04313553869724274, + 0.184660866856575, + -0.27778613567352295, + 0.16798904538154602, + 0.1531701385974884, + 0.17214247584342957, + 0.17572279274463654, + 0.07631128281354904, + 0.05677931755781174, + 0.06369055062532425, + -0.02140909433364868, + -0.1258021593093872, + -0.06806061416864395, + 0.05103553086519241, + 0.01798504963517189, + 0.012600124813616276, + -0.06968306750059128 + ] + }, + { + "name": "Julien", + "encoding": [ + -0.06332400441169739, + 0.014076118357479572, + -0.01976156234741211, + 0.026098908856511116, + -0.12719903886318207, + -0.03904600441455841, + -0.004660709295421839, + -0.1303572654724121, + 0.16009779274463654, + -0.032694488763809204, + 0.1361243724822998, + 0.0024931461084634066, + -0.25436440110206604, + -0.08616084605455399, + 0.009805064648389816, + 0.05082347244024277, + -0.08342055231332779, + -0.16045352816581726, + -0.1324111670255661, + -0.13106516003608704, + 0.04393664374947548, + 0.08772819489240646, + 0.04075387492775917, + 0.12399910390377045, + -0.21767644584178925, + -0.32187044620513916, + -0.05141706019639969, + -0.16635249555110931, + 0.07454294711351395, + -0.10440683364868164, + -0.027405476197600365, + 0.05370142310857773, + -0.15227611362934113, + -0.08113743364810944, + 0.07586654275655746, + 0.15033115446567535, + -0.06354992836713791, + -0.10694524645805359, + 0.23080065846443176, + 0.05271197855472565, + -0.14171916246414185, + -0.009178301319479942, + -0.018737131729722023, + 0.3168924152851105, + 0.2032906860113144, + -0.03484869748353958, + 0.15580593049526215, + -0.08350075781345367, + 0.2052678018808365, + -0.27104419469833374, + 0.12255723774433136, + 0.12439021468162537, + 0.16192187368869781, + 0.01245813351124525, + 0.155714213848114, + -0.18495792150497437, + -0.020893780514597893, + 0.2159201055765152, + -0.24532313644886017, + 0.19422660768032074, + 0.09627624601125717, + -0.0665108785033226, + -0.04992594197392464, + -0.05239066109061241, + 0.1721450388431549, + 0.052312497049570084, + -0.1294904351234436, + -0.11468732357025146, + 0.12256469577550888, + -0.2465968132019043, + -0.023833373561501503, + 0.16248838603496552, + -0.0972670316696167, + -0.228252574801445, + -0.2921942174434662, + 0.08046641200780869, + 0.5308839678764343, + 0.18589019775390625, + -0.17831628024578094, + -0.0002741169591899961, + -0.039580218493938446, + 0.0018696843180805445, + 0.10807181894779205, + 0.06637115031480789, + -0.07326183468103409, + -0.004110805224627256, + -0.1488327980041504, + 0.08227763324975967, + 0.22356785833835602, + 0.03919233754277229, + -0.0550643652677536, + 0.24067825078964233, + 0.030054455623030663, + 0.012577214278280735, + 0.06363944709300995, + 0.036795563995838165, + -0.13657715916633606, + -0.023116691038012505, + -0.010830583050847054, + 0.021242264658212662, + 0.03865877538919449, + -0.10779023915529251, + 0.07036346942186356, + 0.008987324312329292, + -0.10859537124633789, + 0.15587420761585236, + -0.07884285598993301, + -0.011380440555512905, + -0.03750503435730934, + -0.09431400895118713, + -0.1745631992816925, + 0.0064880200661718845, + 0.2084885686635971, + -0.34827592968940735, + 0.11581345647573471, + 0.12257897108793259, + 0.04390176758170128, + 0.1752876490354538, + -0.015214132145047188, + 0.035310130566358566, + 0.016108619049191475, + -0.027996500954031944, + -0.15189173817634583, + -0.04449087008833885, + 0.036319974809885025, + -0.05292399227619171, + 0.07328049093484879, + -0.0022955930326133966 + ] + }, + { + "name": "Julien", + "encoding": [ + -0.035742487758398056, + 0.04960407689213753, + -0.07482790946960449, + 0.019521508365869522, + -0.07461246848106384, + 0.01950095221400261, + 0.02284916304051876, + -0.08734345436096191, + 0.2000105082988739, + 0.009370867162942886, + 0.2042587399482727, + 0.022403502836823463, + -0.33314698934555054, + -0.10302915424108505, + 0.008959834463894367, + 0.05726451799273491, + -0.1089300587773323, + -0.07422316819429398, + -0.18974661827087402, + -0.03338164463639259, + 0.08487749099731445, + 0.10566794127225876, + 0.04737073928117752, + 0.09826294332742691, + -0.18325521051883698, + -0.40411436557769775, + -0.08801543712615967, + -0.12833714485168457, + 0.023817628622055054, + -0.12151172012090683, + 0.004364257212728262, + 0.0646282285451889, + -0.17028266191482544, + -0.05180284380912781, + 0.02679343707859516, + -0.0006881537847220898, + -0.07994300872087479, + -0.10026349127292633, + 0.21519869565963745, + 0.036050211638212204, + -0.16353008151054382, + -0.036681801080703735, + -0.01690792478621006, + 0.26873254776000977, + 0.1404082179069519, + -0.0404093973338604, + 0.13395284116268158, + -0.04398243874311447, + 0.10307009518146515, + -0.29035359621047974, + 0.07670038938522339, + 0.17206168174743652, + 0.1499502807855606, + 0.03636622428894043, + 0.14589405059814453, + -0.15347732603549957, + -0.051488712430000305, + 0.22191159427165985, + -0.22911283373832703, + 0.1626606583595276, + 0.03263549879193306, + -0.08842547982931137, + -0.08996610343456268, + -0.09384618699550629, + 0.1764318197965622, + 0.06794280558824539, + -0.17580892145633698, + -0.14475145936012268, + 0.0825929269194603, + -0.2303691953420639, + -0.022060725837945938, + 0.12033282220363617, + -0.09369905292987823, + -0.2872426211833954, + -0.3372719883918762, + 0.08305342495441437, + 0.43908992409706116, + 0.19760948419570923, + -0.23610346019268036, + 0.02085426077246666, + -0.10774599760770798, + -0.01978408731520176, + 0.033745475113391876, + 0.0660976693034172, + -0.07672809064388275, + 0.026505060493946075, + -0.1575934886932373, + 0.05855642259120941, + 0.1890927255153656, + 0.022120976820588112, + -0.0319102481007576, + 0.34027060866355896, + 0.006602619308978319, + -0.007688680663704872, + 0.028837239369750023, + 0.02877080626785755, + -0.11966237425804138, + -0.08301768451929092, + 0.03185169771313667, + 0.05413350835442543, + 0.07386590540409088, + -0.13102567195892334, + 0.01957341469824314, + 0.041224755346775055, + -0.1141483262181282, + 0.1993945837020874, + -0.06023348122835159, + 0.010659953579306602, + 0.04129467532038689, + -0.07767760753631592, + -0.15714694559574127, + -0.041987281292676926, + 0.18902792036533356, + -0.3616115152835846, + 0.13687708973884583, + 0.08881000429391861, + 0.03624110296368599, + 0.1757963001728058, + -0.032708507031202316, + 0.09570306539535522, + -0.05223291739821434, + -0.007568478584289551, + -0.1902342140674591, + -0.07102446258068085, + 0.07614251971244812, + -0.06379387527704239, + 0.02256590873003006, + -0.036080677062273026 + ] + }, + { + "name": "Julien", + "encoding": [ + -0.12070854753255844, + 0.04004785791039467, + -0.019482195377349854, + -0.002991199027746916, + -0.0980122908949852, + -0.06295020878314972, + -0.023755384609103203, + -0.11650346219539642, + 0.19886229932308197, + -0.02281372994184494, + 0.1656494289636612, + 0.03350410982966423, + -0.2430168092250824, + -0.07005833089351654, + 0.020141834393143654, + 0.06048791855573654, + -0.07677707821130753, + -0.1517200767993927, + -0.16719886660575867, + -0.09622641652822495, + 0.01455936674028635, + 0.062283363193273544, + 0.04492436721920967, + 0.08601046353578568, + -0.17488713562488556, + -0.353626012802124, + -0.0835360586643219, + -0.12932614982128143, + 0.09309272468090057, + -0.13303154706954956, + 0.01932624727487564, + 0.05823428928852081, + -0.18401788175106049, + -0.11555429548025131, + 0.06440375745296478, + 0.10467983782291412, + -0.031546492129564285, + -0.08689580112695694, + 0.2488286942243576, + 0.05738076567649841, + -0.15886293351650238, + -0.043309371918439865, + -0.005945228971540928, + 0.322492390871048, + 0.16797800362110138, + -0.0001814713323256001, + 0.13011305034160614, + -0.1038559302687645, + 0.16472142934799194, + -0.2711745798587799, + 0.15269418060779572, + 0.14031365513801575, + 0.11534576863050461, + 0.023846546187996864, + 0.17463429272174835, + -0.14905253052711487, + 0.015088222920894623, + 0.20894312858581543, + -0.2825639545917511, + 0.1822291761636734, + 0.1080593541264534, + -0.013701639138162136, + -0.08086460828781128, + -0.07354403287172318, + 0.20723773539066315, + 0.09474779665470123, + -0.12440785765647888, + -0.12253078073263168, + 0.1745493859052658, + -0.2056858241558075, + -0.014432805590331554, + 0.15077082812786102, + -0.09368561208248138, + -0.22391648590564728, + -0.33037421107292175, + 0.06727445870637894, + 0.4918292462825775, + 0.18778394162654877, + -0.17526602745056152, + -0.00082008121535182, + -0.0745144635438919, + -0.06044771894812584, + 0.049888767302036285, + 0.057579439133405685, + -0.10364176332950592, + 0.0010491986759006977, + -0.08846396952867508, + 0.06979146599769592, + 0.22263377904891968, + 0.11606553941965103, + -0.04773266613483429, + 0.2654273509979248, + 0.042549408972263336, + -0.0350465252995491, + 0.04715423658490181, + 0.07147887349128723, + -0.131403848528862, + -0.09949089586734772, + -0.05550871416926384, + -0.02771536260843277, + 0.055800046771764755, + -0.08123107999563217, + 0.045532576739788055, + 0.09802611917257309, + -0.14579147100448608, + 0.17260362207889557, + -0.058385953307151794, + -0.01534991804510355, + -0.012427067384123802, + -0.03941130265593529, + -0.11412134021520615, + -0.052157144993543625, + 0.18071313202381134, + -0.3128669261932373, + 0.12199896574020386, + 0.127046138048172, + 0.05417579039931297, + 0.12386837601661682, + -0.04021773114800453, + 0.05363447219133377, + 0.0045356135815382, + -0.009817546233534813, + -0.15769605338573456, + -0.05760998651385307, + 0.012942695058882236, + -0.05800053849816322, + 0.04003020375967026, + 0.03240840509533882 + ] + }, + { + "name": "Julien", + "encoding": [ + -0.05699034035205841, + 0.0132106589153409, + -0.07049567997455597, + 0.018374916166067123, + -0.08549895137548447, + -0.03805551305413246, + 0.01532843429595232, + -0.13039039075374603, + 0.16707764565944672, + -0.04922393709421158, + 0.1371593326330185, + 0.016425931826233864, + -0.2624322772026062, + -0.07638689130544662, + 0.01950218714773655, + 0.03457016497850418, + -0.07928240299224854, + -0.1644938886165619, + -0.1776401698589325, + -0.12531127035617828, + 0.06167776510119438, + 0.0745244100689888, + 0.02346091717481613, + 0.1386270821094513, + -0.18921759724617004, + -0.31420207023620605, + -0.08076632022857666, + -0.15510877966880798, + 0.07624344527721405, + -0.11781051009893417, + -0.019988877698779106, + 0.038150567561388016, + -0.16239316761493683, + -0.06494022905826569, + 0.05054081976413727, + 0.10589107871055603, + -0.09095975011587143, + -0.11766493320465088, + 0.22912806272506714, + 0.05013570189476013, + -0.1374734342098236, + -0.022499529644846916, + -0.010940668173134327, + 0.3339800536632538, + 0.19094592332839966, + -0.030610989779233932, + 0.14119821786880493, + -0.08611170947551727, + 0.18950007855892181, + -0.28515300154685974, + 0.11455991119146347, + 0.14521421492099762, + 0.17311418056488037, + 0.04430251941084862, + 0.17180947959423065, + -0.18551181256771088, + 0.00504723284393549, + 0.2097766101360321, + -0.235154390335083, + 0.17638221383094788, + 0.05200812220573425, + -0.06677424162626266, + -0.0471104234457016, + -0.06912346184253693, + 0.19605425000190735, + 0.05633985996246338, + -0.13732534646987915, + -0.10408664494752884, + 0.11511237919330597, + -0.2504517138004303, + -0.030920259654521942, + 0.15164107084274292, + -0.0995502844452858, + -0.2530549466609955, + -0.3095024526119232, + 0.07247436046600342, + 0.5259639620780945, + 0.20932292938232422, + -0.16563691198825836, + 0.04388020560145378, + -0.0702342763543129, + -0.02166472002863884, + 0.1001332625746727, + 0.06737453490495682, + -0.10296224057674408, + 0.009526007808744907, + -0.15562836825847626, + 0.10126522928476334, + 0.22799353301525116, + 0.02849438600242138, + -0.052653536200523376, + 0.23265685141086578, + 0.02453070878982544, + -0.005241759121417999, + 0.05146654322743416, + 0.03128145635128021, + -0.14049683511257172, + -0.04305264353752136, + -0.0066935718059539795, + 0.01924121007323265, + 0.035060200840234756, + -0.10356594622135162, + 0.04559125378727913, + 0.01580933667719364, + -0.12202461063861847, + 0.17179624736309052, + -0.04681487753987312, + -0.022619521245360374, + -0.0411231704056263, + -0.09790510684251785, + -0.17199039459228516, + 0.003642298746854067, + 0.17412035167217255, + -0.36871322989463806, + 0.11221488565206528, + 0.12112215906381607, + 0.05228279531002045, + 0.17980541288852692, + -0.03264765441417694, + 0.037928592413663864, + -0.011030454188585281, + -0.034836914390325546, + -0.18283061683177948, + -0.03639329969882965, + 0.06140586733818054, + -0.01930537261068821, + 0.055640339851379395, + -0.007886627689003944 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.18258599936962128, + 0.05882543325424194, + -0.049003176391124725, + -0.08064301311969757, + -0.08003028482198715, + -0.07352803647518158, + -0.012129171751439571, + -0.09412918984889984, + 0.15288406610488892, + -0.09304306656122208, + 0.13661973178386688, + -0.04296717047691345, + -0.17166651785373688, + -0.0038620000705122948, + -0.027262449264526367, + 0.0339583083987236, + -0.2637658715248108, + -0.11688961088657379, + -0.05501863732933998, + -0.09639798104763031, + 0.021623624488711357, + 0.040482234209775925, + 0.0041444930247962475, + 0.09940244257450104, + -0.14237359166145325, + -0.2929782271385193, + -0.11186286807060242, + -0.15325477719306946, + 0.09454738348722458, + -0.059427931904792786, + -0.01184876449406147, + -4.0228664147434756e-05, + -0.16782930493354797, + -0.06720121949911118, + 0.06321802735328674, + 0.05911887064576149, + -0.07008019089698792, + -0.056047070771455765, + 0.24827449023723602, + 0.004313203506171703, + -0.1829957664012909, + -0.09597045928239822, + 0.04174897447228432, + 0.31698355078697205, + 0.2654011845588684, + 0.02105974592268467, + -0.05043201148509979, + -0.05400281772017479, + 0.20661519467830658, + -0.24471282958984375, + 0.07833629846572876, + 0.19266070425510406, + 0.12074123322963715, + 0.09763691574335098, + 0.02503165602684021, + -0.11258858442306519, + 0.04157209396362305, + 0.16800689697265625, + -0.20948459208011627, + 0.04499512165784836, + 0.060550104826688766, + -0.16982218623161316, + 0.024227451533079147, + 0.017869455739855766, + 0.1997949182987213, + 0.0500929020345211, + -0.1513729691505432, + -0.14940452575683594, + 0.15316863358020782, + -0.20991292595863342, + -0.06182350963354111, + 0.06521450728178024, + -0.07756049185991287, + -0.2535659968852997, + -0.27568864822387695, + 0.08785281330347061, + 0.38763538002967834, + 0.20629462599754333, + -0.09459960460662842, + 0.07430406659841537, + -0.07902993261814117, + -0.09975608438253403, + 0.09321668744087219, + 0.17925038933753967, + -0.10072559118270874, + -0.004394731484353542, + -0.07460218667984009, + 0.034550346434116364, + 0.18801935017108917, + -0.021614883095026016, + -0.08153031766414642, + 0.18006238341331482, + -0.043608278036117554, + 0.03678511455655098, + 0.06618352979421616, + 0.08634203672409058, + -0.1679329127073288, + 0.007225317880511284, + -0.10703685879707336, + 0.006413557566702366, + 0.08030088245868683, + -0.04210604727268219, + -0.0014405391411855817, + 0.13983719050884247, + -0.14693662524223328, + 0.21213960647583008, + -0.030274774879217148, + -0.06378863006830215, + -0.09102369099855423, + -0.15123625099658966, + -0.0613102950155735, + -0.006554769817739725, + 0.1251143217086792, + -0.2617846727371216, + 0.19780929386615753, + 0.15264837443828583, + 0.07137756049633026, + 0.2585238218307495, + 0.07482477277517319, + -0.04959384724497795, + 0.06041904166340828, + -0.02557181380689144, + -0.17707620561122894, + -0.07098426669836044, + 0.0978955551981926, + 0.02166537567973137, + 0.10377851128578186, + -0.022563008591532707 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.21435439586639404, + 0.0565941147506237, + -0.020555099472403526, + -0.06363866478204727, + -0.08293340355157852, + -0.03456468507647514, + -0.021441392600536346, + -0.11877879500389099, + 0.1357700228691101, + -0.10251408070325851, + 0.16659784317016602, + 0.014626339077949524, + -0.14810578525066376, + -0.04477349668741226, + -0.003093461971729994, + 0.0634455531835556, + -0.2659166157245636, + -0.14662976562976837, + -0.06401851773262024, + -0.07161097973585129, + -0.019195839762687683, + 0.08535473048686981, + 0.009589514695107937, + 0.09510426223278046, + -0.15130862593650818, + -0.34950581192970276, + -0.07290612906217575, + -0.13897830247879028, + 0.10645788908004761, + -0.03713161498308182, + 0.0035374974831938744, + -0.01848694309592247, + -0.1875523179769516, + -0.03291673958301544, + 0.06312861293554306, + 0.06320559978485107, + -0.08564479649066925, + -0.053490445017814636, + 0.2370963990688324, + 0.031129419803619385, + -0.2126576155424118, + -0.08345387876033783, + 0.04011857509613037, + 0.3375823497772217, + 0.2551913261413574, + 0.0044483463279902935, + -0.011171368882060051, + -0.07334166020154953, + 0.2038242071866989, + -0.27816125750541687, + 0.08345162868499756, + 0.1587999314069748, + 0.0885462611913681, + 0.05569019168615341, + 0.052568983286619186, + -0.1472415179014206, + 0.002713126130402088, + 0.16862498223781586, + -0.19284598529338837, + 0.088655486702919, + 0.030065175145864487, + -0.13306011259555817, + 0.05330825597047806, + -0.001666557160206139, + 0.1859245002269745, + 0.04387924447655678, + -0.12574808299541473, + -0.13870058953762054, + 0.14332571625709534, + -0.19263246655464172, + -0.03707800805568695, + 0.09637517482042313, + -0.07397685199975967, + -0.2803722620010376, + -0.30256059765815735, + 0.06635922938585281, + 0.40935462713241577, + 0.20731094479560852, + -0.07932950556278229, + 0.04543565586209297, + -0.05590328201651573, + -0.08953994512557983, + 0.10990358144044876, + 0.1648392379283905, + -0.08860117942094803, + -0.024291373789310455, + -0.07859378308057785, + 0.058722708374261856, + 0.23599474132061005, + 0.016920769587159157, + -0.07329264283180237, + 0.1997816115617752, + -0.044920697808265686, + 0.008349848911166191, + 0.05013469606637955, + 0.08067907392978668, + -0.16011683642864227, + 0.011039423756301403, + -0.1099856048822403, + -0.01567504182457924, + 0.03926156461238861, + -0.023994004353880882, + 0.04818765074014664, + 0.1416722685098648, + -0.16202138364315033, + 0.20793084800243378, + -0.01887642778456211, + -0.051327966153621674, + -0.05228685587644577, + -0.11764425784349442, + -0.06645484268665314, + -0.0046322098933160305, + 0.12368812412023544, + -0.23333875834941864, + 0.221952885389328, + 0.16695743799209595, + 0.09694672375917435, + 0.2619117796421051, + 0.06555981934070587, + -0.07252524793148041, + 0.01639108546078205, + -0.024475891143083572, + -0.165165975689888, + -0.039512988179922104, + 0.07524333149194717, + -0.014444355852901936, + 0.1231212243437767, + -0.014077374711632729 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.17092302441596985, + 0.04383409395813942, + -0.04525783285498619, + -0.06360770016908646, + -0.057263392955064774, + -0.0771392211318016, + -0.005107464734464884, + -0.10105933994054794, + 0.13415886461734772, + -0.06406652182340622, + 0.17995722591876984, + -0.06731928139925003, + -0.18217597901821136, + -0.019910316914319992, + -0.05546606332063675, + 0.04313848912715912, + -0.25695234537124634, + -0.06686469167470932, + -0.0314481146633625, + -0.07950519025325775, + 0.027178993448615074, + 0.04610196873545647, + -0.021125564351677895, + 0.11053524911403656, + -0.16705819964408875, + -0.2812528610229492, + -0.09659817814826965, + -0.14076487720012665, + 0.0821104571223259, + -0.05812941491603851, + 0.0002373538154643029, + 0.046552758663892746, + -0.15542419254779816, + -0.06803765892982483, + 0.057824742048978806, + 0.07116230577230453, + -0.05299975350499153, + -0.0019069453701376915, + 0.21951015293598175, + 0.021030429750680923, + -0.1602315902709961, + -0.08141372352838516, + 0.05154583230614662, + 0.32684993743896484, + 0.23682649433612823, + 0.046771105378866196, + -0.07118061929941177, + -0.057216186076402664, + 0.15198390185832977, + -0.25890398025512695, + 0.06577470898628235, + 0.151130810379982, + 0.10606222599744797, + 0.10006523132324219, + 0.03447236865758896, + -0.12058492749929428, + 0.024610724300146103, + 0.13300208747386932, + -0.23287618160247803, + 0.0614779070019722, + 0.031975455582141876, + -0.16229665279388428, + 0.03307616338133812, + 0.015320722945034504, + 0.18180616199970245, + 0.062415484338998795, + -0.13437525928020477, + -0.11345931142568588, + 0.17156310379505157, + -0.2219969481229782, + -0.07170651108026505, + 0.07074882090091705, + -0.023998575285077095, + -0.24338851869106293, + -0.2969749867916107, + 0.06879115104675293, + 0.39688730239868164, + 0.22969524562358856, + -0.1295970380306244, + 0.05501397326588631, + -0.044491518288850784, + -0.12319119274616241, + 0.14712758362293243, + 0.14956443011760712, + -0.06424611061811447, + -0.01887821964919567, + -0.061325542628765106, + 0.0329316146671772, + 0.15782301127910614, + -0.0008737429743632674, + -0.07206612825393677, + 0.1973133087158203, + -0.035009611397981644, + 0.05921487137675285, + 0.0731181651353836, + 0.07690118253231049, + -0.15832196176052094, + 0.025290310382843018, + -0.11293608695268631, + -0.003086151322349906, + 0.07527676224708557, + -0.01823599450290203, + 0.04160785675048828, + 0.1389266401529312, + -0.12017033249139786, + 0.22779065370559692, + 0.007028077729046345, + -0.06972035020589828, + -0.05502265691757202, + -0.08729881793260574, + -0.05287419632077217, + -0.00017650745576247573, + 0.13351014256477356, + -0.2763673663139343, + 0.20938697457313538, + 0.13020116090774536, + 0.049831781536340714, + 0.23588529229164124, + 0.055434491485357285, + -0.042995817959308624, + 0.04961954429745674, + -0.03989169001579285, + -0.16484017670154572, + -0.06778635084629059, + 0.07329591363668442, + -0.03357749804854393, + 0.11433878540992737, + -0.020458118990063667 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.19490595161914825, + 0.07974125444889069, + -0.0445353165268898, + -0.04251111298799515, + -0.07697092741727829, + -0.017709782347083092, + -0.01910639926791191, + -0.06972641497850418, + 0.14759258925914764, + -0.04706619307398796, + 0.15008148550987244, + -0.047706086188554764, + -0.19194339215755463, + -0.009819701313972473, + -0.037304043769836426, + 0.07529211044311523, + -0.2664223313331604, + -0.07671639323234558, + -0.04572376236319542, + -0.08167537301778793, + 0.01817147620022297, + 0.060842931270599365, + -0.03355013579130173, + 0.10661473870277405, + -0.18834123015403748, + -0.31177371740341187, + -0.07923555374145508, + -0.15117600560188293, + 0.10736953467130661, + -0.03630341589450836, + -0.023766255006194115, + 0.003366071730852127, + -0.1653670072555542, + -0.06369756907224655, + 0.049229979515075684, + 0.057010941207408905, + -0.07651074230670929, + -0.029038038104772568, + 0.21495383977890015, + 0.02202274091541767, + -0.1708785444498062, + -0.06891824305057526, + 0.07741217315196991, + 0.3120546340942383, + 0.22623492777347565, + 0.06158947944641113, + -0.05364561080932617, + -0.03702571243047714, + 0.15168558061122894, + -0.2580539286136627, + 0.0724002867937088, + 0.16624344885349274, + 0.12911851704120636, + 0.11846007406711578, + 0.010231091640889645, + -0.1369432955980301, + 0.04293308034539223, + 0.1309846192598343, + -0.25355392694473267, + 0.0750124603509903, + 0.048695385456085205, + -0.1662190556526184, + 0.016761651262640953, + 0.04020358622074127, + 0.17829595506191254, + 0.06602418422698975, + -0.11587787419557571, + -0.13569575548171997, + 0.15588802099227905, + -0.21766513586044312, + -0.04998711869120598, + 0.05441713333129883, + -0.023650119081139565, + -0.2598201334476471, + -0.30344724655151367, + 0.08274541050195694, + 0.3664512634277344, + 0.25194665789604187, + -0.11991763859987259, + 0.058996837586164474, + -0.03740915283560753, + -0.11016742140054703, + 0.13004189729690552, + 0.14312110841274261, + -0.08109889179468155, + -0.054567307233810425, + -0.07918809354305267, + 0.03289756551384926, + 0.16960909962654114, + -0.0025360775180161, + -0.04020091891288757, + 0.20599079132080078, + 0.0012202884536236525, + 0.02296123467385769, + 0.04643242433667183, + 0.09282473474740982, + -0.1869034767150879, + 0.0161198228597641, + -0.08142130076885223, + -0.013147571124136448, + 0.10034869611263275, + -0.007506151217967272, + 0.052397292107343674, + 0.12163975089788437, + -0.15065531432628632, + 0.24520093202590942, + 0.004916463978588581, + -0.0657639428973198, + -0.03704369440674782, + -0.09573042392730713, + -0.07044339925050735, + -0.0025612853933125734, + 0.14912249147891998, + -0.23795053362846375, + 0.21284028887748718, + 0.14173881709575653, + 0.054575007408857346, + 0.24570414423942566, + 0.08934290707111359, + -0.035730112344026566, + 0.03960501775145531, + -0.032693471759557724, + -0.1836705356836319, + -0.08392948657274246, + 0.08546975255012512, + -0.061126332730054855, + 0.1164461076259613, + 0.0055600302293896675 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.22380095720291138, + 0.05035726726055145, + -0.03003976121544838, + -0.035596657544374466, + -0.06103777140378952, + -0.017946170642971992, + -0.024138979613780975, + -0.09349923580884933, + 0.15250396728515625, + -0.018991226330399513, + 0.126841738820076, + -0.0037012104876339436, + -0.21803385019302368, + -0.049629561603069305, + -0.004798672161996365, + 0.06605590134859085, + -0.2582731544971466, + -0.10266031324863434, + -0.05549689754843712, + -0.08188596367835999, + 0.028944751247763634, + 0.06009478494524956, + 0.0011985849123448133, + 0.11623545736074448, + -0.1882161796092987, + -0.3551107347011566, + -0.046558212488889694, + -0.1944083422422409, + 0.0874895229935646, + -0.02907421439886093, + -0.045728668570518494, + 0.006900253240019083, + -0.1800725907087326, + -0.06262257695198059, + 0.0553908534348011, + 0.04966225102543831, + -0.038711853325366974, + -0.032898686826229095, + 0.1847279816865921, + 0.020716151222586632, + -0.20544926822185516, + -0.07748617976903915, + 0.0646015852689743, + 0.26892414689064026, + 0.23671303689479828, + 0.04818793013691902, + -0.04024749994277954, + -0.026335658505558968, + 0.18337401747703552, + -0.28711244463920593, + 0.03030884452164173, + 0.17531150579452515, + 0.1363392174243927, + 0.058987319469451904, + 0.06495150178670883, + -0.1554291993379593, + 0.036910153925418854, + 0.13763196766376495, + -0.26296913623809814, + 0.13564012944698334, + 0.009914874099195004, + -0.17132338881492615, + 0.033764734864234924, + 0.0359877347946167, + 0.16673177480697632, + 0.07176677137613297, + -0.1308884173631668, + -0.10503065586090088, + 0.12821468710899353, + -0.19475209712982178, + -0.03874834626913071, + 0.06823219358921051, + -0.05850629135966301, + -0.30375736951828003, + -0.304126501083374, + 0.055011384189128876, + 0.3800917863845825, + 0.2504982054233551, + -0.15084920823574066, + 0.058030255138874054, + -0.05967320129275322, + -0.0814785584807396, + 0.11820004880428314, + 0.14883342385292053, + -0.09082332253456116, + -0.041428904980421066, + -0.09243680536746979, + 0.014869449660182, + 0.183578222990036, + 0.03328308090567589, + -0.032828472554683685, + 0.25000885128974915, + -0.04666205123066902, + 0.05754905939102173, + 0.02165873721241951, + 0.09280839562416077, + -0.19735784828662872, + -0.00894805509597063, + -0.07768772542476654, + -0.04516852647066116, + 0.08809109777212143, + -0.017041094601154327, + 0.07739341259002686, + 0.11262542754411697, + -0.15626880526542664, + 0.16545698046684265, + -0.02098171040415764, + -0.03379446268081665, + -0.031871385872364044, + -0.09165611118078232, + -0.05318464711308479, + 0.008467636071145535, + 0.12164518237113953, + -0.23157648742198944, + 0.25116607546806335, + 0.1812935471534729, + 0.05984384939074516, + 0.22209954261779785, + 0.064229317009449, + -0.09531232714653015, + 0.03788278251886368, + -0.033670779317617416, + -0.1617572009563446, + -0.07256340235471725, + 0.09989140927791595, + -0.08584131300449371, + 0.09735515713691711, + -0.021247370168566704 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.18452627956867218, + 0.063629649579525, + -0.04897606745362282, + -0.0762929916381836, + -0.09626401960849762, + -0.05870247632265091, + 0.0013319265563040972, + -0.11455771327018738, + 0.15005768835544586, + -0.1171087697148323, + 0.16067129373550415, + -0.06439174711704254, + -0.16758999228477478, + 0.0036186259239912033, + -0.038517508655786514, + 0.05574590712785721, + -0.23187971115112305, + -0.10604535788297653, + -0.03564116358757019, + -0.0961003303527832, + 0.021074432879686356, + 0.05710426717996597, + -0.01482208352535963, + 0.11029668897390366, + -0.1749839335680008, + -0.26433661580085754, + -0.09008970111608505, + -0.13459403812885284, + 0.07475372403860092, + -0.034963324666023254, + 0.008837857283651829, + 0.05095306783914566, + -0.15627120435237885, + -0.0408531092107296, + 0.06089269369840622, + 0.04210204631090164, + -0.0517495796084404, + 0.02894836664199829, + 0.2579694092273712, + 0.0013635047944262624, + -0.1876058131456375, + -0.043343327939510345, + 0.032257650047540665, + 0.3307701349258423, + 0.2528608441352844, + 0.018386155366897583, + -0.05649462714791298, + -0.068421870470047, + 0.1989113986492157, + -0.2506515383720398, + 0.10026277601718903, + 0.15232695639133453, + 0.14048084616661072, + 0.06717157363891602, + 0.0009018947021104395, + -0.12082624435424805, + 0.01418319996446371, + 0.147751122713089, + -0.20398099720478058, + 0.08547011017799377, + 0.08209379762411118, + -0.18441985547542572, + 0.018592264503240585, + 0.03513871505856514, + 0.1602531373500824, + 0.029859811067581177, + -0.1354263722896576, + -0.14050160348415375, + 0.13989503681659698, + -0.22166875004768372, + -0.043911855667829514, + 0.08127568662166595, + -0.06361492723226547, + -0.2577456533908844, + -0.28924235701560974, + 0.09691493958234787, + 0.3798481225967407, + 0.21031291782855988, + -0.12368907779455185, + 0.06666512042284012, + -0.015253322198987007, + -0.07014214992523193, + 0.1418779492378235, + 0.15859389305114746, + -0.08910626918077469, + -0.05844799429178238, + -0.062286846339702606, + 0.046384453773498535, + 0.19160713255405426, + -0.03247690945863724, + -0.08698605000972748, + 0.22639386355876923, + -0.018325166776776314, + 0.053129252046346664, + 0.052218712866306305, + 0.07683485001325607, + -0.13254904747009277, + 0.009437775239348412, + -0.08995746076107025, + 0.03870351240038872, + 0.0555085614323616, + -0.022481504827737808, + 0.020860010758042336, + 0.12696561217308044, + -0.1549156904220581, + 0.2516067326068878, + -0.047580964863300323, + -0.03337980806827545, + -0.0852389708161354, + -0.10099376738071442, + -0.06541244685649872, + -0.0032295563723891973, + 0.13348518311977386, + -0.23307418823242188, + 0.18591687083244324, + 0.13130249083042145, + 0.0605347715318203, + 0.2475975602865219, + 0.0832434743642807, + -0.05907326191663742, + 0.07936691492795944, + -0.002742044162005186, + -0.17283964157104492, + -0.05466119945049286, + 0.12564100325107574, + -0.03731603920459747, + 0.12614203989505768, + -0.0045868102461099625 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.17721866071224213, + 0.0700308158993721, + -0.022121651098132133, + -0.07577400654554367, + -0.06899064034223557, + -0.027497872710227966, + -0.05321032553911209, + -0.12948349118232727, + 0.16355563700199127, + -0.1329880803823471, + 0.16520251333713531, + -0.06872300803661346, + -0.19374515116214752, + -0.008520142175257206, + -0.03358512371778488, + 0.04580974951386452, + -0.20410114526748657, + -0.1337539404630661, + -0.027985742315649986, + -0.07259401679039001, + 0.024509582668542862, + 0.07059424370527267, + 0.007376516237854958, + 0.0933116003870964, + -0.2046167552471161, + -0.3114376664161682, + -0.10549882799386978, + -0.11237084865570068, + 0.044879138469696045, + -0.017215922474861145, + -0.021946800872683525, + 0.02267543412744999, + -0.15239210426807404, + -0.04403853788971901, + 0.0476405955851078, + 0.0646819993853569, + -0.02521873451769352, + 0.006973655894398689, + 0.2633408010005951, + 0.02432817406952381, + -0.21616233885288239, + -0.055685121566057205, + 0.012822790071368217, + 0.32240787148475647, + 0.23154950141906738, + 0.012978038750588894, + -0.051333341747522354, + -0.08300396054983139, + 0.1907612830400467, + -0.23896020650863647, + 0.13464383780956268, + 0.1853751391172409, + 0.1218094527721405, + 0.0636945590376854, + 0.01133432611823082, + -0.11367961019277573, + -0.001810499932616949, + 0.18507099151611328, + -0.18685388565063477, + 0.06612130254507065, + 0.07518893480300903, + -0.16019432246685028, + 0.04277462884783745, + -0.008237862959504128, + 0.14091728627681732, + 0.044569049030542374, + -0.12660425901412964, + -0.14972196519374847, + 0.12266681343317032, + -0.18956008553504944, + -0.05071767792105675, + 0.07667633146047592, + -0.08511336892843246, + -0.26009127497673035, + -0.32684433460235596, + 0.08881688863039017, + 0.36813169717788696, + 0.2078837901353836, + -0.1378781795501709, + 0.06099800392985344, + -0.0284823440015316, + -0.07818801701068878, + 0.13069739937782288, + 0.1489877551794052, + -0.07144341617822647, + -0.02377457730472088, + -0.06207701563835144, + 0.028547916561365128, + 0.19898273050785065, + -0.007458111271262169, + -0.08864324539899826, + 0.22776933014392853, + -0.027979929000139236, + 0.06674665957689285, + 0.07819357514381409, + 0.1056707426905632, + -0.15411250293254852, + 0.003928482066839933, + -0.10813295841217041, + 0.036904700100421906, + 0.044654179364442825, + -0.011013283394277096, + 0.02304736338555813, + 0.13077321648597717, + -0.17075923085212708, + 0.2531646192073822, + -0.026623370125889778, + -0.04026377573609352, + -0.05358562991023064, + -0.08998262882232666, + -0.06221766024827957, + -0.03338422626256943, + 0.1555696278810501, + -0.23598557710647583, + 0.13806112110614777, + 0.12667573988437653, + 0.0825376808643341, + 0.26951396465301514, + 0.10382635146379471, + -0.03188387304544449, + 0.041750792413949966, + 0.007325839716941118, + -0.18686622381210327, + -0.055932216346263885, + 0.10960846394300461, + -0.01406048983335495, + 0.12820276618003845, + 0.02255968563258648 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.19589512050151825, + 0.07352219521999359, + -0.033620551228523254, + -0.10997748374938965, + -0.09264454990625381, + -0.0792265385389328, + 0.001398615539073944, + -0.09820421785116196, + 0.10791267454624176, + -0.08587942272424698, + 0.16122043132781982, + -0.06907856464385986, + -0.17630834877490997, + -0.0006064253393560648, + -0.039051685482263565, + 0.05458395183086395, + -0.25329846143722534, + -0.10047106444835663, + -0.03654774650931358, + -0.09873662143945694, + 0.014286703430116177, + 0.03167985379695892, + -0.01834692619740963, + 0.0998149886727333, + -0.15607470273971558, + -0.2449495494365692, + -0.08685848861932755, + -0.14694330096244812, + 0.08807361125946045, + -0.028294801712036133, + 0.028157800436019897, + 0.04032938554883003, + -0.14693734049797058, + -0.04989822581410408, + 0.05844065919518471, + 0.03473899886012077, + -0.07076960802078247, + 0.006334603764116764, + 0.25409135222435, + -0.006327644921839237, + -0.1711927354335785, + -0.04663260281085968, + 0.032516200095415115, + 0.3399119973182678, + 0.2554389238357544, + 0.01726018451154232, + -0.024391595274209976, + -0.077003113925457, + 0.18516938388347626, + -0.2578076720237732, + 0.08354649692773819, + 0.15777179598808289, + 0.10992785543203354, + 0.07794104516506195, + 0.0022568004205822945, + -0.12536752223968506, + 0.046826090663671494, + 0.15363389253616333, + -0.22818732261657715, + 0.08614557236433029, + 0.0751609057188034, + -0.17368942499160767, + 0.022298645228147507, + 0.025294184684753418, + 0.1716834455728531, + 0.0364687480032444, + -0.13411477208137512, + -0.14252182841300964, + 0.16583649814128876, + -0.19925172626972198, + -0.04189411550760269, + 0.09858749806880951, + -0.07514017075300217, + -0.25214216113090515, + -0.26411402225494385, + 0.10316628217697144, + 0.39566338062286377, + 0.22313781082630157, + -0.09539740532636642, + 0.06905631721019745, + -0.0342530719935894, + -0.08745294064283371, + 0.1442101001739502, + 0.15794774889945984, + -0.09711116552352905, + -0.058265991508960724, + -0.052315328270196915, + 0.05755754932761192, + 0.17907404899597168, + -0.043144483119249344, + -0.09151177108287811, + 0.19165563583374023, + -0.003033378394320607, + 0.03372004255652428, + 0.05743195861577988, + 0.07070720940828323, + -0.13195721805095673, + 0.022705640643835068, + -0.10117157548666, + 0.022995339706540108, + 0.05874903127551079, + -0.04532784968614578, + 0.02713458426296711, + 0.1285756230354309, + -0.13269095122814178, + 0.23649723827838898, + -0.03299974650144577, + -0.04953732341527939, + -0.1147066280245781, + -0.11294204741716385, + -0.0343756340444088, + 0.009285124018788338, + 0.13184118270874023, + -0.22846242785453796, + 0.20131216943264008, + 0.1589418649673462, + 0.07372306287288666, + 0.23205949366092682, + 0.08199402689933777, + -0.06763508915901184, + 0.0785825327038765, + -0.016965558752417564, + -0.15611016750335693, + -0.04538657143712044, + 0.11601860076189041, + -0.008893241174519062, + 0.1356007307767868, + -0.010695292614400387 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.16863879561424255, + 0.06627465784549713, + -0.028788741677999496, + -0.07270502299070358, + -0.09281502664089203, + -0.027271263301372528, + -0.004673111252486706, + -0.11149206757545471, + 0.14333286881446838, + -0.10197024047374725, + 0.15097013115882874, + -0.057781051844358444, + -0.16970041394233704, + 0.014501126483082771, + -0.040904395282268524, + 0.057179100811481476, + -0.22415782511234283, + -0.10381017625331879, + -0.034403372555971146, + -0.09024955332279205, + 0.01269511878490448, + 0.06077821925282478, + -0.006756771821528673, + 0.09347338229417801, + -0.17236199975013733, + -0.28581592440605164, + -0.08495143800973892, + -0.148304745554924, + 0.07328535616397858, + -0.014760556630790234, + 0.0077631366439163685, + 0.03396277502179146, + -0.15299026668071747, + -0.023997493088245392, + 0.04714471101760864, + 0.054249584674835205, + -0.061095137149095535, + 0.014196198433637619, + 0.2555117607116699, + 0.020589087158441544, + -0.19640199840068817, + -0.042136963456869125, + 0.02653491124510765, + 0.3378857374191284, + 0.2532309591770172, + 0.018742704764008522, + -0.06402790546417236, + -0.044658828526735306, + 0.16359950602054596, + -0.24101535975933075, + 0.0912913903594017, + 0.16570600867271423, + 0.10427888482809067, + 0.09630197286605835, + -0.01970810256898403, + -0.11624004691839218, + 0.043544165790081024, + 0.13722747564315796, + -0.22066771984100342, + 0.04832069203257561, + 0.07824408262968063, + -0.17744718492031097, + 0.04537980630993843, + 0.04736713320016861, + 0.18375812470912933, + 0.036529749631881714, + -0.12695203721523285, + -0.14107295870780945, + 0.10563818365335464, + -0.2207232117652893, + -0.041778091341257095, + 0.06340844184160233, + -0.09182311594486237, + -0.24146588146686554, + -0.28586283326148987, + 0.09805607795715332, + 0.38164961338043213, + 0.21705251932144165, + -0.11222761124372482, + 0.06006370857357979, + -0.041303955018520355, + -0.08141858875751495, + 0.16536134481430054, + 0.15359777212142944, + -0.048298053443431854, + -0.05950840935111046, + -0.05880486220121384, + 0.03797056898474693, + 0.18264621496200562, + -0.045675553381443024, + -0.08411561697721481, + 0.21895527839660645, + -0.02036946453154087, + 0.04345454275608063, + 0.03468687832355499, + 0.07205204665660858, + -0.13687650859355927, + 0.037962768226861954, + -0.09326820075511932, + 0.03159315884113312, + 0.029165012761950493, + 0.008000892587006092, + 0.03702564164996147, + 0.12140066176652908, + -0.17461426556110382, + 0.25276830792427063, + -0.016727106645703316, + -0.04026992246508598, + -0.0684601217508316, + -0.11107748001813889, + -0.06980175524950027, + -0.013743462041020393, + 0.15133017301559448, + -0.2372250109910965, + 0.19530238211154938, + 0.15476948022842407, + 0.0762893483042717, + 0.2425551861524582, + 0.09493310749530792, + -0.07084160298109055, + 0.06336694210767746, + -0.00226515787653625, + -0.190395787358284, + -0.03012786991894245, + 0.11285438388586044, + -0.030665544793009758, + 0.11819366365671158, + 0.005085509270429611 + ] + }, + { + "name": "Erwin", + "encoding": [ + -0.1548071801662445, + 0.04916200041770935, + -0.04102865606546402, + -0.09919983893632889, + -0.07326008379459381, + -0.08177114278078079, + -0.013772242702543736, + -0.11244944483041763, + 0.1480410248041153, + -0.09597042202949524, + 0.15496863424777985, + -0.08024746924638748, + -0.15606914460659027, + -0.0267067588865757, + -0.02637202851474285, + 0.0491272397339344, + -0.2385416328907013, + -0.11756975203752518, + -0.04934912547469139, + -0.09115657955408096, + 0.015194370411336422, + 0.049434177577495575, + 0.011629607528448105, + 0.11567437648773193, + -0.18852387368679047, + -0.28837594389915466, + -0.08815594762563705, + -0.1384858340024948, + 0.06261086463928223, + -0.027186863124370575, + 0.00797837320715189, + 0.04560321569442749, + -0.17394471168518066, + -0.06719963997602463, + 0.07016243040561676, + 0.0340646393597126, + -0.05169783905148506, + 0.013248433358967304, + 0.2739030420780182, + 0.002858665306121111, + -0.20243285596370697, + -0.04502202942967415, + 0.02969132922589779, + 0.3057974874973297, + 0.257739394903183, + 0.025495564565062523, + -0.051794786006212234, + -0.044367846101522446, + 0.20035284757614136, + -0.2607806324958801, + 0.09618166089057922, + 0.16581617295742035, + 0.11736202239990234, + 0.052533507347106934, + 0.0164842177182436, + -0.10673900693655014, + 0.0047494638711214066, + 0.15722131729125977, + -0.19899596273899078, + 0.06854751706123352, + 0.060293324291706085, + -0.18877576291561127, + 0.004327258560806513, + 0.00672787195071578, + 0.12609317898750305, + 0.026430422440171242, + -0.12788686156272888, + -0.14920181035995483, + 0.14301081001758575, + -0.19985447824001312, + -0.04888042435050011, + 0.08766026049852371, + -0.06488536298274994, + -0.2461855411529541, + -0.30669111013412476, + 0.07988930493593216, + 0.38765597343444824, + 0.20128101110458374, + -0.12915894389152527, + 0.05898873135447502, + -0.02220522053539753, + -0.06792344897985458, + 0.11080259084701538, + 0.13158640265464783, + -0.08188565820455551, + -0.03525770455598831, + -0.06265098601579666, + 0.0443805456161499, + 0.1694902628660202, + -0.023411566391587257, + -0.09898047149181366, + 0.20082896947860718, + -0.03826048597693443, + 0.07729160785675049, + 0.054513804614543915, + 0.08171926438808441, + -0.14281825721263885, + 0.022335320711135864, + -0.1053934097290039, + 0.04932538419961929, + 0.08344369381666183, + 0.0010955467587336898, + 0.022161511704325676, + 0.13589175045490265, + -0.1469677835702896, + 0.2517522871494293, + -0.04478178545832634, + -0.05321742594242096, + -0.08771862089633942, + -0.07732118666172028, + -0.05735133960843086, + -0.005756136029958725, + 0.126054584980011, + -0.22848650813102722, + 0.17482466995716095, + 0.14952057600021362, + 0.05976427346467972, + 0.24129943549633026, + 0.07805075496435165, + -0.07719114422798157, + 0.0644664391875267, + 0.009399162605404854, + -0.19043678045272827, + -0.08411446213722229, + 0.11004700511693954, + -0.012882765382528305, + 0.13231031596660614, + -0.00164964166469872 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.11935687065124512, + 0.08689609915018082, + 0.05897112563252449, + -0.00283694826066494, + -0.11129795014858246, + -0.0134520148858428, + -0.08244529366493225, + -0.11298615485429764, + 0.10876145213842392, + -0.08687952160835266, + 0.2824523150920868, + 0.039858128875494, + -0.18132498860359192, + -0.041795358061790466, + -0.012188715860247612, + 0.06021437048912048, + -0.1843648999929428, + -0.13355088233947754, + -0.03414193540811539, + -0.07918984442949295, + 0.014207360334694386, + 0.08672759681940079, + 0.05717683583498001, + 0.056950848549604416, + -0.19733281433582306, + -0.34305980801582336, + -0.09684675931930542, + -0.06535298377275467, + 0.018386809155344963, + -0.1333378404378891, + 0.08712320029735565, + 0.02795792557299137, + -0.1621028035879135, + 0.045442722737789154, + -0.020296776667237282, + 0.06628420203924179, + -0.14625364542007446, + -0.09680796414613724, + 0.28810134530067444, + 0.045275673270225525, + -0.12447363883256912, + 0.004478021524846554, + -0.051352474838495255, + 0.3170337975025177, + 0.16433310508728027, + -0.027876803651452065, + 0.044821593910455704, + -0.06638967990875244, + 0.12508279085159302, + -0.3059369921684265, + 0.09814894199371338, + 0.19636808335781097, + 0.11719944328069687, + 0.02414005994796753, + 0.04577071592211723, + -0.0986877828836441, + 0.004299877677112818, + 0.17908740043640137, + -0.13998016715049744, + 0.10250861942768097, + 0.04758528992533684, + -0.09856237471103668, + -0.001811003079637885, + -0.065828338265419, + 0.14396972954273224, + 0.09064038842916489, + -0.09050098061561584, + -0.11374229937791824, + 0.09600186347961426, + -0.14569739997386932, + -0.10723322629928589, + 0.15841078758239746, + -0.0964566022157669, + -0.2960827052593231, + -0.27209579944610596, + 0.09108398109674454, + 0.3904345631599426, + 0.14123347401618958, + -0.17586210370063782, + -0.04985954239964485, + 0.017165828496217728, + -0.030028892681002617, + 0.09277628362178802, + 0.0796223133802414, + -0.09938176721334457, + -0.13236001133918762, + -0.1631205677986145, + 0.07938437908887863, + 0.24307315051555634, + 0.006705839652568102, + -0.09832938760519028, + 0.24310588836669922, + 0.05343354493379593, + 0.07805702090263367, + 0.048771101981401443, + 0.03422699496150017, + -0.03428201004862785, + 0.04814683645963669, + -0.050858091562986374, + 0.09849944710731506, + 0.03587595745921135, + -0.027334801852703094, + -0.053781479597091675, + 0.09582100808620453, + -0.09692870825529099, + 0.22562144696712494, + -0.021776296198368073, + -0.05288124084472656, + 0.0037471165414899588, + -0.0643208920955658, + -0.16179822385311127, + -0.028844080865383148, + 0.17732466757297516, + -0.2858518660068512, + 0.14778704941272736, + 0.17119929194450378, + 0.05443628504872322, + 0.20043979585170746, + 0.05276889353990555, + 0.04446255415678024, + -0.041055694222450256, + -0.0251548420637846, + -0.22547300159931183, + -0.0303560271859169, + 0.05442428961396217, + -0.05100931227207184, + 0.009073997847735882, + -0.0057869767770171165 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.21838916838169098, + 0.19393955171108246, + 0.09506239742040634, + 0.0024915668182075024, + -0.11817217618227005, + 0.006395136006176472, + -0.09459301829338074, + -0.05463094636797905, + 0.11223100125789642, + -0.023867428302764893, + 0.25986984372138977, + 0.06498388946056366, + -0.18417766690254211, + -0.022659024223685265, + -0.0028103769291192293, + 0.12479040026664734, + -0.19548629224300385, + -0.11365236341953278, + -0.049354858696460724, + -0.07543031871318817, + 0.07573185861110687, + 0.10523399710655212, + 0.0770370289683342, + 0.05640121176838875, + -0.17370660603046417, + -0.3681564927101135, + -0.06615001708269119, + -0.03412169590592384, + 0.052999112755060196, + -0.12309463322162628, + 0.06859750300645828, + 0.002520865062251687, + -0.1476142406463623, + 0.005818954668939114, + 0.027618462219834328, + 0.07508301734924316, + -0.08877519518136978, + -0.05908339470624924, + 0.2870428264141083, + 0.01078409980982542, + -0.13730977475643158, + 0.04489115625619888, + 0.036543603986501694, + 0.34858542680740356, + 0.22295129299163818, + 0.02319270744919777, + 0.057375356554985046, + -0.08339089900255203, + 0.0623016394674778, + -0.2563008666038513, + 0.10789331793785095, + 0.22443677484989166, + 0.059108927845954895, + 0.044134654104709625, + 0.0304774921387434, + -0.10364287346601486, + 0.006302966736257076, + 0.1472395807504654, + -0.16384997963905334, + 0.06783634424209595, + 0.11194130033254623, + -0.09056639671325684, + -0.015228978358209133, + -0.03990217298269272, + 0.15900026261806488, + 0.10404009371995926, + -0.09734625369310379, + -0.17431002855300903, + 0.03393794223666191, + -0.13423316180706024, + -0.09079289436340332, + 0.12223117798566818, + -0.1469736099243164, + -0.2236335724592209, + -0.2875972390174866, + 0.05491916090250015, + 0.36189505457878113, + 0.12559297680854797, + -0.16071483492851257, + 0.0035730155650526285, + -0.006025890354067087, + -0.012722966261208057, + 0.09798938781023026, + 0.06236906349658966, + -0.12430337816476822, + -0.1363959163427353, + -0.1319575160741806, + 0.1111910343170166, + 0.22276027500629425, + 0.05074053257703781, + -0.097813680768013, + 0.21730749309062958, + 0.09292510896921158, + -0.006361763924360275, + 0.05595218017697334, + 0.08502862602472305, + -0.05231670290231705, + -0.0059140087105333805, + -0.10310282558202744, + 0.012859882786870003, + 0.018185431137681007, + -0.01618119515478611, + -0.006535852327942848, + 0.09960797429084778, + -0.1706167310476303, + 0.19661454856395721, + -0.01728646270930767, + -0.0038851886056363583, + -0.01581205055117607, + -0.03514097258448601, + -0.1802634447813034, + 0.002680822741240263, + 0.17606493830680847, + -0.2195298671722412, + 0.20014473795890808, + 0.18944282829761505, + 0.032074619084596634, + 0.15770764648914337, + 0.1239546686410904, + 0.062100887298583984, + -0.03541334718465805, + 0.018149359151721, + -0.13582196831703186, + -0.020286541432142258, + 0.05475209280848503, + -0.039736729115247726, + 0.1333530843257904, + 0.01874563843011856 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.11613720655441284, + 0.07328169047832489, + 0.0688638910651207, + 0.01228210050612688, + -0.15675878524780273, + -8.773803301664884e-07, + -0.056770890951156616, + -0.10696624219417572, + 0.1148039922118187, + -0.0792437270283699, + 0.26367267966270447, + 0.10717259347438812, + -0.20133331418037415, + -0.005282441154122353, + -0.02408449910581112, + 0.08303168416023254, + -0.18477661907672882, + -0.1427784115076065, + -0.020525548607110977, + -0.026723667979240417, + 0.04243412986397743, + 0.07012157887220383, + 0.06809286028146744, + 0.037149637937545776, + -0.14434289932250977, + -0.30404534935951233, + -0.09323646128177643, + -0.01559580210596323, + 0.062492065131664276, + -0.15658991038799286, + 0.11818744242191315, + -0.018671108409762383, + -0.17032870650291443, + 0.02560434117913246, + 0.00765983434394002, + 0.058580607175827026, + -0.1350286900997162, + -0.104958176612854, + 0.2884075939655304, + 0.07018712908029556, + -0.1842745989561081, + 0.021755686029791832, + -0.03438103199005127, + 0.325717568397522, + 0.1416407972574234, + 0.00796002522110939, + 0.03529471531510353, + -0.0639716386795044, + 0.09414248913526535, + -0.31158247590065, + 0.09709710627794266, + 0.16837884485721588, + 0.10898618400096893, + -0.002425277139991522, + -0.014940707013010979, + -0.16062946617603302, + 0.056999605149030685, + 0.18588760495185852, + -0.17817603051662445, + 0.1532081812620163, + 0.10223498940467834, + -0.14696486294269562, + 0.03485590219497681, + 0.048450767993927, + 0.14902015030384064, + 0.06742080301046371, + -0.0803191140294075, + -0.13676440715789795, + 0.08490333706140518, + -0.14197713136672974, + -0.07699530571699142, + 0.14396443963050842, + -0.08725078403949738, + -0.2736704647541046, + -0.2307814210653305, + 0.042231254279613495, + 0.4309964179992676, + 0.09461264312267303, + -0.1628907173871994, + -0.037085436284542084, + -0.00781781692057848, + 0.0045488327741622925, + 0.07891059666872025, + 0.10249924659729004, + -0.09601899236440659, + -0.11960951238870621, + -0.21372251212596893, + 0.04539119079709053, + 0.24919462203979492, + 0.020541507750749588, + -0.07523728162050247, + 0.2820756137371063, + 0.08261246234178543, + 0.022609030827879906, + 0.08319252729415894, + 0.05950496718287468, + -0.05306518077850342, + 0.024391118437051773, + -0.06073809787631035, + 0.0006632527802139521, + 0.021217694506049156, + -0.07891982048749924, + -0.017488596960902214, + 0.09798987954854965, + -0.15968948602676392, + 0.2353735864162445, + -0.03338395059108734, + -0.030043380334973335, + 0.023244934156537056, + -0.06533472239971161, + -0.14006978273391724, + -0.02832181379199028, + 0.17164361476898193, + -0.2560815215110779, + 0.2014078050851822, + 0.21390406787395477, + 0.08593859523534775, + 0.17810286581516266, + 0.08059240132570267, + 0.0431327186524868, + -0.017593882977962494, + -0.021141689270734787, + -0.17659826576709747, + -0.02805313840508461, + -0.0136526795104146, + -0.08585681021213531, + 0.06515979766845703, + 0.012120849452912807 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.11181814968585968, + 0.09202590584754944, + 0.07119172066450119, + 0.0028897258453071117, + -0.11597391963005066, + 0.012609073892235756, + -0.05462029203772545, + -0.08948782831430435, + 0.11036019772291183, + -0.0392703041434288, + 0.3189513385295868, + 0.08720479160547256, + -0.2233731746673584, + -0.014097337611019611, + 0.00203546229749918, + 0.07843594253063202, + -0.1855459213256836, + -0.12949830293655396, + -0.042883507907390594, + -0.043681029230356216, + 0.04009836167097092, + 0.06726538389921188, + 0.03439687192440033, + 0.03377976641058922, + -0.18034549057483673, + -0.29162895679473877, + -0.06831002980470657, + -0.025923095643520355, + 0.00821787491440773, + -0.14867888391017914, + 0.1216900497674942, + -0.013720261864364147, + -0.16037777066230774, + 0.036978233605623245, + -0.001987020717933774, + 0.07305480539798737, + -0.15209238231182098, + -0.13041076064109802, + 0.2785937488079071, + 0.0592038556933403, + -0.15237843990325928, + 0.0036000257823616266, + -0.021666156128048897, + 0.311113566160202, + 0.15816575288772583, + -0.028955020010471344, + 0.03403279185295105, + -0.05963293835520744, + 0.06323260813951492, + -0.3183141350746155, + 0.08622786402702332, + 0.18676988780498505, + 0.13925592601299286, + 0.03598112612962723, + -0.020452823489904404, + -0.12702549993991852, + 0.014344858005642891, + 0.17017292976379395, + -0.17903845012187958, + 0.1011107787489891, + 0.08369941264390945, + -0.12321479618549347, + 0.010552147403359413, + -0.021967222914099693, + 0.16429226100444794, + 0.10175565630197525, + -0.12892381846904755, + -0.10475902259349823, + 0.05607248842716217, + -0.12647691369056702, + -0.12362793833017349, + 0.12359968572854996, + -0.09957047551870346, + -0.29552632570266724, + -0.26213833689689636, + 0.08696264028549194, + 0.4134305715560913, + 0.09324926882982254, + -0.1882060021162033, + -0.056214384734630585, + -0.015952348709106445, + -0.018375132232904434, + 0.0471542663872242, + 0.09378102421760559, + -0.09358089417219162, + -0.11104431003332138, + -0.17703552544116974, + 0.06816689670085907, + 0.24567046761512756, + 0.0010141676757484674, + -0.08116894215345383, + 0.27311503887176514, + 0.06290621310472488, + 0.0197309497743845, + 0.06616618484258652, + 0.07102340459823608, + -0.013526592403650284, + 0.03233128413558006, + -0.04879610985517502, + 0.032033178955316544, + 0.026602238416671753, + -0.0732954815030098, + -0.004637161269783974, + 0.09092903137207031, + -0.1324429214000702, + 0.2108803540468216, + 0.0033535256516188383, + -0.036207351833581924, + 0.05472426116466522, + -0.05431389808654785, + -0.15641044080257416, + -0.0684845894575119, + 0.18444058299064636, + -0.27331799268722534, + 0.165872260928154, + 0.18684223294258118, + 0.07575014978647232, + 0.17525771260261536, + 0.08680930733680725, + 0.08027509599924088, + -0.027775494381785393, + -0.007707720156759024, + -0.1706061065196991, + -0.013736789114773273, + -0.0035883437376469374, + -0.026475585997104645, + 0.05730661377310753, + 0.01539829932153225 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.11751805990934372, + 0.1264737993478775, + 0.01907673478126526, + 0.0069321533665061, + -0.08434969931840897, + 0.005422407295554876, + -0.04464889317750931, + -0.10551949590444565, + 0.18475377559661865, + -0.06783214211463928, + 0.2567637264728546, + 0.08489635586738586, + -0.18036480247974396, + -0.05022828280925751, + 0.030750790610909462, + 0.08066641539335251, + -0.18543271720409393, + -0.13715429604053497, + -0.05662715807557106, + -0.009095943532884121, + 0.09221102297306061, + 0.09758632630109787, + 0.027564143761992455, + 0.11116734147071838, + -0.18156474828720093, + -0.3661174774169922, + -0.0696568563580513, + -0.05138690769672394, + 0.07855606824159622, + -0.12611807882785797, + 0.06501958519220352, + 0.018022000789642334, + -0.15182290971279144, + -0.0027743051759898663, + 0.018894720822572708, + 0.08123847097158432, + -0.06444090604782104, + -0.08792351186275482, + 0.2573220729827881, + 0.05281627178192139, + -0.1723213493824005, + 0.023630628362298012, + -0.0357465036213398, + 0.3097522556781769, + 0.169687420129776, + 8.251294639194384e-05, + 0.0965956375002861, + -0.08439990878105164, + 0.11160612106323242, + -0.2964737117290497, + 0.06780929118394852, + 0.16730791330337524, + 0.08888960629701614, + -0.002172015607357025, + 0.0565810427069664, + -0.1301373392343521, + -0.03429838642477989, + 0.12017003446817398, + -0.22376784682273865, + 0.13822190463542938, + 0.1052815392613411, + -0.08387034386396408, + -0.01041866559535265, + -0.04823342710733414, + 0.10995488613843918, + 0.08704329282045364, + -0.10002811253070831, + -0.18252113461494446, + 0.05315990373492241, + -0.2362043559551239, + -0.10339076071977615, + 0.1398717612028122, + -0.07272350043058395, + -0.26296642422676086, + -0.30098849534988403, + 0.04990076273679733, + 0.40542590618133545, + 0.18911977112293243, + -0.15760239958763123, + -0.0038626950699836016, + 0.00295219081453979, + -0.024773653596639633, + 0.08051131665706635, + 0.07055617868900299, + -0.0828152671456337, + -0.0621911846101284, + -0.1703421175479889, + 0.08683335036039352, + 0.24651047587394714, + 0.07901813089847565, + -0.05743594840168953, + 0.29214030504226685, + 0.04441618174314499, + 0.025215379893779755, + 0.034569963812828064, + 0.07425469160079956, + -0.08061395585536957, + 0.012809384614229202, + -0.04691530764102936, + 0.028024164959788322, + 0.030447443947196007, + 0.0007139709196053445, + 0.05136996507644653, + 0.11399080604314804, + -0.12642379105091095, + 0.21288682520389557, + -0.0942264050245285, + -0.008443519473075867, + 0.029344938695430756, + 0.0009739966480992734, + -0.20213763415813446, + -0.046173956245183945, + 0.1691928207874298, + -0.23212283849716187, + 0.11997327208518982, + 0.15607942640781403, + 0.058708690106868744, + 0.13235695660114288, + 0.06547337770462036, + 0.06952410191297531, + -0.0254597757011652, + 0.008258644491434097, + -0.19031333923339844, + -0.040518421679735184, + 0.011652691289782524, + -0.07066340744495392, + 0.08009682595729828, + -0.022175196558237076 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.12256681174039841, + 0.0948297455906868, + 0.08275006711483002, + 0.009542659856379032, + -0.17241960763931274, + -0.02239978313446045, + -0.07707022875547409, + -0.08757714927196503, + 0.06414616107940674, + -0.023549379780888557, + 0.24476619064807892, + 0.05249232053756714, + -0.21021325886249542, + -0.023043721914291382, + -0.005883990321308374, + 0.06489245593547821, + -0.1918928325176239, + -0.14119790494441986, + -0.016525033861398697, + -0.077730692923069, + 0.03326936066150665, + 0.11156351119279861, + 0.020359192043542862, + 0.07465057820081711, + -0.22354571521282196, + -0.3314587473869324, + -0.08556873351335526, + -0.030945882201194763, + 0.013841366395354271, + -0.13893723487854004, + 0.09966748207807541, + 0.039404693990945816, + -0.17703914642333984, + 0.04386720433831215, + 0.013530569151043892, + 0.060654982924461365, + -0.08864007890224457, + -0.09807084500789642, + 0.256889671087265, + 0.09059072285890579, + -0.1339087337255478, + 0.029346559196710587, + -0.027155069634318352, + 0.3305306136608124, + 0.17905372381210327, + -0.016960108652710915, + 0.06096847355365753, + -0.03340316563844681, + 0.0713488832116127, + -0.29078975319862366, + 0.10148648172616959, + 0.2098548412322998, + 0.08562319725751877, + 0.004145297221839428, + 0.015078814700245857, + -0.12515340745449066, + -0.04815501719713211, + 0.19457922875881195, + -0.16681306064128876, + 0.15017381310462952, + 0.06422407180070877, + -0.12232257425785065, + 0.008148927241563797, + -0.061861734837293625, + 0.1337735950946808, + 0.09506163746118546, + -0.08404558897018433, + -0.13624420762062073, + 0.11513858288526535, + -0.1656874418258667, + -0.1325404942035675, + 0.12762603163719177, + -0.08999945223331451, + -0.2558543384075165, + -0.25584861636161804, + 0.09342298656702042, + 0.37602853775024414, + 0.1354396641254425, + -0.22456291317939758, + -0.06359443813562393, + 0.003823784412816167, + -0.0078057050704956055, + 0.1044459342956543, + 0.0631396695971489, + -0.05276278033852577, + -0.138224795460701, + -0.16928283870220184, + 0.07909350097179413, + 0.27591511607170105, + 0.04200813174247742, + -0.08448276668787003, + 0.2808499038219452, + 0.07215549051761627, + 0.016295431181788445, + 0.07898030430078506, + 0.03264300152659416, + -0.03293661028146744, + 0.02346615679562092, + -0.061351411044597626, + 0.05397769436240196, + 0.016156842932105064, + -0.055850546807050705, + -0.02745763026177883, + 0.10906635224819183, + -0.09703388065099716, + 0.19603309035301208, + -0.011304420419037342, + -0.05882122740149498, + -0.03087865374982357, + -0.04919023439288139, + -0.18662530183792114, + -0.028477605432271957, + 0.2014751136302948, + -0.2726249098777771, + 0.20745444297790527, + 0.17539170384407043, + 0.04037581756711006, + 0.1765393167734146, + 0.04746294394135475, + 0.05414170026779175, + -0.02214094065129757, + -0.055233635008335114, + -0.13990363478660583, + -0.04974764212965965, + 0.03912961855530739, + -0.07579424232244492, + 0.0512537807226181, + 0.0058425841853022575 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.1646718680858612, + 0.09962770342826843, + 0.07589791715145111, + -0.047479867935180664, + -0.1327289491891861, + 0.06076791509985924, + -0.056817676872015, + -0.14262491464614868, + 0.03850901499390602, + -0.07131343334913254, + 0.2953170835971832, + 0.013698694296181202, + -0.3018793761730194, + -0.019824260845780373, + 0.009025572799146175, + 0.07484091818332672, + -0.1086687445640564, + -0.09812262654304504, + -0.05922584980726242, + -0.053776636719703674, + 0.07122688740491867, + 0.04258403554558754, + 0.057773761451244354, + 0.012628539465367794, + -0.11556272953748703, + -0.35160425305366516, + -0.11728101223707199, + 0.014531738124787807, + 0.0055058859288692474, + -0.09962189197540283, + 0.13494835793972015, + -0.013987699523568153, + -0.15184548497200012, + 0.044171422719955444, + -0.006558307912200689, + 0.056715935468673706, + -0.13919506967067719, + -0.08733508735895157, + 0.24458371102809906, + 0.0004299784777686, + -0.1596403419971466, + 0.016777528449892998, + 0.06951279193162918, + 0.26309964060783386, + 0.09725446254014969, + 0.003642207244411111, + 0.04324837774038315, + -0.10192160308361053, + 0.04716690257191658, + -0.2734632194042206, + 0.09466077387332916, + 0.20211383700370789, + 0.12694142758846283, + 0.045280370861291885, + 0.024479107931256294, + -0.08929730206727982, + 0.039328839629888535, + 0.1531003713607788, + -0.1941799521446228, + 0.09545602649450302, + 0.09165091067552567, + -0.07964774966239929, + -0.058950889855623245, + -0.06411217153072357, + 0.1366492062807083, + 0.14720186591148376, + -0.13303588330745697, + -0.14647416770458221, + 0.06084505468606949, + -0.12263420969247818, + -0.10656338185071945, + 0.10468269884586334, + -0.1415037363767624, + -0.26690295338630676, + -0.2579280138015747, + 0.089150570333004, + 0.38517338037490845, + 0.09920811653137207, + -0.14097018539905548, + -0.007764038164168596, + -0.0032195495441555977, + -0.01650083065032959, + 0.04706941172480583, + 0.08591975271701813, + -0.11996092647314072, + -0.08697616308927536, + -0.06943383812904358, + 0.11292939633131027, + 0.17409072816371918, + -0.033511195331811905, + -0.05364108085632324, + 0.29470714926719666, + 0.08839530497789383, + 0.04975251108407974, + 0.07012970745563507, + 0.11319883912801743, + -0.014557979069650173, + -0.005423898342996836, + -0.0872606635093689, + 0.04404319077730179, + 0.03871437534689903, + -0.1066112145781517, + 0.049961864948272705, + 0.04669836536049843, + -0.17878812551498413, + 0.2187425047159195, + 0.012345779687166214, + -0.018424630165100098, + 0.07628677040338516, + -0.030163118615746498, + -0.13806043565273285, + -0.04772588983178139, + 0.1485215127468109, + -0.30193158984184265, + 0.17188957333564758, + 0.2038392424583435, + 0.04643835872411728, + 0.1384122669696808, + 0.13214118778705597, + 0.09021638333797455, + 0.024593209847807884, + -0.008518921211361885, + -0.13739418983459473, + -0.032656677067279816, + 0.03911344334483147, + -0.0265897735953331, + -0.0076088435016572475, + 0.012879150919616222 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.13454274833202362, + 0.07800352573394775, + 0.032167792320251465, + 0.003772380528971553, + -0.15489330887794495, + 0.01498796883970499, + -0.0550386942923069, + -0.12374068796634674, + 0.1272708624601364, + -0.05948767066001892, + 0.24653397500514984, + 0.0992065817117691, + -0.23523081839084625, + -0.03263387084007263, + -0.019678300246596336, + 0.07165421545505524, + -0.16816671192646027, + -0.15768472850322723, + -0.02716623991727829, + -0.04322332143783569, + 0.03422898054122925, + 0.12595166265964508, + 0.08401767909526825, + 0.0677362009882927, + -0.1690581887960434, + -0.31816431879997253, + -0.07663381844758987, + -0.058273930102586746, + 0.04176019877195358, + -0.11071166396141052, + 0.11396994441747665, + 0.019151562824845314, + -0.16242758929729462, + 0.028227755799889565, + 0.01648416928946972, + 0.1123492494225502, + -0.13822399079799652, + -0.11507396399974823, + 0.31049644947052, + 0.09070635586977005, + -0.17711125314235687, + -0.005054555833339691, + -0.04593353345990181, + 0.34194597601890564, + 0.13466283679008484, + -0.049896687269210815, + 0.07396472990512848, + -0.06571514904499054, + 0.0953744575381279, + -0.29976728558540344, + 0.09972153604030609, + 0.19738540053367615, + 0.1389288455247879, + 0.010224848985671997, + -0.007357410620898008, + -0.14827533066272736, + 0.040987346321344376, + 0.1956869214773178, + -0.18134868144989014, + 0.13247670233249664, + 0.11285971105098724, + -0.14769247174263, + 0.030911244451999664, + 0.0055737742222845554, + 0.15373294055461884, + 0.07535751163959503, + -0.0799160823225975, + -0.12740732729434967, + 0.11268091201782227, + -0.15498296916484833, + -0.11695882678031921, + 0.14897498488426208, + -0.10505081713199615, + -0.27051934599876404, + -0.24171485006809235, + 0.05988921597599983, + 0.4161098003387451, + 0.1289011538028717, + -0.15925291180610657, + -0.03448372706770897, + -0.016776692122220993, + 0.006346273701637983, + 0.06394588947296143, + 0.11113268882036209, + -0.08391207456588745, + -0.10525622218847275, + -0.19795876741409302, + 0.057781048119068146, + 0.25428053736686707, + 0.01742529682815075, + -0.07434801757335663, + 0.28352510929107666, + 0.10796276479959488, + 0.036930907517671585, + 0.09884592890739441, + 0.0439603365957737, + -0.030230676755309105, + 0.02743644453585148, + -0.04674173891544342, + 0.05625011399388313, + -0.004715794697403908, + -0.08650021255016327, + 0.014145582914352417, + 0.07657794654369354, + -0.13419818878173828, + 0.2306397408246994, + -0.02388863079249859, + -0.04518083110451698, + 0.01988319680094719, + -0.07231339812278748, + -0.1369229555130005, + -0.036466069519519806, + 0.19327327609062195, + -0.25961723923683167, + 0.18984171748161316, + 0.17718468606472015, + 0.08242139965295792, + 0.2123318463563919, + 0.07114028930664062, + 0.08182573318481445, + -0.03470120206475258, + -0.03828759491443634, + -0.1889699101448059, + -0.04067869484424591, + 0.0109645314514637, + -0.06046685203909874, + 0.05081402137875557, + 0.03242095559835434 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.1700132191181183, + 0.09997473657131195, + 0.07538248598575592, + 0.006898563355207443, + -0.159061461687088, + 0.02315865457057953, + -0.033143963664770126, + -0.12363220751285553, + 0.03300653398036957, + -0.04004164785146713, + 0.22265291213989258, + 0.039691824465990067, + -0.25282996892929077, + -0.019883092492818832, + 0.011382103897631168, + 0.06669732183218002, + -0.17241354286670685, + -0.14223171770572662, + -0.051551975309848785, + -0.04544948786497116, + 0.033327773213386536, + 0.06760057061910629, + 0.08623607456684113, + 0.06016101315617561, + -0.1654951274394989, + -0.3366749584674835, + -0.08160598576068878, + -0.04131810739636421, + 0.03837372362613678, + -0.09000580757856369, + 0.09622374176979065, + -0.019699549302458763, + -0.14608703553676605, + 0.04668726027011871, + 0.005392326973378658, + 0.08710630238056183, + -0.14120163023471832, + -0.12039492279291153, + 0.28961417078971863, + 0.03197570890188217, + -0.17191416025161743, + 0.02469068206846714, + 0.002154512330889702, + 0.3277316093444824, + 0.14024369418621063, + -0.01165779959410429, + 0.05896006152033806, + -0.05840827897191048, + 0.08129803836345673, + -0.28901705145835876, + 0.10191410779953003, + 0.19042716920375824, + 0.10346076637506485, + -0.00836125947535038, + -0.01870948076248169, + -0.13498114049434662, + 0.047485221177339554, + 0.17696666717529297, + -0.18514347076416016, + 0.11964261531829834, + 0.11033276468515396, + -0.1460016816854477, + 0.0019371997332200408, + -0.0261344313621521, + 0.14868409931659698, + 0.10773445665836334, + -0.08198969066143036, + -0.14077521860599518, + 0.09477105736732483, + -0.15645548701286316, + -0.0922575294971466, + 0.11775431036949158, + -0.1282074749469757, + -0.2375592142343521, + -0.2573152184486389, + 0.05162002518773079, + 0.4146769940853119, + 0.11747892200946808, + -0.13660095632076263, + -0.05334925651550293, + -0.02844856120646, + 0.02195705845952034, + 0.07714660465717316, + 0.0955127477645874, + -0.1351662278175354, + -0.12409791350364685, + -0.18414776027202606, + 0.08467606455087662, + 0.23732927441596985, + 0.006670000031590462, + -0.08070939034223557, + 0.25388965010643005, + 0.1283472627401352, + 0.01687946915626526, + 0.0894097238779068, + 0.021543964743614197, + -0.0410769023001194, + 0.004276348277926445, + -0.07819269597530365, + 0.048401083797216415, + 0.0036371711175888777, + -0.10503268986940384, + 0.021639473736286163, + 0.09742819517850876, + -0.17465394735336304, + 0.20478755235671997, + -0.00691650714725256, + -0.04575455188751221, + 0.03680824488401413, + -0.06637230515480042, + -0.16571113467216492, + -0.03281639516353607, + 0.1823136806488037, + -0.2552531659603119, + 0.15295037627220154, + 0.22175417840480804, + 0.11008330434560776, + 0.16002075374126434, + 0.10306598246097565, + 0.04864327982068062, + -0.02894608862698078, + 0.004847015254199505, + -0.1959473043680191, + -0.007643802557140589, + 0.04866741597652435, + -0.06202493980526924, + 0.05722175911068916, + 0.0366603285074234 + ] + }, + { + "name": "Bert", + "encoding": [ + -0.10125546157360077, + 0.07369036227464676, + 0.04965447634458542, + 0.03727353364229202, + -0.14932815730571747, + 0.011789517477154732, + -0.06162808835506439, + -0.10496660321950912, + 0.10241417586803436, + -0.02848091721534729, + 0.2631118595600128, + 0.08433260023593903, + -0.21906103193759918, + -0.015581877902150154, + -0.007795370649546385, + 0.07803604751825333, + -0.18615490198135376, + -0.13852886855602264, + -0.03922107070684433, + -0.05124007910490036, + 0.00817091017961502, + 0.09240253269672394, + 0.04299547150731087, + 0.0530172660946846, + -0.18608342111110687, + -0.32507166266441345, + -0.05217013880610466, + -0.05062299594283104, + 0.036670438945293427, + -0.13166658580303192, + 0.10576480627059937, + 0.005644259508699179, + -0.17172633111476898, + 0.025860564783215523, + 0.020949535071849823, + 0.07298209518194199, + -0.136768639087677, + -0.11300718039274216, + 0.3031473159790039, + 0.06962524354457855, + -0.16878928244113922, + -0.0035703741014003754, + -0.030650638043880463, + 0.3306305706501007, + 0.14527885615825653, + -0.03610657900571823, + 0.0596831738948822, + -0.0397169329226017, + 0.09120268374681473, + -0.31897494196891785, + 0.0960109606385231, + 0.18318778276443481, + 0.11595608294010162, + 0.01398217398673296, + -0.028182117268443108, + -0.1534397304058075, + 0.0012773509370163083, + 0.17787200212478638, + -0.17418323457241058, + 0.13828179240226746, + 0.11517825722694397, + -0.1420297920703888, + 0.020993130281567574, + -0.010936890728771687, + 0.15274037420749664, + 0.07293722778558731, + -0.08753764629364014, + -0.12357524782419205, + 0.07562319934368134, + -0.16199833154678345, + -0.08773521333932877, + 0.1221364215016365, + -0.08937212079763412, + -0.27988871932029724, + -0.2786327302455902, + 0.06959555298089981, + 0.42038747668266296, + 0.11884792149066925, + -0.16522592306137085, + -0.06320855021476746, + -0.013229736126959324, + 0.0017756103770807385, + 0.07880271971225739, + 0.08006925135850906, + -0.06964699923992157, + -0.11008323729038239, + -0.1845131814479828, + 0.0737486407160759, + 0.2672916352748871, + 0.020616518333554268, + -0.07466419786214828, + 0.2662600874900818, + 0.07047133147716522, + 0.02428838424384594, + 0.06913027912378311, + 0.04730957746505737, + -0.031558748334646225, + 0.024458760395646095, + -0.04133071377873421, + 0.07042136788368225, + -0.0024480188731104136, + -0.06460776925086975, + 0.03251505270600319, + 0.09613719582557678, + -0.12773990631103516, + 0.2139708399772644, + -0.0176028311252594, + -0.032143354415893555, + 0.03917117044329643, + -0.044554729014635086, + -0.16849099099636078, + -0.06721222400665283, + 0.20500414073467255, + -0.25338536500930786, + 0.18204103410243988, + 0.18213282525539398, + 0.09121459722518921, + 0.18398307263851166, + 0.0601838156580925, + 0.0610382966697216, + -0.041799429804086685, + -0.012863267213106155, + -0.19040389358997345, + -0.018813343718647957, + -0.009036027826368809, + -0.06371993571519852, + 0.05263302102684975, + 0.02440733090043068 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.12067485600709915, + 0.08614832907915115, + 0.06375346332788467, + -0.07228690385818481, + -0.04757752642035484, + 0.03063967637717724, + 0.006610070820897818, + -0.11074023693799973, + 0.14102108776569366, + -0.20833370089530945, + 0.18699118494987488, + -0.012722390703856945, + -0.22287143766880035, + 0.0924653634428978, + -0.04982561990618706, + 0.2025154083967209, + -0.18770673871040344, + -0.12505507469177246, + -0.062139805406332016, + -0.10390548408031464, + -0.015089121647179127, + 0.06077563762664795, + 0.005576042458415031, + 0.09509364515542984, + -0.13714812695980072, + -0.24001292884349823, + -0.10191018134355545, + -0.0849062129855156, + 0.012570374645292759, + -0.07055141776800156, + 0.010935619473457336, + -0.0028324753511697054, + -0.0930292084813118, + 0.08585020899772644, + 0.07557287812232971, + 0.12643280625343323, + -0.06367195397615433, + -0.08479908853769302, + 0.2576759159564972, + 0.07105172425508499, + -0.24129004776477814, + -0.00900485459715128, + 0.12627853453159332, + 0.2723338305950165, + 0.21962003409862518, + -0.06286507099866867, + -0.01679527759552002, + -0.0761837437748909, + 0.18384873867034912, + -0.29666948318481445, + 0.018317226320505142, + 0.10472948104143143, + 0.09283053874969482, + 0.13015785813331604, + 0.01761174574494362, + -0.16782905161380768, + 0.031910717487335205, + 0.17620573937892914, + -0.16138364374637604, + 0.01206712145358324, + 0.09488463401794434, + -0.0676926001906395, + -0.01828816719353199, + 0.02756669744849205, + 0.15711869299411774, + 0.12269589304924011, + -0.1730572134256363, + -0.2116558849811554, + 0.1788768768310547, + -0.22934825718402863, + -0.04101743549108505, + 0.1785380095243454, + -0.10772321373224258, + -0.2010282278060913, + -0.14834260940551758, + 0.024095164611935616, + 0.4540582299232483, + 0.18698401749134064, + -0.06693525612354279, + -0.000711969390977174, + -0.0785498097538948, + -0.04675017669796944, + 0.04982724413275719, + 0.12553241848945618, + -0.018380245193839073, + -0.041119709610939026, + -0.02832738310098648, + -0.009839006699621677, + 0.24609375, + 0.02109127677977085, + -0.04302223026752472, + 0.19489330053329468, + 0.019424328580498695, + 0.03245580941438675, + 0.019422024488449097, + 0.06729190051555634, + -0.13207370042800903, + -0.027821330353617668, + -0.16674283146858215, + -0.08598393946886063, + -0.14827226102352142, + -0.06442325562238693, + -0.019630974158644676, + 0.10259614884853363, + -0.25537291169166565, + 0.30480635166168213, + -0.03228404372930527, + -0.052381668239831924, + -0.03171877562999725, + 0.07394357025623322, + -0.06938886642456055, + 0.06288514286279678, + 0.17983675003051758, + -0.27074772119522095, + 0.1130174919962883, + 0.20659859478473663, + 0.055557891726493835, + 0.12250427156686783, + 0.09442871063947678, + 0.054893650114536285, + 0.021106312051415443, + -0.03185444697737694, + -0.21324729919433594, + -0.08420559018850327, + 0.012943561188876629, + -0.10112614184617996, + 0.05124850198626518, + -0.051358290016651154 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.0632016584277153, + 0.04374726116657257, + 0.06338963657617569, + -0.10667116194963455, + -0.10853087902069092, + 0.001859510550275445, + -0.027352528646588326, + -0.0743057057261467, + 0.12100827693939209, + -0.20777779817581177, + 0.21104282140731812, + -0.013563892804086208, + -0.15963886678218842, + 0.08654142916202545, + -0.07457704097032547, + 0.17406606674194336, + -0.17098312079906464, + -0.09715333580970764, + -0.06646787375211716, + -0.1305273473262787, + -0.02531546726822853, + 0.11149689555168152, + 0.011072111316025257, + 0.10181920975446701, + -0.12281063944101334, + -0.24621188640594482, + -0.07852893322706223, + -0.08780436217784882, + 0.06701226532459259, + -0.07630199939012527, + 0.042624276131391525, + 0.02239726483821869, + -0.12507735192775726, + 0.0856979563832283, + 0.04934881627559662, + 0.06654565781354904, + -0.04922579228878021, + -0.08840963244438171, + 0.269808292388916, + 0.07453041523694992, + -0.24521026015281677, + -0.003732520854100585, + 0.11494777351617813, + 0.26743409037590027, + 0.19414083659648895, + -0.10037669539451599, + 0.03976815193891525, + -0.06662505865097046, + 0.17123353481292725, + -0.2736237347126007, + 0.05570868030190468, + 0.09395715594291687, + 0.044948432594537735, + 0.09821712225675583, + -0.01842578314244747, + -0.14766836166381836, + 0.018916387110948563, + 0.18276911973953247, + -0.13932836055755615, + 0.06576433777809143, + 0.09779252111911774, + -0.07006862014532089, + -0.042204275727272034, + 0.05904538929462433, + 0.1741258054971695, + 0.09412574768066406, + -0.13797877728939056, + -0.25138819217681885, + 0.17352662980556488, + -0.24499627947807312, + -0.0651872307062149, + 0.16977985203266144, + -0.09837981313467026, + -0.14945638179779053, + -0.17756880819797516, + 0.05319271609187126, + 0.4398794174194336, + 0.12976424396038055, + -0.07732033729553223, + 0.06774971634149551, + -0.06864183396100998, + -0.06949581950902939, + 0.06159018352627754, + 0.16060666739940643, + -0.006174785550683737, + -0.009650485590100288, + -0.03207680210471153, + 0.03646516054868698, + 0.26984015107154846, + -0.0025665229186415672, + -0.03856129199266434, + 0.229180708527565, + 0.0420210026204586, + 0.015704786404967308, + 0.05089539289474487, + 0.08653676509857178, + -0.13096676766872406, + -0.03260236606001854, + -0.13646657764911652, + -0.03933821991086006, + -0.07246740162372589, + -0.04846775531768799, + -0.04006955027580261, + 0.09601179510354996, + -0.2510764002799988, + 0.3296092450618744, + -0.05970703065395355, + -0.07328580319881439, + -0.017166145145893097, + 0.039484404027462006, + -0.03868589177727699, + 0.01897934451699257, + 0.1852208822965622, + -0.2059508115053177, + 0.12245869636535645, + 0.16216298937797546, + 0.13282188773155212, + 0.15849776566028595, + 0.11452291160821915, + 0.03744213655591011, + 0.05667940527200699, + -0.031092263758182526, + -0.1924441158771515, + -0.06609832495450974, + -0.00017189963546115905, + -0.11532143503427505, + 0.038394439965486526, + -0.018075648695230484 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.07928939908742905, + 0.0687764436006546, + 0.06311196088790894, + -0.10119155794382095, + -0.054223768413066864, + 0.040304988622665405, + -0.021941525861620903, + -0.11595403403043747, + 0.13057681918144226, + -0.19977903366088867, + 0.20754754543304443, + -0.021601667627692223, + -0.2076997458934784, + 0.07605603337287903, + -0.05084006115794182, + 0.16081178188323975, + -0.18006692826747894, + -0.1009019985795021, + -0.06761627644300461, + -0.11601509153842926, + -0.0028054623398929834, + 0.0877053365111351, + 0.037853240966796875, + 0.1016397476196289, + -0.15902577340602875, + -0.2317788302898407, + -0.08961575478315353, + -0.09583612531423569, + 0.07063879817724228, + -0.06718587875366211, + 0.023732418194413185, + 0.019317399710416794, + -0.11279141902923584, + 0.09919880330562592, + 0.06111310049891472, + 0.11469829082489014, + -0.037918999791145325, + -0.0769617035984993, + 0.28732967376708984, + 0.05995645746588707, + -0.2424125373363495, + -0.02052222192287445, + 0.12564270198345184, + 0.24989363551139832, + 0.19598828256130219, + -0.09959422051906586, + 0.01680729165673256, + -0.07680287212133408, + 0.17754456400871277, + -0.2719323933124542, + 0.06623363494873047, + 0.10979015380144119, + 0.07939597964286804, + 0.1130404844880104, + 0.029237639158964157, + -0.16380575299263, + 0.029123757034540176, + 0.1762726753950119, + -0.1415465772151947, + 0.03927299752831459, + 0.10087168216705322, + -0.08032809942960739, + -0.03810030594468117, + 0.05166570469737053, + 0.15057989954948425, + 0.0879659652709961, + -0.1455128788948059, + -0.23824453353881836, + 0.166645810008049, + -0.20549136400222778, + -0.04365658015012741, + 0.21240711212158203, + -0.10242956131696701, + -0.15523064136505127, + -0.1666787564754486, + 0.03891362249851227, + 0.45867812633514404, + 0.15104709565639496, + -0.08909004181623459, + 0.07221589982509613, + -0.08560262620449066, + -0.08252961933612823, + 0.06645974516868591, + 0.13569732010364532, + -0.008519710972905159, + 0.0011487776646390557, + -0.038055889308452606, + 0.03892039135098457, + 0.23036623001098633, + -0.0052648792043328285, + -0.02533635124564171, + 0.2164975106716156, + 0.037402715533971786, + 0.03421999514102936, + 0.04914679378271103, + 0.08212599903345108, + -0.14603745937347412, + -0.03656943887472153, + -0.15294626355171204, + -0.0741790309548378, + -0.07893402874469757, + -0.03591032326221466, + -0.018647467717528343, + 0.07737917453050613, + -0.25945043563842773, + 0.3103696405887604, + -0.02657020278275013, + -0.08401700854301453, + -0.0025904332287609577, + 0.03594342619180679, + -0.04965736344456673, + 0.03740294650197029, + 0.18692214787006378, + -0.2822794020175934, + 0.08883160352706909, + 0.15038332343101501, + 0.07900239527225494, + 0.14406605064868927, + 0.11214952170848846, + 0.06275742501020432, + 0.049004849046468735, + -0.030119309201836586, + -0.1896282136440277, + -0.07212033122777939, + 0.021525174379348755, + -0.09692370891571045, + 0.04183933511376381, + -0.03890720009803772 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.0523061566054821, + 0.02449534833431244, + 0.0017855140613391995, + -0.10332853347063065, + -0.10830240696668625, + 0.013793103396892548, + -0.003962003160268068, + -0.10507020354270935, + 0.17197571694850922, + -0.1436993032693863, + 0.2312765121459961, + -0.030852891504764557, + -0.17209206521511078, + 0.057779476046562195, + -0.002753226086497307, + 0.1026901975274086, + -0.19583956897258759, + -0.06978102773427963, + -0.031998325139284134, + -0.09553501009941101, + -0.0011182802263647318, + 0.09808611869812012, + 0.01188616268336773, + 0.11180652678012848, + -0.20825205743312836, + -0.23804055154323578, + -0.11874628812074661, + -0.10315927863121033, + 0.08518866449594498, + -0.09056545794010162, + 0.042131926864385605, + 0.07057454437017441, + -0.1181928738951683, + 0.046455640345811844, + 0.05951852351427078, + 0.047227270901203156, + -0.055430296808481216, + -0.07514653354883194, + 0.24357053637504578, + 0.0700417160987854, + -0.20845630764961243, + -0.035971205681562424, + 0.06935696303844452, + 0.2763077914714813, + 0.17154665291309357, + -0.06087863817811012, + 0.01550693716853857, + -0.06283289939165115, + 0.14275649189949036, + -0.24248355627059937, + 0.07671483606100082, + 0.09137769788503647, + 0.09359370172023773, + 0.06160470470786095, + 0.028693262487649918, + -0.12247244268655777, + 0.0065121338702738285, + 0.17959700524806976, + -0.2028346210718155, + 0.11453017592430115, + 0.0980440005660057, + -0.09985877573490143, + 0.0011545688612386584, + 0.020272716879844666, + 0.1669977307319641, + 0.09075657278299332, + -0.1404372751712799, + -0.19848905503749847, + 0.11062055081129074, + -0.2222849428653717, + -0.08731133490800858, + 0.18105179071426392, + -0.09806899726390839, + -0.2075624018907547, + -0.2543925344944, + 0.03872234374284744, + 0.42405855655670166, + 0.1471075564622879, + -0.11960984021425247, + 0.024145659059286118, + -0.0034679388627409935, + -0.08843902498483658, + 0.10889463126659393, + 0.17113620042800903, + -0.02372131682932377, + -0.04432341083884239, + -0.049811672419309616, + 0.05144284665584564, + 0.2483866661787033, + -0.016209376975893974, + -0.05881834030151367, + 0.24888469278812408, + -0.002439755480736494, + 0.027945199981331825, + 0.01630057953298092, + 0.0804862380027771, + -0.12005159258842468, + -0.02437797747552395, + -0.060642872005701065, + -0.016426604241132736, + -0.023605918511748314, + -0.018540438264608383, + -0.010404052212834358, + 0.13598181307315826, + -0.19682598114013672, + 0.2835733890533447, + -0.039023805409669876, + -0.08809244632720947, + -0.019431840628385544, + -0.012630348093807697, + -0.061234381049871445, + -0.005896218121051788, + 0.17618580162525177, + -0.28440946340560913, + 0.09830693900585175, + 0.13205868005752563, + 0.07936518639326096, + 0.1447858363389969, + 0.023916158825159073, + 0.019184520468115807, + 0.03341824561357498, + -0.006224862765520811, + -0.1737121343612671, + -0.0348421148955822, + 0.029737012460827827, + -0.11779773235321045, + 0.06332262605428696, + -0.046146001666784286 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.07391294091939926, + 0.05369267985224724, + 0.13824254274368286, + -0.09505252540111542, + -0.06773123890161514, + 0.030764034017920494, + 0.006311917677521706, + -0.11184342205524445, + 0.13128003478050232, + -0.20973791182041168, + 0.22635936737060547, + -0.03059309348464012, + -0.22063925862312317, + 0.10528916120529175, + -0.017337646335363388, + 0.16528016328811646, + -0.16933244466781616, + -0.08187443763017654, + -0.08404356986284256, + -0.0740242451429367, + -0.019283873960375786, + 0.0825682058930397, + 0.027124427258968353, + 0.05379773676395416, + -0.13497096300125122, + -0.2520769536495209, + -0.11840793490409851, + -0.05238402262330055, + 0.0816846415400505, + -0.03394472226500511, + -0.0003557514282874763, + 0.0299916323274374, + -0.0869441106915474, + 0.07819107174873352, + 0.06465363502502441, + 0.08933445811271667, + -0.061970386654138565, + -0.08826730400323868, + 0.24124862253665924, + 0.04774109646677971, + -0.2534434199333191, + 0.0056593334302306175, + 0.11564040929079056, + 0.25072458386421204, + 0.20000453293323517, + -0.08236256241798401, + 0.024538161233067513, + -0.06794510781764984, + 0.14394448697566986, + -0.3098739981651306, + 0.05431148782372475, + 0.08726636320352554, + 0.05737048014998436, + 0.12459230422973633, + 0.058293506503105164, + -0.14085569977760315, + 0.017737550660967827, + 0.15880560874938965, + -0.14103862643241882, + 0.05791538581252098, + 0.13881662487983704, + -0.05847448855638504, + -0.036079294979572296, + 0.008849035017192364, + 0.14328396320343018, + 0.11997800320386887, + -0.15850526094436646, + -0.23673371970653534, + 0.15244294703006744, + -0.22862988710403442, + -0.05899373069405556, + 0.18310828506946564, + -0.12325801700353622, + -0.1372850239276886, + -0.17778049409389496, + 0.020025009289383888, + 0.4511018395423889, + 0.16129612922668457, + -0.1049073114991188, + 0.02612081728875637, + -0.057982709258794785, + -0.044559936970472336, + 0.0779879167675972, + 0.13904105126857758, + 0.0020771599374711514, + 0.01208887342363596, + -0.016976328566670418, + 0.010863635689020157, + 0.23888248205184937, + -0.011109990999102592, + -0.028199385851621628, + 0.242588609457016, + 0.06074974313378334, + 0.017097286880016327, + 0.052498359233140945, + 0.06323396414518356, + -0.0911305621266365, + -0.08755268901586533, + -0.1963706910610199, + -0.06199049949645996, + -0.10760152339935303, + -0.04440746828913689, + -0.029527336359024048, + 0.09764657914638519, + -0.24502144753932953, + 0.339599072933197, + -0.028579579666256905, + -0.056241072714328766, + 0.01039742212742567, + 0.04770200327038765, + -0.04397743567824364, + 0.04243718087673187, + 0.1802692711353302, + -0.2679230570793152, + 0.0693965032696724, + 0.17764133214950562, + 0.08608821034431458, + 0.09018827229738235, + 0.0717121958732605, + 0.05351078510284424, + 0.030435869470238686, + 0.011173024773597717, + -0.16232335567474365, + -0.09020333737134933, + -0.0034781317226588726, + -0.1128353551030159, + 0.017430435866117477, + -0.034052297472953796 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.07781801372766495, + 0.0489477813243866, + 0.05915911868214607, + -0.07290247082710266, + -0.11542965471744537, + -0.004722218029201031, + -0.004293398000299931, + -0.10674674808979034, + 0.10868290066719055, + -0.18956603109836578, + 0.25525668263435364, + -0.008194541558623314, + -0.19902198016643524, + 0.07862125337123871, + -0.02547292597591877, + 0.14402776956558228, + -0.15822675824165344, + -0.10122566670179367, + -0.09623411297798157, + -0.10834632813930511, + -0.012002910487353802, + 0.09470302611589432, + 0.03459741920232773, + 0.08818899840116501, + -0.20435094833374023, + -0.2342461794614792, + -0.10728025436401367, + -0.058052342385053635, + 0.060765717178583145, + -0.03764967992901802, + 0.0623040609061718, + 0.04518737643957138, + -0.10356100648641586, + 0.09752089530229568, + 0.091841921210289, + 0.05241980776190758, + -0.03177322447299957, + -0.09828919917345047, + 0.2719910740852356, + 0.057365112006664276, + -0.23568929731845856, + -0.041418880224227905, + 0.13907390832901, + 0.23490186035633087, + 0.16059091687202454, + -0.06648778170347214, + 0.08039805293083191, + -0.06821232289075851, + 0.13018499314785004, + -0.26170840859413147, + 0.07847078889608383, + 0.10112655162811279, + 0.0907616913318634, + 0.09978089481592178, + 0.013502273708581924, + -0.15522783994674683, + 0.02216777577996254, + 0.21023604273796082, + -0.13501177728176117, + 0.07319197803735733, + 0.10721064358949661, + -0.058540403842926025, + -0.03880373015999794, + 0.054431766271591187, + 0.17783567309379578, + 0.10934105515480042, + -0.15892988443374634, + -0.21493586897850037, + 0.17748931050300598, + -0.23485654592514038, + -0.09940571337938309, + 0.1790146827697754, + -0.10904566198587418, + -0.17329926788806915, + -0.1988302618265152, + 0.02542656846344471, + 0.4512404501438141, + 0.14957457780838013, + -0.11071457713842392, + 0.016621097922325134, + -0.04929860308766365, + -0.04498693346977234, + 0.05077821761369705, + 0.14084233343601227, + -0.050622280687093735, + -0.047983843833208084, + -0.05274895951151848, + 0.018380695953965187, + 0.3110717236995697, + 0.01259862631559372, + -0.04508424550294876, + 0.2505663335323334, + 0.07909888029098511, + -0.018764076754450798, + 0.045724380761384964, + 0.06917639821767807, + -0.0978178083896637, + -0.07286836206912994, + -0.08848920464515686, + -0.03285875916481018, + -0.07033702731132507, + -0.04929427430033684, + -0.04402711242437363, + 0.10540061444044113, + -0.25848156213760376, + 0.30830663442611694, + -0.05608334392309189, + -0.08540485054254532, + -0.014550474472343922, + 0.04685821011662483, + -0.04750090464949608, + 0.007397324778139591, + 0.15652258694171906, + -0.2492343783378601, + 0.09223052859306335, + 0.1638396680355072, + 0.1077125146985054, + 0.15199337899684906, + 0.08337122946977615, + 0.06455645710229874, + 0.06083669513463974, + -0.014557627029716969, + -0.14613159000873566, + -0.11330551654100418, + 0.0069627962075173855, + -0.1378098428249359, + 0.04962964355945587, + -0.024827608838677406 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.07647142559289932, + 0.052873313426971436, + 0.04067838937044144, + -0.10407602041959763, + -0.0556313656270504, + 0.035389550030231476, + -0.03639412298798561, + -0.07832653820514679, + 0.1276572197675705, + -0.23412302136421204, + 0.21896076202392578, + 0.0004489511775318533, + -0.16639846563339233, + 0.08994188904762268, + -0.06120388209819794, + 0.16845828294754028, + -0.17181669175624847, + -0.10085011273622513, + -0.06269251555204391, + -0.10516399145126343, + -0.002120910445228219, + 0.10448477417230606, + 0.02602025680243969, + 0.08938705176115036, + -0.11939594894647598, + -0.24731490015983582, + -0.09400977939367294, + -0.07533812522888184, + 0.03461718186736107, + -0.0960364043712616, + 0.05749494582414627, + -0.0006451746448874474, + -0.12060850858688354, + 0.1357036530971527, + 0.05395530164241791, + 0.09552481770515442, + -0.04824310168623924, + -0.0704541802406311, + 0.26168715953826904, + 0.08474332839250565, + -0.21968762576580048, + -0.0414217971265316, + 0.1217019259929657, + 0.2803312838077545, + 0.2191486954689026, + -0.10101060569286346, + -0.006547277793288231, + -0.08359227329492569, + 0.17529723048210144, + -0.2806602120399475, + 0.032905012369155884, + 0.09126811474561691, + 0.057489462196826935, + 0.10434778779745102, + 0.030757563188672066, + -0.11287609487771988, + 0.026558412238955498, + 0.19609126448631287, + -0.12538334727287292, + 0.06277940422296524, + 0.07409960776567459, + -0.0630032867193222, + -0.0569986030459404, + 0.02493402175605297, + 0.1830156296491623, + 0.07945790886878967, + -0.17083041369915009, + -0.23588326573371887, + 0.16342587769031525, + -0.21669019758701324, + -0.05951341986656189, + 0.2036575973033905, + -0.10166509449481964, + -0.19831985235214233, + -0.1506519466638565, + 0.03204452991485596, + 0.44003963470458984, + 0.15788033604621887, + -0.08964818716049194, + 0.059697702527046204, + -0.055513329803943634, + -0.07872885465621948, + 0.0717354565858841, + 0.15557530522346497, + 0.0060254596173763275, + -0.018400179222226143, + -0.04300646111369133, + 0.04198269173502922, + 0.26173993945121765, + -0.003250319045037031, + -0.033719632774591446, + 0.2207767218351364, + -0.0046083880588412285, + 0.021029382944107056, + 0.025486687198281288, + 0.0788358673453331, + -0.13406839966773987, + -0.031007936224341393, + -0.17677421867847443, + -0.09730587899684906, + -0.0986437126994133, + -0.044555701315402985, + -0.04722042381763458, + 0.09333234280347824, + -0.22710584104061127, + 0.3031899333000183, + -0.04260719195008278, + -0.0728357806801796, + 0.0018270534928888083, + 0.039491500705480576, + -0.06217304989695549, + 0.025834130123257637, + 0.17460696399211884, + -0.24453650414943695, + 0.0930168405175209, + 0.15225264430046082, + 0.10247166454792023, + 0.14001762866973877, + 0.10346634685993195, + 0.07393279671669006, + 0.037141941487789154, + -0.03189477697014809, + -0.20610560476779938, + -0.05077487975358963, + -0.014021359384059906, + -0.08007512986660004, + 0.03098120540380478, + -0.0692095011472702 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.08102545887231827, + 0.02595984935760498, + 0.08157726377248764, + -0.06215759739279747, + -0.07972773164510727, + 0.014920121058821678, + -0.003154471516609192, + -0.020844830200076103, + 0.11992795765399933, + -0.1476077288389206, + 0.20590892434120178, + 0.0014361352659761906, + -0.17981891334056854, + 0.09177827835083008, + -0.004342731088399887, + 0.13295786082744598, + -0.16216890513896942, + -0.03260927274823189, + -0.11834697425365448, + -0.08326040208339691, + -0.012592996470630169, + 0.09585374593734741, + -0.022849323228001595, + 0.08587576448917389, + -0.1317017674446106, + -0.23951342701911926, + -0.07347474247217178, + -0.0539541132748127, + 0.016572942957282066, + -0.10758427530527115, + 0.020518885925412178, + 0.028049752116203308, + -0.10616324096918106, + 0.015020175836980343, + 0.06171649694442749, + 0.039955705404281616, + -0.06215841323137283, + -0.0658244714140892, + 0.2374175637960434, + 0.09044491499662399, + -0.21330861747264862, + 0.0021149106323719025, + 0.14328543841838837, + 0.28221699595451355, + 0.2103424370288849, + -0.039984285831451416, + 0.014601399190723896, + -0.06756369769573212, + 0.19183775782585144, + -0.2904089391231537, + -0.0017382306978106499, + 0.09420054405927658, + 0.10916652530431747, + 0.08376191556453705, + 0.030765237286686897, + -0.136475071310997, + 0.015207082033157349, + 0.138474702835083, + -0.16877388954162598, + 0.10442973673343658, + 0.0887710377573967, + -0.08959140628576279, + -0.048295725136995316, + 0.0157997515052557, + 0.17395783960819244, + 0.07180963456630707, + -0.16945473849773407, + -0.1972266137599945, + 0.14373470842838287, + -0.1970798671245575, + -0.05102085322141647, + 0.17145562171936035, + -0.09538303315639496, + -0.18788017332553864, + -0.2027577906847, + 0.03668365627527237, + 0.4514574706554413, + 0.09103009849786758, + -0.12215544283390045, + 0.01626639813184738, + -0.07919134944677353, + -0.1029103547334671, + 0.024983925744891167, + 0.17479395866394043, + -0.03197110444307327, + -0.03058946132659912, + -0.0007335544796660542, + 0.04546178877353668, + 0.2599382698535919, + 0.019808270037174225, + -7.412153991026571e-06, + 0.2119043916463852, + 0.06318105012178421, + -0.021344313398003578, + 0.037206411361694336, + 0.07549609988927841, + -0.1448742002248764, + -0.06178532913327217, + -0.14397628605365753, + -0.04203064739704132, + -0.07503892481327057, + -0.10519668459892273, + -0.0004229705664329231, + 0.09275960922241211, + -0.25147563219070435, + 0.30940350890159607, + -0.03206273540854454, + -0.08353527635335922, + 0.011681281961500645, + 0.020896291360259056, + -0.0738178938627243, + 0.022294793277978897, + 0.17545898258686066, + -0.24852415919303894, + 0.07536695152521133, + 0.1514856368303299, + 0.09938369691371918, + 0.10955366492271423, + 0.04909958317875862, + 0.07195424288511276, + 0.021414542570710182, + 0.04810568690299988, + -0.15479151904582977, + -0.0691489651799202, + -0.011209641583263874, + -0.11273834109306335, + 0.04473324492573738, + -0.05596795305609703 + ] + }, + { + "name": "Sara", + "encoding": [ + -0.01536183524876833, + 0.024282140657305717, + 0.12233875691890717, + -0.06744005531072617, + -0.10974156111478806, + 0.0231088325381279, + -0.0010907321702688932, + -0.10027787834405899, + 0.1604040265083313, + -0.22035157680511475, + 0.20631566643714905, + -0.0031983235385268927, + -0.18821266293525696, + 0.07025856524705887, + 0.030497947707772255, + 0.1761496514081955, + -0.1819712072610855, + -0.11561688035726547, + -0.077193483710289, + -0.08267169445753098, + -0.024336963891983032, + 0.059421051293611526, + 0.0038519646041095257, + 0.08880540728569031, + -0.20798447728157043, + -0.29841986298561096, + -0.11095143109560013, + -0.07126587629318237, + -0.0015061321901157498, + -0.042076896876096725, + 0.01737641729414463, + 0.06584152579307556, + -0.09348910301923752, + 0.0683203712105751, + 0.06033850833773613, + 0.0656236857175827, + -0.03265398368239403, + -0.050888076424598694, + 0.22816535830497742, + 0.09343484044075012, + -0.24373744428157806, + 0.035409219563007355, + 0.08939418941736221, + 0.24660897254943848, + 0.16778776049613953, + -0.03861694782972336, + 0.04609723389148712, + -0.05002887174487114, + 0.16777633130550385, + -0.2922988533973694, + 0.06549704819917679, + 0.10308951884508133, + 0.06539894640445709, + 0.08343289792537689, + 0.07252122461795807, + -0.11706782132387161, + 0.01690067909657955, + 0.16964194178581238, + -0.17861531674861908, + 0.09537684917449951, + 0.12341586500406265, + -0.036956537514925, + -0.0036967152263969183, + 0.0123086953535676, + 0.15852300822734833, + 0.12078258395195007, + -0.15480554103851318, + -0.1738317459821701, + 0.10436441004276276, + -0.21802037954330444, + -0.10370603948831558, + 0.09805662930011749, + -0.14307540655136108, + -0.15912768244743347, + -0.26198944449424744, + 0.008986830711364746, + 0.4817553162574768, + 0.13634109497070312, + -0.15001927316188812, + -0.027759844437241554, + -0.0343635156750679, + -0.05790864676237106, + 0.09755173325538635, + 0.12232355773448944, + -0.018757665529847145, + -0.050516899675130844, + -0.011637258343398571, + 0.03483603522181511, + 0.2642395496368408, + 0.03598015010356903, + -0.023180628195405006, + 0.24644450843334198, + 0.039621442556381226, + 0.026896385475993156, + 0.008899546228349209, + 0.03952570632100105, + -0.09986399114131927, + -0.0520026870071888, + -0.1550769805908203, + -0.014133323915302753, + -0.13414634764194489, + -0.028197625651955605, + -0.032606881111860275, + 0.09751041978597641, + -0.2687849700450897, + 0.3020629286766052, + -0.02882486954331398, + -0.07995248585939407, + -0.02006593346595764, + 0.11187570542097092, + -0.15111044049263, + 0.010732488706707954, + 0.1810101419687271, + -0.25337931513786316, + 0.08201014995574951, + 0.20681220293045044, + 0.08477181196212769, + 0.0803346335887909, + 0.05093740299344063, + 0.02241833694279194, + 0.0033291333820670843, + 0.01122346706688404, + -0.17161647975444794, + -0.07435725629329681, + 0.027073688805103302, + -0.14191754162311554, + 0.03727308288216591, + -0.02530103363096714 + ] + } +] \ No newline at end of file diff --git a/mm_application/facerec_on_rasp_usb_camera.py b/mm_application/facerec_on_rasp_usb_camera.py new file mode 100644 index 000000000..4fdbca203 --- /dev/null +++ b/mm_application/facerec_on_rasp_usb_camera.py @@ -0,0 +1,179 @@ +import face_recognition +import numpy as np +import cv2 +import os +import json +import time +from mqtt_client_ayes import AyesMqttClient + + +# KEPT LIKE THIS AS THIS MAY MOVE AROUND IN THE FUTURE +ENCODINGS_PATH = "./encodings.json" + +if os.path.exists(ENCODINGS_PATH): + with open(ENCODINGS_PATH, 'r') as file: + try: + db = json.load(file) + except json.decoder.JSONDecodeError: + db = [] + +names = [encoding['name'] for encoding in db] +known_encodings = [np.array(encoding['encoding']) for encoding in db] + +mqtt_handler_client = AyesMqttClient( + broker = "localhost", + port = 1883, + topics_list = ["greetings/face_added", "greetings/face_removed"], + client_id = "FaceRecognition" +) + +# Wait until mqtt handler is running +while True: + try : + mqtt_handler_client.connect() + break + + except Exception as e: + print(e) + time.sleep(1) + + +def find_true_indices(boolean_list): + """ + Find the indexes of the recognized persons + + """ + return_index = -1 + for index, value in enumerate(boolean_list): + if value: + return_index = index + + return return_index + + +def preprocess_frame(frame): + """ + Pre processing a frame, in particular + 1. Resize it to make it smaller, having a faster recognition process + - The horizontal and vertical resizing values shall be [0,1] + Returns the small frame in rgb + """ + + RESIZING = 0.5 + + # Resize frame of video for faster face recognition processing + small_frame = cv2.resize(frame, (0, 0), fx=RESIZING, fy=RESIZING) + + return small_frame + + +def detect_faces(rgb_small_frame): + """ + Manages the face recognition process from current video frame in RGB and returns the recognized people on screen. + """ + + face_locations = face_recognition.face_locations(rgb_small_frame) + + if len(face_locations) == 0: return [] + + face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) + people_on_screen = [] + + # See if the face is a match for the known face(s) + for face_encoding in face_encodings: + matches = face_recognition.compare_faces(known_encodings, face_encoding, tolerance=0.5) + index = find_true_indices(matches) + + if index == -1: + continue # People is unknown. How do we handle that ? + + detected_people = names[index] + if detected_people not in people_on_screen: + people_on_screen.append(detected_people) + + return people_on_screen + + +def publish_messages(removed_people, added_people): + """ + Send the messages to the MQTT broker + The function only activates if the publish flag is set to true, in such case: + 1. First send the names of the last recognized people on the face_removed topic + 2. Send the names of the newly recognized people on the face_added topic + Returns the recognized faces, to be then used at step 1 the next time the function is called + This is needed to have a quick and clean way to avoid having the names to be repeated multiple times. + """ + face_removed = json.dumps({"names" : removed_people}) + mqtt_handler_client.publish_message("greetings/face_removed", face_removed) + face_added = json.dumps({"names" : added_people}) + mqtt_handler_client.publish_message("greetings/face_added", face_added) + + +if __name__ == "__main__": + cap = cv2.VideoCapture(0) + + if not cap.isOpened(): exit + + frame_i = 0 + previous_people_on_frame = [] + + people_list = {} + for name in names: + if name not in people_list: + people_list[name] = { + "last_time_became_visible": 0, + "last_time_stayed_visible": 0, + "is_visible" : False + } + + while True: + ret, frame = cap.read() + + must_process_frame = ((frame_i % 2) == 0) and ret + frame_i += 1 + + if must_process_frame: + current_time = time.time() + + rgb_small_frame = preprocess_frame(frame) + current_people_on_frame = detect_faces(rgb_small_frame) + + publish_added_people = [] + publish_removed_people = [] + + for people in people_list: + # Short-term + + if (people not in previous_people_on_frame) and (people in current_people_on_frame): + # people becomes (short-term) visible + people_list[people]["last_time_became_visible"] = current_time + + if (people in previous_people_on_frame) and (people in current_people_on_frame): + # people stays (short-term) visible + people_list[people]["last_time_stayed_visible"] = current_time + + # Long-term + VISIBLE_THRESHOLD_DURATION = 0.5 + NOT_VISIBLE_THRESHOLD_DURATION = 5 + + if not people_list[people]["is_visible"]: + if (people_list[people]["last_time_stayed_visible"] - people_list[people]["last_time_became_visible"]) >= VISIBLE_THRESHOLD_DURATION: + # people becomes (long-term) visible + people_list[people]["is_visible"] = True + publish_added_people.append(people) + + else: + if (current_time - people_list[people]["last_time_stayed_visible"]) >= NOT_VISIBLE_THRESHOLD_DURATION: + # people becomes (long-term) invisible + people_list[people]["is_visible"] = False + people_list[people]["last_time_became_visible"] = 0 + people_list[people]["last_time_stayed_visible"] = 0 + publish_removed_people.append(people) + + previous_people_on_frame = current_people_on_frame + + if (len(publish_added_people) > 0) or (len(publish_removed_people) > 0): + publish_messages(publish_removed_people, publish_added_people) + print(publish_removed_people, publish_added_people) + + time.sleep(0.01) diff --git a/mm_application/facerec_on_raspberry_pi.py b/mm_application/facerec_on_raspberry_pi.py new file mode 100644 index 000000000..4e874d93f --- /dev/null +++ b/mm_application/facerec_on_raspberry_pi.py @@ -0,0 +1,48 @@ +# This is a demo of running face recognition on a Raspberry Pi. +# This program will print out the names of anyone it recognizes to the console. + +# To run this, you need a Raspberry Pi 2 (or greater) with face_recognition and +# the picamera[array] module installed. +# You can follow this installation instructions to get your RPi set up: +# https://gist.github.com/ageitgey/1ac8dbe8572f3f533df6269dab35df65 + +import face_recognition +import picamera +import numpy as np + +# Get a reference to the Raspberry Pi camera. +# If this fails, make sure you have a camera connected to the RPi and that you +# enabled your camera in raspi-config and rebooted first. +camera = picamera.PiCamera() +camera.resolution = (320, 240) +output = np.empty((240, 320, 3), dtype=np.uint8) + +# Load a sample picture and learn how to recognize it. +print("Loading known face image(s)") +obama_image = face_recognition.load_image_file("obama_small.jpg") +obama_face_encoding = face_recognition.face_encodings(obama_image)[0] + +# Initialize some variables +face_locations = [] +face_encodings = [] + +while True: + print("Capturing image.") + # Grab a single frame of video from the RPi camera as a numpy array + camera.capture(output, format="rgb") + + # Find all the faces and face encodings in the current frame of video + face_locations = face_recognition.face_locations(output) + print("Found {} faces in image.".format(len(face_locations))) + face_encodings = face_recognition.face_encodings(output, face_locations) + + # Loop over each face found in the frame to see if it's someone we know. + for face_encoding in face_encodings: + # See if the face is a match for the known face(s) + match = face_recognition.compare_faces([obama_face_encoding], face_encoding) + name = "" + + if match[0]: + name = "Barack Obama" + + print("I see someone named {}!".format(name)) diff --git a/requirements.txt b/requirements.txt index 051fd3cc5..f33f7ac5a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ face_recognition_models Click>=6.0 +cmake dlib>=19.3.0 -numpy Pillow -scipy>=0.17.0 +paho-mqtt