Skip to content

Commit 0be3719

Browse files
committed
feat: Make face recognition learning rate and model configurable through env vars
1 parent 86841a0 commit 0be3719

6 files changed

Lines changed: 32 additions & 7 deletions

File tree

docs/_sources/index.rst.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,12 @@ Enums
766766

767767
====
768768

769+
.. autoclass:: jarvis.modules.models.enums.FaceRecognitionModel(Enum)
770+
:members:
771+
:exclude-members: _generate_next_value_, _member_names_, _member_map_, _member_type_, _value2member_map_
772+
773+
====
774+
769775
.. autoclass:: jarvis.modules.models.enums.ReminderOptions(Enum)
770776
:members:
771777
:exclude-members: _generate_next_value_, _member_names_, _member_map_, _member_type_, _value2member_map_

docs/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7338,6 +7338,7 @@ <h1>Enums<a class="headerlink" href="#enums" title="Link to this heading">¶</a>
73387338

73397339
</dd></dl>
73407340

7341+
<hr class="docutils" />
73417342
<hr class="docutils" />
73427343
<dl class="py class">
73437344
<dt class="sig sig-object py" id="jarvis.modules.models.enums.ReminderOptions">

docs_gen/index.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,12 @@ Enums
766766

767767
====
768768

769+
.. autoclass:: jarvis.modules.models.enums.FaceRecognitionModel(Enum)
770+
:members:
771+
:exclude-members: _generate_next_value_, _member_names_, _member_map_, _member_type_, _value2member_map_
772+
773+
====
774+
769775
.. autoclass:: jarvis.modules.models.enums.ReminderOptions(Enum)
770776
:members:
771777
:exclude-members: _generate_next_value_, _member_names_, _member_map_, _member_type_, _value2member_map_

jarvis/modules/facenet/face.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,6 @@ class FaceNet:
105105
If unable to connect to the camera.
106106
"""
107107

108-
# TODO: Allow config via env vars
109-
LEARNING_RATE = 0.6 # tolerance level - keep switching this until you find perfection in recognition
110-
MODEL = "hog" # model using which the images are matched
111-
112108
def __init__(self):
113109
"""Instantiates the ``Processor`` object and sources the camera hardware."""
114110
self.validation_video = cv2.VideoCapture(models.env.camera_index or 0)
@@ -161,12 +157,16 @@ def recognizer(self, location: str | FilePath, retry_count: int = 20) -> str | N
161157
logger.warning("Unable to read from camera index: %d", models.env.camera_index or 0)
162158
continue
163159
# gets image from the video read above
164-
identifier = face_recognition.face_locations(img, model=self.MODEL)
160+
identifier = face_recognition.face_locations(img, model=models.env.face_recognition_model)
165161
# creates an encoding for the image
166-
encoded_ = face_recognition.face_encodings(img, identifier)
162+
encoded_ = face_recognition.face_encodings(face_image=img, known_face_locations=identifier)
167163
for face_encoding, face_location in zip(encoded_, identifier):
168164
# using learning_rate, the encoding is matched against the encoded matrix for images in named directory
169-
results = face_recognition.compare_faces(self.train_faces, face_encoding, self.LEARNING_RATE)
165+
results = face_recognition.compare_faces(
166+
known_face_encodings=self.train_faces,
167+
face_encoding_to_check=face_encoding,
168+
tolerance=models.env.face_recognition_learning_rate,
169+
)
170170
# if a match is found the directory name is rendered and returned as match value
171171
if True in results:
172172
return self.train_names[results.index(True)]

jarvis/modules/models/classes.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
from jarvis import indicators, scripts
4646
from jarvis.modules.exceptions import InvalidEnvVars, UnsupportedOS
4747
from jarvis.modules.models import enums, env_file, squire
48+
from jarvis.modules.models.enums import FaceRecognitionModel
4849

4950
AUDIO_DRIVER = pyttsx3.init()
5051
platform_info: List[str] = platform.platform(terse=True).split("-")
@@ -346,6 +347,10 @@ class EnvConfig(BaseSettings):
346347
wifi_ssid: str | None = None
347348
wifi_password: str | None = None
348349

350+
# Face Recognition
351+
face_recognition_learning_rate: int | float = Field(0.5, le=1, ge=0)
352+
face_recognition_model: enums.FaceRecognitionModel = FaceRecognitionModel.hog
353+
349354
wake_words: List[str] = Field(["jarvis"])
350355

351356
class Config:

jarvis/modules/models/enums.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ class StartupOptions(StrEnum):
6060
thermostat = "thermostat"
6161

6262

63+
class FaceRecognitionModel(StrEnum):
64+
"""Face recognition model supported by Jarvis."""
65+
66+
hog = "hog"
67+
cnn = "cnn"
68+
69+
6370
class TemperatureUnits(StrEnum):
6471
"""Types of temperature units supported by Jarvis.
6572

0 commit comments

Comments
 (0)