试用 GCP 的 Vision API

大家好,
我是开发团队野生队的成员 Mandai。
我之前试用过微软的 Emotion API,但谷歌云平台 (GCP) 也提供了一个类似的、使用机器学习的图像检测 API。
这次,我准备试用一下 Vision API。
需要谷歌帐户
要使用 GCP,您需要一个 Google 帐户和一张信用卡。GCP
的 API 提供免费套餐,足以满足入门需求,但某些功能需要您注册信用卡。
Vision API 正是这种类型的 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 地址以允许来自多个服务器的访问,还可以使用子网掩码指定 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 中。
公共互联网 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





