В этом блоге мы создадим простой алгоритм OpenCV + Tesseract и развернем его как API на AWS с использованием лямбда-функций и шлюза API.

"Потрясающий. Вы создали отличный алгоритм машинного обучения. Впечатлен точностью и мне очень нравится техника. Как мы можем реализовать это в нашей системе? » - Вы слышали это несколько раз во время встречи с клиентом или на деловой встрече, но никогда не могли правдиво ответить на него? Не волнуйтесь, с этим, вероятно, сталкиваются 90% (консервативно) коллег по анализу данных. И у AWS есть множество решений для этого. Одна из них - лямбда-функция AWS, интегрированная со шлюзом Amazon API.

Что такое AWS Lambda?

AWS Lambda - это бессерверная вычислительная платформа, управляемая событиями, предоставляемая Amazon как часть Amazon Web Services. Это вычислительная служба, которая запускает код в ответ на события и автоматически управляет вычислительными ресурсами, необходимыми для этого кода. Концепция бессерверных вычислений связана с тем, что вам не нужно поддерживать собственные серверы для выполнения этих функций. Это означает, что вы можете просто загрузить свои коды (Python, Node.js, Go, .NET, Java, Ruby), и Lambda будет управлять другими вещами, такими как время выполнения, масштабирование, балансировка нагрузки и т. Д.

Что такое Amazon API Gateway?

Amazon API Gateway - это полностью управляемый сервис, который позволяет разработчикам легко создавать, публиковать, поддерживать, отслеживать и защищать API в любом масштабе. API-интерфейсы выступают в качестве входной двери для приложений для доступа к данным, бизнес-логике или функциям ваших серверных служб. Используя API Gateway, мы можем создавать RESTful API и WebSocket API, которые позволяют приложениям двусторонней связи в реальном времени. API Gateway поддерживает контейнерные и бессерверные рабочие нагрузки, а также веб-приложения.

Наш план действий для этого блога

Индекс

  1. Войдите в AWS Lambda.
  2. Понять и создать lambda_function
  3. Загрузите и определите слои (также известные как зависимости) с помощью Docker
  4. Протестируйте нашу функцию
  5. Настройте шлюз Amazon API
  6. Разверните API и протестируйте его с помощью Postman

Начнем с простого

Для всех, у кого нет учетной записи AWS, перейдите на
→ Создать новую учетную запись на https://signin.aws.amazon.com/ »
→ Не забудьте добавить биллинг подробности, поскольку без него не будут работать некоторые функции AWS. (Не волнуйтесь, AWS предоставляет уровень бесплатного пользования и поэтому с вас не будет взиматься плата, если вы не превысите его, а это очень много!)

Для получения дополнительной информации о лимитах вы можете проверить следующее: aws.amazon.com/free

Войдите в AWS Lambda.

→ Войдите в консоль AWS и найдите Lambda в строке поиска.

→ На целевой странице Lambda есть несколько объектов, таких как Функции, Слои и т. Д.
→ Нажмите Создать функцию

Назначьте имя функции, время выполнения и роль выполнения, например:
→ Имя функции: MLFunction
→ Время выполнения: Python 3.7
Роль выполнения: Создайте новую роль с базовыми разрешениями Lambda

Понять и создать lambda_function

Что такое lambda_function?

Код (здесь: python), работающий на AWS Lambda, загружается как функция Lambda. Он может включать библиотеки, даже собственные.

У него два аргумента - событие и контекст.

  • Event представляет событие или триггер, вызвавший вызов лямбды. Это как вход в функцию. например: лямбда-функция может быть запущена при загрузке в S3 или при передаче некоторого ввода / данных через API-шлюз. (В основном мы будем заниматься событиями)
  • Context Предоставляет информацию о вызове, функции и среде выполнения вашей лямбда-выражения. Может использоваться для проверки распределения памяти или для получения количества миллисекунд, оставшихся до истечения времени ожидания выполнения. Это похоже на дополнительную или мета информацию, предоставляемую AWS для понимания времени выполнения функции.

Создайте lambda_function

Давайте создадим код, который выполняет следующие действия:
→ Вход: файл изображения (.jpg, .png и т. Д.)
→ OpenCV: чтение изображения
→ Tesseract: выполнение OCR на изображении & распечатать текст

import base64
import pytesseract
import json
import io
import cv2
def write_to_file(save_path, data):
  with open(save_path, "wb") as f:
    f.write(base64.b64decode(data))
def ocr(img):
  ocr_text = pytesseract.image_to_string(img, config = "eng")
  return ocr_text
def lambda_handler(event, context=None):
    
    write_to_file("/tmp/photo.jpg", event["body"])
    im = cv2.imread("/tmp/photo.jpg")
    
    ocr_text = ocr(im)
     
    # Return the result data in json format
    return {
      "statusCode": 200,
      "body": ocr_text
    }

Загрузите и определите слои (также известные как зависимости ) с помощью Docker

Хотя мы создали лямбда-функцию, она не будет выполняться сразу же. Причина в том, что мы не загрузили или не установили необходимые библиотеки (зависимости), необходимые для запуска кода. Как и в обычной среде, нам нужно pip или conda установить библиотеки, нам нужно будет сделать то же самое для AWS lambda. Мы делаем это, добавляя слои в нашу лямбда-форму AWS. Это определяется как:

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

Скачивание зависимостей с помощью Docker

Если кто-либо из нас раньше использовал tesseract, мы знаем, насколько сложно установить эту библиотеку.

Benjamin Genz проделал огромную работу по облегчению всего процесса.

