Русский
Русский
English
Статистика
Реклама

Convolutional neural network

Перевод Обзор статьи AdderNet Действительно ли нам нужно умножение в глубоком обучении? (Классификация изображений)

08.04.2021 14:12:31 | Автор: admin

Использование сложения вместо умножения для свертки результирует в меньшей задержке, чем у стандартной CNN

Свертка AdderNet с использованием сложения, без умноженияСвертка AdderNet с использованием сложения, без умножения

Вашему вниманию представлен обзор статьи AdderNet: действительно ли нам нужно умножение в глубоком обучении?, (AdderNet), Пекинского университета, Huawei Noah's Ark Lab и Сиднейского университета.

Действительно ли нам нужно умножение в глубоком обучении?

Структура статьи

  1. Свертка AdderNet

  2. Прочие моменты: BN, производные, скорость обучения

  3. Результаты экспериментов

1. Свертка AdderNet

1.1. Обобщенные фильтры

  • Как правило, выходной признак Y указывает на сходство между фильтром и входным элементом:

  • где S - мера сходства.

1.2. Стандартная свертка с использованием умножения

Стандартная свертка с использованием умноженияСтандартная свертка с использованием умножения
  • Если в качестве меры стандартного отклонения принимается взаимная корреляция, то используется умножение. Так мы получаем свертку.

1.3. Свертка AdderNet с использованием сложения

Свертка AdderNet с использованием сложения, без умноженияСвертка AdderNet с использованием сложения, без умножения
  • Если используется сложение, то вычисляется l1-мера стандартного отклонения между фильтром и входным признаком:

  • с помощью l1-меры стандартного отклонения можно эффективно вычислить сходство между фильтрами и признаками.

Сложение требует гораздо меньших вычислительных ресурсов, чем умножение.

Вы могли заметить, что приведенное выше уравнение относится к сопоставлению шаблонов в компьютерном зрении, цель которого - найти части изображения, соответствующие определенному шаблону.

2. Прочие моменты: BN, производные, скорость обучения

2.1. Пакетная нормализация (Batch Normalization - BN)

  • После сложения, используется пакетная нормализация (BN) для нормализации Y к соответствующему диапазону, чтобы все функции активации, используемые в обычных CNN, после этого могли использоваться в предлагаемых AdderNets.

  • Хотя слой BN включает в себя умножения, его вычислительные затраты значительно ниже, чем у сверточных слоев, и ими можно пренебречь.

  • (Появятся ли в будущем какие-нибудь BN, использующие сложение?)

2.2. Производные

  • Производная l1-меры не подходит для градиентного спуска. Таким образом, мы рассматриваем производную l2-меры:

  • Использование точного градиента позволяет точно обновлять фильтры.

  • Чтобы избежать взрыва градиента, градиент X обрезается до [-1,1].

  • Затем вычисляется частная производная выходных признаков Y по отношению к входным характеристикам X как:

  • где HT - функция HardTanh:

2.3. Скорость адаптивного обучения

l2-меры градиентов в LeNet-5-BNl2-меры градиентов в LeNet-5-BN
  • Как показано в этой таблице, меры градиентов фильтров в AdderNets намного меньше, чем в CNN, что может замедлить обновление фильтров в AdderNets.

  • В AdderNets используется адаптивная скорость обучения для разных уровней:

  • где - глобальная скорость обучения всей нейронной сети (например, для сумматора и BN слоев), L(Fl) - градиент фильтра в слое l, а l - соответствующая локальная скорость обучения.

  • Таким образом, локальная скорость обучения может быть определена как

  • где k обозначает количество элементов в Fl, а - гиперпараметр для управления скоростью обучения фильтров сумматора.

3. Результаты экспериментов

3.1. MNIST

  • CNN достигает точности 99,4% при 435K умножений и 435K сложений.

  • Заменяя умножения в свертке на сложения, предлагаемая AdderNet достигает точности 99,4%, такой же показатель как у CNN, с 870K сложениями и почти без умножений.

  • Теоретическая задержка умножения в ЦП также больше, чем задержка сложения и вычитания.

  • Например, на модели VIA Nano 2000 задержка умножения и сложения с плавающей запятой составляет 4 и 2 соответственно. AdderNet с моделью LeNet-5 будет иметь задержку 1.7M, в то время как CNN будет иметь задержку 2.6M на том же CPU.

