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

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

Я выбрал Intel Image Classification Dataset, взятый с веб-сайта Kaggle. Вы можете найти много таких интересных наборов данных на Kaggle.

Прежде чем приступить к работе над проблемой, всегда полезно взглянуть на наш набор данных. С первого взгляда мы можем найти много интересных открытий или аномалий в наборе данных. Этот набор данных содержит 25000 изображений зданий, лесов, ледников, гор, морей и улиц с разными пометками. Мы разделим изображения на эти 6 различных классов. Большинство изображений имеют размер 150 х 150 пикселей.

Начальная настройка

Начнем с импорта всех необходимых библиотек.

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

od.download('https://www.kaggle.com/puneet6060/intel-image-classification')

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

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

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

Утилиты GPU

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

Теперь мы создали класс Python DeviceLoader, который будет проверять, доступен ли нам графический процессор в среде, и перемещать данные на графический процессор.

Обучите нашу модель

Теперь мы готовы приступить к написанию кода для обучения нашей модели. Мы будем использовать предварительно обученную модель ResNet34, которая была обучена на данных изображения, имеющих 1000 классов. Зачем использовать предварительно обученную модель CNN? Начальные слои CNN обучаются только элементам низкого и среднего уровня, таким как края, линии, границы и т. Д. Все виды изображений содержат эти элементы в себе. Эти характеристики предварительно обученной CNN делают ее очень многоразовой. Следовательно, имеет смысл использовать такие предварительно обученные модели, которые уже были обучены на большом наборе данных, в которые многие компании вложили много денег. Это называется трансферным обучением.

Чтобы использовать предварительно обученную модель, нам нужно оставить все предыдущие уровни как есть и изменить только последний слой в соответствии с нашим вариантом использования. ResNet34 обучен на 1000 классах изображений. В нашей задаче всего 6 различных классов изображений (здания, леса, ледники, горы, моря и улицы). Следовательно, мы изменим последний уровень ResNet34 на эти 6 классов. Трансферное обучение экономит время на обучение и усилия инженеров по развитию.

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

Последний слой нашей модели теперь был изменен с начальных 1000 классов на наши 6 классов. При необходимости в конце мы могли бы добавить в нашу модель больше слоев, но один линейный слой здесь отлично работает.

self.network.fc = nn.Linear(self.network.fc.in_features, num_classes)

Ура! Теперь мы успешно создали нашу модель CNN с использованием трансферного обучения. Кроме того, нам нужно создать цикл обучения, в котором мы оцениваем нашу модель, изменяем гиперпараметры, такие как скорость обучения, эпохи, настраиваем оптимизаторы и т. Д. Для обучения, а также для проверки. Мы добавим некоторые методы регуляризации, такие как Политика скорости обучения за один цикл, Снижение веса, Градиентное отсечение в нашу функцию подгонки, чтобы улучшить обучение нашей модели.

Таким образом, у нас есть все готово для наших тренировок. Теперь нам просто нужно применить функцию, которую мы разработали с использованием различных гиперпараметров, и обучить нашу модель наилучшим образом. После нескольких итераций с разными гиперпараметрами модель обучается с точностью более 90% на данных проверки в течение 10-15 минут. В этом заключается преимущество применения трансферного обучения к вашей модели и ее обработки на графическом процессоре для быстрого достижения хорошей точности. Этот подход очень удобен для промышленных приложений, в которых долгое ожидание обучения недопустимо.

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

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

Потеря проверки показывает некоторые взлеты и падения в начале, но ближе к концу она начинает сливаться с потерей обучения. Если он отличается от потери при обучении, это будет означать переоснащение модели.

Используемая нами методика регуляризации, а именно. Политика скорости обучения O ne Cycle Learning Rate увеличивает скорость обучения для начальных пакетов данных до определенного значения, а затем снижается для последующих пакетов.

Осталась одна вещь. Нам нужно увидеть, как наша модель работает с немаркированными данными вывода. В используемом нами наборе данных Kaggle уже есть папка с изображениями без меток. Давай предсказуем! Мы случайным образом выберем изображения из этого набора выводов и будем использовать их для нашего прогноза.

Наша модель смогла предсказать все классы изображений из набора Inference.

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