From a5f53b125624304fa4d372ee6dec3007f4eae45d Mon Sep 17 00:00:00 2001 From: jouel88 Date: Mon, 4 May 2026 22:33:34 +0700 Subject: [PATCH] 1:N --- services/verify_service.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/services/verify_service.py b/services/verify_service.py index 93b4f7a..56b3bb8 100644 --- a/services/verify_service.py +++ b/services/verify_service.py @@ -205,17 +205,21 @@ def _classify_frame(features, svm, scaler, expected_user): second_df = float(df_values[df_sorted[1][0]]) if len(df_sorted) > 1 else -999.0 df_margin = top_df - second_df - # === Verifikasi 1:1 === - # Untuk model LBP+SVM, cukup cek skor OVR user sendiri. - # Gap check dihapus karena terlalu ketat untuk variasi pencahayaan/sudut. - gap = top_df - user_df if predicted_class != expected_user else 0.0 + # === Verifikasi 1:N === + # Mengecek apakah prediksi tertinggi adalah user yang login + # dan memastikan skornya memenuhi threshold + gap = top_df - second_df if len(df_sorted) > 1 else top_df - if user_df >= DF_APPROVED: - status = "APPROVED" - is_match = True - elif user_df >= DF_PENDING: - status = "PENDING" - is_match = True + if predicted_class == expected_user: + if top_df >= DF_APPROVED: + status = "APPROVED" + is_match = True + elif top_df >= DF_PENDING: + status = "PENDING" + is_match = True + else: + status = "REJECTED" + is_match = False else: status = "REJECTED" is_match = False @@ -329,8 +333,7 @@ def verify_face(model_dir, user_id, input_path, is_video=False): "frames_pending": aggregated['frames_pending'], "frames_rejected": aggregated['frames_rejected'], "approved_ratio": aggregated['approved_ratio'], - "predicted_user": expected_user if aggregated['match'] else "unknown", - "actual_predicted": max(set(r['predicted_class'] for r in frame_results), key=lambda c: sum(1 for r in frame_results if r['predicted_class'] == c)), + "predicted_user": max(set(r['predicted_class'] for r in frame_results), key=lambda c: sum(1 for r in frame_results if r['predicted_class'] == c)), "expected_user": expected_user, "user_id": int(user_id) if str(user_id).isdigit() else str(user_id), "message": None,