3.2. CIFAR

Результаты классификации на наборах данных CIFAR-10 и CIFAR-100Результаты классификации на наборах данных CIFAR-10 и CIFAR-100BNN: свертка XNORNet, использующая логической операции XNORBNN: свертка XNORNet, использующая логической операции XNOR
  • Двоичные нейронные сети (Binary neural networks - BNN): могут использовать операции XNOR для замены умножения, что мы также используем для сравнения.

  • Для модели VGG-small, AdderNets без умножения достигает почти таких же результатов (93,72% в CIFAR-10 и 72,64% в CIFAR-100) как и CNNs (93,80% в CIFAR-10 и 72,73% в CIFAR-100).

  • Хотя размер модели BNN намного меньше, чем у AdderNet и CNN, ее точность намного ниже (89,80% в CIFAR-10 и 65,41% в CIFAR-100).

  • Что касается ResNet-20, CNN достигают наивысшей точности (т.е. 92,25% в CIFAR-10 и 68,14% в CIFAR-100), но с большим числом умножений (41,17M).

  • Предлагаемые AdderNets достигают точности 91,84% в CIFAR-10 и 67,60% точности в CIFAR-100 без умножения, что сравнимо с CNN.

  • Напротив, BNN достигают точности только 84,87% и 54,14% в CIFAR-10 и CIFAR-100.

  • Результаты ResNet-32 также предполагают, что предлагаемые AdderNets могут достигать результатов аналогичных обычным CNN.

3.3. ImageNet

Классификация результатов на наборах данных ImageNetКлассификация результатов на наборах данных ImageNet
  • CNN достигает 69,8% точности top-1 и 89,1% точности top-5 в RESNET-18. Однако, при 1.8G умножениях.

  • AdderNet обеспечивает 66,8% точности top-1 и 87,4% точности top-5 в ResNet-18, что демонстрирует, что фильтры сумматора могут извлекать полезную информацию из изображений.

  • Несмотря на то, что BNN может достигать высокой степени ускорения и сжатия, он достигает только 51,2% точности top-1 и 73,2% точности top-5 в ResNet-18.

  • Аналогичные результаты для более глубокого ResNet-50.

3.4. Результаты визуализации

Визуализация признаков в AdderNets и CNN. Признаки CNN разных классов разделены по их углам.Визуализация признаков в AdderNets и CNN. Признаки CNN разных классов разделены по их углам.
  • LeNet++ обучался на наборе данных MNIST, который имеет шесть сверточных слоев и полносвязный слой для извлечения выраженных 3D признаков.

  • Количество нейронов в каждом сверточном слое составляет 32, 32, 64, 64, 128, 128 и 2 соответственно.

  • AdderNets использует l1-меру для различения разных классов. Признаки имеют тенденцию быть сгруппированными относительно центров разных классов.

  • Результаты визуализации демонстрируют, что предлагаемые AdderNets могут обладать аналогичной способностью распознавания для классификации изображений как и CNN.

Визуализация фильтров в первом слое LeNet-5-BN на MNISTВизуализация фильтров в первом слое LeNet-5-BN на MNIST
  • Фильтры предлагаемых adderNets по-прежнему имеют некоторые схожие паттерны со сверточными фильтрами.

  • Эксперименты по визуализации дополнительно демонстрируют, что фильтры AdderNets могут эффективно извлекать полезную информацию из входных изображений и признаков.

Гистограммы по весам с AdderNet (слева) и CNN (справа).Гистограммы по весам с AdderNet (слева) и CNN (справа).
  • Распределение весов с AdderNets близко к распределению Лапласа, тогда как распределение с CNN больше походит больше на распределение Гаусса. Фактически, априорным распределением l1-меры является распределение Лапласа.

3.5. Абляционное исследование

