Как начать работать с Vision OCR
Этот раздел описывает, как распознать текст на изображении или в файле с помощью Vision OCR API.
Перед началом работы
Чтобы воспользоваться примерами, установите cURL
- На странице Yandex Cloud Billing
убедитесь, что платежный аккаунт находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его. - Получите IAM-токен, необходимый для аутентификации.
- Получите идентификатор любого каталога, на который у вашего аккаунта есть роль
ai.vision.user
или выше. - Полученный идентификатор передавайте в заголовке
x-folder-id
.
Распознайте текст
Вы можете использовать любую модель для распознавания из списка. Для примера воспользуемся моделью page
, которая позволяет распознавать любое количество текста на изображении:
-
Подготовьте файл изображения, соответствующий требованиям:
- Поддерживаемые форматы файлов: JPEG, PNG, PDF. MIME-тип
файла указывайте в свойствеmime_type
. По умолчаниюimage
. - Максимальный размер файла: 10 МБ.
- Размер изображения не должен превышать 20 мегапикселей (длина × ширина).
Совет
Нужен пример? Скачайте изображение
дорожного знака, предупреждающего о пингвинах. - Поддерживаемые форматы файлов: JPEG, PNG, PDF. MIME-тип
-
Кодируйте файл с изображением в формат Base64:
UNIXWindowsPowerShellPythonNode.jsJavaGobase64 -i input.jpg > output.txt
C:> Base64.exe -e input.jpg > output.txt
[Convert]::ToBase64String([IO.File]::ReadAllBytes("./input.jpg")) > output.txt
# Импортируйте библиотеку для кодирования в Base64 import base64 # Создайте функцию, которая кодирует файл и возвращает результат. def encode_file(file_path): with open(file_path, "rb") as fid: file_content = fid.read() return base64.b64encode(file_content).decode("utf-8")
// Считайте содержимое файла в память. var fs = require('fs'); var file = fs.readFileSync('/path/to/file'); // Получите содержимое файла в формате Base64. var encoded = Buffer.from(file).toString('base64');
// Импортируйте библиотеку для кодирования в Base64. import org.apache.commons.codec.binary.Base64; // Получите содержимое файла в формате Base64. byte[] fileData = Base64.encodeBase64(yourFile.getBytes());
import ( "bufio" "encoding/base64" "io/ioutil" "os" ) // Откройте файл f, _ := os.Open("/path/to/file") // Прочитайте содержимое файла. reader := bufio.NewReader(f) content, _ := ioutil.ReadAll(reader) // Получите содержимое файла в формате Base64. base64.StdEncoding.EncodeToString(content)
-
Создайте файл с телом запроса, например
body.json
.body.json:
{ "mimeType": "JPEG", "languageCodes": ["*"], "model": "page", "content": "<изображение_в_кодировке_base64>" }
В свойстве
content
укажите содержимое файла, полученное при переводе изображения в формат Base64.Чтобы сервис автоматически определил язык текста, укажите в конфигурации свойство
"languageCodes": ["*"]
. -
Отправьте запрос с помощью метода recognize и сохраните ответ в файл, например
output.json
:UNIXPythonexport IAM_TOKEN=<IAM-токен> curl \ --request POST \ --header "Content-Type: application/json" \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --header "x-folder-id: <идентификатор_каталога>" \ --header "x-data-logging-enabled: true" \ --data '{ "mimeType": "JPEG", "languageCodes": ["ru","en"], "model": "handwritten", "content": "<изображение_в_кодировке_base64>" }' \ https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText \ --output output.json
Где:
<IAM-токен>
— полученный ранее IAM-токен.<идентификатор_каталога>
— полученный ранее идентификатор каталога.
data = {"mimeType": <mime_type>, "languageCodes": ["ru","en"], "content": content} url = "https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText" headers= {"Content-Type": "application/json", "Authorization": "Bearer {:s}".format(<IAM-токен>), "x-folder-id": "<идентификатор_каталога>", "x-data-logging-enabled": "true"} w = requests.post(url=url, headers=headers, data=json.dumps(data))
Результат будет состоять из распознанных блоков текста, строк и слов с указанием их местоположения на изображении:
{'result': {'textAnnotation': {'width': '1920', 'height': '1280', 'blocks': [ {'boundingBox': {'vertices': [ {'x': '460', 'y': '777' }, {'x': '460', 'y': '906' }, {'x': '810', 'y': '906' }, {'x': '810', 'y': '777' } ] }, 'lines': [ {'boundingBox': {'vertices': [ {'x': '460', 'y': '777' }, {'x': '460', 'y': '820' }, {'x': '802', 'y': '820' }, {'x': '802', 'y': '777' } ] }, 'text': 'PENGUINS', 'words': [ {'boundingBox': {'vertices': [ {'x': '460', 'y': '768' }, {'x': '460', 'y': '830' }, {'x': '802', 'y': '830' }, {'x': '802', 'y': '768' } ] }, 'text': 'PENGUINS', 'entityIndex': '-1', 'textSegments': [ {'startIndex': '0', 'length': '8' } ] } ], 'textSegments': [ {'startIndex': '0', 'length': '8' } ], 'orientation': 'ANGLE_0' }, {'boundingBox': {'vertices': [ {'x': '489', 'y': '861' }, {'x': '489', 'y': '906' }, {'x': '810', 'y': '906' }, {'x': '810', 'y': '861' } ] }, 'text': 'CROSSING', 'words': [ {'boundingBox': {'vertices': [ {'x': '489', 'y': '852' }, {'x': '489', 'y': '916' }, {'x': '810', 'y': '916' }, {'x': '810', 'y': '852' } ] }, 'text': 'CROSSING', 'entityIndex': '-1', 'textSegments': [ {'startIndex': '9', 'length': '8' } ] } ], 'textSegments': [ {'startIndex': '9', 'length': '8' } ], 'orientation': 'ANGLE_0' } ], 'languages': [ {'languageCode': 'en' } ], 'textSegments': [ {'startIndex': '0', 'length': '17' } ], 'layoutType': 'LAYOUT_TYPE_TEXT' }, {'boundingBox': {'vertices': [ {'x': '547', 'y': '989' }, {'x': '547', 'y': '1046' }, {'x': '748', 'y': '1046' }, {'x': '748', 'y': '989' } ] }, 'lines': [ {'boundingBox': {'vertices': [ {'x': '547', 'y': '989' }, {'x': '547', 'y': '1046' }, {'x': '748', 'y': '1046' }, {'x': '748', 'y': '989' } ] }, 'text': 'SLOW', 'words': [ {'boundingBox': {'vertices': [ {'x': '547', 'y': '983' }, {'x': '547', 'y': '1054' }, {'x': '748', 'y': '1054' }, {'x': '748', 'y': '983' } ] }, 'text': 'SLOW', 'entityIndex': '-1', 'textSegments': [ {'startIndex': '18', 'length': '4' } ] } ], 'textSegments': [ {'startIndex': '18', 'length': '4' } ], 'orientation': 'ANGLE_0' } ], 'languages': [ {'languageCode': 'en' } ], 'textSegments': [ {'startIndex': '18', 'length': '4' } ], 'layoutType': 'LAYOUT_TYPE_TEXT' } ], 'entities': [], 'tables': [], 'fullText': 'PENGUINS\nCROSSING\nSLOW\n', 'rotate': 'ANGLE_0', 'markdown': '', 'pictures': [] }, 'page': '0' } }
-
Чтобы получить все распознанные на изображении слова, найдите все значения со свойством
text
.
Примечание
Если полученные координаты не соответствуют отображаемому положению элементов, настройте в вашем средстве просмотра изображений поддержку метаданных exif
, либо при передаче в сервис удаляйте из секции exif
изображения атрибут Orientation
.