→ Зайдите в свой терминал и клонируйте репо

git clone https://github.com/amtam0/lambda-tesseract-api.git
cd lambda-tesseract-api/

Важно:
1. Будет использоваться докер для установки всех библиотек, поэтому убедитесь, что он у вас загружен
2. Не просматривайте файлы Docker в деталях, а внесите необходимые изменения

Перейти к команде и запустить

bash build_tesseract4.sh

Это загрузит слой тессеракта для функции

build_py37_pkgs.sh содержит список дополнительных библиотек, которые необходимо установить. Уберите подушку, потому что она нам не нужна.

declare -a arr=(“opencv-python” “pytesseract” “Pillow”)

to

declare -a arr=(“opencv-python” “pytesseract”)

→ Перейти к команде и запустить

bash build_py37_pkgs.sh

Пройдет какое-то время, и вы увидите, что все соответствующие библиотеки были загружены в виде zip-файла.

Добавить слои в AWS Lambda

→ Вернитесь в лямбда-консоль AWS и нажмите Создать слой.

→ Добавьте Имя, совместимую среду выполнения и загрузите zip-файл

Вуаля, вы успешно добавили слой pytesseract

→ Повторите тот же процесс, чтобы загрузить библиотеку OpenCV и Tesseract через zip-файл.

Определите каталог для слоев

И последнее, прежде чем мы сможем начать использовать загруженные зависимости.

→ Вернитесь в MLFuntion и нажмите Слои

→ Добавьте pytesseract в качестве совместимого слоя

→ Повторите тот же процесс, чтобы добавить OpenCV & Tesseract в качестве другого слоя для этой функции. Наконец, вы должны увидеть оба слоя, которые нужно добавить в MLFunction.

Теперь, когда мы добавили слои, нам просто нужно убедиться, что эти библиотеки могут быть прочитаны MLFunction.

→ Перейдите в Переменные среды

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

PYTHONPATH = /opt/

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

→ Перейдите в Основные настройки и установите время ожидания до 1 мин.

Давайте проверим нашу лямбда-функцию

Протестируйте нашу функцию

→ Перейдите в Тест

→ Создать новое событие добавьте следующее

Это версия в кодировке base64 для следующего изображения:

Совет: функция лямбда конвертирует все изображения (события) в base64. Поэтому не забудьте декодировать их, прежде чем использовать их в дальнейшем в своем коде

→ Нажмите Тест, и вы должны увидеть следующее:

Вы не только успешно создали новую лямбда-функцию, но и протестировали ее. Похлопайте вас по спине!

Настроить шлюз Amazon API

→ Войдите в консоль AWS и найдите API в строке поиска

→ Нажмите Создать API.

→ Выберите Rest API (не частный)

→ Дайте имя своему API. (Здесь: OCR API)

Теперь вы в своей консоли API. Нам нужно выполнить несколько действий, чтобы настроить наше приложение.

Создать ресурс POST

Нам нужно создать метод POST, чтобы пользователь мог загрузить изображение и передать его через нашу лямбда-функцию.

→ Перейдите в Ресурс → Действия → Создать метод → Выберите POST.

→ Выберите Использовать интеграцию с лямбда-прокси, выберите лямбда-функцию (здесь: MLFunction) и нажмите "Сохранить".

Нажмите ОК, чтобы добавить разрешение для лямбда-функции.

→ Перейдите к Ответ метода

→ Внесите следующие изменения в разделе Статус HTTP:

  • Заголовок ответа: Content-Type
  • Тело ответа: измените содержание на image / jpeg

ПРИМЕЧАНИЕ. Это означает, что API должен отправлять лямбда-функцию content в виде изображения. Это очень важный шаг, и, если мы не внесем это изменение, API не сможет понять, какой тип файла необходимо передать лямбда-функции.
- В случае другого типа, такого как HTML или XML, мы должны изменить тело ответа на application / html или application / xml.

Еще одно изменение, и все готово.

Добавление бинарного опциона

Мы хотим, чтобы пользователь загрузил файл, и для этого нам нужно включить опцию Binary.

→ Перейдите в Настройки в разделе API.

Добавьте */*в Типы двоичных носителей и нажмите "Сохранить изменения". (Это означает, что пользователь может загружать любой тип файла - хотя он будет отправлять лямбда-функцию в соответствии с типом содержимого, который мы определили ранее)

Вы готовы к развертыванию и тестированию вашего API.

Разверните API и протестируйте его с помощью Postman или curl

→ Перейдите в Ресурсы → Действия → Развернуть API.

→ Дайте имя Стадии развертывания (здесь: Тест) → Развернуть

Вау - вы развернули свой API. Теперь вы должны увидеть URL-адрес вашего API.

Протестируйте API

Мы будем использовать Postman для тестирования нашего API. Вы можете скачать его с: https://www.postman.com/downloads/

→ Откройте Postman, и вы увидите панель управления

→ Создать новую вкладку → Выберите параметр POST → добавьте URL-адрес API в Enter Request URL

→ Выберите двоичный в Body & загрузите Hello World файл изображения

Вывод - вы должны получить следующий вывод

Вуаля - вы успешно создали, развернули и протестировали свой API. Поделитесь своим URL-адресом с друзьями и семьей.

Отдельно, если вы заинтересованы в размещении OpenCV и Tesseract на экземпляре AWS EC2 или Heroku, прочтите следующие блоги.





Конец на данный момент. Есть какие-нибудь идеи по улучшению этого или хотите, чтобы я испробовал какие-нибудь новые идеи? Пожалуйста, оставляйте свои предложения в комментариях. Прощай.