Кривая обучения AdderNets с использованием различных схем оптимизацииКривая обучения AdderNets с использованием различных схем оптимизации
  • AdderNets, использующие адаптивную скорость обучения (adaptive learning rate - ALR) и увеличенную скорость обучения (increased learning rate - ILR), достигают точности 97,99% и 97,72% со знаковым градиентом, что намного ниже, чем точность CNN (99,40%) .

  • Поэтому мы предлагаем использовать точный градиент для более точного обновления весов в AdderNets.

  • В результате AdderNet с ILR достигает точности 98,99% при использовании точного градиента. Используя адаптивную скорость обучения (ALR), AdderNet может достичь точности 99,40%, что демонстрирует эффективность предложенного метода.

Ссылка на статью

[2020 CVPR] [AdderNet]

AdderNet: Do We Really Need Multiplications in Deep Learning?

Классификация изображений

19891998: [LeNet]

20122014: [AlexNet & CaffeNet] [Dropout] [Maxout] [NIN] [ZFNet] [SPPNet] [Distillation]

2015: [VGGNet] [Highway] [PReLU-Net] [STN] [DeepImage] [GoogLeNet / Inception-v1] [BN-Inception / Inception-v2]

2016: [SqueezeNet] [Inception-v3] [ResNet] [Pre-Activation ResNet] [RiR] [Stochastic Depth] [WRN] [Trimps-Soushen]

2017: [Inception-v4] [Xception] [MobileNetV1] [Shake-Shake] [Cutout] [FractalNet] [PolyNet] [ResNeXt] [DenseNet] [PyramidNet] [DRN] [DPN] [Residual Attention Network] [IGCNet / IGCV1] [Deep Roots]

2018: [RoR] [DMRNet / DFN-MR] [MSDNet] [ShuffleNet V1] [SENet] [NASNet] [MobileNetV2] [CondenseNet] [IGCV2] [IGCV3] [FishNet] [SqueezeNext] [ENAS] [PNASNet] [ShuffleNet V2] [BAM] [CBAM] [MorphNet] [NetAdapt] [mixup] [DropBlock] [Group Norm (GN)]

2019: [ResNet-38] [AmoebaNet] [ESPNetv2] [MnasNet] [Single-Path NAS] [DARTS] [ProxylessNAS] [MobileNetV3] [FBNet] [ShakeDrop] [CutMix] [MixConv] [EfficientNet] [ABN] [SKNet] [CB Loss]

2020: [Random Erasing (RE)] [SAOL] [AdderNet]


Перевод материала подготовлен в преддверии старта курса "Deap Learning. Basic".

Также приглашаем всех желающих посетить бесплатный демо-урок по теме: "Knowledge distillation: нейросети обучают нейросети".

- УЗНАТЬ ПОДРОБНЕЕ О КУРСЕ

- ЗАПИСАТЬСЯ НА БЕСПЛАТНЙ ДЕМО-УРОК

Подробнее..

Машинное обучение. Нейронные сети (часть 3) Convolutional Network под микроскопом. Изучение АПИ Tensorflow.js

18.09.2020 12:15:01 | Автор: admin

Смотрите также:

  1. Машинное обучение. Нейронные сети (часть 1): Процесс обучения персептрона

  2. Машинное обучение. Нейронные сети (часть 2): Моделирование OR, XOR с помощью TensorFlow.js

В предыдущих статьях, использовался только один из видов слоев нейронной сети полносвязанные (dense, fully-connected), когда каждый нейрон исходного слоя имеет связь со всеми нейронами из предыдущих слоев.

Чтобы обработать, например, черно-белое изображение размером 24x24, мы должны были бы превратить матричное представление изображения в вектор, который содержит 24x24 =576 элементов. Как можно вдуматься, с таким преобразованием мы теряем важный атрибут взаимное расположение пикселей в вертикальном и горизонтальном направлении осей, а также, наверное, в большинстве случаев пиксел, находящийся в верхнем левом углу изображения вряд ли имеет какое-то логически объяснимое влияние на пиксел в нижнем правом углу.

Для исключения этих недостатков для обработки изображений используют сверточные слои (convolutional layer, CNN).

Основным назначением CNN является выделение из исходного изображения малых частей, содержащих опорные (характерные) признаки (features), такие как ребра, контуры, дуги или грани. На следующих уровнях обработки из этих ребер можно распознать более сложные повторяемые фрагменты текстур (окружности, квадратные фигуры и др.), которые дальше могут сложиться в еще более сложные текстуры (часть лица, колесо машины и др.).

