Ước lượng ánh nhìn

Ước lượng ánh nhìn trả về hướng nhìn cho mọi khuôn mặt trong ảnh. LibreYOLO biểu diễn đây là tác vụ hai giai đoạn: face detector chạy trước, sau đó gaze head đọc pitch và yaw từ từng vùng khuôn mặt được trả về.

Định nghĩa

Ước lượng ánh nhìn trả về hai góc cho mỗi khuôn mặt. result.gaze là payload Gaze có shape (N, 2), cột 0 là pitch và cột 1 là yaw theo radian, được căn chỉnh từng dòng với result.boxes, tức các hộp khuôn mặt đã phát hiện. Quy ước giống với L2CS-Net: yaw dương xoay ánh nhìn về bên trái của chủ thể, pitch dương xoay xuống dưới.

Cùng payload cung cấp pitch_degyaw_deg cho đơn vị độ, cùng direction_3d, một vector đơn vị (N, 3) trong hệ tọa độ camera với các cột (x, y, z).

Vì đây là tác vụ hai giai đoạn, một dự đoán phụ thuộc vào hai mô hình. Khuôn mặt mà detector bỏ sót không có dòng ánh nhìn, còn hộp bị đặt sai tạo góc từ vùng khuôn mặt được crop sai. Key tác vụ chuẩn là gaze; gaze-estimation được chuẩn hóa về key đó.

Mô hình

L2CS-Net là family duy nhất phục vụ tác vụ này. Nó ghép ResNet trunk với hai classification head song song theo bin góc, một cho pitch và một cho yaw, trên vùng khuôn mặt 448x448. Năm độ sâu backbone được hỗ trợ về mặt kiến trúc, và một trong số đó, ResNet-50, có checkpoint đã công bố.

Trọng số có hạn chế về giấy phép. Chúng được huấn luyện trên Gaze360, có giấy phép chỉ cho phép sử dụng nghiên cứu và phi thương mại, đồng thời cấm phân phối lại, vì vậy LibreYOLO không mirror gì cho family này. Checkpoint duy nhất thư viện có thể tự động tải đến thẳng từ bản phân phối Google Drive riêng của tác giả qua gdown, sau khi in điều khoản giấy phép. Hãy đọc L2CS-Net trước khi triển khai.

Đường dẫn tải đó cần thành phần bổ sung gaze:

bash
pip install "libreyolo[gaze]"

Nếu thiếu, thư viện in hướng dẫn tải thủ công thay vì thử truyền dữ liệu. Dự đoán bằng checkpoint bạn đã có và xuất checkpoint đó không cần thành phần bổ sung nào.

Dự đoán

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Khi không cung cấp face_detector, dự đoán quay về detector đi kèm# OpenCV, vì vậy ngoài checkpoint sẽ không tải thêm gì.model = LibreYOLO("LibreL2CSr50.pt")result = model(SAMPLE_IMAGE) gaze = result.gazeprint(gaze.pitch, gaze.yaw)              # radian, mỗi khuôn mặt một dòngprint(gaze.pitch_deg, gaze.yaw_deg)      # cùng các góc đó theo độprint(gaze.direction_3d)                 # vector đơn vị (N, 3)
CLI
# Khác với đường dẫn Python, CLI không có fallback tự động: mô hình gaze# yêu cầu face detector tường minh, và đó phải là detector LibreYOLO# có các hộp biểu thị khuôn mặt.libreyolo predict model=LibreL2CSr50.pt source=photo.jpg face_detector=face-detector.pt save=True
Chọn nguồn khuôn mặt
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreL2CSr50.pt") # Truyền cho gaze head các hộp từ detector bạn đã chạy.result = model(SAMPLE_IMAGE, face_boxes=[[34, 12, 90, 80]]) # Hoặc nêu tên một trong các detector đi kèm.result = model(SAMPLE_IMAGE, face_detector="yunet")

Nguồn khuôn mặt được chọn theo một trong ba cách. face_boxes truyền các hộp bạn đã tính và bỏ qua phát hiện. face_detector nhận "auto", "haar", "yunet", mô hình phát hiện LibreYOLO hoặc callable thuần, và có thể được đặt trên constructor hoặc theo từng lời gọi. Khi không đặt trong Python, dự đoán quay về detector đi kèm OpenCV, vì vậy lời gọi rút gọn hoạt động mà không cần nối thêm gì. Trên OpenCV 4, đó là Haar cascade nằm trong wheel và hoàn toàn không cần tải; trên OpenCV 5, nơi API Haar đã bị xóa, đó là YuNet, công cụ tải một tệp mô hình nhỏ từ OpenCV zoo một lần.

CLI không dùng chung fallback đó. libreyolo predict từ chối mô hình gaze không có face_detector=, còn giá trị nhận được là tên detector LibreYOLO hoặc đường dẫn checkpoint. Xem dự đoán để biết về nguồn, stream và cách xử lý kết quả.

Huấn luyện

Không family nào trong tác vụ này huấn luyện bên trong LibreYOLO. LibreL2CS.train() phát sinh lỗi: hãy huấn luyện tại dự án L2CS-Net upstream và nạp state dict kết quả tại đây.

Xác thực

Việc xác thực trên dataset có ground truth ánh nhìn nằm ngoài phạm vi, và val() phát sinh lỗi thay vì trả về các metric không được tính. Tác vụ này không có dictionary metrics/. Hãy đánh giá ở upstream trên dataset dùng để huấn luyện checkpoint.

Xuất

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreL2CSr50.pt")model.export(format="onnx")
CLI
libreyolo export model=LibreL2CSr50.pt format=onnx

Hợp đồng xuất gaze bao gồm ONNX, TorchScript, ExecuTorch, TensorRT và OpenVINO. Phần rời khỏi thư viện chỉ là ResNet trunk và hai head bin góc: graph nhận vùng khuôn mặt 448x448 đã tiền xử lý và trả về logit yaw cùng pitch thô. Phát hiện khuôn mặt, crop, softmax, kỳ vọng bin và chuyển đổi thành góc đều ở lại trong Python, tại libreyolo.models.l2cs.utils. Xem xuất để biết các định dạng và đối số.

Đã kiểm chứng với LibreYOLO v1.5.0.