1. Обзор

API Vision позволяет разработчикам легко интегрировать функции распознавания изображений в приложения, включая маркировку изображений, обнаружение лиц и ориентиров, оптическое распознавание символов (OCR) и разметку контента откровенного характера.
В этом руководстве вы сосредоточитесь на использовании Vision API с Python.
Что вы узнаете
- Как настроить свою среду
- Как выполнить обнаружение меток
- Как выполнить распознавание текста
- Как выполнить обнаружение ориентиров
- Как выполнить распознавание лиц
- Как выполнить обнаружение объектов
Что вам понадобится
Опрос
Как вы будете использовать этот учебный материал?
Как бы вы оценили свой опыт работы с Python?
Как бы вы оценили свой опыт использования сервисов Google Cloud?
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



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

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

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

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.
После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.
- Выполните следующую команду в 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`
- Выполните следующую команду в 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 принимает на вход изображение и возвращает наиболее вероятные метки, которые к этому изображению относятся. Он возвращает наиболее подходящие метки вместе с оценкой достоверности совпадения с изображением.
В этом примере вы выполните обнаружение меток на изображении (предоставленном Алексом Найтом ) района Сетагая, популярного района Токио:

Скопируйте следующий код в свою сессию 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
Вот как представлены результаты в онлайн-демонстрации:

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

Скопируйте следующий код в свою сессию 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)
Вот как представлены результаты в онлайн-демонстрации:

Краткое содержание
На этом этапе вы смогли выполнить обнаружение текста на изображении и отобразить распознанный текст. Подробнее об обнаружении текста можно прочитать здесь.
6. Выполните обнаружение ориентиров.
Функция обнаружения ориентиров выявляет популярные природные и рукотворные сооружения на изображении.
В этом примере вы выполните обнаружение ключевых точек на изображении Эйфелевой башни (предоставленном Джоном Таунером ):

Скопируйте следующий код в свою сессию 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
Вот как представлены результаты в онлайн-демонстрации:

Краткое содержание
На этом этапе вы смогли выполнить обнаружение ориентиров на изображении Эйфелевой башни. Подробнее об обнаружении ориентиров читайте здесь.
7. Выполнить распознавание лиц.
Функция распознавания черт лица позволяет обнаружить несколько лиц на изображении, а также связанные с ними ключевые черты лица, такие как эмоциональное состояние или наличие головного убора.
В этом примере вы сможете распознать лица на следующем изображении (предоставлено Химаншу Сингхом Гурджаром ):

Скопируйте следующий код в свою сессию 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 --------------------------------------------------------------------------------
Вот как представлены результаты в онлайн-демонстрации:

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

Скопируйте следующий код в свою сессию 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)
Вот как представлены результаты в онлайн-демонстрации:

Краткое содержание
На этом этапе вы смогли выполнить обнаружение объектов. Подробнее об обнаружении объектов можно прочитать здесь.
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. Поздравляем!

Вы научились использовать 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
Узнать больше
- Протестируйте онлайн-демонстрацию в своем браузере: https://cloud.google.com/vision
- Документация по API Vision: https://cloud.google.com/vision/docs
- Python в Google Cloud: https://cloud.google.com/python
- Клиентские библиотеки для облачных сервисов на Python: https://github.com/googleapis/google-cloud-python
Лицензия
Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.