L2CS-Net

O L2CS-Net é um estimador de olhar em dois estágios: um detector de rostos localiza os rostos, e um tronco ResNet com duas cabeças de classificação por bins de ângulo prediz pitch e yaw para cada rosto. O LibreYOLO o encapsula somente para inferência.

Tarefas
gaze
Tamanhos
r18, r34, r50, r101, r152 at 448 px
Instalação
pip install libreyolo
Nível de suporte
Somente inferência, desde a v. Somente predição, validação e exportação. Os recursos de treinamento não se aplicam.
Origem
L2CS-Net por Ahmed A. Abdelrahman et al., Gaze360 dataset terms: research and non-commercial use only, no redistribution. Artigo, código-fonte
Licenças
Código MIT, pesos Gaze360 dataset terms: research and non-commercial use only, no redistribution. Uso comercial

Instalação

O L2CS-Net não precisa de nenhum extra para construir, fazer predições ou exportar um modelo do qual você já tenha um checkpoint.

bash
pip install libreyolo

O único checkpoint que o LibreYOLO consegue buscar automaticamente, um ResNet-50 treinado no Gaze360, é baixado via gdown em vez de um mirror HTTP simples, porque ele fica no Google Drive do autor e não na org do LibreYOLO. Esse caminho precisa do extra gaze:

bash
pip install "libreyolo[gaze]"

Sem ele, o LibreYOLO imprime instruções de download manual em vez de falhar silenciosamente.

Predição

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Sem face_detector: cai no detector de rostos embutido do OpenCV# (Haar no OpenCV 4, YuNet no OpenCV 5), então isso roda sem nenhum# download além do próprio checkpoint do L2CS.model = LibreYOLO("LibreL2CSr50.pt")result = model(SAMPLE_IMAGE) print(result.gaze.pitch, result.gaze.yaw)
CLI
libreyolo predict model=LibreL2CSr50.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Fonte de rostos
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreL2CSr50.pt") # Passe ao L2CS boxes de um detector que você já rodou.result = model(SAMPLE_IMAGE, face_boxes=[[34, 12, 90, 80]]) # Ou nomeie um detector de rostos embutido específico.result = model(SAMPLE_IMAGE, face_detector="yunet")

O L2CS-Net é um estimador de dois estágios: um detector de rostos roda primeiro, e a cabeça de olhar lê pitch e yaw de cada recorte de rosto que ele devolve. Sem configuração, a predição recorre ao detector embutido do OpenCV, então uma chamada simples funciona sem nenhum download adicional assim que você tiver em mãos o próprio checkpoint do L2CS. face_boxes aceita boxes de um detector que você já rodou; face_detector aceita "auto", "haar", "yunet", um modelo de detecção do LibreYOLO ou um callable simples. result.gaze carrega pitch e yaw em radianos, alinhados linha a linha com result.boxes, as caixas de rosto detectadas. Veja predição para fontes, streaming e tratamento de resultados.

Variantes

Cinco profundidades de backbone compartilham uma mesma resolução de entrada e aceitam os mesmos argumentos. O Gaze360, o dataset por trás do único checkpoint publicado, treinou um ResNet-50; as outras quatro profundidades são suportadas arquiteturalmente, mas não têm pesos publicados para carregar.

Exportação

TarefaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
gazegaze to ONNX: compatívelgaze to TorchScript: compatívelgaze to ExecuTorch: compatívelgaze to TensorRT: compatívelgaze to OpenVINO: compatívelgaze to Paddle: incompatívelgaze to MNN: incompatívelgaze to RKNN: incompatívelgaze to ncnn: incompatívelgaze to TFLite: incompatívelgaze to CoreML: incompatívelgaze to Core AI: incompatível

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreL2CSr50.pt")model.export(format="onnx")model.export(format="tensorrt", half=True)
CLI
libreyolo export model=LibreL2CSr50.pt format=onnx
Usar o arquivo exportado
import numpy as npimport onnxruntime as ort # O grafo exportado é só o tronco ResNet e as duas cabeças de bins# de ângulo: ele recebe um recorte de rosto 448x448 pré-processado e# devolve (yaw_logits, pitch_logits) crus, não ângulos decodificados.# O softmax, a esperança sobre os bins e a conversão para graus ficam# no Python; veja libreyolo.models.l2cs.utils.bin_logits_to_angles.session = ort.InferenceSession("LibreL2CSr50.onnx")name = session.get_inputs()[0].nameyaw_logits, pitch_logits = session.run(    None, {name: np.zeros((1, 3, 448, 448), dtype=np.float32)})

Licenciamento

Confira a licença no repositório do Hugging Face correspondente aos pesos que você baixar. Cada checkpoint na organização LibreYOLO tem uma licença, e ela nem sempre é a mesma em toda a família. Esse repositório é a fonte oficial. O resumo abaixo descreve o que se aplicava na última verificação desta página.

Esta é uma descrição das licenças envolvidas, não uma orientação jurídica. Se a resposta tiver importância comercial, leia as licenças e procure sua própria assessoria.

Trabalho original
L2CS-Net, Ahmed A. Abdelrahman et al.
Licença original
Gaze360 dataset terms: research and non-commercial use only, no redistribution
Código-fonte original
github.com/Ahmednull/L2CS-Net
Código do LibreYOLO
MIT
Pesos
Gaze360 dataset terms: research and non-commercial use only, no redistribution, distribuído pelos autores. O LibreYOLO não hospeda nem espelha esses pesos.
Interpretação
The L2CS-Net source is MIT and may be used, modified and redistributed, including commercially. The one checkpoint LibreYOLO can fetch automatically, a ResNet-50 trained on Gaze360, is not covered by that grant: the Gaze360 dataset license restricts use of models trained on it to research and non-commercial purposes and forbids redistribution. LibreYOLO does not mirror or host that checkpoint. It downloads it, on request, directly from the author's own distribution and prints the Gaze360 terms once before the transfer starts. A model trained on data you hold the rights to, using this MIT architecture, carries none of those restrictions.

O LibreYOLO não hospeda nem espelha nenhum checkpoint do L2CS: não existe nada dessa família na org do LibreYOLO no Hugging Face, diferente da maioria das outras famílias deste site. O único checkpoint que a biblioteca consegue buscar automaticamente vem direto da distribuição no Google Drive do próprio autor, atrás do aviso de licença do Gaze360 impresso antes de a transferência começar, e não é a cópia "republicada em huggingface.co/LibreYOLO" que o resumo acima dá a entender.

Verificado com o LibreYOLO v1.5.0. As tabelas de suporte, os checkpoints e os números de benchmark desta página são gerados a partir da biblioteca lançada e dos pesos publicados, não escritos à mão.