Оцифровка архива в Yandex Vision
Yandex Vision — сервис компьютерного зрения для анализа изображений.
С помощью этой инструкции вы выполните:
- настройку окружения Yandex Cloud для работы с Yandex Vision;
- распознавание текста в изображениях с помощью Yandex Vision;
- загрузите результат на Yandex Object Storage.
- Подготовьте облако к работе.
- Создайте и настройте виртуальную машину.
- Настройте AWS CLI.
- Настройте доступ в Object Storage.
- Создайте архив с изображениями.
- Создайте скрипт для оцифровки и загрузки изображений.
- Проверьте корректность оцифровки.
- Удалите созданные облачные ресурсы.
Подготовьте облако к работе
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры распознавания и хранения данных входит:
- плата за постоянно запущенную виртуальную машину (см. тарифы Yandex Compute Cloud);
- плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за использование обектного хранилища (см. тарифы для Yandex Object Storage);
- плата за использование Yandex Vision (см. тарифы для Yandex Vision).
Создайте и настройте виртуальную машину
Создайте виртуальную машину:
-
На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите пункт Виртуальная машина.
-
В поле Имя введите имя виртуальной машины.
- Длина — от 3 до 63 символов.
- Может содержать строчные буквы латинского алфавита, цифры и дефисы.
- Первый символ — буква. Последний символ — не дефис.
-
Выберите зону доступности, в которой должна находиться виртуальная машина.
-
В блоке Образы из Cloud Marketplace выберите образ CentOS 7.
-
В блоке Диски выберите:
- SSD
- 19 Гб
-
В блоке Вычислительные ресурсы:
- Выберите платформу виртуальной машины.
- Укажите необходимое количество vCPU и объем RAM:
- Платформа — Intel Cascade Lake.
- Гарантированная доля vCPU — 20%.
- vCPU — 2.
- RAM — 2 ГБ.
-
В блоке Сетевые настройки выберите сеть и подсеть, к которым нужно подключить виртуальную машину. Если нужной сети или подсети еще нет, вы можете создать их на странице создания виртуальной машины.
-
В поле Публичный адрес оставьте значение Автоматически, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Yandex Cloud. Чтобы внешний IP-адрес не изменялся после остановки виртуальной машины, сделайте его статическим.
-
Укажите данные для доступа на виртуальную машину:
-
В поле Логин введите имя пользователя.
-
В поле SSH-ключ вставьте содержимое файла открытого ключа.
Пару ключей для подключения по SSH необходимо создать самостоятельно, см. раздел о подключении к виртуальным машинам по SSH.
Внимание
IP-адрес и имя хоста (FQDN) для подключения к машине будут назначены ей при создании. Если вы выбрали вариант Без адреса в поле Публичный адрес, вы не сможете обращаться к виртуальной машине из интернета.
-
-
Нажмите кнопку Создать ВМ.
Создание виртуальной машины может занять несколько минут.
Настройте Yandex CLI
- Зайдите на виртуальную машину по SSH.
- Установите YC CLI по инструкции:
- Выполните установку.
- Выполните инициализацию.
- Убедитесь, что YC CLI функционирует корректно:
yc config list
Настройте сервисный аккаунт
-
Создайте сервисный аккаунт, назовите его, например
vision
:yc iam service-account create --name vision --description "this is vision service account"
-
Узнайте идентификатор каталога по инструкции.
-
Узнайте идентификатор вашего сервисного аккаунта, подставив соответствующий идентификатор каталога:
yc iam service-account --folder-id <FOLDER-ID> get vision
На выводе вы получите одну из строк вида:
id: <SERVICE-ACCOUNT-ID>
-
Настройте роль
editor
для вашего сервисного аккаунта, подставив соответствующее значение:yc resource-manager folder add-access-binding default --role editor --subject serviceAccount:<SERVICE-ACCOUNT-ID>
-
Создайте статический ключ доступа для вашего сервисного аккаунта:
yc iam access-key create --service-account-name vision --description "this key is for vision"
Сохраните следующие значения, они понадобятся для конфигурации AWS CLI:
key_id
secret
-
Получите IAM-токен для сервисного аккаунта с помощью CLI по инструкции:
yc iam key create --service-account-name vision --output key.json yc config profile create vision-profile yc config set service-account-key key.json yc iam create-token
Сохраните значение IAM-токена, полученного после ввода команды
yc iam create-token
. В дальнейшем это значение понадобится для пересылки изображений в Vision.
Настройте AWS CLI
- Установите
yum
репозиторий:sudo yum install epel-release -y
- Установите pip:
sudo yum install python-pip -y
- Установите AWS CLI:
sudo pip install awscli --upgrade
- Настройте 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
содержит правильные значения:cat ~/.aws/credentials
- Проверьте, что файл
~/.aws/config
содержит правильные значения:cat ~/.aws/config
Настройте доступ в Object Storage
-
Создайте Object Storage бакет по инструкции:
- Максимальный размер оставьте по умолчанию.
- Доступ к бакету - Ограниченный.
- Класс хранилища - Холодное.
-
Зайдите в консоль Yandex Cloud и убедитесь, что бакет отображается в списке:
https://console.cloud.yandex.ru/folders/<FOLDER-ID>/storage
Создайте архив с изображениями
- Загрузите изображения с текстом в ваш бакет по инструкции.
- Убедитесь, что изображения были загружены:
aws --endpoint-url=https://storage.yandexcloud.net s3 ls s3://<BUCKET-NAME>/
<BUCKET-NAME>
- название вашего бакета - Скачайте изображения на виртуальную машину, например, в папку
my_pictures
:aws --endpoint-url=https://storage.yandexcloud.net s3 cp s3://<BUCKET-NAME>/ my_pictures --recursive
- Запакуйте изображения в архив с названием, например
my_pictures
:tar -cf my_pictures.tar my_pictures/*
- Удалите папку с изображениями:
rm -rfd my_pictures
Создайте скрипт для оцифровки и загрузки изображений
Подготовка
- Установите пакет
jq
, который понадобится в скрипте для обработки результатов из Vision:yum install jq -y
- Создайте переменные окружения, необходимые для работы скрипта:
export BUCKETNAME="<BUCKET-NAME>" export FOLDERID="<FOLDER-ID>" export IAMTOKEN="<IAM-TOKEN>"
BUCKETNAME
- название вашего бакета.FOLDERID
- название каталога.IAMTOKEN
- IAM-токен полученный в этом разделе.
Написание скрипта
В данном скрипте реализуются следующие этапы:
- Создание необходимых директорий.
- Распаковка архива с картинками.
- Обработка изображений в цикле:
- Кодирование изображения для пересылки в POST-запросе в Vision.
- Формирование тела запроса для данного изображения.
- Пересылка изображения в Vision с последующей обработкой.
- Запись полученного результата в
output.json
. - Парсинг текста из
output.json
и запись в текстовый файл.
- Запаковка в архив всех текстовых файлов, полученных после обработки картинок.
- Перемещение оцифрованного архива в Object Storage.
- Удаление ненужных файлов.
Для удобства в теле скрипта добавлены комментарии по каждому шагу.
- Создайте файл, c произвольныйм названием, например
vision.sh
. Откройте это файл в текстовом редакторе, напримерvi
:vi 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%.*}" # Получите из 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
Проверьте корректность оцифровки
- Зайдите в Vision в консоли Yandex Cloud.
- Убедитесь, что в вашем бакете появился архив
my_pictures_text.tar
. - Скачайте и распакуйте архив.
- Убедитесь что текст в файле
<имя изображения>.txt
совпадает с текстом на соответствующем изображении.
Удалите созданные облачные ресурсы
Если вам больше не нужны облачные ресурсы, созданные в процессе оцифровки архива:
- Удалите виртуальную машину.
- Удалите статический IP адрес, если он был вами создан.
- Удалите бакет Object Storage.