Например, рассмотрим классическую задачу распознавание изображения цифр. Каждая цифра имеет свой набор характерных для них фигур (окружности, линии). В тоже самое время каждую окружность или линию можно составить из более мелких ребер (рисунок 1)

Рисунок 1 Принцип работы последовательно подключенных сверточных слоев, с выделением характерных признаков на каждом из уровней. Каждый следующий из набора последовательно подключенных CNN слоев извлекает более сложные паттерны, базируясь на ранее выделанных.Рисунок 1 Принцип работы последовательно подключенных сверточных слоев, с выделением характерных признаков на каждом из уровней. Каждый следующий из набора последовательно подключенных CNN слоев извлекает более сложные паттерны, базируясь на ранее выделанных.

1. Сверточные слои нейронной сети (convolutional layer)

Основным элементом CNN является фильтр (матричной формы), который продвигается вдоль изображения c шагом в один пиксел (ячейку) вдоль горизонтальной и вертикальной осях, начиная от левого верхнего угла и заканчивая нижним правым. На каждом шаге CNN выполняет вычисление с целью оценки на сколько похожа часть изображения попавшиеся в окно фильтра с паттерном самого фильтра.

Предположим, что мы имеем фильтр размерностью 2x2 (матрица K) и он делает проекцию на исходное изображение, которая обязательно тоже имеет размерность 2x2 (матрица N), тогда значение выходного слоя вычисляется следующим образом:

\left[\begin{matrix}n_{11}&n_{12}\\n_{21}&n_{22}\\\end{matrix}\right]\ast\left[\begin{matrix}k_{11}&k_{12}\\k_{21}&k_{22}\\\end{matrix}\right]=n_{11}k_{11}+n_{12}k_{12}+n_{21}k_{21}+n_{22}k_{22}

Мы перемножаем каждый пиксел в паттерне фильтра с соответствующим пикселем части исходного изображения, попавшего в проекцию фильтра на текущем шаге и суммируем эти значения.

Обратите внимание, что данное выражение имеет похожую форму записи операции суммирования в полносвязанные слоях (fully-connected, dense layers):

{sum=\ \vec{X}}^T\vec{W}=\sum_{i=1}^{n=4}{x_iw_i}=x_1w_1+x_2w_2+x_3w_3+x_4w_4

Единственным существенным отличием является то, что в полносвязанных слоях операции выполняются над векторо-подобными структурами, а в случае сверточных слоях это матрично-подобные структуры, которые учитывают влияние близко расположенных пикселов в вертикальных и горизонтальных осях и при этом игнорируют влияние далеко расположенных пикселов (вне окна фильтра).

Общий подход к обработке в сверточном слое вы можете увидеть на рисунке 2. Обратите внимание тут, что на втором изображении сканируемая часть изображения полностью совпадает с паттерном фильтра, и ожидаемо, что значение ячейки в выходном слое будет иметь максимальное значение.

Рисунок 2 Вычисление внутри сверточных слоевРисунок 2 Вычисление внутри сверточных слоев

Размерность ядра фильтра (kernel size) обычно выбирают квадратной формы и с нечетным количеством элементов вдоль осей матрицы 3, 5, 7.

Если мы имеем форму ядра фильтра (kernel) [kh, kw], а входное изображение размерностью [nh, nw], то размерность выходного сверточного слоя будет (рисунок 3):

c_w=n_w-k_w+1; c_h=n_h-k_h+1Рисунок 3 Принцип формирования сверточного выходного слоя с размерностью ядра фильтра [3,3]Рисунок 3 Принцип формирования сверточного выходного слоя с размерностью ядра фильтра [3,3]

Когда мы выбираем достаточно малое значение ядра фильтра, то потеря в размерности выходного слоя не велика. Если же это значение увеличивается, то и размерность выходного слоя уменьшается по отношению к оригинальному размеру входного изображения. Это может стать проблемой, особенно если в модели нейронной сети подключено последовательно много сверточных слоев.

