[cite_start]Đây là một hệ thống giám sát thi trực tuyến toàn diện, hoạt động trong thời gian thực (realtime)[cite: 242]. Hệ thống tích hợp 4 module AI cốt lõi chạy đồng thời nhằm tự động phát hiện các hành vi gian lận trong phòng thi:
[cite_start]Thách thức cốt lõi và trọng tâm kỹ thuật của dự án nằm ở khả năng xử lý đồng thời (Concurrency) và tối ưu hiệu suất, đảm bảo tốc độ xử lý nhanh, không gây giật lag hay tụt FPS[cite: 244]. [cite_start]Hệ thống được thiết kế theo kiến trúc Micro-Monolith, sử dụng các công nghệ hiện đại nhất hiện nay bao gồm FastAPI cho Backend, Streamlit cho Frontend, cùng mạng WebRTC và WebSocket để giao tiếp dữ liệu[cite: 245].
[cite_start]Dự án được tổ chức theo mô hình Micro-Monolith (tách biệt rõ Frontend và Backend nhưng vẫn nằm trong cùng một kho lưu trữ), giúp dễ dàng quản lý, gỡ lỗi và mở rộng[cite: 246].
exam_proctoring_system/
├── backend/
│ ├── main.py
│ ├── api/
│ │ ├── endpoints_webrtc.py
│ │ └── endpoints_ws.py
│ ├── ai_services/
│ │ ├── pose_gaze/
│ │ ├── object_detect/
│ │ ├── face_verify/
│ │ └── audio_whisper/
│ └── core/
│ └── config.py
├── frontend/
│ ├── app.py
│ └── components/
│ ├── student_view.py
│ └── proctor_dashboard.py
├── weights/
│ ├── yolov8_finetuned.pt
│ └── whisper_tiny.pt
├── data/
│ └── student_faces/
├── .env
├── requirements.txt
└── README.md
| File / Thư mục | Chức năng chi tiết |
|---|---|
backend/ | [cite_start]Thư mục chứa toàn bộ logic xử lý của FastAPI, nơi quản lý kết nối và điều phối dữ liệu[cite: 271]. |
backend/main.py | [cite_start]Tệp gốc để khởi chạy máy chủ Backend[cite: 272]. |
backend/api/ | [cite_start]Nơi định nghĩa các luồng mở kết nối mạng, nhận video frame và gửi cảnh báo[cite: 273]. |
api/endpoints_webrtc.py | [cite_start]Quản lý kết nối WebRTC để truyền luồng video từ thí sinh lên server mượt mà[cite: 274]. |
api/endpoints_ws.py | [cite_start]Quản lý kết nối WebSocket để server bắn các cảnh báo gian lận ngược về dạng Text/JSON[cite: 275]. |
backend/ai_services/ | [cite_start]Chứa các script chạy độc lập từng module AI, giúp dễ dàng bảo trì hoặc thay thế mô hình[cite: 276]. |
ai_services/pose_gaze.py | [cite_start]Module tính góc Euler từ MediaPipe để tìm hướng nhìn của sinh viên[cite: 277]. |
ai_services/object_detect.py | [cite_start]Module chạy mô hình YOLOv8 phát hiện vật thể[cite: 278]. |
ai_services/face_verify.py | [cite_start]Module xử lý nhận diện danh tính và so sánh khuôn mặt[cite: 279]. |
ai_services/audio_whisper.py | [cite_start]Module xử lý Audio Chunking, VAD và mồi cho Whisper AI[cite: 280]. |
backend/core/config.py | [cite_start]Chứa các biến cấu hình và tham số hệ thống[cite: 281]. |
frontend/ | [cite_start]Chứa mã nguồn Streamlit để hiển thị giao diện luồng giám sát[cite: 282]. |
frontend/app.py | [cite_start]Tệp gốc khởi chạy ứng dụng web giao diện[cite: 283]. |
frontend/components/ | [cite_start]Chứa các module giao diện như màn hình làm bài của thí sinh và bảng điều khiển (Dashboard) của giám thị[cite: 284]. |
weights/ | [cite_start]Nơi lưu trữ các file trọng số (model weights) tĩnh của AI, giúp tách biệt code và dữ liệu mô hình[cite: 285]. |
data/student_faces/ | [cite_start]Thư mục lưu trữ ảnh gốc hoặc Face Vector đã trích xuất sẵn của thí sinh, dùng để so sánh Cosine Similarity tìm người lạ[cite: 286]. |
.env | [cite_start]Tệp tin ẩn dùng để lưu trữ các biến môi trường bảo mật (Mật khẩu, Port, API Key)[cite: 287]. |
requirements.txt | [cite_start]Danh sách liệt kê các thư viện Python (dependencies) cần thiết để chạy dự án[cite: 288]. |
README.md | [cite_start]Tệp tài liệu hiện tại chứa mô tả và hướng dẫn về dự án[cite: 289]. |
uv run -m backend.main
CountBasedPaperMonitor)object_detect_every_n_frames = 2 (trong backend/core/config.py), giúp hệ thống quét vật thể thường xuyên hơn và phản hồi nhanh hơn ~4.3 giây so với cấu hình cũ.0.20.0.15 nhằm phát hiện các tờ phao nhỏ/bị che khuất một phần.cluster_papers): Thiết lập duplicate_center_distance_ratio = 0.70 tránh gộp nhầm 2 tờ giấy ở sát nhau thành 1.owner_person_id). Bất kỳ thí sinh nào có số giấy vượt mức baseline riêng của mình sẽ lập tức bị cờ đỏ cảnh báo.suspicious_new_paper): Đánh dấu đỏ cheat_sheet NEW cho tờ phao mới ngay khi xuất hiện mà không bị hoãn giao diện chờ debounce streak.baseline_clusters) khi có sự cố học sinh rút thêm phao.[cite_start]Đây là một hệ thống giám sát thi trực tuyến toàn diện, hoạt động trong thời gian thực (realtime)[cite: 242]. Hệ thống tích hợp 4 module AI cốt lõi chạy đồng thời nhằm tự động phát hiện các hành vi gian lận trong phòng thi:
[cite_start]Thách thức cốt lõi và trọng tâm kỹ thuật của dự án nằm ở khả năng xử lý đồng thời (Concurrency) và tối ưu hiệu suất, đảm bảo tốc độ xử lý nhanh, không gây giật lag hay tụt FPS[cite: 244]. [cite_start]Hệ thống được thiết kế theo kiến trúc Micro-Monolith, sử dụng các công nghệ hiện đại nhất hiện nay bao gồm FastAPI cho Backend, Streamlit cho Frontend, cùng mạng WebRTC và WebSocket để giao tiếp dữ liệu[cite: 245].
[cite_start]Dự án được tổ chức theo mô hình Micro-Monolith (tách biệt rõ Frontend và Backend nhưng vẫn nằm trong cùng một kho lưu trữ), giúp dễ dàng quản lý, gỡ lỗi và mở rộng[cite: 246].
exam_proctoring_system/
├── backend/
│ ├── main.py
│ ├── api/
│ │ ├── endpoints_webrtc.py
│ │ └── endpoints_ws.py
│ ├── ai_services/
│ │ ├── pose_gaze/
│ │ ├── object_detect/
│ │ ├── face_verify/
│ │ └── audio_whisper/
│ └── core/
│ └── config.py
├── frontend/
│ ├── app.py
│ └── components/
│ ├── student_view.py
│ └── proctor_dashboard.py
├── weights/
│ ├── yolov8_finetuned.pt
│ └── whisper_tiny.pt
├── data/
│ └── student_faces/
├── .env
├── requirements.txt
└── README.md
| File / Thư mục | Chức năng chi tiết |
|---|---|
backend/ | [cite_start]Thư mục chứa toàn bộ logic xử lý của FastAPI, nơi quản lý kết nối và điều phối dữ liệu[cite: 271]. |
backend/main.py | [cite_start]Tệp gốc để khởi chạy máy chủ Backend[cite: 272]. |
backend/api/ | [cite_start]Nơi định nghĩa các luồng mở kết nối mạng, nhận video frame và gửi cảnh báo[cite: 273]. |
api/endpoints_webrtc.py | [cite_start]Quản lý kết nối WebRTC để truyền luồng video từ thí sinh lên server mượt mà[cite: 274]. |
api/endpoints_ws.py | [cite_start]Quản lý kết nối WebSocket để server bắn các cảnh báo gian lận ngược về dạng Text/JSON[cite: 275]. |
backend/ai_services/ | [cite_start]Chứa các script chạy độc lập từng module AI, giúp dễ dàng bảo trì hoặc thay thế mô hình[cite: 276]. |
ai_services/pose_gaze.py | [cite_start]Module tính góc Euler từ MediaPipe để tìm hướng nhìn của sinh viên[cite: 277]. |
ai_services/object_detect.py | [cite_start]Module chạy mô hình YOLOv8 phát hiện vật thể[cite: 278]. |
ai_services/face_verify.py | [cite_start]Module xử lý nhận diện danh tính và so sánh khuôn mặt[cite: 279]. |
ai_services/audio_whisper.py | [cite_start]Module xử lý Audio Chunking, VAD và mồi cho Whisper AI[cite: 280]. |
backend/core/config.py | [cite_start]Chứa các biến cấu hình và tham số hệ thống[cite: 281]. |
frontend/ | [cite_start]Chứa mã nguồn Streamlit để hiển thị giao diện luồng giám sát[cite: 282]. |
frontend/app.py | [cite_start]Tệp gốc khởi chạy ứng dụng web giao diện[cite: 283]. |
frontend/components/ | [cite_start]Chứa các module giao diện như màn hình làm bài của thí sinh và bảng điều khiển (Dashboard) của giám thị[cite: 284]. |
weights/ | [cite_start]Nơi lưu trữ các file trọng số (model weights) tĩnh của AI, giúp tách biệt code và dữ liệu mô hình[cite: 285]. |
data/student_faces/ | [cite_start]Thư mục lưu trữ ảnh gốc hoặc Face Vector đã trích xuất sẵn của thí sinh, dùng để so sánh Cosine Similarity tìm người lạ[cite: 286]. |
.env | [cite_start]Tệp tin ẩn dùng để lưu trữ các biến môi trường bảo mật (Mật khẩu, Port, API Key)[cite: 287]. |
requirements.txt | [cite_start]Danh sách liệt kê các thư viện Python (dependencies) cần thiết để chạy dự án[cite: 288]. |
README.md | [cite_start]Tệp tài liệu hiện tại chứa mô tả và hướng dẫn về dự án[cite: 289]. |
uv run -m backend.main
CountBasedPaperMonitor)object_detect_every_n_frames = 2 (trong backend/core/config.py), giúp hệ thống quét vật thể thường xuyên hơn và phản hồi nhanh hơn ~4.3 giây so với cấu hình cũ.0.20.0.15 nhằm phát hiện các tờ phao nhỏ/bị che khuất một phần.cluster_papers): Thiết lập duplicate_center_distance_ratio = 0.70 tránh gộp nhầm 2 tờ giấy ở sát nhau thành 1.owner_person_id). Bất kỳ thí sinh nào có số giấy vượt mức baseline riêng của mình sẽ lập tức bị cờ đỏ cảnh báo.suspicious_new_paper): Đánh dấu đỏ cheat_sheet NEW cho tờ phao mới ngay khi xuất hiện mà không bị hoãn giao diện chờ debounce streak.baseline_clusters) khi có sự cố học sinh rút thêm phao.