This commit is contained in:
jouel88 2026-05-04 22:33:34 +07:00
parent 62cce21166
commit a5f53b1256
1 changed files with 15 additions and 12 deletions

View File

@ -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,