achmadichzan commited on
Commit
c6472e1
·
verified ·
1 Parent(s): a130845

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +22 -5
src/streamlit_app.py CHANGED
@@ -34,7 +34,7 @@ if uploaded_video is not None:
34
  # Inisialisasi hitungan emosi
35
  emotion_counts = {
36
  "Happy": 0, "Neutral": 0, "Angry": 0,
37
- "Sad": 0, "Surprised": 0, "Fear": 0, "Disgust": 0, "Contempt": 0
38
  }
39
  total_detections = 0
40
 
@@ -48,6 +48,10 @@ if uploaded_video is not None:
48
 
49
  frame_idx = 0
50
 
 
 
 
 
51
  # 3. PROSES LOOPING VIDEO (TWO-STAGE DETECTION + TRACKING)
52
  while cap.isOpened():
53
  ret, frame = cap.read()
@@ -57,8 +61,18 @@ if uploaded_video is not None:
57
  frame_idx += 1
58
  progress_bar.progress(frame_idx / total_frames)
59
 
 
 
 
 
 
 
 
 
 
 
 
60
  # --- TAHAP 1: Deteksi & Lacak Wajah dengan YOLOv11-Face Tracking ---
61
- # Menggunakan .track() dan persist=True agar ID wajah tetap konsisten antar frame
62
  face_results = face_model.track(frame, conf=0.4, persist=True, verbose=False)
63
 
64
  for r_face in face_results:
@@ -74,6 +88,10 @@ if uploaded_video is not None:
74
  # Ambil koordinat kotak pembatas
75
  x1, y1, x2, y2 = map(int, box)
76
 
 
 
 
 
77
  # Potong area wajah dari frame (Crop)
78
  face_crop = frame[y1:y2, x1:x2]
79
 
@@ -103,12 +121,11 @@ if uploaded_video is not None:
103
  # --- 4. TAMPILKAN RINGKASAN DATA (TERMASUK TOTAL WAJAH) ---
104
  st.subheader("Ringkasan Hasil Analisis")
105
 
106
- # Menggunakan kolom metrik Streamlit agar terlihat profesional
107
  col1, col2 = st.columns(2)
108
  with col1:
109
  st.metric(label="Total Wajah/Siswa Terdeteksi", value=f"{len(unique_face_ids)} Orang")
110
  with col2:
111
- st.metric(label="Total Deteksi Emosi (Frame akumulatif)", value=f"{total_detections} Kali")
112
 
113
  st.write("---")
114
 
@@ -171,4 +188,4 @@ if uploaded_video is not None:
171
  "memperlambat tempo penjelasan pada pertemuan berikutnya."
172
  )
173
  else:
174
- st.error("❌ Tidak ada wajah siswa yang terdeteksi di dalam video. Pastikan kualitas video cukup jelas.")
 
34
  # Inisialisasi hitungan emosi
35
  emotion_counts = {
36
  "Happy": 0, "Neutral": 0, "Angry": 0,
37
+ "Sad": 0, "Surprised": 0, "Fear": 0, "Disgust": 0
38
  }
39
  total_detections = 0
40
 
 
48
 
49
  frame_idx = 0
50
 
51
+ # --- KONFIGURASI OPTIMASI CPU ---
52
+ FRAME_SKIP = 5 # Analisis 1 dari setiap 5 frame (Mempercepat hingga 5x lipat)
53
+ TARGET_WIDTH = 640 # Mengecilkan resolusi frame agar inferensi YOLO jauh lebih ringan
54
+
55
  # 3. PROSES LOOPING VIDEO (TWO-STAGE DETECTION + TRACKING)
56
  while cap.isOpened():
57
  ret, frame = cap.read()
 
61
  frame_idx += 1
62
  progress_bar.progress(frame_idx / total_frames)
63
 
64
+ # --- OPTIMASI 1: FRAME SKIPPING ---
65
+ if frame_idx % FRAME_SKIP != 0:
66
+ continue # Lewati deteksi YOLO pada frame ini untuk menghemat CPU
67
+
68
+ # --- OPTIMASI 2: RESIZE FRAME ---
69
+ # Menjaga aspek rasio video tetap proporsional saat diperkecil
70
+ h, w = frame.shape[:2]
71
+ aspect_ratio = h / w
72
+ target_height = int(TARGET_WIDTH * aspect_ratio)
73
+ frame = cv2.resize(frame, (TARGET_WIDTH, target_height))
74
+
75
  # --- TAHAP 1: Deteksi & Lacak Wajah dengan YOLOv11-Face Tracking ---
 
76
  face_results = face_model.track(frame, conf=0.4, persist=True, verbose=False)
77
 
78
  for r_face in face_results:
 
88
  # Ambil koordinat kotak pembatas
89
  x1, y1, x2, y2 = map(int, box)
90
 
91
+ # Pastikan koordinat berada di dalam batas frame setelah di-resize
92
+ x1, y1 = max(0, x1), max(0, y1)
93
+ x2, y2 = min(TARGET_WIDTH, x2), min(target_height, y2)
94
+
95
  # Potong area wajah dari frame (Crop)
96
  face_crop = frame[y1:y2, x1:x2]
97
 
 
121
  # --- 4. TAMPILKAN RINGKASAN DATA (TERMASUK TOTAL WAJAH) ---
122
  st.subheader("Ringkasan Hasil Analisis")
123
 
 
124
  col1, col2 = st.columns(2)
125
  with col1:
126
  st.metric(label="Total Wajah/Siswa Terdeteksi", value=f"{len(unique_face_ids)} Orang")
127
  with col2:
128
+ st.metric(label="Total Deteksi Emosi (Sampel Terpilih)", value=f"{total_detections} Kali")
129
 
130
  st.write("---")
131
 
 
188
  "memperlambat tempo penjelasan pada pertemuan berikutnya."
189
  )
190
  else:
191
+ st.error("❌ Tidak ada wajah siswa yang terdeteksi di dalam video. Pastikan kualitas video cukup jelas.")