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,20 +205,24 @@ 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 second_df = float(df_values[df_sorted[1][0]]) if len(df_sorted) > 1 else -999.0
df_margin = top_df - second_df df_margin = top_df - second_df
# === Verifikasi 1:1 === # === Verifikasi 1:N ===
# Untuk model LBP+SVM, cukup cek skor OVR user sendiri. # Mengecek apakah prediksi tertinggi adalah user yang login
# Gap check dihapus karena terlalu ketat untuk variasi pencahayaan/sudut. # dan memastikan skornya memenuhi threshold
gap = top_df - user_df if predicted_class != expected_user else 0.0 gap = top_df - second_df if len(df_sorted) > 1 else top_df
if user_df >= DF_APPROVED: if predicted_class == expected_user:
if top_df >= DF_APPROVED:
status = "APPROVED" status = "APPROVED"
is_match = True is_match = True
elif user_df >= DF_PENDING: elif top_df >= DF_PENDING:
status = "PENDING" status = "PENDING"
is_match = True is_match = True
else: else:
status = "REJECTED" status = "REJECTED"
is_match = False is_match = False
else:
status = "REJECTED"
is_match = False
return { return {
'is_match': is_match, 'is_match': is_match,
@ -329,8 +333,7 @@ def verify_face(model_dir, user_id, input_path, is_video=False):
"frames_pending": aggregated['frames_pending'], "frames_pending": aggregated['frames_pending'],
"frames_rejected": aggregated['frames_rejected'], "frames_rejected": aggregated['frames_rejected'],
"approved_ratio": aggregated['approved_ratio'], "approved_ratio": aggregated['approved_ratio'],
"predicted_user": expected_user if aggregated['match'] else "unknown", "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)),
"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)),
"expected_user": expected_user, "expected_user": expected_user,
"user_id": int(user_id) if str(user_id).isdigit() else str(user_id), "user_id": int(user_id) if str(user_id).isdigit() else str(user_id),
"message": None, "message": None,