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

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


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

Пакет Torchvision состоит из популярных наборов данных, архитектур моделей и шаблонов для компьютерного зрения. В принципе, если вы занимаетесь компьютерным зрением и используете PyTorch, Torchvision будет очень полезен!

1. Готовые модели для классификации изображений

Предварительно обученные модели -это модели, обученные на больших наборах данных, таких как ImageNet. Сообщество глубокого обучения значительно выиграло от этих моделей с открытым исходным кодом, и это одна из основных причин быстрого прогресса в исследованиях компьютерного зрения. Другие исследователи и практики могут использовать эти модели вместо того, чтобы изобретать все с нуля.

Ниже приведен примерный график того, как современные модели улучшились с течением времени. Мы включили только те модели, которые присутствуют в пакете Torchvision.

Прежде чем мы перейдем к деталям того, как мы можем использовать предварительно обученные модели для классификации изображений, давайте посмотрим, какие модели мы можем использовать. Мы возьмем AlexNet и ResNet101 в качестве двух основных примеров. Обе сети были обучены на наборе данных ImageNet.

Набор данных ImageNet содержит более 14 миллионов изображений, поддерживаемых Стэнфордским университетом, и широко используется для проектов, связанных с изображениями. Изображения принадлежат к различным классам. Цель предварительно подготовленных моделей, таких как AlexNet и ResNet101, состоит в том, чтобы взять изображение в качестве входных данных и предсказать его класс.

Слово предварительно подготовленные модели здесь означает, что архитектуры глубокого обучения AlexNet и ResNet101, были обучены на некотором (огромном) наборе данных, результирующие веса и смещения с ними уже настроены. Эта разница между архитектурой и Весами и смещениями должна быть очень ясной, потому что, как мы увидим в следующем разделе, TorchVision имеет как архитектуры, так и предварительно подготовленные модели.

1.1 Способ Вывода Модели

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

  1. Чтение входного изображения

2. Выполнение преобразований на изображении, например изменение размера, обрезка по центру, нормализация и т.д.

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

4. На основе полученных оценок (элементов выходного вектора, о которых мы говорили в шаге-3) выводятся прогнозы.

1.2 Загрузка предварительно обученной сети с помощью TorchVision

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

Во-первых, давайте установим модуль TorchVision.

Далее, импортируем модели из модуля torchvision и посмотрим, какие различные модели и архитектуры доступны.

Стой, стой! Не так быстро! Внимательно посмотри на данные, которые мы получили выше.

Обратите внимание, что есть одна запись называется AlexNet, а другая называется alexnet. Заглавное имя относится к классу Python (AlexNet), тогда как alexnet — это функция, которая возвращает модель, созданную из класса AlexNet. Кроме того, эти функции могут иметь различные наборы параметров. Например, densenet121, densenet161, densenet169, densenet201, все являются экземплярами класса DenseNet, но с различным количеством слоев – 121,161,169 и 201, соответственно.

1.3 Использование AlexNet для классификации изображений

Давайте сначала начнем с AlexNet, одной из первых прорывных сетей в распознавании изображений.

Архитектура AlexNet

Шаг 1: Загрузите предварительно подготовленную модель

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

Скачать модель можно по ссылке.Обратите внимание, что обычно модели PyTorch имеют расширение .pt или .pth

После того, как Весы были загружены, мы можем перейти к другим шагам.

Шаг 2: указываем параметры изображения

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

Мы можем предварительно обработать входное изображение с помощью преобразований, присутствующих в модуле TochVision. В этом случае мы можем использовать следующие преобразования для AlexNet и ResNet.

Давайте разберемся, что произошло в приведенном выше фрагменте кода.

Строка [1]: здесь мы определяем переменную, которая представляет собой комбинацию всех преобразований изображения, выполняемых на входном изображении.

Строка [2]: Изменение размера изображения до 256?256 пикселей.

Строка [3]: обрезка изображения до 224?224 пикселей по центру.

Строка [4]: преобразование изображения в тип данных PyTorch Tensor.

Строка [5-7]: нормализация изображения путем установки его среднего и стандартного отклонения на заданные значения

Шаг 3: загрузите изображение и предварительно обработайте его

Далее загрузим изображение и выполним указанные выше преобразования изображения. Обратите внимание, что мы будем широко использовать модуль Pillow (PIL) с TorchVision, поскольку это бэкэнд изображения по умолчанию, поддерживаемый TorchVision.

Шаг 4: Вывод Модели

Наконец, пришло время использовать модель, чтобы увидеть, что модель думает об изображении.

Во-первых, нам нужно перевести нашу модель в режим eval.

Далее, выведем результат

Это все хорошо, но что мы делаем с этим вектором из 1000 элементов? У нас все еще нет класса (или метки) изображения. Для этого мы сначала прочитаем и сохраним метки из текстового файла, имеющего список всех 1000 меток. Обратите внимание, что номер строки указывает номер класса, поэтому очень важно убедиться, что вы не меняете этот порядок.

Поскольку AlexNet и ResNet были обучены на одном и том же наборе данных ImageNet, мы можем использовать один и тот же список классов для обеих моделей.

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

