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

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

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

Предположим, что желтоватое тело, движущееся между деревьями, может оказаться:

Хорошо, если это А, и вы ошиблись, значит, вы мертвы. Но если это B, и вы сделаете ошибку, вы потеряете много времени на ласки и игры, и это может быть хуже (я посчитал, но это не так).

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

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

Лучший инструмент машинного обучения для классификации изображений - это сверточная нейронная сеть (CNN; подробнее здесь). Мы будем использовать Keras для фактической реализации, поскольку он предлагает интуитивно понятный, но мощный API.

Код для CNN будет выглядеть примерно так:

(Если вы, как и я, ненавидите читать код по частям, не отчаивайтесь: в конце сообщения вы найдете ссылку на весь конвейер в Colab.)

Для подачи изображений в классификатор мы можем использовать Keras’ ImageDataGenerator , который также включает в себя множество методов преобразования данных.

Теперь, даже несмотря на то, что наш набор данных довольно мал, а наша CNN очень неглубокая, обучение нейронной сети всегда является медленным делом (наша простая модель по-прежнему имеет более 10 000 000 параметров, которые необходимо оптимизировать). Было бы удобно иметь доступ к видеокарте NVIDIA, поскольку мы могли бы сэкономить много времени, используя графический процессор для вычислений.

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

С другой стороны, Google Colab (отказ от ответственности: компания, в которой я сейчас работаю) предлагает бесплатный доступ к NVIDIA Tesla K80 GPU и интуитивно понятному облачному интерфейсу, подобному Jupyter. Google Colab побеждает.

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

Ладно, неплохо. С простой архитектурой, всего 40 эпох и без оптимизации гиперпараметров, мы получили точность 82,5% на тестовом наборе, что на самом деле лучше, чем лучший результат при проверке, установленном во время обучения (см. график выше; это из тех странностей, которые возникают при работе с несколькими точками данных).

Также ясно, что модель начинает переобучаться примерно в эпоху 20 (точность повышается для набора поездов, но не для набора для проверки).

В целом графический процессор Colab работал нормально, и даже несмотря на то, что мне приходилось перезапускать среду выполнения несколько раз, я мог обработать эпоху примерно за 3 секунды, что намного быстрее, чем на моем персональном компьютере. Основная проблема с Colab заключалась в том, что время от времени я сталкивался с проблемами памяти графического процессора (ResourceExhaustedError). Типа проблем, которые приходят с бесплатно.

Здесь вы можете найти мой Colab, который содержит весь мой код CNN плюс несколько ячеек, связанных с волшебными функциями Colab (например, как использовать Google Drive для извлечения и сохранения файлов непосредственно из Colab).

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

Вы можете прочитать вторую часть здесь.

Постскриптум

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