Эта запись в блоге является частью серии статей об обучении и развертывании одной и той же модели на трех разных облачных платформах: AWS, Azure и Google Cloud.

  1. Часть 0: Введение + Парсинг данных.
  2. Часть 1: Amazon Web Services (SageMaker)
  3. Часть 2: Azure (Azure ML)
  4. Часть 3: Google Cloud (платформа ИИ)

В этой статье из четырех частей моя цель — показать вам, как обучать и развертывать модель в AWS, Azure или Google Cloud. Для этого я создам простой классификатор изображений, используя пользовательский набор данных и API Tensorflow Estimator. В этой части я представлю модель и покажу, как я собирал данные. Разумеется, весь код доступен на моем Github.

Классификатор учредителей

Чтобы показать вам, как обучать и развертывать модель tf.estimator на этих трех платформах, я сначала подумал об использовании уже доступного набора данных, такого как Fruit360. В большинстве случаев вы действительно научитесь строить модели, используя хорошо известные и используемые наборы данных. Для этого проекта я хотел создать свой собственный, чтобы поэкспериментировать с различными доступными инструментами очистки данных.

Если я хочу создать свой собственный набор данных, мне сначала нужно подумать о том, что моя модель должна классифицировать. Какой лучший способ протестировать каждую из облачных платформ, чем классифицировать основателей каждой компании? Итак, я создал модель, которая при наличии изображения классифицирует человека на нем как Билла Гейтса, Джеффа Безоса или Ларри Пейджа.

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

Соскребите это, пока не сделаете это

Самый быстрый и простой способ создать набор данных изображений — использовать систему поиска изображений, такую ​​​​как Google Images или Bing Images (жаль, что у Amazon нет своей собственной).

Картинки Google
Чтобы массово загружать изображения из Картинок Google, вы можете установить google_images_download с помощью pip. Все, что вам нужно сделать, это указать необходимые аргументы, такие как условия поиска (ключевые слова), количество необходимых изображений (ограничение), выходной каталог. Вы даже можете указать тип изображения, которое вы ищете, и формат изображений.
Кроме того, если вы хотите получить более 100 изображений, вам необходимо скачать chromedriver на свой компьютер и указать путь к exe-файлу. Chromedriver — это важный инструмент для взаимодействия с Google Chrome из вашего скрипта Python и очень полезный инструмент для очистки данных в целом. Скачать его можно здесь.

Изображения Bing
Для загрузки изображений из Bing мы используем API поиска изображений, доступный здесь. Чтобы использовать его, вам необходимо зарегистрировать бесплатную учетную запись Azure и получить ключ к API. Мы можем получить URL-адреса только 150 изображений за раз, поэтому мы используем аргумент смещения, чтобы начать загрузку изображений четырьмя пакетами, начиная с другой позиции. Аналогично google_images_download, мы можем указать, что мы ищем лица, которые будут выбирать из нашего набора данных неподходящие изображения. После того, как мы собрали URL-адреса, мы можем использовать запросы для загрузки изображений.

Результаты
Итак, какая поисковая система из Google и Bing предоставила нам наиболее подходящие изображения для нашего классификатора? В нашем случае лучший набор данных должен иметь много изображений, и эти изображения должны включать только одно лицо. Таким образом, мы сравнили оба поисковика по этим двум показателям. Чтобы определить количество лиц на каждом изображении, мы использовали Haarcascade OpenCV (фронтальное лицо) и подсчитали количество изображений, на которых было обнаружено более одного лица.

Результаты были нанесены на графики ниже:

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

Предварительная обработка изображения

Чтобы передавать изображения в CNN, нам нужно, чтобы каждое изображение имело одинаковые размеры. Мы использовали алгоритм обнаружения лиц Haarcascade, чтобы найти квадратную рамку вокруг каждого обнаруженного лица и обрезать его. После этого все обрезанные лица были преобразованы в оттенки серого и изменены до размеров 28x28. Это те же размеры, что и в наборе данных MNIST, на котором наша модель работает очень хорошо.

Как вы можете видеть на приведенных выше образцах изображений нашего набора данных Джеффа Безоса, здесь и там есть несколько неправильных изображений. Либо мы получили лица не от того человека, либо ошибки исходили от детектора лиц Haarcascade. Последнее можно улучшить, изменив аргументы, переданные Haarcascade. Такие параметры, как минимальные размеры лица или масштаб, при котором изображение уменьшается при выполнении алгоритма, могут уменьшить количество ложных срабатываний. Но опять же, цель этой статьи не в том, чтобы создать идеальный классификатор, а в том, чтобы показать процесс его обучения в облаке. Так что несколько неправильно помеченных изображений не имеют большого значения.

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

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