Распознавание изображений

Как компьютер может взять изображение и ответить на вопросы типа «что на этом изображении? Кошка, собака или что-то еще?

За последние несколько лет область машинного обучения добилась огромного прогресса в решении этой сложной проблемы. В частности, глубокая нейронная сеть (DNN) может достичь разумной производительности в задачах визуального распознавания — в некоторых областях она соответствует или превосходит производительность человека.

InceptionV3 — одна из последних разработок Google по распознаванию изображений. Он обучен для участия в конкурсе ImageNet Large Visual Recognition Challenge с использованием данных за 2012 год. Это стандартная задача компьютерного зрения, когда модели пытаются классифицировать целые изображения по 1000 классам, таким как Зебра, Далматинец и Посудомоечная машина. По сравнению с предыдущими моделями DNN InceptionV3 имеет одну из самых сложных сетевых архитектур в компьютерном зрении.

Итак, вы хотите сделать это… с помощью OCaml?

Существует множество хороших сред глубокого обучения, которые можно использовать для классификации изображений, таких как TensorFlow, Caffe, Torch и т. д. Но что, если вы выбрали язык функционального программирования, такой как OCaml? Долгое время считалось, что OCaml не подходит для сложных вычислительных задач, таких как машинное обучение. А теперь у нас есть Сова.

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

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

Подготовка: установить сову

Во-первых, вам нужно установить OCaml. Удобнее всего это сделать из системного менеджера пакетов. Однако для Owl требуются версии >= 4.04.0 , которые могут еще не поддерживаться вашим менеджером пакетов. В этом случае попробуйте скомпилировать исходный код. После установки OCaml вы можете установить OPAM, менеджер пакетов для OCaml. Опять же, рекомендуемый способ — установка из исходников. Для справки, вот Dockerfile для этих двух шагов.

Установить Сову очень просто. Вы можете собрать из исходного кода, загрузить с помощью opam или попробовать все современные функции с помощью Docker. Подробности смотрите в руководстве по установке. Обратите внимание, что Owl на opam отстает от основной ветки и пропускает много новых функций, поэтому я не гарантирую, что код из этой статьи будет гладко работать на ней.

Перед компиляцией Owl из исходников вам следует установить некоторые внешние библиотеки и пакеты OCaml. Обратите внимание, что один из этих пакетов, eigen, также отстает от ветки master, если он установлен из opam. Пожалуйста, установите этот пакет из источника, если можете.

Конечно, самый удобный способ поэкспериментировать с Owl — использовать Docker. Все, что вам нужно сделать, это вытащить образ, запустить контейнер, а затем поиграть с ним в utop!

Пусть катится!

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

owl -run 6dfed11c521fb2cd286f2519fb88d3bf

Вот и все. Этот однострочник — все, что вам нужно сделать, чтобы увидеть пример классификации изображений в действии. Вот результат:

Top 5 Predictions:
Prediction #0 (96.20%) : giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca
Prediction #1 (0.12%) : lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens
Prediction #2 (0.06%) : space shuttle
Prediction #3 (0.04%) : soccer ball
Prediction #4 (0.03%) : indri, indris, Indri indri, Indri brevicaudatus

Это результат классификации этого изображения:

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

Вам нужно выполнить 5 шагов для классификации изображений с помощью InceptionV3:

  1. Импортируйте внешний код/библиотеки, используя Zoo в Owl. #Zoo “gist-id” позволяет использовать модули кода, определенные в других Gist. Здесь мы хотим использовать модули InceptionV3. Он определяет сетевую архитектуру InceptionV3 и загружает веса сети. Загруженный код кэшируется в каталоге $HOME/.owl/zoo.
  2. Загрузите модель InceptionV3 одной строкой кода
  3. Укажите абсолютный путь к входному изображению. Здесь мы используем функцию extend_zoo_path util для автоматического поиска изображения «panda.png», содержащегося в самом Gist.
  4. Запустите логический вывод с помощью модели нейронной сети и входного изображения, а затем декодируйте результат, получив первые N (N по умолчанию равно 5) прогнозов в удобочитаемом формате. Выходные данные представляют собой массив кортежей, каждый кортеж состоит из строки для описания классифицированного типа и числа с плавающей запятой в диапазоне от 0 до 100, представляющего процентную вероятность того, что входное изображение действительно относится к этому типу.

5. Если хотите, можете распечатать результат на экране.

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

Онлайн-демонстрация

Если вас не интересует установка чего-либо — Нет проблем! Здесь — это веб-демонстрация этого приложения для классификации изображений на платформе Owl. Пожалуйста, не стесняйтесь играть с ним! И сервер не будет хранить ваше изображение. На самом деле, если вы так стремитесь защитить конфиденциальность своих личных данных — с чем я не могу с вами больше согласиться — тогда вам определенно следует попытаться вытащить код здесь и быстро создать локальный сервис обработки изображений, не беспокоясь о том, что ваши изображения увидит кто-то еще!

Хотите знать больше?

У нас есть больше! Я предлагаю вам прочитать код, который строит всю сеть InceptionV3 из этой сути. Даже если вы не очень хорошо знакомы с Owl или OCaml, должно быть довольно удивительно видеть, что сеть, содержащая 313 нейронных узлов, может быть построена с использованием всего ~150 строк кода. И речь идет об одной из самых сложных нейронных сетей для компьютерного зрения. Что касается других более мелких задач, таких как наиболее распространенная задача распознавания рукописных цифр, вы можете построить хорошую модель глубокой нейронной сети всего за 9 строк кода! Пожалуйста, проверьте исходный код Owl, чтобы получить больше примеров, если вы заинтересованы.

Лучшая отправная точка для обучения использованию Owl — это учебники с utop под рукой и обучение на практике.

Удачной охоты!