Распознавание архива изображений в Yandex Vision
Используйте сервис Yandex Vision для распознавания текста на изображениях. Также вы можете использовать Yandex Object Storage для хранения исходных изображений и результатов распознавания.
Чтобы настроить инфраструктуру для распознавания текста с помощью Vision и автоматической выгрузки результатов в Object Storage:
- Подготовьте облако к работе.
- Создайте бакет.
- Создайте виртуальную машину.
- Настройте виртуальную машину.
- Создайте архив с изображениями.
- Подготовьте скрипт для распознавания и загрузки изображений.
- Проверьте корректность распознавания.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для распознавания изображений и хранения данных входят:
- плата за вычислительные ресурсы и диски ВМ (см. тарифы Yandex Compute Cloud);
- плата за хранение данных в бакете и операции с ними (см. тарифы Yandex Object Storage);
- плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за использование Yandex Vision (см. тарифы для Yandex Vision).
Создайте бакет
Чтобы создать бакет Object Storage для хранения исходных изображений и результатов распознавания:
- Перейдите в консоль управления Yandex Cloud и выберите каталог, в котором будете выполнять операции.
- На странице каталога нажмите кнопку Создать ресурс и выберите Бакет.
- В поле Имя введите имя бакета в соответствии с правилами именования, например
vision-bucket
. - В поле Доступ к бакету выберите Ограниченный.
- В поле Класс хранилища выберите Холодное.
- Нажмите кнопку Создать бакет.
Создайте виртуальную машину
-
В консоли управления на странице каталога нажмите кнопку Создать ресурс и выберите Виртуальная машина.
-
В поле Имя введите имя ВМ, например
vision-vm
. Требования к имени:- Длина — от 3 до 63 символов.
- Может содержать строчные буквы латинского алфавита, цифры и дефисы.
- Первый символ — буква. Последний символ — не дефис.
-
Выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Выбор образа/загрузочного диска перейдите на вкладку Cloud Marketplace и выберите публичный образ CentOS 7.
-
В блоке Диски и файловые хранилища выберите параметры:
- Тип — SSD.
- Размер — 19 ГБ.
-
В блоке Вычислительные ресурсы выберите параметры:
- Платформа — Intel Cascade Lake.
- Гарантированная доля vCPU — 20%.
- vCPU — 2.
- RAM — 2 ГБ.
-
В блоке Сетевые настройки выберите сеть и подсеть, к которым нужно подключить ВМ. Если сети нет, создайте ее:
-
Выберите пункт
-
В открывшемся окне укажите имя сети и каталог, в котором она будет создана.
-
(опционально) Для автоматического создания подсетей выберите опцию Создать подсети.
-
Нажмите кнопку Создать.
У каждой сети должна быть как минимум одна подсеть. Если подсети нет, создайте ее, выбрав пункт
-
-
В поле Публичный адрес оставьте значение Автоматически, чтобы назначить ВМ случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
Укажите данные для доступа на ВМ:
-
В поле Логин введите имя пользователя.
-
В поле SSH-ключ вставьте содержимое файла открытого ключа.
Пару ключей для подключения по SSH необходимо создать самостоятельно, см. Создание пары ключей SSH.
-
-
Нажмите кнопку Создать ВМ.
-
Дождитесь перехода ВМ в статус
Running
и сохраните ее публичный IP-адрес, он понадобится для SSH-подключения.
Настройте виртуальную машину
Настройте Yandex Cloud CLI
-
Подключитесь к ВМ по протоколу SSH.
-
Установите на ВМ Yandex Cloud CLI и создайте профиль.
-
Убедитесь, что Yandex Cloud CLI функционирует корректно:
CLIНа ВМ выполните команду:
yc config list
Результат:
token: AQ...gs cloud-id: b1gdtdqb1900f5rqqvli folder-id: b1gveg9vude9g3uioa50
Сохраните идентификатор каталога — параметр
folder-id
, он понадобится для настройки сервисного аккаунта.
Настройте сервисный аккаунт
-
Создайте сервисный аккаунт:
yc iam service-account create \ --name <имя_сервисного_аккаунта> \ --description "<описание_сервисного_аккаунта>"
Где:
--name
— имя сервисного аккаунта, напримерvision-sa
.--description
— описание сервисного аккаунта, напримерthis is vision service account
.
Результат:
id: aje6aoc8hccuh5tp55bg folder_id: b1gv87ssvu497lpgjh5o created_at: "2022-10-12T14:04:43.198559512Z" name: vision-sa description: this is vision service account
Сохраните идентификатор сервисного аккаунта — параметр
id
, он понадобится для дальнейшей настройки. -
Назначьте сервисному аккаунту роль
editor
:yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role editor \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Где:
--role
— назначаемая роль.--subject serviceAccount
— идентификатор сервисного аккаунта.
-
Создайте статический ключ доступа для сервисного аккаунта:
yc iam access-key create \ --service-account-id <идентификатор_сервисного_аккаунта> \ --description "<описание_ключа>"
Где:
--service-account-id
— идентификатор сервисного аккаунта.--description
— описание ключа, напримерthis key is for vision
.
Результат:
access_key: id: ajen8d7fur27bt8losom service_account_id: aje6aoc8hccuh5tp55bg created_at: "2022-10-12T15:08:08.045280520Z" description: this key is for vision key_id: YC...li secret: YC...J5
Сохраните следующие параметры, они понадобятся для конфигурации утилиты AWS CLI:
key_id
— идентификатор статического ключ доступа.secret
— секретный ключ.
-
Создайте авторизованный ключ для сервисного аккаунта:
yc iam key create \ --service-account-id <идентификатор_сервисного_аккаунта> \ --output key.json
Где:
--service-account-id
— идентификатор сервисного аккаунта.--output
— имя файла с авторизованным ключом в формате JSON.
Результат:
id: aje3qc9pagb9kedkhdn5 service_account_id: aje6aoc8hccuh5tp55bg created_at: "2022-10-13T12:53:04.810240976Z" key_algorithm: RSA_2048
-
Создайте профиль Yandex Cloud CLI для работы от имени сервисного аккаунта, например
vision-profile
:yc config profile create vision-profile
Результат:
Profile 'vision-profile' created and activated
-
Укажите в конфигурации профиля авторизованный ключ сервисного аккаунта:
yc config set service-account-key key.json
-
Получите IAM-токен для сервисного аккаунта:
yc iam create-token
Сохраните IAM-токен, он понадобится для отправки изображений в Vision.
Настройте AWS CLI
-
Обновите пакеты, установленные в операционной системе ВМ, для этого выполните команду:
sudo yum update -y
-
Установите AWS CLI:
sudo yum install awscli -y
-
Настройте AWS CLI:
aws configure
Укажите значения параметров:
AWS Access Key ID
— идентификатор статического ключа доступаkey_id
, который вы получили при настройке сервисного аккаунта.AWS Secret Access Key
— секретный ключsecret
, который вы получили при настройке сервисного аккаунта.Default region name
—ru-central1
.Default output format
—json
.
-
Проверьте, что файл
~/.aws/credentials
содержит правильные значения параметровkey_id
иsecret
:cat ~/.aws/credentials
-
Проверьте, что файл
~/.aws/config
содержит правильные значения параметровDefault region name
иDefault output format
:cat ~/.aws/config
Создайте архив с изображениями
-
Загрузите изображения с текстом в бакет.
Совет
Воспользуйтесь примером изображения дорожного знака, предупреждающего о пингвинах.
-
Убедитесь, что изображения были загружены, указав в запросе имя бакета:
aws --endpoint-url=https://storage.yandexcloud.net s3 ls s3://<имя_бакета>/
-
Сохраните изображения из бакета на ВМ, например в директорию
my_pictures
:aws --endpoint-url=https://storage.yandexcloud.net s3 cp s3://<имя_бакета>/ my_pictures --recursive
-
Запакуйте изображения в архив, например в
my_pictures.tar
:tar -cf my_pictures.tar my_pictures/*
-
Удалите директорию с изображениями:
rm -rfd my_pictures
Подготовьте скрипт для распознавания и загрузки изображений
Настройте окружение
-
Установите пакет
jq
, который понадобится для обработки результатов из Vision:sudo yum install jq -y
-
Установите текстовый редактор
nano
:sudo yum install nano -y
-
Задайте переменные окружения, необходимые для работы скрипта:
export BUCKETNAME="<имя_бакета>" export FOLDERID="<идентификатор_каталога>" export IAMTOKEN="<IAM-токен>"
Где:
BUCKETNAME
— имя бакета.FOLDERID
— идентификатор каталога.IAMTOKEN
— IAM-токен, который вы получили при настройке сервисного аккаунта.
Создайте скрипт
В скрипте выполняются следующие этапы:
- Создаются необходимые директории.
- Распаковывается архив с изображениями.
- Последовательно обрабатываются все изображения:
- Изображение кодируется по стандарту Base64.
- Формируется тело запроса для конкретного изображения.
- Изображение отправляется в POST-запросе в Vision для распознавания.
- Полученный результат записывается в файл
output.json
в формате JSON. - Из файла
output.json
выделяется распознанный текст и записывается в текстовый файл.
- Полученные текстовые файлы запаковываются в архив.
- Архив с текстовыми файлами загружается в Object Storage.
- Удаляются служебные файлы.
Для удобства в текст скрипта добавлены комментарии к каждому этапу.
Чтобы реализовать скрипт:
-
Создайте файл, например
vision.sh
, и откройте его в текстовом редактореnano
:sudo nano vision.sh
-
Скопируйте в файл
vision.sh
текст скрипта:#!/bin/bash # Создать необходимые директории echo "Creating directories..." # Создать директорию для распознанного текста mkdir my_pictures_text # Распаковать архив с изображениями в созданную директорию echo "Extract pictures in my_pictures directory..." tar -xf my_pictures.tar # Распознать изображения из архива FILES=my_pictures/* for f in $FILES # В цикле для каждого файла из директории произвести следующие действия: do # Закодировать изображение по стандарту Base64 для отправки в Vision CODEIMG=$(base64 -i $f | cat) # Создать файл body.json, который будет отправляться в POST-запросе в Vision cat <<EOF > body.json { "folderId": "$FOLDERID", "analyze_specs": [{ "content": "$CODEIMG", "features": [{ "type": "TEXT_DETECTION", "text_detection_config": { "language_codes": ["en","ru"] } }] }] } EOF # Отправить изображение в Vision для распознавания и записать результат в файл output.json echo "Processing file $f in Vision..." curl -X POST --silent \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${IAMTOKEN}" \ -d '@body.json' \ https://vision.api.cloud.yandex.net/vision/v1/batchAnalyze > output.json # Получить имя файла с изображением для дальнейшей подстановки IMAGE_BASE_NAME=$(basename -- "$f") IMAGE_NAME="${IMAGE_BASE_NAME%.*}" # Получить из файла output.json текстовые данные и записать их в TXT-файл с таким же именем, как у файла с изображением cat output.json | jq -r '.results[].results[].textDetection.pages[].blocks[].lines[].words[].text' | awk -v ORS=" " '{print}' > my_pictures_text/$IMAGE_NAME".txt" done # Запаковать содержимое директории с текстовыми файлами в архив echo "Packing text files to archive..." tar -cf my_pictures_text.tar my_pictures_text # Отправить архив с текстовыми файлами в бакет echo "Sending archive to Object Storage Bucket..." aws --endpoint-url=https://storage.yandexcloud.net s3 cp my_pictures_text.tar s3://$BUCKETNAME/ > /dev/null # Удалить служебные файлы echo "Cleaning up..." rm -f body.json rm -f output.json rm -rfd my_pictures rm -rfd my_pictures_text rm -r my_pictures_text.tar
-
Установите разрешения на запуск скрипта:
sudo chmod 755 vision.sh
-
Запустите скрипт:
./vision.sh
Проверьте корректность распознавания
- В консоли управления Yandex Cloud выберите каталог, в котором находится бакет с результатами распознавания.
- Выберите сервис Object Storage.
- Откройте бакет с результатами распознавания.
- Убедитесь, что в бакете появился архив
my_pictures_text.tar
. - Скачайте и распакуйте архив.
- Убедитесь что текст в файлах
<имя_изображения>.txt
совпадает с текстом на соответствующих изображениях.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: