diff --git a/frigate/object_processing.py b/frigate/object_processing.py
index aa966bab8..137883b2b 100644
--- a/frigate/object_processing.py
+++ b/frigate/object_processing.py
@@ -412,6 +412,11 @@ class CameraState:
self.previous_frame_id = frame_name
+ def shutdown(self) -> None:
+ for obj in self.tracked_objects.values():
+ if not obj.obj_data.get("end_time"):
+ obj.write_thumbnail_to_disk()
+
class TrackedObjectProcessor(threading.Thread):
def __init__(
@@ -722,6 +727,10 @@ class TrackedObjectProcessor(threading.Thread):
event_id, camera, _ = update
self.camera_states[camera].finished(event_id)
+ # shut down camera states
+ for state in self.camera_states.values():
+ state.shutdown()
+
self.requestor.stop()
self.detection_publisher.stop()
self.event_sender.stop()
diff --git a/web/src/pages/FaceLibrary.tsx b/web/src/pages/FaceLibrary.tsx
index 4bb6b39ff..8daf7e325 100644
--- a/web/src/pages/FaceLibrary.tsx
+++ b/web/src/pages/FaceLibrary.tsx
@@ -327,7 +327,7 @@ function FaceAttempt({
.post(`/faces/reprocess`, { training_file: image })
.then((resp) => {
if (resp.status == 200) {
- toast.success(`Successfully trained face.`, {
+ toast.success(`Successfully updated face score.`, {
position: "top-center",
});
onRefresh();
@@ -335,11 +335,14 @@ function FaceAttempt({
})
.catch((error) => {
if (error.response?.data?.message) {
- toast.error(`Failed to train: ${error.response.data.message}`, {
- position: "top-center",
- });
+ toast.error(
+ `Failed to update score: ${error.response.data.message}`,
+ {
+ position: "top-center",
+ },
+ );
} else {
- toast.error(`Failed to train: ${error.message}`, {
+ toast.error(`Failed to update score: ${error.message}`, {
position: "top-center",
});
}
@@ -419,7 +422,7 @@ function FaceAttempt({
onClick={() => onReprocess()}
/>
- Delete Face Attempt
+ Reprocess Face