Чтобы избежать потери разрешений выходных изображений, в настройках сверточных слоев используют дополнительный параметр отступ (padding). Это расширяет исходное изображения по краям, заполняя эти ячейки нулевыми значениями. Предположим, что мы добавляем ph и pw ячеек к исходному изображению, тогда размер выходного сверточного слоя будет:

c_w=n_w+p_w-k_w+1; c_h=n_h+p_h-k_h+1

Обычно, размерность отступов задают таким образом, чтобы размерности исходного изображения и выходного сверточного слоя совпадали, тогда они могут быть вычислены следующим образом:

p_w=k_w-1; p_h=k_h-1Рисунок 4 Включение отступов в исходное изображения для сохранения той же размерности для выходного сверточного слояРисунок 4 Включение отступов в исходное изображения для сохранения той же размерности для выходного сверточного слоя

Как вы уже может обратили внимание - сверочный фильтр начинает свое движение с верхнего левого угла изображения и продвигается вдоль горизонтальной и вертикальной осей на одну ячейку вдоль направления движения. Однако иногда для снижения времени вычисления или же для уменьшения размерности выходного слоя, перемещение сверточного слоя может происходить вдоль направления движения больше чем на одну ячейку (stride). Это еще один из параметров сверточного слоя шаг перемещения (stride).

Рисунок 5 Передвижение сверточного слоя с шагом (stride) больше единицыРисунок 5 Передвижение сверточного слоя с шагом (stride) больше единицы

Предполагая, что размер шага вдоль горизонтальной и вертикальной осей равны соответственно sw, sh, тогда размер выходного сверточного слоя составит:

c_w=\left \lfloor (n_w+p_w-k_w+s_w)/s_w \right \rfloor; c_h=\left \lfloor (n_h+p_h-k_h+s_h)/s_h \right \rfloor

Так же стоит отметить, что сверточный слой может содержать один и более фильтров (каждый фильтр это аналог скрытого слоя с нейронами в полносвязанном слое нейронной сети). Каждый фильтр будет ответственен за извлечение из изображения своих специфичных паттернов (признаков). Представим, что на вход первого сверточного слоя (CONV1) было подано изображение размерностью 9x9x1 (изображение с одним цветовым каналом черно-белое изображение), а сверточный слой имеет 2 фильтра с шагом перемещения ядра 1x1 (stride) и отступ (padding) подобран таким образом, чтобы выходной слой сохранял туже размерность, что и входной. Тогда размерность выходного слоя будет 9x9x2 где 2 это количество фильтров (см. рисунок 6). На следующем шаге в CONV2 сверточном слое, обратите внимание, что при задании размерности фильтра 2x2, его глубина определяется глубиной входного слоя, которой равен 2, тогда ядро будет размерностью 2x2x2. Выходной слой после второго сверточного слоя (CONV2) тогда будет 9x9x4, где 4 количество фильтров в сверточном слое.

Рисунок 6 Изменение размерности тензоров после несколько последовательных сверточных слоев Рисунок 6 Изменение размерности тензоров после несколько последовательных сверточных слоев

Обратите тут внимание, что во всех фреймворках мы будем задавать kw и kh для фильтра, однако если при этом этот на сверточный слой было подано изображение размерностью nw x nh x nd, где nd - количество цветовых каналов изображения или же количество характеристик, извлеченных на предыдущем сверточном слое, то размерность фильтра будет kw x kh x nd (смотри рисунок 6, CONV2).

На рисунке 7 изображен подход при вычислениях, если на сверточный слой подано цветное изображение с тремя каналами RGB, а сверточный слой задан матрицей 3x3. Как было указано выше, так как глубина входного изображения равна трем (3 канала), то фильтр будет иметь размерность 3x3x3.

Риунок 7 - Вычисления в сверточном слое, если входное изображение имеет три канала RGBРиунок 7 - Вычисления в сверточном слое, если входное изображение имеет три канала RGB

АПИ TensorFlow.js для сверточного слоя

Для создания сверточного слоя, необходимо воспользоваться следующим методом: tf.layers.conv2d, который принимает один аргумент это объект параметров, среди которых важны к рассмотрению следующие:
- filter number число фильтров в слое

- kernelSize number | number[] размерность фильтра, если задана number, то размерность фильтра принимает квадратную форму, если задана массивом то высота и ширина могут отличаться

