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

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

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

Начало: изучение данных

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

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

В наборе данных представлено 133 породы собак, и все они представлены примерно одинаково.

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

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

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

Часть 1: Обнаружение человеческих лиц

Чтобы начать этот проект, мы делаем детектор человеческого лица, используя каскад вуаля-Джонса Хаара, который работает, пропуская область изображения через несколько фильтров, чтобы определить, содержит ли область лицо или нет. В этом конкретном примере используется функция detectMultiScale, созданная OpenCV.

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

Затем мы заставили его работать с двумя предварительно загруженными наборами данных образцов изображений, один из которых содержит изображения людей, а другой — изображения собак.

К сожалению, хотя детектор лиц хаара отлично справляется со своей задачей, он менее успешен в различении людей и собак — 11 из 100 изображений собак были помечены как содержащие человеческие лица.

Часть 2: Обнаружение собачьих морд

В следующей части мы посмотрим, сможем ли мы сделать детектор собак, который сможет не только различать собачьи морды, но и отличать определенные породы собак друг от друга!

ImageNet содержит базу данных из более чем 14 000 000 изображений и 20 000 категорий. Данные, используемые в этом проекте, представляют собой гораздо меньшее подмножество данных изображения и меток, и мы будем использовать предварительно обученный классификатор ResNet-50 для их интерпретации.

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

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

Затем мы извлекаем метки ImageNet, соответствующие породам собак, и используем их для создания детектора пород собак.

И, наконец, мы пишем функцию, которая берет 100 изображений людей и 100 изображений собак и сообщает нам, может ли модель ResNet-50 определить, на каких фотографиях изображены собаки, а на каких нет.

Это работает намного лучше при выделении собак, чем детектор лиц хаара!

Часть 3: Создание детектора собак с нуля

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

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

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

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

Всего 25% точности! И потребовалось 20 эпох и много времени, чтобы обучить модель такого размера и сложности. Посмотрим, сможем ли мы сделать лучше.

Часть 4: Создание детектора собак с трансферным обучением

На этом этапе мы используем предварительно обученный классификатор VGG-16 для выполнения работы по обнаружению изображений, используя «узкие места» или вывод предварительно обученной библиотеки для используемых здесь наборов данных изображений.

Затем мы добавляем слой глобального среднего пула и выходной слой к базовой архитектуре модели VGG-16 и обучаем готовую модель библиотеке изображений собак.

И все же, после 20 эпох обучения модель VGG-16 все еще может точно угадать породу собаки на тестовых изображениях только в 41% случаев. Кажется, что нужно проделать еще больше работы, чтобы сделать более точный классификатор пород собак.

Часть 5. Создание лучшего детектора собак с помощью трансферного обучения

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

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

Разработка оптимизатора для этого проекта была сложной задачей. Я протестировал множество различных оптимизаторов, прежде чем узнал, что Adamax лучше всего работает с этой предварительно обученной моделью. Оптимизатор Adadelta также работает очень хорошо, но дает противоречивые результаты. Также были протестированы несколько функций потерь Keras, и лучшими функциями потерь после categorical_crossentropy были mean_absolute_percentage_error и mean_squared_logarithmic_error, обе из которых также могли работать непоследовательно.

Наконец, во время обучения модели я увеличил размер тренировочного пакета с 20 до 64.

Наконец-то у нас есть классификатор CNN, который может постоянно достигать точности 84% на тестовых данных! Теперь поработаем над новыми изображениями и посмотрим, как это выглядит на практике!

Часть 6: Написание алгоритма определения породы собак

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

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

При тестировании на двух случайно выбранных изображениях из тестовых файлов собак и файлов изображений человека:

Классификатор правильно идентифицирует американского стаффордширского терьера, а Сару Джессику Паркер — как акиту! Может дело в глазах и в носу?

Наконец, я попробовал классификатор, используя еще несколько фотографий.

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