Использование Vision API с Python

1. Обзор

5ab7829fc22b21c4.png

API Vision позволяет разработчикам легко интегрировать функции распознавания изображений в приложения, включая маркировку изображений, обнаружение лиц и ориентиров, оптическое распознавание символов (OCR) и разметку контента откровенного характера.

В этом руководстве вы сосредоточитесь на использовании Vision API с Python.

Что вы узнаете

  • Как настроить свою среду
  • Как выполнить обнаружение меток
  • Как выполнить распознавание текста
  • Как выполнить обнаружение ориентиров
  • Как выполнить распознавание лиц
  • Как выполнить обнаружение объектов

Что вам понадобится

  • Проект Google Cloud
  • Браузер, например Chrome или Firefox.
  • Знание языка Python

Опрос

Как вы будете использовать этот учебный материал?

Прочитайте только от начала до конца. Прочитайте текст и выполните упражнения.

Как бы вы оценили свой опыт работы с Python?

Новичок Средний Профессионал

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Профессионал

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Cloud Shell — среду командной строки, работающую в облаке.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . 853e55310c205094.png .

55efc1aaa7a4d3ad.png

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вам был показан промежуточный экран, нажмите «Продолжить» .

9c92662c6a846a5c.png

Подготовка и подключение к Cloud Shell займут всего несколько минут.

9f0e51b578fecce5.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.

После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list

вывод команды

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью следующей команды:

gcloud config set project <PROJECT_ID>

вывод команды

Updated property [core/project].

3. Настройка среды

Прежде чем начать использовать Vision API, выполните следующую команду в Cloud Shell, чтобы включить API:

gcloud services enable vision.googleapis.com

Вы должны увидеть что-то подобное:

Operation "operations/..." finished successfully.

Теперь вы можете использовать API Vision!

Перейдите в свою домашнюю директорию:

cd ~

Создайте виртуальное окружение Python для изоляции зависимостей:

virtualenv venv-vision

Активируйте виртуальную среду:

source venv-vision/bin/activate

Установите IPython и клиентскую библиотеку Vision API:

pip install ipython google-cloud-vision

Вы должны увидеть что-то подобное:

...
Installing collected packages: ..., ipython, google-cloud-vision
Successfully installed ... google-cloud-vision-3.4.0 ...

Теперь вы готовы использовать клиентскую библиотеку Vision API!

На следующих шагах вы будете использовать интерактивный интерпретатор Python под названием IPython , который вы установили на предыдущем шаге. Чтобы начать сессию, запустите ipython в Cloud Shell:

ipython

Вы должны увидеть что-то подобное:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.12.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

Вы готовы отправить свой первый запрос...

4. Выполните обнаружение меток.

Одна из ключевых функций Vision API — идентификация объектов или сущностей на изображении, известная как аннотирование меток. Обнаружение меток позволяет идентифицировать общие объекты, местоположения, действия, виды животных, товары и многое другое. Vision API принимает на вход изображение и возвращает наиболее вероятные метки, которые к этому изображению относятся. Он возвращает наиболее подходящие метки вместе с оценкой достоверности совпадения с изображением.

В этом примере вы выполните обнаружение меток на изображении (предоставленном Алексом Найтом ) района Сетагая, популярного района Токио:

756f97f0b1e46c38.jpeg

Скопируйте следующий код в свою сессию IPython:

from typing import Sequence

from google.cloud import vision


def analyze_image_from_uri(
    image_uri: str,
    feature_types: Sequence,
) -> vision.AnnotateImageResponse:
    client = vision.ImageAnnotatorClient()

    image = vision.Image()
    image.source.image_uri = image_uri
    features = [vision.Feature(type_=feature_type) for feature_type in feature_types]
    request = vision.AnnotateImageRequest(image=image, features=features)

    response = client.annotate_image(request=request)

    return response


