Распознавание архива изображений в Yandex Vision OCR
С помощью сервисов Vision OCR и Yandex Object Storage можно организовать распознавание текста на изображениях и хранение архива исходных изображений и результатов распознавания.
Чтобы настроить инфраструктуру для распознавания текста с помощью Vision OCR и автоматической выгрузки результатов в Object Storage:
- Подготовьте облако к работе.
- Создайте бакет.
- Создайте виртуальную машину.
- Настройте ВМ.
- Создайте архив с изображениями.
- Подготовьте скрипт для распознавания и загрузки изображений.
- Проверьте корректность распознавания.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для распознавания изображений и хранения данных входят:
- Плата за вычислительные ресурсы и диски ВМ (см. тарифы Yandex Compute Cloud).
- Плата за хранение данных в бакете и операции с ними (см. тарифы Object Storage).
- Плата за использование динамического или статического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud).
- Плата за использование Vision OCR (см. тарифы для Vision OCR).
Создайте бакет
Чтобы создать бакет Object Storage для хранения исходных изображений и результатов распознавания:
- В консоли управления
выберите каталог, в котором будете выполнять операции. - Выберите сервис Object Storage.
- Нажмите кнопку Создать бакет.
- Введите имя бакета в соответствии с правилами именования.
- В поле Доступ на чтение объектов выберите Ограниченный.
- В поле Класс хранилища выберите Холодное.
- Нажмите кнопку Создать бакет.
Создайте ВМ
-
На странице каталога в консоли управления
нажмите кнопку Создать ресурс и выберитеВиртуальная машина
. -
В блоке Образ загрузочного диска в поле Поиск продукта введите
CentOS 7
и выберите публичный образ CentOS 7. -
В блоке Расположение выберите зону доступности, в которой будет создана ВМ. Если вы не знаете, какая зона доступности вам нужна, оставьте выбранную по умолчанию.
-
В блоке Диски и файловые хранилища выберите тип диска
SSD
и задайте размер19 ГБ
. -
В блоке Вычислительные ресурсы перейдите на вкладку
Своя конфигурация
и укажите необходимую платформу, количество vCPU и объем RAM:- Платформа —
Intel Cascade Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
20%
. - RAM —
2 ГБ
.
- Платформа —
-
В блоке Сетевые настройки:
- В поле Подсеть выберите сеть и подсеть, к которым нужно подключить ВМ. Если нужной сети или подсети еще нет, создайте их.
- В поле Публичный адрес оставьте значение
Автоматически
, чтобы назначить ВМ случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
В блоке Доступ выберите вариант SSH-ключ и укажите данные для доступа на ВМ:
- В поле Логин введите имя пользователя. Не используйте имя
root
или другие имена, зарезервированные ОС. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
- В поле Логин введите имя пользователя. Не используйте имя
-
В блоке Общая информация задайте имя ВМ. Требования к имени:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
Нажмите кнопку Создать ВМ.
-
Дождитесь перехода ВМ в статус
Running
и сохраните ее публичный IP-адрес, он понадобится для SSH-подключения.
Настройте ВМ
Настройте Yandex Cloud CLI
-
Подключитесь к ВМ по протоколу SSH.
-
Установите на ВМ Yandex Cloud CLI и создайте профиль.
-
Убедитесь, что Yandex Cloud CLI функционирует корректно:
CLIНа ВМ выполните команду:
yc config list
Результат:
token: AQ...gs cloud-id: b1gdtdqb1900******** folder-id: b1gveg9vude9********
Сохраните идентификатор каталога — параметр
folder-id
, он понадобится для настройки сервисного аккаунта.
Настройте сервисный аккаунт
-
Создайте сервисный аккаунт:
yc iam service-account create \ --name <имя_сервисного_аккаунта> \ --description "<описание_сервисного_аккаунта>"
Где:
--name
— имя сервисного аккаунта, напримерvision-sa
.--description
— описание сервисного аккаунта, напримерthis is vision service account
.
Результат:
id: aje6aoc8hccu******** folder_id: b1gv87ssvu49******** 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: ajen8d7fur27******** service_account_id: aje6aoc8hccu******** 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: aje3qc9pagb9******** service_account_id: aje6aoc8hccu******** 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
-
Получите Yandex Identity and Access Management-токен для сервисного аккаунта:
yc iam create-token
Сохраните Identity and Access Management-токен, он понадобится для отправки изображений в Vision OCR.
Настройте 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
Подготовьте скрипт для распознавания и загрузки изображений
Настройте окружение
-
Установите репозиторий дополнительных пакетов
epel
:sudo yum install epel-release -y
-
Установите пакет
jq
, который понадобится для обработки результатов из Vision OCR:sudo yum install jq -y
-
Установите текстовый редактор
nano
:sudo yum install nano -y
-
Задайте переменные окружения, необходимые для работы скрипта:
export BUCKETNAME="<имя_бакета>" export FOLDERID="<идентификатор_каталога>" export IAMTOKEN="<IAM-токен>"
Где:
BUCKETNAME
— имя бакета.FOLDERID
— идентификатор каталога.IAMTOKEN
— Identity and Access Management-токен, который вы получили при настройке сервисного аккаунта.
Создайте скрипт
В скрипте выполняются следующие этапы:
- Создаются необходимые директории.
- Распаковывается архив с изображениями.
- Последовательно обрабатываются все изображения:
- Изображение кодируется по стандарту Base64.
- Формируется тело запроса для конкретного изображения.
- Изображение отправляется в POST-запросе в Vision OCR для распознавания.
- Полученный результат записывается в файл
output.json
в формате JSON. - Из файла
output.json
выделяется распознанный текст и записывается в текстовый файл.
- Полученные текстовые файлы запаковываются в архив.
- Архив с текстовыми файлами загружается в Object Storage.
- Удаляются служебные файлы.
Для удобства в текст скрипта добавлены комментарии к каждому этапу.
Чтобы реализовать скрипт:
-
Создайте файл, например
vision.sh
, и откройте его в текстовом редактореnano
:sudo nano vision.sh
-
Скопируйте в файл
vision.sh
текст скрипта на Bash:#!/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 OCR. CODEIMG=$(base64 -i $f | cat) # Создать файл body.json, который будет отправляться в POST-запросе в Vision OCR. cat <<EOF > body.json { "mimeType": "JPEG", "languageCodes": ["*"], "model": "page", "content": "$CODEIMG" } EOF # Отправить изображение в Vision для распознавания и записать результат в файл output.json. echo "Processing file $f in Vision..." curl --request POST \ --header "Content-Type: application/json" \ --header "Authorization: Bearer ${IAMTOKEN}" \ --header "x-data-logging-enabled: true" \ --header "x-folder-id: ${FOLDERID}" \ --data '@body.json' \ https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText \ --output output.json # Получить имя файла с изображением для дальнейшей подстановки. IMAGE_BASE_NAME=$(basename -- "$f") IMAGE_NAME="${IMAGE_BASE_NAME%.*}" # Получить из файла output.json текстовые данные и записать их в TXT-файл с таким же именем, как у файла с изображением. cat output.json | jq -r '.result[].blocks[].lines[].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
совпадает с текстом на соответствующих изображениях.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: