ResNet
ResNet — классификатор изображений, собранный из остаточных блоков: это пропускающие соединения (skip connections), которые позволяют сети добавить гораздо больше слоёв без потери точности, от которой иначе страдают глубокие стеки обычных свёрток. LibreYOLO поддерживает его для одной задачи — классификации.
- Задачи
- classification
- Размеры
- 18, 34, 50, 101 at 224 px
- Установка
pip install libreyolo- Уровень поддержки
- Поддерживаемый, начиная с v1.3.0. Дополнительные обучаемые модели: тесты CI поддерживаются в рабочем состоянии, а функции добавляются по возможности.
- Исходный проект
- ResNet от Microsoft Research Asia, Apache-2.0. Статья, исходный код
- Лицензии
- Код: Apache-2.0, веса: Apache-2.0. Коммерческое использование
Установка
ResNet не требует опциональных extra. Всё, что он импортирует, входит в базовую установку.
pip install libreyoloПредсказание
Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreResNet50-cls.pt")result = model(SAMPLE_IMAGE, save=True) print(result.probs.top1, result.probs.top1conf)print(result.probs.top5)libreyolo predict model=LibreResNet50-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=TrueВозвращаемый объект Results — тот же, что возвращает любое семейство,
поэтому переход на другую модель сводится к правке в одну строку. У
классификатора нет ни рамок, ни масок: result.probs содержит предсказание
для всего изображения, с полями top1, top5, top1conf и top5conf.
Аргументы conf, iou и max_det принимаются ради единообразия API, но ни
на что не влияют: в одном векторе вероятностей нечего отсекать по порогу и
нечего подавлять. Про источники, стриминг и обработку результатов —
предсказание.
Варианты
Четыре глубины, все обучены и оценены одинаково, поэтому выбор сводится к
прямому размену числа параметров на точность. Задача зафиксирована: каждый
размер закрывает только классификацию. Имя файла весов у всех размеров
заканчивается на -cls.pt, и именно по этому суффиксу фабрика определяет
семейство; аргумент task= не нужен.
Обучение
Дообучение стартует с опубликованного бэкбона ImageNet и автоматически перестраивает последний слой классификатора под число классов целевого датасета.
from libreyolo import LibreYOLO model = LibreYOLO("LibreResNet50-cls.pt")model.train(data="imagenette160", epochs=5)libreyolo train model=LibreResNet50-cls.pt data=imagenette160 epochs=5libreyolo train model=LibreResNet50-cls.pt data=imagenette160 \ epochs=50 device=0,1 batch=-1Если ничего не менять, обучение идёт 100 эпох с lr0=1e-3 и AdamW, размером
батча 64 и ранней остановкой после 50 эпох без улучшений. data принимает
корень датасета (train/ и val/, по одной папке на класс), известное
короткое имя вроде imagenette160 или URL на .zip. lora=True здесь не
поддерживается: при передаче будет исключение, потому что LoRA в LibreYOLO
работает с компонентами трансформеров со слоями nn.Linear, а в ResNet их
нет.
Про датасеты, аугментацию, обучение на нескольких GPU и логгеры — обучение.
cls_pw=0 отключает взвешивание функции потерь; значения до 1 используют веса, обратные частоте классов и нормализованные к среднему 1. class_weights=True использует обратные частоты, нормализованные по числу примеров, и не сочетается с cls_pw>0. При возобновлении эти настройки должны совпадать. См. классификацию.
Валидация
val() возвращает словарь с ключами metrics/. Для классификации это top-1
и top-5 accuracy на валидационной выборке.
from libreyolo import LibreYOLO model = LibreYOLO("LibreResNet50-cls.pt")metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreResNet50-cls.pt data=imagenette160Валидация и калибровка INT8 используют преобразование семейства для оценки. Метаданные экспорта записывают norm_mean, norm_std и resize_mode; старые артефакты используют значения семейства. Предобработчики калибровки возвращают требуемые массив CHW и коэффициент масштаба.
Экспорт
| Задача | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Classification | Classification to ONNX: поддерживается | Classification to TorchScript: поддерживается | Classification to ExecuTorch: поддерживается | Classification to TensorRT: поддерживается | Classification to OpenVINO: поддерживается | Classification to Paddle: не поддерживается | Classification to MNN: не поддерживается | Classification to RKNN: не поддерживается | Classification to ncnn: поддерживается | Classification to TFLite: поддерживается | Classification to CoreML: не поддерживается | Classification to Core AI: поддерживается |
Экспортированный артефакт загружается обратно через LibreYOLO() по суффиксу
файла, поэтому файл .onnx или .engine ведёт себя как чекпойнт и
возвращает те же Results. В разделе экспорт перечислены
аргументы, которые принимает каждый формат, и дополнительные, которые
добавляют некоторые из них.
from libreyolo import LibreYOLO model = LibreYOLO("LibreResNet50-cls.pt")model.export(format="onnx")model.export(format="tensorrt", half=True)libreyolo export model=LibreResNet50-cls.pt format=onnxlibreyolo export model=LibreResNet50-cls.pt format=tensorrt half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает загрузчик по суффиксу файла, поэтому экспортированный# артефакт загружается как обычный чекпойнт и возвращает тот же объект Results.model = LibreYOLO("LibreResNet50-cls.onnx")result = model(SAMPLE_IMAGE) print(result.probs.top1)Чекпойнты
Все опубликованные файлы весов этого семейства.
| Файл | Вход (пикс.) | Лицензия весов |
|---|---|---|
| Classification | ||
| LibreResNet18-cls.pt | 224 | apache-2.0 |
| LibreResNet34-cls.pt | 224 | apache-2.0 |
| LibreResNet50-cls.pt | 224 | apache-2.0 |
| LibreResNet101-cls.pt | 224 | apache-2.0 |
Все перечисленные выше файлы уже доступны в организации LibreYOLO и скачиваются при первом использовании.
Лицензирование
Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.
Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.
- Оригинальная работа
- ResNet, Microsoft Research Asia
- Лицензия исходного проекта
- Apache-2.0
- Исходный код проекта
- github.com/huggingface/pytorch-image-models
- Код LibreYOLO
- MIT
- Веса
- Apache-2.0, повторно опубликованы на huggingface.co/LibreYOLO
- Толкование
- Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. It places no obligation on your own application code, and weights you train yourself on your own data are yours. The architecture is the original Microsoft Research Asia design; the pretrained weights LibreYOLO ships are timm's resnet{18,34,50,101}.a1_in1k reproduction (the "ResNet Strikes Back" A1 recipe), trained by Ross Wightman and the timm contributors on ImageNet-1k and licensed Apache-2.0 there. LibreYOLO's module and attribute names mirror timm so the state dict loads unchanged and inference matches bit-identically.
Цитирование
@article{He2015,
author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun},
title = {Deep Residual Learning for Image Recognition},
journal = {arXiv preprint arXiv:1512.03385},
year = {2015}
}Скопировано из блока цитирования авторов на странице github.com/KaimingHe/deep-residual-networks#citation.