- strides number | number[] - шаг продвижения, не обязательный параметр и по умолчанию задан как [1,1], в горизонтальном и вертикальном направлениях окно фильтра будет продвигаться на одну ячейку.

- padding same, valid настройка нулевого отступа, по умолчанию valid

Рассмотрим режимы задания нулевого отступа.

Режим 'same'

Сверточный слой будет использовать нулевые отступы при необходимости, при котором выходной слой будет всегда иметь размерность, которая вычисляется делением входной ширины (длины) на шаг передвижения фильтра (stride) с округлением в большую сторону. Например, входная ширина слоя вдоль одной из осей - 11 ячеек, шаг перемещения окна фильтра 5, тогда выходной слой будет иметь размерность 13/5=2.6, с учетом округления в большое сторону это будет 3 (рисунок 8).

Рисунок 8 Режим работы valid и same для отступов в фреймворках при kernelSize=6 и strides=5.Рисунок 8 Режим работы valid и same для отступов в фреймворках при kernelSize=6 и strides=5.

В случае если stride=1, то размерность выходного слоя будет равна размерности входного слоя (рисунок 9), фреймворк добавит столько нулевых отступов, сколько необходимо (рисунок 8).

Рисунок 9 Режим работы valid и same для отступов в фреймворке при kernelSize=3 и strides=1Рисунок 9 Режим работы valid и same для отступов в фреймворке при kernelSize=3 и strides=1

Режим 'valid'

В этом режиме фреймворк не добавляет нулевые отступы, в котором в зависимости от strides будут игнорироваться некоторые ячейки входного изображения, как показано на рисунке 8.

Практическое использование сверточного слоя в TensorFlow.js

Давайте ближе познакомимся с АПИ и попробуем к загруженному изображению применить сверточный слой, фильтр которого извлекают из изображения вертикальные или горизонтальные линии. Эти фильтры имеют следующий вид:

- для извлечения вертикальных линий:

\left[\begin{matrix}1&0&-1\\1&0&-1\\1&0&-1\\\end{matrix}\right]

- для извлечения горизонтальных линий:

\left[\begin{matrix}1&1&1\\0&0&0\\-1&-1&-1\\\end{matrix}\right]

В первую очередь понадобится АПИ, который преобразует загруженное изображение в тензор, для этого будет использован tf.browser.fromPixels. Первым аргументом является источник изображения, это может быть указатель на img или canvas элемент в разметке.

<img src="./sources/itechart.png" alt="Init image" id="target-image"/><canvas id="output-image-01"></canvas><script>   const imgSource = document.getElementById('target-image');   const image = tf.browser.fromPixels(imgSource, 1);</script>

Далее, соберем модель, которая состоит из одного сверточного слоя, содержащей один фильтр размерностью 3x3, с режимом отступа same и активационной функцией relu:

const model = tf.sequential({    layers: [        tf.layers.conv2d({            inputShape: image.shape,            filters: 1,            kernelSize: 3,            padding: 'same',            activation: 'relu'        })    ]});

Данная модель в качестве входных параметров принимает тензор формой [NUM_SAMPLES, WIDTH, HEIGHT,CHANNEL], однако tf.browser.fromPixel возвращает тензор размерностью [WIDTH, HEIGHT, CHANNEL], то поэтому нам надо модифицировать форму тензора и добавить еще одну ось там где располагаются образцы изображений (в нашем случае будет только один, так как одно изображение):

const input = image.reshape([1].concat(image.shape));

По умолчанию значения весов фильтра в слое будет инициализироваться в произвольном порядке. Чтобы задать собственные веса, воспользуемся методом setWeights класса Layer, нужный слой может быть получен у экземпляра модели по его индексу:

model.getLayer(null, 0).setWeights([    tf.tensor([         1,  1,  1,         0,  0,  0,        -1, -1, -1    ], [3, 3, 1, 1]),    tf.tensor([0])]);

Далее пропустим исходное изображение через модель, а также нормализуем выходной тензор таким образом, чтобы все значения были в промежутке 0-255, а также уберем ось NUM_SAMPLES:

const output = model.predict(input);const max = output.max().arraySync();const min = output.min().arraySync();const outputImage = output.reshape(image.shape)    .sub(min)    .div(max - min)    .mul(255)    .cast('int32');

Чтобы отобразить тензор на плоскости canvas, воспользуемся функцией tf.browser.toPixels:

tf.browser.toPixels(outputImage, document.getElementById('output-image-01'));

Тут приведен результат работы с применением двух разных фильтров:


2. Подвыборочный слой (pooling layer)

Обычно для обработки изображения, последовательно подключается несколько сверточных слоев (обычно это десять или даже сотня слоев), при этом каждый сверточный слой увеличивает размерность выходного изображения, что в свою очередь приводит к увеличению времени обучения такой сети. Для того, чтобы его снизить, после сверточных слоев применяют подвыборочный слой (pooling layer, subsample layer), которые уменьшают размерность выходного изображения. Обычно применяется MaxPooling операция.

Данный слой также снижает чувствительность к точному пространственному расположению признаков изображения, потому что например любая написанная цифра от руки может быть смещена от центра абсолютно в любом направлении.

В целом преобразования в этом слое похожи на преобразования в сверточном слое. Этот слой также имеет ядро (kernel) определенного размера, который скользит вдоль изображения с задаваемым шагом (stride) и в отличии от сверточного слоя в фреймворках по умолчанию он равен не 1x1, а равен размеру задаваемого ядра. В выходном изображении, каждая ячейка будет содержать максимальное значение пикселов в проекции ядра на определённом шаге (см. рисунок 10).

Рисунок 10 Преобразование в подвыброчном слоеРисунок 10 Преобразование в подвыброчном слое

Как видим, при исходном изображении размерностью 4x4, подвыборочный слой с размерностью фильтра 2x2 и размерностью шага (stride) по умолчанию, равному размерностью фильтра 2x2, выходное изображение имеет размерность в два раза меньше входного.

Также покажем наглядно, что этот слой сглаживает пространственные смещения (рисунок 11) во входном слое. Обратите внимание, что на втором рисунке изображение смещено на один пиксел влево относительно первого изображения, тем не менее выходные изображения для обоих случаев после MaxPooling слоев идентичные. Это еще называют пространственной инверсией (translation invariance). На третьем рисунке, выходной слой уже не идентичен первым двум, но тем не менее пространственная инверсия составляет 50%. Тут в примере рассматривались смещения вдоль вертикальной, горизонтальных осях, но MaxPooling также толерантен к небольшим вращением изображениям также.

Рисунок 11 Сглаживание пространственных смещений после MaxPooling слояРисунок 11 Сглаживание пространственных смещений после MaxPooling слоя

В некоторых источниках преобразование подвыборочного слоя сопоставляют с работой программ по сжатию изображений с целью снизить размер файла, но при этом не потеряв важные характеристики изображения.

Кстати, тут ради справедливости стоит сказать, что некоторые источники предлагают не использовать этот тип слоя вовсе и предлагают для снижения разрешения выходного изображения манипулировать значением шага перемещения фильтра в сверточном слое (stride).

Также помимо MaxPooling иногда используется AveragePooling, с той лишь разницей, что в этом случае считается среднее взвешенное значение пикселей, попавшие в проекции фильтра. Этот фильтр ранее был популярным, но сейчас все же отдают предпочтение MaxPooling. С одной стороны AveragePooling теряет меньше информации, так как учитывает средневзвешенное значение всех пикселов, в тоже время MaxPooling выкидывает из рассмотрения менее значимые пикселы в окне.

АПИ TensorFlow.js для подвыборочного слоя (pooling layer)

В зависимости от слоя вы можете выбрать или tf.layers.maxPooling2d или tf.layers.averagePooling2d. Оба метода имеют одинаковую сигнатуру и принимают один аргумент объект параметров, среди которых важны к рассмотрению следующие:

- poolSize number | number[] размерность фильтра, если задана number, то размерность фильтра принимает квадратную форму, если задана массивом то высота и ширина могут отличаться

- strides number | number[] - шаг продвижения, не обязательный параметр и по умолчанию имеет туже размерность, что и заданный poolSize.

- padding same, valid настройка нулевого отступа, по умолчанию valid

Подробнее..

