Конвейер распознавания изображений в AWS с использованием двух параллельных экземпляров EC2, S3 для облачного хранилища, SQS для связи между виртуальными машинами и Rekognition для алгоритма машинного обучения для обнаружения объектов и текстов.

Цель. Цель этого проекта — научиться использовать облачную платформу Amazon AWS и разработать приложение AWS, использующее существующие облачные сервисы. В частности, мы узнаем:

  1. Как создать виртуальные машины (экземпляры EC2) в облаке.
  2. Как использовать облачное хранилище (S3) в своих приложениях.
  3. Как обмениваться данными между виртуальными машинами с помощью службы очередей (SQS).
  4. Как программировать распределенные приложения на Java на виртуальных машинах Linux в облаке.
  5. Как использовать сервис машинного обучения (AWS Rekognition) в облаке.

Описание. Мы создаем конвейер распознавания изображений в AWS, используя два экземпляра EC2, S3, SQS и Rekognition. Проект написан на Java на виртуальных машинах Amazon Linux. Для остальной части описания вы должны обратиться к рисунку ниже:

Мы создадим два инстанса EC2 (EC2-A и EC2-B, как показано на рисунке) с Amazon Linux AMI, которые будут работать параллельно. Каждый экземпляр будет запускать приложение Java. Экземпляр EC2-A будет считывать 10 изображений из корзины S3 (поскольку корзина S3 была предоставлена ​​моей школой, я не могу публиковать ее для всех, но не стесняйтесь создавать корзину S3 и добавлять 10 изображений) и выполняет обнаружение объектов на изображениях.

Когда автомобиль обнаруживается с помощью Rekognition с достоверностью выше 90%, индекс этого изображения (например, 2.jpg) сохраняется в SQS. Экземпляр EC2-B считывает индексы изображений из SQS, как только эти индексы становятся доступными в очереди, и выполняет распознавание текста на этих изображениях (т. е. загружает их из S3 по одному и использует Rekognition для распознавания текста).

Обратите внимание, что два экземпляра работают параллельно: например, экземпляр EC2-A обрабатывает изображение 3, а экземпляр EC2-B одновременно обрабатывает изображение 1, которое было распознано экземпляром A как автомобиль. Когда экземпляр EC2-A завершает обработку изображения , он добавляет в очередь индекс -1, чтобы сообщить экземпляру EC2-B, что его работа выполнена. Когда экземпляр EC2-B завершает работу, он печатает в файл в связанной с ним EBS индексы изображений, на которых есть и автомобили, и текст, а также печатает фактический текст на каждом изображении рядом с его индексом.

Попытка решения

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

  1. Войдите в свою учетную запись AWS.
  2. После входа в лабораторию AWS в разделе «Курсы» › «Модули» выберите Learner Lab.
  3. Запустите лабораторию и перейдите на вкладку Readme (находится в правом верхнем углу вместе с Start Lab, End Lab, Подробности AWS и кнопки Сброс), чтобы запустить среду AWS. Чтобы запустить консоль AWS, обязательно нажмите кнопку AWS с зеленым кружком. Красный кружок означает, что лаборатория неактивна, а зеленый кружок означает, что лаборатория активна.
  4. Убедитесь, что вы скопировали AWS access_key, secret_key и session_token (можно найти в кнопке Подробности AWS) и вставьте его в свой файл ~/.aws/credentials. Наряду с этим загрузите файл PEM под SSH-ключ, чтобы позже пройти аутентификацию при доступе к экземплярам EC2 через терминал. (Скопируйте свои ключи AWS. Эти ключи доступны независимо от студенческой или индивидуальной учетной записи).
  5. Перейдите в консоль управления AWS и найдите EC2. После того, как вы перейдете к панели управления EC2, следующие шаги помогут создать два экземпляра.

Создайте два экземпляра EC2 для параллельной работы:

  1. Нажмите «Запустить экземпляр».
  2. Введите имя экземпляра EC2, который вы хотите создать.
  3. В AMI выберите Amazon Linux 2 AMI (HVM) — ядро ​​5.10, тип тома SSD.
  4. Выберите тип экземпляра t2.micro. Инстансы T2 — это недорогие инстансы общего назначения, которые обеспечивают базовый уровень производительности ЦП с возможностью увеличения производительности выше базового уровня при необходимости.
  5. Выберите vockey в качестве значения пары ключей, которое должно быть предварительно заполнено. Обратите внимание, что вы можете создать собственное значение пары ключей с необходимыми разрешениями.
  6. В разделе «Параметры сети» выберите «Создать группу безопасности» и проверьте указанные ниже параметры.
  • Разрешить SSH-трафик от
  • Разрешить HTTP-трафик из Интернета
  • Разрешить HTTP-трафик из Интернета
  • И вместо Откуда выберите Мой IP, чтобы отправлять трафик только с вашего IP-адреса.

Примечание. Не рекомендуется изменять настройки в разделах Настройка хранилища и Дополнительные сведения, если вы не знаете, что делаете. Выполните описанный выше шаг дважды, чтобы создать два экземпляра. Мои экземпляры называются EC2-A и EC2-B и выглядят так:

Добавьте роли IAM к созданным инстансам:

  1. Как только вы создадите свои экземпляры, перейдите к экземплярам EC2, чтобы увидеть свои экземпляры. Если ваши экземпляры не запущены, выберите экземпляр, нажмите в раскрывающемся списке Состояние экземпляра и выберите Запустить экземпляр.
  2. После запуска экземпляров выберите экземпляры (по одному), перейдите к Действия > Безопасность > Изменить роль IAM.
  3. В раскрывающемся списке выберите предварительно заполненный **LabInstanceProfile**. Обратите внимание, что эта роль может не иметь доступа к S3, SQS или Rekognition, которые необходимы для проекта). И обновите роль IAM.
  4. Если у роли IAM нет доступа к S3, SQS или Recognition, перейдите в IAM › Roles › LabRole и предоставьте следующие разрешения в качестве политик:

После прикрепления политик все готово для доступа к инстансам EC2.

Работа с JAVA-программами:

  • У нас будет две разные программы, одна для распознавания Object, а другая для распознавания Text. Пожалуйста, прочитайте описание проекта, чтобы понять, почему нам нужны две программы.
  • Программа обнаружения объектов будет работать на первом экземпляре, а на втором экземпляре будет запущена программа обнаружения текста.
  • Пожалуйста, убедитесь, что у вас есть исполняемые файлы JAR для каждой из программ, так как мы будем загружать файлы JAR в экземпляры.
  • Когда у вас будут готовы файлы JAR, вы можете загрузить их в соответствующие инстансы EC2 с помощью Cyberduck (Mac) или WinSCP (Windows). Я использую Cyberduck для проекта, так как работаю с системой Mac.
  • Если вы хотите узнать, как загрузить файл в инстанс EC2 с помощью Cyberduck, перейдите по ссылке — FTP в инстанс EC2 с помощью Cyberduck

Примечание. При подключении по FTP к инстансу EC2 с помощью Cyberduck имя пользователя должно быть ec2-user.

SSH-доступ с Mac:

Теперь мы будем использовать SSH с Mac для доступа к обоим нашим экземплярам EC2.

Примечание. Эти инструкции предназначены только для пользователей Mac/Linux.

  • Прежде чем приступить к выполнению действий, прочтите второй и третий пункты, поскольку вы не сможете увидеть эти инструкции, когда открыта панель сведений об AWS.
  • Выберите ссылку Подробности AWS.
  • Нажмите кнопку Загрузить PEM и сохраните файл labsuser.pem. (Обычно ваш браузер сохраняет его в каталоге «Загрузки».)
  • Откройте окно терминала и измените каталог cd на каталог, в который был загружен файл .pem. Например, запустите эту команду, если она была сохранена в каталоге «Загрузки»:
cd Downloads
  • Измените права доступа к ключу только для чтения, выполнив команду:
chmod 400 labsuser.pem
  • Вернитесь в Консоль управления AWS и в сервисе EC2 выберите Экземпляры. Установите флажок рядом с экземпляром, который вы хотите подключить.
  • На вкладке Описание скопируйте значение Общедоступный IP-адрес IPv4.
  • Вернитесь в окно терминала и выполните эту команду (замените public-ip фактическим общедоступным IP-адресом, который вы скопировали):
ssh -i <filename>.pem ec2-user@<public-ip>
  • Введите yes, когда будет предложено разрешить первое подключение к этому удаленному серверу SSH. Поскольку вы используете пару ключей для аутентификации, вам не будет предложено ввести пароль.

Как только мы подключим SSH к двум экземплярам EC2, у нас будет что-то вроде этого:

Запустите программы на соответствующем экземпляре EC2:

  1. Обязательно обновите свой access_key, secret_key и default_region на своем терминале AWS.
    – Чтобы обновить указанную выше информацию, введите aws configure на терминале AWS.
    — Регион по умолчанию должен быть us-east-1.
  2. После завершения настройки запустите программы с помощью команды `java -jar ‹NAME_OF_YOUR_JAR_FILE›.jar`.
  3. Для второй программы, поскольку мы хотим вывести результат в текстовый файл, мы можем использовать команду `java -jar ‹NAME_OF_YOUR_JAR_FILE›.jar › output.txt`.
  • Будет создан файл output.txt, и выходные данные второй программы (работающей на втором экземпляре) будут записаны в файл.
  • В файле будут необходимые данные об индексах изображений, на которых есть и автомобили, и текст, а также будет напечатан фактический текст в каждом изображении рядом с его индексом.

Запуск программы на экземпляре EC2-A (первый экземпляр EC2):

  • После запуска файла AWSObjectDetection.jar в экземпляре EC2-A изображения, удовлетворяющие условию, будут помещены в SQS (очередь).

  • У нас есть 6 элементов, которые помещены в очередь, так как только 6 элементов удовлетворяют условию (Ярлык = «Автомобиль» и Доверие › 90).
  • Очередь создается так:

  • А содержимое очередей можно получить долгим опросом:

Как только мы заполним очереди, мы увидим, как это выглядит, когда мы запустим программу AWSTextRekognition на экземпляре EC2-B.

Запуск программы на экземпляре EC2-B (второй экземпляр EC2):

  • Мы запускаем AWSTextRekognition.jar на экземпляре EC2-B следующим образом:

  • Когда экземпляр B завершает работу, он печатает в файл (output.txt) индексы изображений, на которых есть и автомобили, и текст, а также печатает фактический текст в каждом изображении рядом с его индексом.
  • Окончательный вывод, сохраненный в output.txt, выглядит следующим образом:

Ресурсы: