Misc bugfixes and improvements (#14460)

* only save a fixed number of thumbnails if genai is enabled

* disable cpu_mem_arena to save on memory until its actually needed

* fix search settings pane so it actually saves to the config
This commit is contained in:
Josh Hawkins 2024-10-20 15:14:51 -05:00 committed by GitHub
parent b24d292ade
commit 6c70e56059
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 29 additions and 2 deletions

View File

@ -31,6 +31,8 @@ from .embeddings import Embeddings
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
MAX_THUMBNAILS = 10
class EmbeddingMaintainer(threading.Thread): class EmbeddingMaintainer(threading.Thread):
"""Handle embedding queue and post event updates.""" """Handle embedding queue and post event updates."""
@ -117,6 +119,15 @@ class EmbeddingMaintainer(threading.Thread):
return return
camera_config = self.config.cameras[camera] camera_config = self.config.cameras[camera]
# no need to save our own thumbnails if genai is not enabled
# or if the object has become stationary
if (
not camera_config.genai.enabled
or self.genai_client is None
or data["stationary"]
):
return
if data["id"] not in self.tracked_events: if data["id"] not in self.tracked_events:
self.tracked_events[data["id"]] = [] self.tracked_events[data["id"]] = []
@ -127,7 +138,14 @@ class EmbeddingMaintainer(threading.Thread):
if yuv_frame is not None: if yuv_frame is not None:
data["thumbnail"] = self._create_thumbnail(yuv_frame, data["box"]) data["thumbnail"] = self._create_thumbnail(yuv_frame, data["box"])
# Limit the number of thumbnails saved
if len(self.tracked_events[data["id"]]) >= MAX_THUMBNAILS:
# Always keep the first thumbnail for the event
self.tracked_events[data["id"]].pop(1)
self.tracked_events[data["id"]].append(data) self.tracked_events[data["id"]].append(data)
self.frame_manager.close(frame_id) self.frame_manager.close(frame_id)
except FileNotFoundError: except FileNotFoundError:
pass pass

View File

@ -85,8 +85,14 @@ class ONNXModelRunner:
else: else:
# Use ONNXRuntime # Use ONNXRuntime
self.type = "ort" self.type = "ort"
options = ort.SessionOptions()
if device == "CPU":
options.enable_cpu_mem_arena = False
self.ort = ort.InferenceSession( self.ort = ort.InferenceSession(
model_path, providers=providers, provider_options=options model_path,
sess_options=options,
providers=providers,
provider_options=options,
) )
def get_input_names(self) -> list[str]: def get_input_names(self) -> list[str]:

View File

@ -84,7 +84,10 @@ export default function SearchSettingsView({
axios axios
.put( .put(
`config/set?semantic_search.enabled=${searchSettings.enabled}&semantic_search.reindex=${searchSettings.reindex}&semantic_search.model_size=${searchSettings.model_size}`, `config/set?semantic_search.enabled=${searchSettings.enabled ? "True" : "False"}&semantic_search.reindex=${searchSettings.reindex ? "True" : "False"}&semantic_search.model_size=${searchSettings.model_size}`,
{
requires_restart: 0,
},
) )
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {