adidtiya commited on
Commit
610e32e
·
1 Parent(s): 0f8da20

Deploy Deepfake Shield Backend v2.0

Browse files
Files changed (1) hide show
  1. detector.py +9 -7
detector.py CHANGED
@@ -141,9 +141,10 @@ class FaceDeepfakeDetector:
141
  df1_score = self._classify_image(face_crop, model_loader.face_deepfake_model)
142
  df2_score = self._classify_image(face_crop, model_loader.face_deepfake_model_2)
143
 
144
- # Gunakan rata-rata berbobot sama dari kedua model deepfake
145
- # Keduanya dirancang untuk wajah, sehingga rata-ratanya lebih kuat.
146
- score = (df1_score + df2_score) / 2.0
 
147
 
148
  face_scores.append(score)
149
  face_boxes.append([x1, y1, x2 - x1, y2 - y1])
@@ -154,16 +155,17 @@ class FaceDeepfakeDetector:
154
  # Oleh karena itu, prioritas utama adalah skor dari potongan wajah.
155
 
156
  if len(face_scores) > 0:
157
- # Jika ada wajah terdeteksi, kita ambil skor terendah (probabilitas REAL terkecil).
158
- # Karena jika ada 1 saja wajah yang FAKE, maka seluruh gambar/video dianggap FAKE.
159
- representative_score = float(min(face_scores))
 
160
 
161
  # Kita tidak mencampur dengan full_frame_score karena model wajah tidak cocok
162
  # untuk full-frame yang memiliki background luas (sering salah tebak REAL).
163
 
164
  logger.info(
165
  f"📊 Skor Wajah={[round(s,3) for s in face_scores]} "
166
- f"-> Final Score (Min)={representative_score:.3f}"
167
  )
168
  else:
169
  # Jika sama sekali tidak ada wajah, sebagai fallback kita cek full frame.
 
141
  df1_score = self._classify_image(face_crop, model_loader.face_deepfake_model)
142
  df2_score = self._classify_image(face_crop, model_loader.face_deepfake_model_2)
143
 
144
+ # Model 2 (Prithiv) sering memberikan 'False Positive' pada wajah asli yang jernih.
145
+ # Jadi kita berikan bobot lebih besar ke Model 1 (Wvolf) yang lebih seimbang.
146
+ # Bobot: 70% Model 1, 30% Model 2.
147
+ score = (df1_score * 0.7) + (df2_score * 0.3)
148
 
149
  face_scores.append(score)
150
  face_boxes.append([x1, y1, x2 - x1, y2 - y1])
 
155
  # Oleh karena itu, prioritas utama adalah skor dari potongan wajah.
156
 
157
  if len(face_scores) > 0:
158
+ # Jika ada banyak wajah, mengambil min() akan menyebabkan foto grup yang asli
159
+ # menjadi FAKE hanya karena 1 wajah buram/menghadap samping (skor rendah).
160
+ # Menggunakan rata-rata (mean) jauh lebih stabil untuk foto grup.
161
+ representative_score = float(np.mean(face_scores))
162
 
163
  # Kita tidak mencampur dengan full_frame_score karena model wajah tidak cocok
164
  # untuk full-frame yang memiliki background luas (sering salah tebak REAL).
165
 
166
  logger.info(
167
  f"📊 Skor Wajah={[round(s,3) for s in face_scores]} "
168
+ f"-> Final Score (Mean)={representative_score:.3f}"
169
  )
170
  else:
171
  # Jika sama sekali tidak ada wajah, sebagai fallback kita cek full frame.