HRNet

O HRNet é uma rede convolucional que mantém um fluxo de características em alta resolução por meio de fusões multiescala repetidas, em vez de recuperar a resolução depois de reduzi-la. O LibreYOLO empacota a variante oficial de pose top-down para inferência e validação.

Tarefas
pose
Tamanhos
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
HRNet por Microsoft, MIT. Artigo, código-fonte
Licenças
Código MIT, pesos MIT. Uso comercial

Instalação

O HRNet não precisa de nenhum extra além do pacote base.

bash
pip install libreyolo

Seu detector de pessoas padrão, um checkpoint LibreYOLO9t leve, é baixado automaticamente na primeira vez que o HRNet se pareia com ele.

Predição

Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache local.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Sem fonte de pessoas informada: o HRNet se pareia sozinho com um# detector LibreYOLO9t leve e registra essa escolha uma vez.model = LibreYOLO("LibreHRNetw32-pose.pt")result = model(SAMPLE_IMAGE, save=True) print(result.keypoints.xy)print(result.boxes.xyxy)
CLI
libreyolo predict model=LibreHRNetw32-pose.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Fonte de pessoas
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreHRNetw32-pose.pt") # Pula a detecção por completo: trata a imagem inteira como uma pessoa.result = model(SAMPLE_IMAGE, cropped=True) # Ou passe ao HRNet boxes de um detector que você já rodou.result = model(SAMPLE_IMAGE, person_boxes=[[34, 12, 220, 400]]) # Ou pareie com um detector LibreYOLO específico em vez do# padrão LibreYOLO9t.result = model(SAMPLE_IMAGE, person_detector="rfdetr")

O HRNet é um estimador de pose top-down: ele precisa de uma caixa de pessoa antes que a cabeça de pose possa rodar, então toda chamada resolve uma. Se você não disser nada, ele se pareia com um detector LibreYOLO9t na primeira vez e registra essa escolha. cropped=True pula a detecção e trata a imagem inteira como uma pessoa; person_boxes aceita boxes de um detector que você já rodou; person_detector aceita "auto", "rfdetr", qualquer modelo de detecção do LibreYOLO ou um callable simples. flip_test=True roda o modelo também no recorte espelhado horizontalmente e faz a média dos dois mapas de calor, o data augmentation em tempo de teste do próprio HRNet; o augment=True genérico não é definido aqui. Fontes com várias imagens rodam sequencialmente: o detector do HRNet e o número variável de pessoas por imagem não suportam predição empilhada. Veja predição para fontes, streaming e tratamento de resultados.

Variantes

Dois tamanhos, w32 e w48, ambos prevendo o conjunto padrão de keypoints COCO-17 a partir de um recorte de pessoa em resolução fixa; o w48 é o mais largo dos dois backbones.

O model zoo upstream reporta a acurácia de pose de cada tamanho com o próprio detector de pessoas, a própria configuração de flip-test e o protocolo oficial de avaliação do COCO. O pareamento padrão do LibreYOLO usa um detector diferente, então uma rodada de validação aqui mede essa combinação, não a do upstream; bater com os números do upstream exige as mesmas caixas de pessoa, os mesmos scores do detector e a mesma configuração de flip que a avaliação original usou.

Validação

val() roda o OKS-AP de keypoints no estilo COCO e aceita um data.yaml no formato YOLO-pose ou um JSON de keypoints do COCO junto com um diretório de imagens. O backend de métricas é o faster-coco-eval por padrão, com o pycocotools sendo usado automaticamente quando o faster-coco-eval não está instalado; faster_coco_eval=False força o caminho do pycocotools.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreHRNetw32-pose.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/keypoints_mAP50-95"])print(metrics["metrics/keypoints_mAP50"])
CLI
libreyolo val model=LibreHRNetw32-pose.pt data=my-dataset.yaml

A validação aciona internamente o próprio predict() do HRNet, então ela usa qualquer detector de pessoas com que o modelo tenha sido construído ou chamado. Construa o modelo com um person_detector= explícito para manter essa fonte fixa entre as rodadas, em vez de deixar cada chamada resolver o padrão de novo.

Exportação

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

O contrato de exportação do HRNet cobre apenas ONNX, TorchScript, OpenVINO e TensorRT; qualquer outro formato levanta erro antes de o trace começar. Toda exportação é só a cabeça de mapas de calor de tela fixa, FP32 com batch um, que recebe um recorte de pessoa e devolve mapas de calor brutos: a geometria afim do recorte antes dela e a decodificação dos mapas de calor, a restauração do flip e a supressão por OKS depois dela ficam em Python, então um pipeline completo de imagem na entrada e keypoints na saída ainda precisa do LibreYOLO do outro lado.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreHRNetw32-pose.pt")model.export(format="onnx")model.export(format="tensorrt", half=True)
CLI
libreyolo export model=LibreHRNetw32-pose.pt format=onnx
Usar o arquivo exportado
import numpy as npimport onnxruntime as ort # O grafo exportado é só a cabeça de mapas de calor de tela fixa: ela# recebe um batch de recortes de pessoa já recortados e já# normalizados e devolve mapas de calor brutos. A detecção de pessoas,# a geometria do recorte, a decodificação dos mapas de calor e a# supressão por OKS não fazem parte deste grafo; rodá-lo fora do# LibreYOLO significa reimplementar essa etapa de decodificação por# conta própria.session = ort.InferenceSession("LibreHRNetw32-pose.onnx")name = session.get_inputs()[0].nameheatmaps = session.run(    None, {name: np.zeros((1, 3, 256, 192), dtype=np.float32)})[0]

Checkpoints

Todos os arquivos de pesos publicados desta família.

ArquivoEntrada (px)Licença dos pesos
Pose
LibreHRNetw32-pose.ptmit
LibreHRNetw48-pose.ptmit

Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.

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
HRNet, Microsoft
Licença original
MIT
Código do LibreYOLO
MIT
Pesos
MIT, republicado em huggingface.co/LibreYOLO
Interpretação
MIT permits commercial and non-commercial use, modification and redistribution of both the code and the two published checkpoints, with the copyright notice retained. The official repository does not attach a separate license to its model-zoo checkpoints; LibreYOLO's redistribution basis is the MIT license the releasing project implies, the same basis the upstream repository's own files state.

Citação

@inproceedings{sun2019deep,
  title={Deep High-Resolution Representation Learning for Human Pose Estimation},
  author={Sun, Ke and Xiao, Bin and Liu, Dong and Wang, Jingdong},
  booktitle={CVPR},
  year={2019}
}

Copiado do bloco de citação dos autores em github.com/leoxiaobin/deep-high-resolution-net.pytorch#citation.

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.