1:N
This commit is contained in:
parent
62cce21166
commit
a5f53b1256
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue