Как работает VGG16 — нейросеть для выделения признаков изображений
И почему она полезна для всех, кто работает с computer vision
Сегодня говорим об архитектуре нейронной сети, которая называется VGG16. Она относится к семейству сверточных сетей, а они, в свою очередь, лежат в основе современных систем компьютерного зрения.
Так что начнем с разбора именно сверточных нейронок.
Как работает сверточная нейронная сеть: объясняем на пальцах
Хотя первые сверточные нейронки создавали еще в 90-х, для их работы нужны были огромные количества обучающих данных и большие вычислительные ресурсы. Поэтому считается, что архитектуру первых сверточных нейронных сетей придумал французский ученый Ян Лекун (Yann LeCun) в 2012 году. Многослойность, по принципу которой она строится, Ян подсмотрел в природе: сеть копирует работу зрительной системы у млекопитающих, в частности — у человека.
Ян Лекун, автор архитектуры первых сверточных нейронных сетей. С 2013 года — глава Facebook AI Research // Photo by Jérémy Barande
Вот как это происходит на примере. Допустим, перед нейронной сетью стоит задача распознать предмет на фотографии:
1. Сверточная сеть делит изображение на маленькие кусочки, которые называются фильтрами или ядрами.
2. Фильтры скользят по всему изображению, проверяя, насколько они совпадают с разными его частями. Каждый фильтр пытается обнаружить специфические признаки объекта: границы, цвета, текстуры.
3. Если фильтр обнаруживает искомый признак, он создает активацию — высокое значение в определенной области изображения.
4. Активации объединяются вместе, чтобы сгенерировать новое представление изображения, где более высокие уровни абстракции связаны с более глубокими слоями сети. Таким образом, сверточная сеть самостоятельно анализирует иерархические признаки изображений, начиная с простых форм и линий — и заканчивая сложными объектами и концепциями.
5. Наконец, обработанные признаки передаются в полносвязные слои сети для классификации или выполнения других задач, например, обнаружения объектов или сегментации изображений.
Сверточные нейронные сети значительно улучшили показатели систем компьютерного зрения: до их использования распознавание проходило успешно только в 25 % случаев, а в 2012 году модель AlexNet на основе сверточных сетей показала распознавание в почти 84 % случаев.
Поэтому сверточные сети стали активно внедрять в ПО для анализа медицинских изображений, индексации и поиска картинок, автоматического контроля транспортных средств на дорогах и т. д.
Особенности модели VGG16
Перейдем к модели VGG16. Аббревиатура VGG — это сокращение от названия Visual Geometry Group, группы при Оксфордском университете, которая и разработала эту технологию в 2013 году. Число 16 в имени означает количество слоев, которые используются в этой нейронной сети: 13 сверточных слоев и 3 полносвязанных слоя.
Рассмотрим схему работы модели VGG16 детальнее:
Как работает нейронная сеть VGG16
Размерность входного слоя нейронной сети VGG16 составляет 224 на 224 пикселя. Задача входного слоя — преобразовать входные данные в формат, понятный для последующих слоев нейронной сети. То есть это точка входа, через которую данные передаются в модель для обработки.
Вот что происходит, когда изображение прошло через точку входа:
1. Данные проходят два сверточных слоя, у которых функция активации ReLu и размеры ядер — 3x3 пикселя.
2. После двух сверточных слоев следует слой MaxPooling, который уменьшает размерность данных в два раза.
3. Далее следуют два сверточных слоя, у которых также есть функция активации ReLu и размер ядер 3x3. У этих слоев 128 фильтров. После этого применяется операция MaxPooling — и размер карты признаков снова уменьшается в два раза.
4. Затем идут три сверточных слоя, у которых 256 фильтров, и т. д.
По мере углубления сети количество фильтров увеличивается с 64 до 512. После каждого сверточного слоя следует активация ReLu, которая помогает введению нелинейности в модель. В конце, после последнего слоя MaxPooling, мы получаем размерность 7x7 и 512 каналов.
Данные подаются на вход полносвязанной нейронной сети, которая содержит 4096 нейронов и также имеет функцию активации ReLu (кроме последнего слоя Softmax). Поскольку изначально сеть обучалась на тысяче разных классов, на выходе у нее — тысяча нейронов.
Важно! Когда мы используем два сверточных слоя подряд, мы получаем карту признаков, которая анализируется вторым сверточным слоем. Получается, что ситуация аналогична тому, как если бы мы взяли ядро с размерностью 5х5. Но если все-таки взять фильтр с размерностью 5х5, то, подсчитав количество настраиваемых коэффициентов, можно убедиться, что два сверточных слоя выгоднее по сравнению с одним с фильтром большей размерности.
Это нетрудно подсчитать по формуле:
число_настраиваемых_коэффициентов = количество_фильтров * (размер_ядра_свертки * размер_ядра_свертки + 1)
Для одного слоя результат будет 5*5+1=26, а для двух слоев — 2(3*3+1)=20. То есть число настраиваемых коэффициентов будет меньше, но при этом скорость обучения нейронной сети — выше.
Как работать с VGG16
Чтобы начать работать с VGG16, вам нужен фреймворк глубокого обучения. Например, на Python. Можно использовать:
1. TensorFlow
2. PyTorch
3. Keras
Список не ограничивается этими фреймворками, но именно они предоставляют удобные средства для создания, обучения и тестирования моделей нейронных сетей. Например, PyTorch предлагает загрузить уже обученную модель из библиотеки torchvision.models, в Keras она загружается из keras.applications, а в TensorFlow — через библиотеку tf.keras.applications.
Важно! Также VGG16 можно найти в открытых репозиториях, например, GitHub.
Для проверки производительности и точности обработки данных рекомендуется применять тестовые наборы данных, которые содержат изображения, соответствующие задаче классификации объектов. Это могут быть такие наборы, как CIFAR-10, ImageNet або COCO.
Заключение
VGG16 считается фундаментом для разработки систем компьютерного зрения. На сегодня ее точность и скорость уже недостаточны для реальных проектов, зато она помогает понять основные принципы работы сверточных нейронок и с ней удобно работать в учебных целях.
«VGG — это классика. У нее относительно старая архитектура, но она до сих пор используется. Есть, конечно, более эффективные альтернативы, но новичкам знать принципы ее работы очень полезно. Потому что как вы хотите работать с нейросетями, если не знаете, что такое VGG?»
Ян Колода, Senior CV&ML Engineer,
PhD в Image Processing & Computer Vision,
лектор курса Computer Vision в robot_dreams
Главная особенность VGG16 — задействование небольших фильтров с размером ядра 3x3 пикселя и применение глубоких сверточных слоев. Часто модель требует оптимизации и регуляризации, что объясняется особенностями архитектуры и высокой вычислительной сложностью.
Также эта нейросеть требует большого объема памяти для хранения параметров модели. Общее количество параметров в модели VGG16 — около 138 миллионов. Это включает в себя вес и смещения всех слоев нейронной сети.
Полезно! Если вы используете фреймворк Keras, то объем памяти, занимаемый моделью, можно узнать с помощью метода model.summary(). Он выведет сводку архитектуры модели, включая общее число параметров и размеры каждого слоя.
Помимо VGG16 есть также модель VGG19, которая появилась в 2014 году. У нее практически идентичная архитектура и отличие только в числе используемых слоев — тут их 19. К ее изучению можно приступить как раз после VGG16. А если ищете что-нибудь сложнее и производительнее, присмотритесь к ResNet, Inception и EfficientNet.