Estimasi pandangan

Estimasi pandangan mengembalikan arah pandangan untuk setiap wajah dalam gambar. LibreYOLO memodelkannya sebagai task dua tahap: detektor wajah dijalankan terlebih dahulu, dan pandangan head membaca pitch dan yaw dari setiap potongan wajah yang dikembalikan.

Definisi

Estimasi pandangan mengembalikan dua sudut per wajah. result.gaze adalah muatan Gaze berbentuk (N, 2), kolom 0 pitch dan kolom 1 yaw, dalam radian, disusun baris per baris dengan result.boxes, kotak wajah yang terdeteksi. Konvensinya adalah yang L2CS-Net menggunakan: yaw positif memutar pandangan ke arah kiri subjek, pitch positif memutarnya ke bawah.

Payload yang sama mengekspos pitch_deg dan yaw_deg untuk derajat, dan direction_3d, sebuah (N, 3) vektor satuan dalam frame kamera dengan kolom (x, y, z).

Karena task adalah dua tahap, prediksi bergantung pada dua model. Wajah yang terlewat oleh detektor tidak memiliki baris pandangan, dan kotak yang ditempatkan dengan buruk menghasilkan sudut dari wajah yang dipotong dengan buruk. Kunci task kanonik adalah gaze; gaze-estimation menormalkannya.

Model

L2CS-Net adalah satu-satunya family yang melayani task ini. Ini memasangkan sebuah Trunk ResNet dengan dua kepala klasifikasi bin-sudut paralel, satu untuk pitch dan satu untuk yaw, di atas 448x448 potongan wajah. Lima kedalaman backbone didukung Secara arsitektural, dan salah satunya, ResNet-50, memiliki checkpoint yang dipublikasikan.

Bobot tersebut memiliki batasan lisensi. Mereka dilatih pada Gaze360, yang lisensi hanya mengizinkan penelitian dan penggunaan non-komersial serta melarang redistribusi, jadi LibreYOLO tidak mencerminkan apa pun untuk family ini. Satu checkpoint perpustakaan dapat mengambil secara otomatis langsung dari Google milik penulis Distribusikan drive, melalui gdown, setelah mencetak syarat lisensi. Baca L2CS-Net sebelum menyebarkannya.

Jalur unduhan itu memerlukan tambahan gaze:

bash
pip install "libreyolo[gaze]"

Tanpanya, pustaka mencetak instruksi unduhan manual alih-alih mencoba transfer. Melakukan prediksi dan mengekspor checkpoint yang sudah Anda miliki tidak memerlukan tambahan sama sekali.

Prediksi

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Tanpa face_detector yang diberikan, prediksi kembali menggunakan detektor bawaan OpenCV# sehingga tidak ada yang diunduh selain checkpoint.model = LibreYOLO("LibreL2CSr50.pt")result = model(SAMPLE_IMAGE) gaze = result.gazeprint(gaze.pitch, gaze.yaw)              # radian, satu baris per wajahprint(gaze.pitch_deg, gaze.yaw_deg)      # sudut yang sama dalam derajatprint(gaze.direction_3d)                 # (N, 3) vektor satuan
CLI
# Tidak seperti jalur Python, CLI tidak memiliki cadangan otomatis: pandangan# model memerlukan detektor wajah yang eksplisit, dan itu harus# LibreYOLO detektor yang kotaknya adalah wajah.libreyolo predict model=LibreL2CSr50.pt source=photo.jpg face_detector=face-detector.pt save=True
Pilih sumber wajah
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreL2CSr50.pt") # Berikan kotak head pandangan dari detektor yang sudah Anda jalankan.result = model(SAMPLE_IMAGE, face_boxes=[[34, 12, 90, 80]]) # Atau sebutkan salah satu detektor yang sudah disertakan.result = model(SAMPLE_IMAGE, face_detector="yunet")

Sumber wajah dipilih dengan salah satu dari tiga cara. face_boxes melewati kotak yang sudah Anda hitung dan melewati deteksi. face_detector menerima "auto", "haar", "yunet", model deteksi LibreYOLO, atau callable biasa, dan bisa disetel pada konstruktor atau per panggilan. Jika tidak disetel di Python, prediksi akan kembali ke detektor yang dibundel OpenCV, sehingga panggilan kosong bekerja tanpa pengaturan. OpenCV 4 yaitu Haar cascade yang dikirimkan di dalam wheel, yang tidak membutuhkan unduh sama sekali; pada OpenCV 5, di mana API Haar dihapus, itu adalah YuNet, yang mengambil satu berkas model kecil dari OpenCV zoo sekali.

CLI tidak membagikan fallback itu. libreyolo predict menolak model pandangan tanpa face_detector=, dan nilai yang diambilnya adalah nama detektor LibreYOLO atau Jalur checkpoint. Lihat prediksi untuk sumber, streaming dan penanganan hasil.

Kereta

Tidak ada family di task kereta di dalam LibreYOLO. LibreL2CS.train() meningkatkan: latih di proyek L2CS-Net hulu dan muat dictionary state yang dihasilkan di sini.

Validasi

Validasi terhadap dataset gaze ground-truth berada di luar ruang lingkup, dan val() menghasilkan alih-alih mengembalikan metrik yang tidak dihitungnya. Tidak ada metrics/ kamus untuk task ini. Evaluasi di hulu, pada dataset checkpoint adalah dilatih untuk.

Ekspor

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

Kontrak ekspor gaze mencakup ONNX, TorchScript, ExecuTorch, TensorRT dan OpenVINO. Yang keluar dari pustaka adalah batang ResNet dan dua bin sudut hanya kepala: grafik mengambil potongan wajah 448x448 yang telah diproses sebelumnya dan mengembalikan data mentah logit yaw dan pitch. Deteksi wajah, pemotongan, softmax, bin harapan dan konversi ke sudut semuanya tetap di Python, dalam libreyolo.models.l2cs.utils. Lihat ekspor untuk format dan argumennya.

Diverifikasi dengan LibreYOLO v1.5.0.