将 Vision API 与 Python 搭配使用

1. 概览

5ab7829fc22b21c4.png

借助 Vision API,开发者可轻松将视觉检测功能集成到应用中,这些功能包括图片标记、面孔和地标检测、光学字符识别 (OCR) 以及露骨内容的标记等。

在本教程中,您将重点学习如何将 Vision API 与 Python 搭配使用。

学习内容

  • 如何设置环境
  • 如何执行标签检测
  • 如何执行文本检测
  • 如何执行地标检测
  • 如何执行人脸检测
  • 如何执行对象检测

所需条件

  • Google Cloud 项目
  • 一个浏览器,例如 ChromeFirefox
  • 熟悉如何使用 Python

调查问卷

您将如何使用本教程?

仅阅读教程内容 阅读并完成练习

您如何评价使用 Python 的体验?

新手水平 中等水平 熟练水平

您如何评价自己在 Google Cloud 服务方面的经验水平?

新手水平 中等水平 熟练水平

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Cloud Shell,这是一个在云端运行的命令行环境。

激活 Cloud Shell

  1. 在 Cloud Console 中,点击激活 Cloud Shell853e55310c205094.png

55efc1aaa7a4d3ad.png

如果您是第一次启动 Cloud Shell,系统会显示一个介绍其功能的过渡页面。如果您看到了过渡页面,请点击继续

9c92662c6a846a5c.png

预配和连接到 Cloud Shell 只需花几分钟时间。

9f0e51b578fecce5.png

这个虚拟机已加载了所需的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器即可完成本 Codelab 中的大部分工作。

连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。

  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 客户端库了!

在接下来的步骤中,您将使用在上一步中安装的名为 IPython 的交互式 Python 解释器。在 Cloud Shell 中运行 ipython 以启动会话:

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 接受输入图片,并返回适用于该图片的最可能标签。它会返回最匹配的标签以及图片匹配的置信度分数。

在此示例中,您将对东京热门地区世田谷的一张图片(由 Alex Knight 提供)执行标签检测:

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. 执行地标检测

地标检测功能可检测图片内热门的自然景观和人造建筑。

在此示例中,您将对埃菲尔铁塔的图片(由 John Towner 提供)执行地标检测:

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. 执行人脸检测

面部特征检测功能可以检测图片中的多张人脸,以及相关的主要面部特征,如情绪状态或有无头饰。

在此示例中,您将检测以下图片中的人脸(图片由 Himanshu Singh Gurjar 提供):

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. 执行对象检测

在此示例中,您将对同一张世田谷区旧照片(由 Alex Knight 提供)执行对象检测:

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 的一些功能,但该 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 会话中,请返回到 shell:exit
  • 停止使用 Python 虚拟环境:deactivate
  • 删除虚拟环境文件夹:cd ~ ; rm -rf ./venv-vision

如需删除 Google Cloud 项目,请在 Cloud Shell 中执行以下操作:

  • 检索当前项目 ID:PROJECT_ID=$(gcloud config get-value core/project)
  • 请确保这是您要删除的项目:echo $PROJECT_ID
  • 删除项目:gcloud projects delete $PROJECT_ID

了解详情

许可

此作品已获得 Creative Commons Attribution 2.0 通用许可授权。