试用 GCP 的 Vision API

大家好,
我是Mandai,Wild团队负责开发工作的成员。
我之前试用过微软的 Emotion API,但谷歌云平台 (GCP) 也提供类似的基于机器学习的图像检测 API。
这次,我整理了一份指南,介绍如何准备使用这个 Vision API。
需要谷歌帐户
使用 GCP 只需要一个 Google 帐户和一张信用卡。GCP
API 提供免费套餐,足以满足一些简单的实验需求,但部分 API 需要注册信用卡信息。
Vision API 正是如此;如果您尚未注册信用卡,将会弹出一个对话框,提示“需要收费”。
看到提示需要付款,您可能会犹豫是否点击按钮,这是可以理解的,但请放心,在您超出免费额度之前,系统会要求您确认!
这种心理障碍非常重要。
要启用计费功能,您将被引导至计费账户创建页面。
新用户将获得 300 美元的信用额度,自注册之日起 60 天内有效。
此外,Vision API 本身也提供免费套餐,只要您不过度使用,即可在免费套餐内充分体验其功能。
在 GCP 上启用 Vision API
创建一个合适的项目,然后从左上角的汉堡菜单中打开 API 管理器。
点击仪表盘标题旁边的“启用 API”链接。
在库中的“Google Cloud Machine Learning”列表中,点击“Vision API”。
点击 Google Cloud Vision API 标题旁边的“启用”按钮以启用该 API。
获取 API 密钥
启用 API 后,您需要创建一个 API 密钥才能访问 API。
从左侧菜单中选择“凭据”,然后单击“创建凭据”按钮。
从下拉菜单中选择“API密钥”。
屏幕上将出现一个显示 API 密钥的对话框,请复制并粘贴该密钥,然后将其保存到本地。
API密钥创建后,任何在请求参数中包含该密钥的人都可以使用,因此您需要点击“限制密钥”链接来限制其使用。
限制密钥使用的方法有四种。
HTTP引用页
这种类型会根据嵌入在 HTTP 标头中的引用信息来限制 API 的使用。这种
方法在浏览器和类似应用程序中非常有效。
IP地址
在服务器上运行批处理或类似任务时,可以使用基于 IP 地址(IPv4/IPv6)的访问限制。
可以注册多个 IP 地址以允许来自多个服务器的访问,也可以使用子网掩码指定地址范围。
安卓应用
要限制 Android 应用的使用,请在开发环境中获取 SHA-1 签名证书指纹,并将其与包名一起注册。
iOS 应用
如果您想限制 iOS 应用的使用,则需要注册一个 Bundle ID。
即使您只是将其用于测试目的,最好也施加一些限制,但如果您绝对必须这样做,您可以根据需要创建任意次数的 API 密钥,因此我们强烈建议您在使用完毕后立即将其删除。
现在您可以使用 API 了。
测试代码
现在一切准备就绪,让我们从 PHP 测试 API 吧。
基本信息都Google Cloud Vision API 文档 | Google Cloud Vision API | Google Cloud Platform可以在“入门 | PHP API 客户端库(测试版) | Google Developers”的地方安装 Google API 客户端库,或者使用 curl 或类似工具手动安装。
这次,我将借此机会使用 curl 来编写它。
由于 Vision API 是一个图像识别 API,因此需要在请求数据中包含图像信息。
以下是图像信息:
- 本地图像数据
- 存储在 Google Cloud Storage 上的图像数据
另外需要注意的是,在顺序分析本地存储的图像数据时,网络流量是一个需要考虑的问题。
如果将其部署到完整的生产环境中,则需要特别注意带宽使用情况。
在这种情况下,您还需要注意服务器的存储,因此不妨考虑将图片存储在 Google Cloud Storage 中。
由于 Google Cloud Storage 不接受公共互联网 URI 作为外部来源,如果您想与 AWS S3 或类似服务集成,则需要采取不同的方法。
使用 API 密钥调用 Vision API 非常简单,所以我们快速贴出代码。
<?php $path = '/path/to/image.jpg'; $url = 'https://vision.googleapis.com/v1/images:annotate?key='. 'YOUR_SECRET_API_KEY'; $body = []; $res = []; file_exists($path) or die("file not found. path:". $path); $image = base64_encode(file_get_contents($path)); $body = [ 'requests' => [ [ 'image' => ['content' => $image], 'features' => [ ['type' => 'LABEL_DETECTION'], ['type' => 'TEXT_DETECTION'], ['type' => 'FACE_DETECTION'], ['type' => 'LANDMARK_DETECTION'], ['type' => 'LOGO_DETECTION'], ['type' => 'SAFE_SEARCH_DETECTION'], ['type' => 'IMAGE_PROPERTIES'], ], ], ], ]; $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', ], CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => true, CURLOPT_VERBOSE => true, CURLOPT_POSTFIELDS => json_encode($body), ]); try { $response = curl_exec($ch); } catch (Exception $ex){ var_dump($ex->getMessage()); } $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); echo "-- header --\n". substr($response, 0, $header_size). "\n"; echo "-- body --\n". substr($response, $header_size). "\n";
您可以通过在 `$path` 中指定本地图像文件的绝对路径,并在 `YOUR_SECRET_API_KEY` 部分输入您的 API 密钥来解析图像。
(已在我的 PHP 5.6 环境下测试)
我遇到的一个主要陷阱是忘记添加 Content-Type 标头。在微软的 Motion API 中即使没有这个标头也能正常工作
你可能会想,“只要看看请求就能知道”,但谷歌对这类规范的要求非常严格……
那么,您是否成功收到了回复?
当您通过控制台传输图像时,根据图像的不同,屏幕滚动速度是不是非常快?
这个 API 很容易分析,但却是最难组织响应数据的 API。
返回的数据过多!
查看响应数据似乎工作量很大,所以我稍后再试。
就这样。
0






