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.
pip install libreyoloSeu 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.
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)libreyolo predict model=LibreHRNetw32-pose.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom 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.
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"])libreyolo val model=LibreHRNetw32-pose.pt data=my-dataset.yamlA 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
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pose | Pose to ONNX: compatível | Pose to TorchScript: compatível | Pose to ExecuTorch: incompatível | Pose to TensorRT: compatível | Pose to OpenVINO: compatível | Pose to Paddle: incompatível | Pose to MNN: incompatível | Pose to RKNN: incompatível | Pose to ncnn: incompatível | Pose to TFLite: incompatível | Pose to CoreML: incompatível | Pose 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.
from libreyolo import LibreYOLO model = LibreYOLO("LibreHRNetw32-pose.pt")model.export(format="onnx")model.export(format="tensorrt", half=True)libreyolo export model=LibreHRNetw32-pose.pt format=onnximport 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.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| Pose | ||
| LibreHRNetw32-pose.pt | mit | |
| LibreHRNetw48-pose.pt | mit | |
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-fonte original
- github.com/leoxiaobin/deep-high-resolution-net.pytorch
- 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.