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

1. Обзор

5ab7829fc22b21c4.png

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

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

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

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

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

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

Опрос

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

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

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

Новичок Средний Опытный

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

Новичок Средний Опытный

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

Самостоятельная настройка среды

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Запустить Cloud Shell

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

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

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

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

После подключения к 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.

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

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

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 License.