Поиск изображений с помощью AffNet

29.01.2021 02:04:02 | Автор: admin
Перед нами стояла задача сравнения изображений (image matching) для поиска изображения максимально подобного данному изображению из коллекции. В этой статье я расскажу как мы использовали для этой задачи подход на основе нейронных сетей под названием AffNet. Кому интересно, прошу под кат.

В нашем случае нам нужно было найти для заданного изображения наиболее похожее с целью последующего вычисления позиции камеры на основе метода фундаментальной матрицы трансформации в OpenCV.

Первоначально мы попробовали стандартный матчинг изображений с использованием дескрипторов признаков SIFT и матчера FLANN из библиотеки OpenCV, а также Bag-of-Words. Оба подхода давали слабые результаты. Bag-of-Words к тому же требует огромный датасет изображений и много времени для обучения.

Обзор подхода AffNet


На использование подхода нас вдохновил вебинар Points & Descriptors, который прошлым летом проводил CVisionLab. Для всех заинтересованных здесь доступны слайды с этого вебинара. На этом вебинаре представили интересный подход: AffNet + HardNet. Результаты матчинга, представленные на слайдах нас впечатлили и мы решили попробовать его в нашей задаче. По словам авторов AffNet это инновационный метод для обучения регионов ковариантных к афинной трансформации с функцией постоянной отрицательной потери (hard negative-constant loss), который обходит state-of-the-art подходы типа Bag-of-Words на задачах матчинга изображений и wide baseline stereo.

image

HardNet это новый компактный обучаемый дескриптор признаков, показавший лучшую эффективность state-of-art в сравнении с классическими и обучаемыми дескрипторами признаков и который возможно быстро вычислять на GPU (ссылка на статью). Он доступен публично на github. Здесь есть хороший пример матчинга изоображений с большой афинной трансформацией с использованием AffNet.

image

Авторы AffNet объясняют подход более детально в своей статье.

Тестирование подхода AffNet


Клонируем репозиторий с github:

git clone https://github.com/ducha-aiki/affnet.git


Затем переходим в папку affnet.
Запустим Jupyter:

jupyter notebook


и откроем ноутбук SIFT-AffNet-HardNet-kornia-matching.ipynb в папке examples. Сначала установим все завивисимости. Создадим ячейку в верху ноутбука и запустим ее

!pip install kornia pydegensac extract_patches


Если у вас установлен OpenCV версии 4 вы можете получить ошибку из-за функции SIFT_create:

The function/feature is not implemented) This algorithm is patented and is excluded in this configuration;


. Дело в том, что начиная с версии 3.4.2.16 SIRF и SURF больше недоступны в основном репозитории opencv, они были вынесены в отдельный пакет opencv-contrib. Установим OpenCV и opencv-contrib:

pip install opencv-python==3.4.2.16pip install opencv-contrib-python==3.4.2.16

Когда мы запустим матчинг изображений с AffNet на изображениях, предоставленных авторами, мы получим примерно такой результат:

30.0 inliers found

image

Довольно неплохой результат для таких изображений.
Для пайплайна DoG-AffNet-OriNet-HardNet

18.0 inliers found


image

И наконец для пайплайна DoG-OriNet-HardNet

25.0 inliers found


image

Когда мы применили подход на своих изображениях сцен домашей обтановке (комнаты в доме), мы были удивлены результатами. AffNet находил соответствия между двумя изображениями с очень плохим освещением и большей разницей в угле обхора камеры. AffNet показал хорошие результаты без дополнительного дообучения.

Теперь осталось попробовать AffNet на своих изображениях.
Чтобы интегрировать AffNet в свою программу вам нужно только установить все необходимые библиотеки, скачать предобученные веса модели и скопировать несколько функций из ноутбука SIFT-AffNet-HardNet-kornia-matching.ipynb.

Можно легко сконвертировать Jupyter ноутбук в скрипт python с помощью утилиты jupyter nbconvert. Установим ее через pip:

pip install nbconvert


и запустим конвертацию:

jupyter nbconvert SIFT-AffNet-HardNet-kornia-matching.ipynb --to python


На этом все. Удачи в использовании AffNet для матчинга изоображений и до новых встреч.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru