💡💡💡Эксклюзивное оригинальное улучшение этой статьи: эффективный выбор архитектуры облегченного ViT постепенно повышает удобство использования для мобильных устройств стандартного облегченного CNN (особенно MobileNetV3). В результате появилось новое семейство чисто облегченных CNN — RepViT.
RepViTBlock — это готовая к использованию система для облегчения обнаружения | Личное тестирование позволяет добиться высоких результатов и легкости в нескольких наборах данных
Введение в Реп Ви Т
бумага:https://arxiv.org/pdf/2307.09283.pdf
Основное внимание уделяется переосмыслению конструкции легких сверточных нейронных сетей и интеграции легких сверточных нейронных сетей на мобильных устройствах с ограниченными ресурсами. ViTs
Эффективный выбор архитектуры для улучшения легкости CNNs
производительность.
Вклад в эту статью:
MSHA
)Позвольте модели учитьсяглобальное представительство。Однако,легкий ViTs и легкий CNNs Архитектурные различия междуMobileNetV3
мобильное удобство. Это порождает новый чистый легкий вес. CNN Рождение семьи,Прямо сейчасRepViT
。Стоит отметить, что,хотя RepViT иметь MetaFormer структуру, но она целиком состоит из извилин.RepViT
Превосходя существующие современные легкие ViT и демонстрируют превосходную производительность и эффективность по сравнению с существующими современными легкими ViT при выполнении различных задач машинного зрения, включая ImageNet Классификация, COCO-2017 обнаружение объектов и сегментация экземпляров на ADE20k Семантическая сегментация включена. специально,существоватьImageNet
начальство,RepViT
существовать iPhone 12
достиг почти 1ms задерживать и превышать 80% Топ-1 Точность, это первый прорыв среди легких моделей.
Постепенно повышайте удобство использования стандартных облегченных CNN для мобильных устройств (особенно MobileNetV3) за счет эффективных архитектурных решений, интегрирующих облегченный ViT. Результатом является новое семейство чистых легких CNN — RepViT.
RepViT настраивает легкие CNN посредством послойного микропроектирования, которое включает в себя выбор подходящего размера ядра свертки и оптимизацию расположения слоя сжатия и возбуждения (SE). Оба метода значительно улучшают производительность модели.
Неглубокие сети используют сверточные экстракторы
Более глубокие слои субдискретизации,Авторы начали со свертка 1x1 для настройки размеров канала., а затем объединить два 1x1 Вход и выход свертки соединены через остатки, образуя сеть прямой связи. Кроме того, они добавили RepViT блок для дальнейшего углубления слоя понижающей дискретизации, этот шаг улучшает top-1 точность до 75,4%, при этом задержка составляет 0.96ms。
финальный,Путем интеграции вышеуказанных стратегий улучшения,Мы получили модельRepViT
Общая структура,Данная модель имеет несколько вариантов,НапримерRepViT-M1/M2/M3
。Так же,Различные варианты в основном отличаются количеством каналов и блоков на каскад.
Основной код:
class RepViTBlock(nn.Module):
def __init__(self,in1, inp, hidden_dim, oup, kernel_size=3, stride=2, use_se=0, use_hs=0):
super(RepViTBlock, self).__init__()
assert stride in [1, 2]
self.identity = stride == 1 and inp == oup
print(inp)
print(hidden_dim)
print(oup)
assert(hidden_dim == 2 * inp)
if stride == 2:
self.token_mixer = nn.Sequential(
Conv2d_BN(inp, inp, kernel_size, stride, (kernel_size - 1) // 2, groups=inp),
SqueezeExcite(inp, 0.25) if use_se else nn.Identity(),
Conv2d_BN(inp, oup, ks=1, stride=1, pad=0)
)
self.channel_mixer = Residual(nn.Sequential(
# pw
Conv2d_BN(oup, 2 * oup, 1, 1, 0),
nn.GELU() if use_hs else nn.GELU(),
# pw-linear
Conv2d_BN(2 * oup, oup, 1, 1, 0, bn_weight_init=0),
))
else:
assert(self.identity)
self.token_mixer = nn.Sequential(
RepVGGDW(inp),
SqueezeExcite(inp, 0.25) if use_se else nn.Identity(),
)
self.channel_mixer = Residual(nn.Sequential(
# pw
Conv2d_BN(inp, hidden_dim, 1, 1, 0),
nn.GELU() if use_hs else nn.GELU(),
# pw-linear
Conv2d_BN(hidden_dim, oup, 1, 1, 0, bn_weight_init=0),
))
def forward(self, x):
return self.channel_mixer(self.token_mixer(x))
Подробности см.:
https://blog.csdn.net/m0_63774211/article/details/131939062