Как начать работать с Vision OCR

Этот раздел описывает, как распознать текст на изображении или в файле с помощью Vision OCR API.

Перед началом работы

Чтобы воспользоваться примерами, установите cURL.

  1. На странице Yandex Cloud Billing убедитесь, что платежный аккаунт находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его.
  2. Получите IAM-токен, необходимый для аутентификации.
  3. Получите идентификатор любого каталога, на который у вашего аккаунта есть роль ai.vision.user или выше.
  4. Полученный идентификатор передавайте в заголовке x-folder-id.

Распознайте текст

Вы можете использовать любую модель для распознавания из списка. Для примера воспользуемся моделью page, которая позволяет распознавать любое количество текста на изображении:

  1. Подготовьте файл изображения, соответствующий требованиям:

    • Поддерживаемые форматы файлов: JPEG, PNG, PDF. MIME-тип файла указывайте в свойстве mime_type. По умолчанию image.
    • Максимальный размер файла: 10 МБ.
    • Размер изображения не должен превышать 20 мегапикселей (длина × ширина).

    Совет

    Нужен пример? Скачайте изображение дорожного знака, предупреждающего о пингвинах.

  2. Кодируйте файл с изображением в формат Base64:

    base64 -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)
            
  3. Создайте файл с телом запроса, например body.json.

    body.json:

    {
              "mimeType": "JPEG",
              "languageCodes": ["*"],
              "model": "page",
              "content": "<изображение_в_кодировке_base64>"
            }
            

    В свойстве content укажите содержимое файла, полученное при переводе изображения в формат Base64.

    Чтобы сервис автоматически определил язык текста, укажите в конфигурации свойство "languageCodes": ["*"].

  4. Отправьте запрос с помощью метода recognize и сохраните ответ в файл, например output.json:

    export 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"
                }
            }
            
  5. Чтобы получить все распознанные на изображении слова, найдите все значения со свойством text.

Примечание

Если полученные координаты не соответствуют отображаемому положению элементов, настройте в вашем средстве просмотра изображений поддержку метаданных exif, либо при передаче в сервис удаляйте из секции exif изображения атрибут Orientation.