Генерация моделей#

Для упрощения прототипирования в проекте реализован генератор моделей для рекуррентных сетей. Инструменты для генерации реализованы в модуле models.generator. Базовым классов для сгенерированных моделей является ModelGen, в котором реализуется общий интерфейс и инструменты генерации. От него наследуются 3 модели, из которых SODa собирает детектор:

BackboneGen

Базовая часть сети. Выделяет признаки из изображения.

NeckGen

Средняя часть сети. Генерирует карты признаков. Результатом работы сети являются несколько матриц разной формы.

HeadGen

Последняя часть сети. Генерирует итоговые предсказания. Используется вместе с классом Head, который создаёт отдельный экземпляр модели головы для каждой карты признаков.

Для генерации моделей используется объект 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.