Конвейер распознавания изображений в AWS с использованием двух параллельных экземпляров EC2, S3 для облачного хранилища, SQS для связи между виртуальными машинами и Rekognition для алгоритма машинного обучения для обнаружения объектов и текстов.
Цель. Цель этого проекта — научиться использовать облачную платформу Amazon AWS и разработать приложение AWS, использующее существующие облачные сервисы. В частности, мы узнаем:
- Как создать виртуальные машины (экземпляры EC2) в облаке.
- Как использовать облачное хранилище (S3) в своих приложениях.
- Как обмениваться данными между виртуальными машинами с помощью службы очередей (SQS).
- Как программировать распределенные приложения на Java на виртуальных машинах Linux в облаке.
- Как использовать сервис машинного обучения (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, предоставленной моей школой. Если у вас есть индивидуальная учетная запись, все должно быть немного по-другому, но идея в основном та же.
- Войдите в свою учетную запись AWS.
- После входа в лабораторию AWS в разделе «Курсы» › «Модули» выберите Learner Lab.
- Запустите лабораторию и перейдите на вкладку Readme (находится в правом верхнем углу вместе с Start Lab, End Lab, Подробности AWS и кнопки Сброс), чтобы запустить среду AWS. Чтобы запустить консоль AWS, обязательно нажмите кнопку AWS с зеленым кружком. Красный кружок означает, что лаборатория неактивна, а зеленый кружок означает, что лаборатория активна.
- Убедитесь, что вы скопировали AWS access_key, secret_key и session_token (можно найти в кнопке Подробности AWS) и вставьте его в свой файл ~/.aws/credentials. Наряду с этим загрузите файл PEM под SSH-ключ, чтобы позже пройти аутентификацию при доступе к экземплярам EC2 через терминал. (Скопируйте свои ключи AWS. Эти ключи доступны независимо от студенческой или индивидуальной учетной записи).
- Перейдите в консоль управления AWS и найдите EC2. После того, как вы перейдете к панели управления EC2, следующие шаги помогут создать два экземпляра.
Создайте два экземпляра EC2 для параллельной работы:
- Нажмите «Запустить экземпляр».
- Введите имя экземпляра EC2, который вы хотите создать.
- В AMI выберите Amazon Linux 2 AMI (HVM) — ядро 5.10, тип тома SSD.
- Выберите тип экземпляра t2.micro. Инстансы T2 — это недорогие инстансы общего назначения, которые обеспечивают базовый уровень производительности ЦП с возможностью увеличения производительности выше базового уровня при необходимости.
- Выберите vockey в качестве значения пары ключей, которое должно быть предварительно заполнено. Обратите внимание, что вы можете создать собственное значение пары ключей с необходимыми разрешениями.
- В разделе «Параметры сети» выберите «Создать группу безопасности» и проверьте указанные ниже параметры.
- Разрешить SSH-трафик от
- Разрешить HTTP-трафик из Интернета
- Разрешить HTTP-трафик из Интернета
- И вместо Откуда выберите Мой IP, чтобы отправлять трафик только с вашего IP-адреса.
Примечание. Не рекомендуется изменять настройки в разделах Настройка хранилища и Дополнительные сведения, если вы не знаете, что делаете. Выполните описанный выше шаг дважды, чтобы создать два экземпляра. Мои экземпляры называются EC2-A и EC2-B и выглядят так:
Добавьте роли IAM к созданным инстансам:
- Как только вы создадите свои экземпляры, перейдите к экземплярам EC2, чтобы увидеть свои экземпляры. Если ваши экземпляры не запущены, выберите экземпляр, нажмите в раскрывающемся списке Состояние экземпляра и выберите Запустить экземпляр.
- После запуска экземпляров выберите экземпляры (по одному), перейдите к Действия > Безопасность > Изменить роль IAM.
- В раскрывающемся списке выберите предварительно заполненный **LabInstanceProfile**. Обратите внимание, что эта роль может не иметь доступа к S3, SQS или Rekognition, которые необходимы для проекта). И обновите роль IAM.
- Если у роли 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:
- Обязательно обновите свой access_key, secret_key и default_region на своем терминале AWS.
– Чтобы обновить указанную выше информацию, введите aws configure на терминале AWS.
— Регион по умолчанию должен быть us-east-1. - После завершения настройки запустите программы с помощью команды `java -jar ‹NAME_OF_YOUR_JAR_FILE›.jar`.
- Для второй программы, поскольку мы хотим вывести результат в текстовый файл, мы можем использовать команду `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, выглядит следующим образом: