HRNet
HRNet — свёрточная сеть, которая держит поток признаков высокого разрешения на всём протяжении сети за счёт повторяющегося многомасштабного слияния, вместо того чтобы восстанавливать разрешение после понижения. LibreYOLO оборачивает официальный top-down вариант для оценки позы — для инференса и валидации.
- Задачи
- pose
- Размеры
- Установка
pip install libreyolo- Уровень поддержки
- Только инференс, начиная с v. Только предсказание, валидация и экспорт. Функции обучения неприменимы.
- Исходный проект
- HRNet от Microsoft, MIT. Статья, исходный код
- Лицензии
- Код: MIT, веса: MIT. Коммерческое использование
Установка
HRNet не требует ничего сверх базового пакета.
pip install libreyoloЕго детектор человека по умолчанию, лёгкий чекпойнт LibreYOLO9t, скачивается автоматически, когда HRNet впервые с ним связывается.
Предсказание
Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Источник рамок человека не задан: HRNet сам подбирает лёгкий# детектор LibreYOLO9t и один раз сообщает об этом выборе.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") # Полностью пропустить детекцию: всё изображение — один человек.result = model(SAMPLE_IMAGE, cropped=True) # Или передать HRNet рамки от уже запущенного детектора.result = model(SAMPLE_IMAGE, person_boxes=[[34, 12, 220, 400]]) # Или подключить конкретный детектор LibreYOLO вместо# LibreYOLO9t по умолчанию.result = model(SAMPLE_IMAGE, person_detector="rfdetr")HRNet оценивает позу по схеме top-down: перед запуском головы позы ему нужна
рамка человека, поэтому каждый вызов её получает. Если ничего не указывать, он
при первом запуске подбирает детектор LibreYOLO9t и сообщает об этом выборе.
cropped=True пропускает детекцию и считает всё изображение одним человеком;
person_boxes принимает рамки от детектора, который вы уже запустили;
person_detector принимает "auto", "rfdetr", любую модель детекции
LibreYOLO или обычный вызываемый объект. flip_test=True дополнительно
прогоняет модель на горизонтально отражённом кропе и усредняет две тепловые
карты — это собственная аугментация HRNet на этапе теста; общий augment=True
здесь не определён. Источники из нескольких изображений обрабатываются
последовательно: детектор HRNet и переменное число людей на каждом изображении
не поддерживают предсказание батчем. Про источники, стриминг и работу с
результатами — предсказание.
Варианты
Два размера, w32 и w48, оба предсказывают стандартный набор ключевых точек
COCO-17 из кропа человека фиксированного разрешения; w48 — более широкий из
двух бэкбонов.
Каталог моделей апстрима приводит точность позы для каждого размера со своим детектором человека, своей настройкой flip-теста и официальным протоколом оценки COCO. Связка LibreYOLO по умолчанию использует другой детектор, поэтому прогон валидации здесь измеряет именно эту комбинацию, а не апстримную; чтобы сойтись с цифрами апстрима, нужны те же рамки людей, те же оценки детектора и та же настройка отражения, что и в исходной оценке.
Валидация
val() считает keypoint OKS-AP в стиле COCO и принимает либо data.yaml в
формате YOLO-pose, либо COCO-разметку ключевых точек в JSON вместе с каталогом
изображений. Бэкенд метрик по умолчанию — faster-coco-eval, а pycocotools
подключается автоматически, если faster-coco-eval не установлен;
faster_coco_eval=False принудительно включает путь через 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.yamlВнутри валидация запускает собственный predict() HRNet, поэтому использует
тот детектор человека, с которым модель была создана или вызвана. Задавайте
person_detector= явно при создании модели, чтобы этот источник оставался
одним и тем же от прогона к прогону, а не разрешался заново на каждом вызове.
Экспорт
| Задача | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pose | Pose to ONNX: поддерживается | Pose to TorchScript: поддерживается | Pose to ExecuTorch: не поддерживается | Pose to TensorRT: поддерживается | Pose to OpenVINO: поддерживается | Pose to Paddle: не поддерживается | Pose to MNN: не поддерживается | Pose to RKNN: не поддерживается | Pose to ncnn: не поддерживается | Pose to TFLite: не поддерживается | Pose to CoreML: не поддерживается | Pose to Core AI: не поддерживается |
Контракт экспорта HRNet покрывает только ONNX, TorchScript, OpenVINO и TensorRT; любой другой формат вызывает ошибку до начала трассировки. Любой экспорт — это только голова тепловых карт на фиксированном холсте, батч из одного элемента и FP32: она принимает кроп человека и возвращает сырые тепловые карты. Аффинная геометрия кропа перед ней, а также декодирование тепловых карт, восстановление после отражения и подавление по OKS после неё остаются в Python, поэтому полному пайплайну «изображение на входе — ключевые точки на выходе» всё равно нужен LibreYOLO на другом конце.
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 # Экспортированный граф — только голова тепловых карт на фиксированном# холсте: принимает батч уже вырезанных и нормализованных кропов# человека и возвращает сырые тепловые карты. Детекция человека,# геометрия кропа, декодирование карт и подавление по OKS в граф не# входят; вне LibreYOLO шаг декодирования придётся написать самому.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]Чекпойнты
Все опубликованные файлы весов этого семейства.
| Файл | Вход (пикс.) | Лицензия весов |
|---|---|---|
| Pose | ||
| LibreHRNetw32-pose.pt | mit | |
| LibreHRNetw48-pose.pt | mit | |
Все перечисленные выше файлы уже доступны в организации LibreYOLO и скачиваются при первом использовании.
Лицензирование
Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.
Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.
- Оригинальная работа
- HRNet, Microsoft
- Лицензия исходного проекта
- MIT
- Исходный код проекта
- github.com/leoxiaobin/deep-high-resolution-net.pytorch
- Код LibreYOLO
- MIT
- Веса
- MIT, повторно опубликованы на huggingface.co/LibreYOLO
- Толкование
- 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.
Цитирование
@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}
}Скопировано из блока цитирования авторов на странице github.com/leoxiaobin/deep-high-resolution-net.pytorch#citation.