Cloud Vision API 将强大的机器学习模型封装在一个简单的 REST API 中,让您能够了解图像的内容。
在本实验中,我们将向 Vision API 发送图片,并观察其检测对象、人脸和地标。
学习内容
- 创建 Vision API 请求并使用 curl 调用 API
- 使用 Vision API 的标签、网页、人脸和地标检测方法
所需条件
您将如何使用本教程?
您如何评价自己在 Google Cloud Platform 方面的经验水平?
自定进度的环境设置
如果您还没有 Google 账号(Gmail 或 Google Apps),则必须创建一个。登录 Google Cloud Platform Console (console.cloud.google.com) 并创建一个新项目:
请记住项目 ID,它在所有 Google Cloud 项目中都是唯一名称(很抱歉,上述名称已被占用,您无法使用!)。它稍后将在此 Codelab 中被称为 PROJECT_ID
。
接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Google Cloud 资源。
在此 Codelab 中运行仅花费几美元,但是如果您决定使用更多资源或继续让它们运行,费用可能更高(请参阅本文档末尾的“清理”部分)。
Google Cloud Platform 的新用户有资格获享 $300 免费试用。
点击屏幕左上角的菜单图标。
从下拉菜单中选择 API 和服务,然后点击“信息中心”
点击启用 API 和服务。
然后,在搜索框中搜索“视觉”。点击 Google Cloud Vision API:
点击启用以启用 Cloud Vision API:
等待几秒钟,直到该功能启用。启用后,您会看到以下内容:
Google Cloud Shell 是 在云端运行的命令行环境。这个基于 Debian 的虚拟机上已加载您需要的所有开发工具(gcloud
、bq
、git
等),并提供永久性的 5 GB 主目录。我们将使用 Cloud Shell 创建发送至 Speech API 的请求。
如需开始使用 Cloud Shell,请点击标题栏右上角的“激活 Google Cloud Shell” 图标
一个 Cloud Shell 会话随即会在控制台底部的新框内打开,并显示命令行提示符。等待直到出现 user@project:~$ 提示
由于我们后续将使用 curl 向 Vision API 发送请求,所以需要生成 API 密钥来传入请求网址。如需创建 API 密钥,请前往 Cloud 控制台中“API 和服务”的“凭据”部分:
在下拉菜单中选择 API 密钥:
接下来,复制您刚刚生成的密钥。
现在您已经有了 API 密钥,可以将其保存到一个环境变量中,这样就不必在每个请求中都手动插入该 API 密钥的值。您可以在 Cloud Shell 中执行此操作。请务必将 <your_api_key>
替换为您刚刚复制的密钥。
export API_KEY=<YOUR_API_KEY>
创建 Cloud Storage 存储分区
您可以通过以下两种方式将图片发送给 Vision API 以进行图片检测:向 API 发送 base64 编码的图片字符串,或向其传递存储在 Google Cloud Storage 中的文件的网址。我们将使用 Cloud Storage 网址。我们将创建一个 Google Cloud Storage 存储分区来存储图片。
在 Cloud 控制台中,前往项目的“存储浏览器”:
然后,点击创建存储分区。为存储分区指定一个唯一的名称(例如您的项目 ID),然后点击创建。
将图片上传到存储分区
右键点击下面的甜甜圈图片,然后点击将图片另存为,并将其保存到“下载”文件夹中,文件名为 donuts.png。
在存储浏览器中,前往您刚刚创建的存储分区,然后点击上传文件。然后选择 donuts.png。
您应该会在存储分区中看到该文件:
接下来,修改图片的权限。
点击添加一项。
添加一个 Group
的新实体,并添加一个 allUsers
的名称:
点击保存。
现在,您已将文件放入存储分区中,接下来可以创建 Vision API 请求,并将此甜甜圈图片的网址传递给该请求。
在 Cloud Shell 环境中,创建一个包含以下代码的 request.json
文件,确保将 my-bucket-name 替换为您创建的 Cloud Storage 存储分区的名称。您可以使用自己习惯使用的任一命令行编辑器(nano、vim、emacs 等)创建该文件,也可以使用 Cloud Shell 中的内置 Orion 编辑器:
request.json
{
"requests": [
{
"image": {
"source": {
"gcsImageUri": "gs://my-bucket-name/donuts.png"
}
},
"features": [
{
"type": "LABEL_DETECTION",
"maxResults": 10
}
]
}
]
}
我们将探索的第一个 Cloud Vision API 功能是标签检测。此方法将返回图片中内容的标签(字词)列表。
现在,我们可以使用 curl 调用 Vision API 了:
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}
响应内容应如下所示:
{
"responses": [
{
"labelAnnotations": [
{
"mid": "/m/01dk8s",
"description": "powdered sugar",
"score": 0.9436922
},
{
"mid": "/m/01wydv",
"description": "beignet",
"score": 0.7160288
},
{
"mid": "/m/06_dn",
"description": "snow",
"score": 0.71219236
},
{
"mid": "/m/02wvn_6",
"mid": "/m/0bp3f6m",
"description": "fried food",
"score": 0.7075312
},
{
"mid": "/m/02wvn_6",
"description": "ricciarelli",
"score": 0.5625
},
{
"mid": "/m/052lwg6",
"description": "baked goods",
"score": 0.53270763
}
]
}
]
}
该 API 能够识别出这些甜甜圈的具体类型(法式贝涅饼),太棒了!对于 Vision API 找到的每个标签,它都会返回一个包含商品名称的 description
。它还会返回一个介于 0 到 100 之间的数字 score
,用于表示系统对说明与图片内容相符的置信度。mid
值对应于 Google 知识图谱中商品的 mid。您可以在调用 Knowledge Graph API 时使用 mid
来获取有关商品的更多信息。
除了获取图片中内容的标签之外,Vision API 还可以搜索互联网,查找有关图片的更多详细信息。通过 API 的 webDetection
方法,我们可以获得许多有趣的数据:
- 根据包含相似图片的网页中的内容,在图片中找到的实体列表
- 在网络上找到的完全匹配和部分匹配的图片的网址,以及相应网页的网址
- 类似图片的网址,例如执行以图搜图操作
为了试用 Web 检测,我们将使用上面相同的炸面饼图片,因此只需更改 request.json
文件中的一行(您也可以冒险尝试使用完全不同的图片)。在功能列表下方,只需将类型从 LABEL_DETECTION
更改为 WEB_DETECTION
即可。request.json
现在应如下所示:
request.json
{
"requests": [
{
"image": {
"source": {
"gcsImageUri": "gs://my-bucket-name/donuts.png"
}
},
"features": [
{
"type": "WEB_DETECTION",
"maxResults": 10
}
]
}
]
}
如需将该图片发送到 Vision API,您可以使用与之前相同的 curl 命令(只需在 Cloud Shell 中按向上键):
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}
让我们深入了解一下响应,首先从 webEntities
开始。以下是此图片返回的部分实体:
"webEntities": [
{
"entityId": "/m/01hyh_",
"score": 0.7155,
"description": "Machine learning"
},
{
"entityId": "/m/01wydv",
"score": 0.48758492,
"description": "Beignet"
},
{
"entityId": "/m/0105pbj4",
"score": 0.3976,
"description": "Google Cloud Platform"
},
{
"entityId": "/m/02y_9m3",
"score": 0.3782,
"description": "Cloud computing"
},
...
]
此图片已在许多有关 Cloud ML API 的演示中重复使用,因此该 API 找到了“机器学习”“Google Cloud Platform”和“云计算”实体。
如果我们检查 fullMatchingImages
、partialMatchingImages
和 pagesWithMatchingImages
下的网址,会发现许多网址都指向此 Codelab 网站(超级元!)。
假设我们想查找其他油条图片,但不是完全相同的图片。这时,API 响应中的 visuallySimilarImages
部分就派上用场了。以下是它找到的一些视觉上相似的图片:
"visuallySimilarImages": [
{
"url": "https://igx.4sqi.net/img/general/558x200/21646809_fe8K-bZGnLLqWQeWruymGEhDGfyl-6HSouI2BFPGh8o.jpg"
},
{
"url": "https://spoilednyc.com//2016/02/16/beignetszzzzzz-852.jpg"
},
{
"url": "https://img-global.cpcdn.com/001_recipes/a66a9a6fc2696648/1200x630cq70/photo.jpg"
},
...
]
我们可以前往这些网址查看相似图片:
不错!现在,您可能真的很想吃贝涅饼(抱歉)。这类似于在 Google 图片中按图片进行搜索:
不过,借助 Cloud Vision,我们可以通过简单易用的 REST API 访问此功能,并将其集成到我们的应用中。
接下来,我们将探索 Vision API 的面部和地标检测方法。人脸检测方法会返回有关图片中检测到的人脸的数据,包括人脸的情绪以及人脸在图片中的位置。地标检测可以识别常见(和不常见)的地标,并返回地标的名称、经纬度坐标以及在图片中识别出地标的位置。
上传新图片
为了使用这两个新方法,我们先将一张包含人脸和地标的新图片上传到 Cloud Storage 存储分区。右键点击以下图片,然后点击图片另存为,并将其保存到“下载”文件夹中,文件名为 selfie.png。
然后,以与上一步中相同的方式将其上传到 Cloud Storage 存储分区,并确保选中“公开分享”复选框。
更新我们的请求
接下来,我们将更新 request.json
文件,以包含新图片的网址,并使用人脸和地标检测功能,而不是标签检测功能。请务必将 my-bucket-name 替换为您的 Cloud Storage 存储分区的名称:
request.json
{
"requests": [
{
"image": {
"source": {
"gcsImageUri": "gs://my-bucket-name/selfie.png"
}
},
"features": [
{
"type": "FACE_DETECTION"
},
{
"type": "LANDMARK_DETECTION"
}
]
}
]
}
调用 Vision API 并解析响应
现在,您可以使用上面使用的同一 curl 命令来调用 Vision API 了:
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}
我们先来看看响应中的 faceAnnotations
对象。您会注意到,该 API 会针对图片中找到的每张人脸返回一个对象,在本例中为三个。以下是我们的回答的剪辑版本:
{
"faceAnnotations": [
{
"boundingPoly": {
"vertices": [
{
"x": 669,
"y": 324
},
...
]
},
"fdBoundingPoly": {
...
},
"landmarks": [
{
"type": "LEFT_EYE",
"position": {
"x": 692.05646,
"y": 372.95868,
"z": -0.00025268539
}
},
...
],
"rollAngle": 0.21619819,
"panAngle": -23.027969,
"tiltAngle": -1.5531756,
"detectionConfidence": 0.72354823,
"landmarkingConfidence": 0.20047489,
"joyLikelihood": "POSSIBLE",
"sorrowLikelihood": "VERY_UNLIKELY",
"angerLikelihood": "VERY_UNLIKELY",
"surpriseLikelihood": "VERY_UNLIKELY",
"underExposedLikelihood": "VERY_UNLIKELY",
"blurredLikelihood": "VERY_UNLIKELY",
"headwearLikelihood": "VERY_LIKELY"
}
...
}
}
boundingPoly
会提供图片中人脸周围的 x、y 坐标。fdBoundingPoly
是比 boundingPoly
更小的框,包含人脸的皮肤部分。landmarks
是一个对象数组,其中包含每个面部特征(有些您可能甚至不知道!)的对象。这会告诉我们地标的类型,以及该特征的 3D 位置(x、y、z 坐标),其中 z 坐标是深度。其余值则会提供有关面部的更多详细信息,包括喜、悲、怒、惊的可能性。上面的对象是图片中最靠后的人,您可以看到他做了一个有点傻的表情,这解释了 POSSIBLE
的 joyLikelihood
。
接下来,我们来看看响应的 landmarkAnnotations
部分:
"landmarkAnnotations": [
{
"mid": "/m/0c7zy",
"description": "Petra",
"score": 0.5403372,
"boundingPoly": {
"vertices": [
{
"x": 153,
"y": 64
},
...
]
},
"locations": [
{
"latLng": {
"latitude": 30.323975,
"longitude": 35.449361
}
}
]
在此示例中,Vision API 能够识别出这张照片是在佩特拉拍摄的,考虑到此图片中的视觉线索很少,这非常令人印象深刻。此响应中的值应与上面的 labelAnnotations
响应类似。
我们会获取地标的 mid
、名称 (description
) 以及置信度 score
。boundingPoly
显示了图片中识别出地标的区域。locations
键表示此地标的纬度/经度坐标。
我们已经了解了 Vision API 的标签、人脸和地标检测方法,但还有三种方法尚未探索。请参阅文档,了解其他三种类型:
- 徽标检测:识别图片中的常见徽标及其位置。
- 安全搜索检测:确定图片是否包含露骨内容。这对于任何包含用户生成内容的应用都非常有用。您可以根据以下四种内容过滤图片:成人内容、医疗内容、暴力内容和欺骗内容。
- 文本检测:运行 OCR 以从图片中提取文本。此方法甚至可以识别图片中文字的语言。
您已了解如何使用 Vision API 分析图片。在本示例中,您是将图片的 Google Cloud Storage 网址传递给了 API;当然,您也可以传递图片的 base64 编码字符串。
所学内容
- 通过传递 Cloud Storage 存储分区中图片的网址,使用 curl 调用 Vision API
- 使用 Vision API 的标签、网页、人脸和地标检测方法
后续步骤
- 查看文档中的 Vision API 教程
- 查找以您偏好的语言提供的 Vision API 示例
- 不妨试试 Speech API 和 Natural Language API Codelab!