def print_labels(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for label in response.label_annotations:
        print(
            f"{label.score:4.0%}",
            f"{label.description:5}",
            sep=" | ",
        )
        

Уделите немного времени изучению кода и посмотрите, как он использует метод клиентской библиотеки annotate_image для анализа изображения на предмет наличия заданного набора признаков.

Отправьте запрос с использованием функции LABEL_DETECTION :

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.LABEL_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_labels(response)

В результате вы должны получить следующий результат:

================================================================================
 97% | Bicycle
 96% | Tire
 94% | Wheel
 91% | Automotive lighting
 89% | Infrastructure
 87% | Bicycle wheel
 86% | Mode of transport
 85% | Building
 83% | Electricity
 82% | Neighbourhood

Вот как представлены результаты в онлайн-демонстрации:

2191b0425c9c148f.png

Краткое содержание

На этом этапе вы смогли выполнить обнаружение меток на изображении и отобразить наиболее вероятные метки, связанные с этим изображением. Подробнее об обнаружении меток можно прочитать здесь.

5. Выполните распознавание текста.

Функция распознавания текста выполняет оптическое распознавание символов (OCR). Она обнаруживает и извлекает текст из изображения, поддерживая широкий спектр языков. Также имеется функция автоматического определения языка.

В этом примере вы выполните обнаружение текста на изображении дорожного знака:

4dedd3fcfd9ad99b.jpeg

Скопируйте следующий код в свою сессию IPython:

def print_text(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for annotation in response.text_annotations:
        vertices = [f"({v.x},{v.y})" for v in annotation.bounding_poly.vertices]
        print(
            f"{repr(annotation.description):42}",
            ",".join(vertices),
            sep=" | ",
        )
        

Отправьте запрос с использованием функции TEXT_DETECTION :

image_uri = "gs://cloud-samples-data/vision/ocr/sign.jpg"
features = [vision.Feature.Type.TEXT_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_text(response)

В результате вы должны получить следующий результат:

================================================================================
'WAITING?\nPLEASE\nTURN OFF\nYOUR\nENGINE' | (310,821),(2225,821),(2225,1965),(310,1965)
'WAITING'                                  | (344,821),(2025,879),(2016,1127),(335,1069)
'?'                                        | (2057,881),(2225,887),(2216,1134),(2048,1128)
'PLEASE'                                   | (1208,1230),(1895,1253),(1891,1374),(1204,1351)
'TURN'                                     | (1217,1414),(1718,1434),(1713,1558),(1212,1538)
'OFF'                                      | (1787,1437),(2133,1451),(2128,1575),(1782,1561)
'YOUR'                                     | (1211,1609),(1741,1626),(1737,1747),(1207,1731)
'ENGINE'                                   | (1213,1805),(1923,1819),(1920,1949),(1210,1935)

Вот как представлены результаты в онлайн-демонстрации:

9c70fbce871c5fe5.png

Краткое содержание

На этом этапе вы смогли выполнить обнаружение текста на изображении и отобразить распознанный текст. Подробнее об обнаружении текста можно прочитать здесь.

6. Выполните обнаружение ориентиров.

Функция обнаружения ориентиров выявляет популярные природные и рукотворные сооружения на изображении.

В этом примере вы выполните обнаружение ключевых точек на изображении Эйфелевой башни (предоставленном Джоном Таунером ):

fb7801e36884b875.jpeg

Скопируйте следующий код в свою сессию IPython:

def print_landmarks(response: vision.AnnotateImageResponse, min_score: float = 0.5):
    print("=" * 80)
    for landmark in response.landmark_annotations:
        if landmark.score < min_score:
            continue
        vertices = [f"({v.x},{v.y})" for v in landmark.bounding_poly.vertices]
        lat_lng = landmark.locations[0].lat_lng
        print(
            f"{landmark.description:18}",
            ",".join(vertices),
            f"{lat_lng.latitude:.5f}",
            f"{lat_lng.longitude:.5f}",
            sep=" | ",
        )
        

Отправьте запрос с использованием функции LANDMARK_DETECTION :

image_uri = "gs://cloud-samples-data/vision/landmark/eiffel_tower.jpg"
features = [vision.Feature.Type.LANDMARK_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_landmarks(response)

В результате вы должны получить следующий результат:

================================================================================
Trocadéro Gardens  | (303,36),(520,36),(520,371),(303,371) | 48.86160 | 2.28928
Eiffel Tower       | (458,76),(512,76),(512,263),(458,263) | 48.85846 | 2.29435

Вот как представлены результаты в онлайн-демонстрации:

2788697365670985.png

Краткое содержание

На этом этапе вы смогли выполнить обнаружение ориентиров на изображении Эйфелевой башни. Подробнее об обнаружении ориентиров читайте здесь.

7. Выполнить распознавание лиц.

Функция распознавания черт лица позволяет обнаружить несколько лиц на изображении, а также связанные с ними ключевые черты лица, такие как эмоциональное состояние или наличие головного убора.

В этом примере вы сможете распознать лица на следующем изображении (предоставлено Химаншу Сингхом Гурджаром ):

58c578ece524cf32.jpeg

Скопируйте следующий код в свою сессию IPython:

def print_faces(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for face_number, face in enumerate(response.face_annotations, 1):
        vertices = ",".join(f"({v.x},{v.y})" for v in face.bounding_poly.vertices)
        print(f"# Face {face_number} @ {vertices}")
        print(f"Joy:     {face.joy_likelihood.name}")
        print(f"Exposed: {face.under_exposed_likelihood.name}")
        print(f"Blurred: {face.blurred_likelihood.name}")
        print("-" * 80)
        

Отправьте запрос с использованием функции FACE_DETECTION :

image_uri = "gs://cloud-samples-data/vision/face/faces.jpeg"
features = [vision.Feature.Type.FACE_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_faces(response)

В результате вы должны получить следующий результат:

================================================================================
# Face 1 @ (1077,157),(2146,157),(2146,1399),(1077,1399)
Joy:     VERY_LIKELY
Exposed: VERY_UNLIKELY
Blurred: VERY_UNLIKELY
--------------------------------------------------------------------------------
# Face 2 @ (144,1273),(793,1273),(793,1844),(144,1844)
Joy:     VERY_UNLIKELY
Exposed: VERY_UNLIKELY
Blurred: UNLIKELY
--------------------------------------------------------------------------------
# Face 3 @ (785,167),(1100,167),(1100,534),(785,534)
Joy:     VERY_UNLIKELY
Exposed: LIKELY
Blurred: VERY_LIKELY
--------------------------------------------------------------------------------

Вот как представлены результаты в онлайн-демонстрации:

cbb7f59299651b83.png

Краткое содержание

На этом этапе вы смогли выполнить распознавание лиц. Подробнее о распознавании лиц можно прочитать здесь.

8. Выполните обнаружение объектов.

В этом примере вы выполните обнаружение объектов на том же самом исходном изображении (предоставленном Алексом Найтом ) города Сетагая:

756f97f0b1e46c38.jpeg

Скопируйте следующий код в свою сессию IPython:

def print_objects(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for obj in response.localized_object_annotations:
        nvertices = obj.bounding_poly.normalized_vertices
        print(
            f"{obj.score:4.0%}",
            f"{obj.name:15}",
            f"{obj.mid:10}",
            ",".join(f"({v.x:.1f},{v.y:.1f})" for v in nvertices),
            sep=" | ",
        )
        

Отправьте запрос с использованием функции OBJECT_LOCALIZATION :

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.OBJECT_LOCALIZATION]

response = analyze_image_from_uri(image_uri, features)
print_objects(response)

В результате вы должны получить следующий результат:

================================================================================
 93% | Bicycle         | /m/0199g   | (0.6,0.6),(0.8,0.6),(0.8,0.9),(0.6,0.9)
 92% | Bicycle wheel   | /m/01bqk0  | (0.6,0.7),(0.7,0.7),(0.7,0.9),(0.6,0.9)
 91% | Tire            | /m/0h9mv   | (0.7,0.7),(0.8,0.7),(0.8,1.0),(0.7,1.0)
 75% | Bicycle         | /m/0199g   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)
 51% | Tire            | /m/0h9mv   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)

Вот как представлены результаты в онлайн-демонстрации:

e1c2ca803d874a6b.png

Краткое содержание

На этом этапе вы смогли выполнить обнаружение объектов. Подробнее об обнаружении объектов можно прочитать здесь.

9. Множественные характеристики

Вы уже ознакомились с некоторыми функциями Vision API, но их гораздо больше, и вы можете запросить несколько функций в одном запросе.

Вот пример запроса, который позволит получить всю необходимую информацию сразу:

image_uri = "gs://..."
features = [
    vision.Feature.Type.OBJECT_LOCALIZATION,
    vision.Feature.Type.FACE_DETECTION,
    vision.Feature.Type.LANDMARK_DETECTION,
    vision.Feature.Type.LOGO_DETECTION,
    vision.Feature.Type.LABEL_DETECTION,
    vision.Feature.Type.TEXT_DETECTION,
    vision.Feature.Type.DOCUMENT_TEXT_DETECTION,
    vision.Feature.Type.SAFE_SEARCH_DETECTION,
    vision.Feature.Type.IMAGE_PROPERTIES,
    vision.Feature.Type.CROP_HINTS,
    vision.Feature.Type.WEB_DETECTION,
    vision.Feature.Type.PRODUCT_SEARCH,
    vision.Feature.Type.OBJECT_LOCALIZATION,
]

# response = analyze_image_from_uri(image_uri, features)

Существуют и другие возможности, например, выполнение обнаружения на пакете изображений, синхронно или асинхронно. Ознакомьтесь со всеми руководствами .

10. Поздравляем!

5ab7829fc22b21c4.png

Вы научились использовать Vision API с Python и протестировали несколько функций распознавания изображений!

Уборка

Для очистки среды разработки используйте Cloud Shell:

  • Если вы всё ещё находитесь в сессии IPython, вернитесь в командную оболочку: exit
  • Прекратите использование виртуальной среды Python: deactivate
  • Удалите папку виртуального окружения: cd ~ ; rm -rf ./venv-vision

Чтобы удалить свой проект Google Cloud, используйте Cloud Shell:

  • Получите текущий идентификатор проекта: PROJECT_ID=$(gcloud config get-value core/project)
  • Убедитесь, что это именно тот проект, который вы хотите удалить: echo $PROJECT_ID
  • Удалите проект: gcloud projects delete $PROJECT_ID

Узнать больше

Лицензия

Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.