Модель предсказывает изображение лабрадора ретривера с уверенностью 41,58%. Но это слишком низко плохо. Давайте посмотрим, к каким другим классам, по мнению модели, принадлежит изображение.

_, indices = torch.sort(out, descending=True)

[(labels[idx], percentage[idx].item()) for idx in indices[0][:5]]

А вот и результаты:

Таким образом, модель смогла предсказать, что это была собака с довольно высокой уверенностью, но она не была очень уверена в породе собаки.

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

Как насчет того, чтобы попробовать то же самое с ResNet?

Весь код можно найти по ссылке

1.4. Использование ResNet для классификации изображений

Мы будем использовать resnet101 — 101 слой сверточной нейронной сети. resnet101 имеет около 44,5 миллионов параметров, настроенных в процессе обучения. Это же здорово!

Давайте быстро пройдем шаги, необходимые для использования resnet101 для классификации изображений.

# First, load the model

resnet = models.resnet101(pretrained=True)

# Second, put the network in eval mode

resnet.eval()

# Third, carry out model inference

out = resnet(batch_t)

# Forth, print the top 5 classes predicted by the model

_, indices = torch.sort(out, descending=True)

percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100

[(labels[idx], percentage[idx].item()) for idx in indices[0][:5]]

И вот что предсказал resnet101.

Так же, как AlexNet, ResNet удалось предсказать, что это была собака с очень высокой уверенностью и предсказал, что это был лабрадор ретривер с уверенностью 48,25%. Это очень хорошо!

2. Сравнение Моделей

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

Error Top-1: error top-1 возникает, если класс, предсказанный моделью с наибольшей достоверностью, не совпадает с истинным классом.

Error top-5: error топ-5 возникает, когда истинный класс не входит в число 5 лучших классов, предсказанных моделью (отсортированных по степени достоверности).

Время вывода на CPU: время вывода - это время, затраченное на шаг вывода модели.

Размер модели: здесь размер обозначает физическое пространство, занимаемое .pth файл предварительно обученной модели, поставляемой PyTorch

Хорошая модель будет иметь низкую ошибку Top-1, низкую ошибку Top-5, низкое время вывода на CPU и GPU и низкий размер модели.

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

2.1. Сравнение точности моделей

Первый критерий, который мы собираемся рассмотреть, состоит из ошибок Top-1 и Top-5. Ошибка Top-1 относится к ошибкам, когда верхний предсказанный класс отличается от истины. Поскольку проблема довольно сложная, существует еще одна мера ошибки, называемая ошибкой Top-5. Прогноз классифицируется как ошибка, если ни один из 5 лучших прогнозируемых классов не является верным.

Обратите внимание на график, у обоих ошибок совпадают тенденции. AlexNet была первой попыткой, основанной на глубоком обучении, и с тех пор произошло улучшение ошибки. Заметные упоминания-GoogLeNet, ResNet, VGGNet, ResNext.

2.2. Сравнение Времени Вывода

Далее мы сравним время вывода результата. Одно изображение подавалось в каждую модель несколько раз, и время вывода для всех итераций усреднялось. Подобный процесс был выполнен для центрального процессора и графического процессора на Google Colab. Несмотря на то, что есть некоторые вариации в порядке, мы можем видеть, что SqueezeNet, ShuffleNet и ResNet-18 имели очень низкое время вывода, что именно то, что нужно.

2.3. Сравнение Размеров Модели

Когда мы используем модель глубокого обучения на устройстве android или iOS, размер модели становится решающим фактором, иногда даже более важным, чем точность. SqueezeNet имеет минимальный размер модели (5 Мб), а затем ShuffleNet V2 (6 МБ) и MobileNet V2 (14 мб). Очевидно, почему эти модели предпочтительны в мобильных приложениях, использующих глубокое обучение.

2.4. Общее Сравнение

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

X-координата, которую мы используем, является ошибкой Top-1 (Чем левее, тем лучше). Y-координата - это время вывода на GPU в миллисекундах (чем ниже, тем лучше). Размер пузырька соответствует размеру модели (чем меньше, тем лучше).

Примечание :

  1. Меньшие пузыри лучше с точки зрения размера модели.
  2. Пузырьки вблизи начала координат лучше с точки зрения точности и скорости.

3. окончательный вердикт

Из приведенного выше графика видно, что ResNet50 является лучшей моделью с точки зрения всех трех параметров ( небольшой по размеру и ближе к началу координат )

DenseNets и ResNext101 слишком долго выводят результат.

AlexNet и SqueezeNet имеют высокую частоту ошибок.

Ну, вот и всё! В этом посте мы рассмотрели, как мы можем использовать модуль TorchVision для классификации изображений с использованием предварительно обученных моделей-всего лишь за 4 шага. Мы также провели сравнение моделей, чтобы решить, какую модель выбрать в зависимости от наших требований к проекту. В следующем посте мы рассмотрим, как использовать transfer learning для обучения модели на пользовательском наборе данных с помощью PyTorch.

Оригинал


Источник: m.vk.com

Комментарии:

Vyacheslav Evteev, 2019-12-08 20:48:59
А как сформировать(или открыть) файл 'imagenet_classes.txt'