Skip to content

Commit

Permalink
Face recognition fixes (#15222)
Browse files Browse the repository at this point in the history
* Fix nginx max upload size

* Close upload dialog when done and add toasts

* Formatting

* fix ruff
  • Loading branch information
NickM-27 authored Nov 27, 2024
1 parent 9c6e31a commit 6475c55
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 13 deletions.
5 changes: 3 additions & 2 deletions docker/main/rootfs/usr/local/nginx/conf/nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ http {
open_file_cache_errors on;
aio on;

# file upload size
client_max_body_size 10M;

# https://github.com/kaltura/nginx-vod-module#vod_open_file_thread_pool
vod_open_file_thread_pool default;

Expand Down Expand Up @@ -246,8 +249,6 @@ http {
proxy_no_cache $should_not_cache;
add_header X-Cache-Status $upstream_cache_status;

client_max_body_size 10M;

location /api/vod/ {
include auth_request.conf;
proxy_pass http://frigate_api/vod/;
Expand Down
2 changes: 1 addition & 1 deletion frigate/util/builtin.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@
from collections.abc import Mapping
from pathlib import Path
from typing import Any, Optional, Tuple, Union
from zoneinfo import ZoneInfoNotFoundError

import numpy as np
import pytz
from ruamel.yaml import YAML
from tzlocal import get_localzone
from zoneinfo import ZoneInfoNotFoundError

from frigate.const import REGEX_HTTP_CAMERA_USER_PASS, REGEX_RTSP_CAMERA_USER_PASS

Expand Down
9 changes: 6 additions & 3 deletions frigate/util/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,9 @@ class FaceClassificationModel:
def __init__(self, config: FaceRecognitionConfig, db: SqliteQueueDatabase):
self.config = config
self.db = db
self.recognizer = cv2.face.LBPHFaceRecognizer_create(radius=4, threshold=(1 - config.threshold) * 1000)
self.recognizer = cv2.face.LBPHFaceRecognizer_create(
radius=4, threshold=(1 - config.threshold) * 1000
)
self.label_map: dict[int, str] = {}

def __build_classifier(self) -> None:
Expand Down Expand Up @@ -190,11 +192,12 @@ def classify_face(self, face_image: np.ndarray) -> Optional[tuple[str, float]]:
if not self.label_map:
self.__build_classifier()

index, distance = self.recognizer.predict(cv2.equalizeHist(cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)))
index, distance = self.recognizer.predict(
cv2.equalizeHist(cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY))
)

if index == -1:
return None

score = 1.0 - (distance / 1000)
return self.label_map[index], round(score, 2)

37 changes: 30 additions & 7 deletions web/src/pages/FaceLibrary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export default function FaceLibrary() {

// face data

const { data: faceData } = useSWR("faces");
const { data: faceData, mutate: refreshFaces } = useSWR("faces");

const faces = useMemo<string[]>(
() => (faceData ? Object.keys(faceData) : []),
Expand All @@ -47,13 +47,36 @@ export default function FaceLibrary() {
(file: File) => {
const formData = new FormData();
formData.append("file", file);
axios.post(`faces/${pageToggle}`, formData, {
headers: {
"Content-Type": "multipart/form-data",
},
});
axios
.post(`faces/${pageToggle}`, formData, {
headers: {
"Content-Type": "multipart/form-data",
},
})
.then((resp) => {
if (resp.status == 200) {
setUpload(false);
refreshFaces();
toast.success(
"Successfully uploaded iamge. View the file in the /exports folder.",
{ position: "top-center" },
);
}
})
.catch((error) => {
if (error.response?.data?.message) {
toast.error(
`Failed to upload image: ${error.response.data.message}`,
{ position: "top-center" },
);
} else {
toast.error(`Failed to upload image: ${error.message}`, {
position: "top-center",
});
}
});
},
[pageToggle],
[pageToggle, refreshFaces],
);

return (
Expand Down

0 comments on commit 6475c55

Please sign in to comment.