Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion data/videos/input_video.mp4

This file was deleted.

Binary file modified requirements.txt
Binary file not shown.
4 changes: 2 additions & 2 deletions src/config/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
DATA_PATH = os.path.join(BASE_DIR, "data")
PROCESSED_PATH = os.path.join(DATA_PATH, "processed")
EMBEDDINGS_PATH = os.path.join( DATA_PATH, "embeddings", "all_embeddings.pkl")
VIDEO_PATH = os.path.join(DATA_PATH, "videos", "input_video.mp4")
VIDEO_PATH = os.path.join(DATA_PATH, "videos", "taylor.mp4")
RESULTS_PATH = os.path.join(DATA_PATH, "results")
TEST = os.path.join(DATA_PATH, "raw")
THRESHOLD = 0.6 # Ngưỡng so sánh embeddings
VIDEO_RESOLUTION = (640, 480)

FACE_DETECTION_CONFIDENCE = 0.54

8 changes: 6 additions & 2 deletions src/detection/detect_faces.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@
from ultralytics import YOLO
import time
import os
import sys

from src.recognition.recognize_faces import load_reference_embeddings, recognize_faces
# Thêm đường dẫn gốc vào sys.path
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(f'{base_dir}/src')

from recognition.recognize_faces import load_reference_embeddings, recognize_faces

MODEL_PATH = 'yolov11n-face.pt'
MODEL_PATH = os.path.join(base_dir, 'yolov11n-face.pt')

try:
print(f"Đang tải mô hình YOLO từ '{MODEL_PATH}', vui lòng đợi...")
Expand Down
1 change: 0 additions & 1 deletion src/detection/utils.py

This file was deleted.

204 changes: 0 additions & 204 deletions src/detection/vanuoc.py

This file was deleted.

20 changes: 0 additions & 20 deletions src/embeddings/compare_embeddings.py

This file was deleted.

56 changes: 41 additions & 15 deletions src/embeddings/extract_embeddings.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
import os
import numpy as np
import pickle
from deepface import DeepFace
from tqdm import tqdm
import sys
import cv2
from facenet_pytorch import MTCNN, InceptionResnetV1
from PIL import Image

# Thêm đường dẫn đến thư mục chứa config
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(f'{base_dir}/src') # Thêm đúng thư mục chứa module
from config.config import PROCESSED_PATH, EMBEDDINGS_PATH

def extract_all_embeddings(processed_root=PROCESSED_PATH, save_path=EMBEDDINGS_PATH, model_name="Facenet"):
"""
Duyệt qua tất cả thư mục con (mỗi người), trích xuất embedding từ từng ảnh,
gắn nhãn tương ứng và lưu vào file pickle.
"""
sys.path.append(f'{base_dir}/src')
try:
from config.config import PROCESSED_PATH, EMBEDDINGS_PATH
except ImportError as e:
print(f"Lỗi khi import config: {e}")
sys.exit(1)

# Khởi tạo MTCNN (phát hiện khuôn mặt) và InceptionResnetV1 (trích xuất embedding)
try:
mtcnn = MTCNN(image_size=160, margin=0, min_face_size=20, device='cpu')
resnet = InceptionResnetV1(pretrained='vggface2').eval().to('cpu')
except Exception as e:
print(f"Lỗi khi khởi tạo mô hình: {e}")
sys.exit(1)


def extract_all_embeddings(processed_root=PROCESSED_PATH, save_path=EMBEDDINGS_PATH):
all_embeddings = []
labels = []

Expand All @@ -25,18 +38,31 @@ def extract_all_embeddings(processed_root=PROCESSED_PATH, save_path=EMBEDDINGS_P
for img_file in tqdm(image_files, desc=f"📸 {person}", leave=False):
img_path = os.path.join(person_path, img_file)
try:
embedding = DeepFace.represent(img_path=img_path, model_name=model_name)[0]["embedding"]
all_embeddings.append(embedding)
labels.append(person)
# Đọc và chuyển ảnh sang định dạng PIL
img = Image.open(img_path).convert('RGB')

# Phát hiện khuôn mặt bằng MTCNN
boxes, probs = mtcnn.detect(img)
if boxes is not None and probs[0] > 0.9: # Chỉ lấy khuôn mặt có độ tin cậy cao
# Trích xuất khuôn mặt và embedding
face = mtcnn(img) # Tự động căn chỉnh khuôn mặt
if face is not None:
embedding = resnet(face.unsqueeze(0)).detach().cpu().numpy()[0]
all_embeddings.append(embedding)
labels.append(person)
else:
print(f"⚠️ Không trích xuất được khuôn mặt từ {img_file}")
else:
print(f"⚠️ Không tìm thấy khuôn mặt trong {img_file}")
except Exception as e:
print(f"⚠️ Lỗi khi xử lý ảnh {img_file} của {person}: {e}")

# Lưu kết quả
# Lưu kết quả vào file .pkl
with open(save_path, "wb") as f:
pickle.dump({"embeddings": all_embeddings, "labels": labels}, f)
print(f"\n✅ Đã lưu {len(all_embeddings)} embeddings vào '{save_path}'")

# Cho phép chạy trực tiếp

# Chạy trực tiếp
if __name__ == "__main__":
extract_all_embeddings()

4 changes: 2 additions & 2 deletions src/embeddings/test.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import os
import pickle
from extract_embeddings import extract_all_embeddings

base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# Đường dẫn tương đối từ src/embeddings
pkl_file = os.path.join("..", "..", "data", "embeddings", "all_embeddings.pkl")
pkl_file = os.path.join(base_dir, "data", "embeddings", "all_embeddings.pkl")

print("Thư mục làm việc hiện tại:", os.getcwd())
print("Đường dẫn file:", os.path.abspath(pkl_file))
Expand Down
Loading