Генерация моделей#
Для упрощения прототипирования в проекте реализован генератор моделей для рекуррентных сетей. Инструменты для генерации реализованы в модуле models.generator
. Базовым классов для сгенерированных моделей является ModelGen
, в котором реализуется общий интерфейс и инструменты генерации. От него наследуются 3 модели, из которых SODa
собирает детектор:
Базовая часть сети. Выделяет признаки из изображения. |
|
Средняя часть сети. Генерирует карты признаков. Результатом работы сети являются несколько матриц разной формы. |
|
Последняя часть сети. Генерирует итоговые предсказания. Используется вместе
с классом |
Для генерации моделей используется объект BlockGen
, который создаёт модель из списка объектов LayerGen
для контурирования слоёв. Если в конфигурации имеется вложенный список, то BlockGen
вызывается рекурсивно. Также можно задать сложное поведение при обработке вложенных листов с помощью перегрузок для списка list
: Residual
и Dense
. Это позволяет строить остаточные и плотные нейросети.
def conv(out_channels: int, kernel: int = 3, stride: int = 1):
return (
Conv(out_channels, stride=stride, kernel_size=kernel),
Norm(),
LIF(),
)
def res_block(out_channels: int, kernel: int = 3):
return (
Conv(out_channels, 1),
# Residual block. The values from all branches are added together
Residual(
[
[*conv(out_channels, kernel)],
[Conv(out_channels, 1)],
]
),
Conv(out_channels, 1),
)
cfgs: ListGen = [
*conv(64, 7, 2), *res_block(64, 5), *conv(128, 5, 2), *res_block(128)
]
Note
Пирамида признаков может быть представлена в списке конфигурации в виде остаточных или плотных сетей.
Собственная конфигурация#
Для добавления своей конфигурации необходимо создать класс наследник BaseConfig
, в котором будут реализованы функции возвращающие конфигурации моделей для Backbone, Neck и Head. Пример конфигурации сети подобной YOLOv8 можно найти в Yolo
.
После создания собственной конфигурации её нужно добавить в словарь config_list
в файле models/__init_.py
:
"""
SODa Model
"""
from .soda import SODa
from .generator import BackboneGen, NeckGen, Head, BaseConfig
from typing import Dict
from .yolo import Yolo
config_list: Dict[str, BaseConfig] = {"yolo": Yolo}
__all__ = "SODa", "BackboneGen", "NeckGen", "Head", "BaseConfig"
После для выбора созданной модели достаточно указать её название из config_list в файле конфигурации (см. Параметры запуска).
Кастомные слои#
Список конфигурации сети состоит из генераторов слоёв, которые наследуются от LayerGen
. Их задача сконструировать и вернуть новый модуль
для включения в сеть. Все поддерживаемые слои находятся в файле models.modules
. Чтобы добавить свой слой достаточно создать нового наследника LayerGen
, который будет конструировать требуемый модуль и рассчитывать количество каналов матрицы после его применения. Для примера смотри Conv
.