人脸检测功能可以检测图片中的多张人脸,以及相关的主要面部特征,如情绪状态或有无 wearing headwear。
不支持特定个人面部识别。
自行试用
如果您是 Google Cloud 新手,请创建一个账号来评估 Cloud Vision API 在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
免费试用 Cloud Vision API人脸检测请求
设置您的 Google Cloud 项目和身份验证
如果您尚未创建 Google Cloud 项目,请立即创建。展开本部分可查看相关说明。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Vision API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Vision API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init - BASE64_ENCODED_IMAGE:二进制图片数据的 base64 表示(ASCII 字符串)。此字符串应类似于以下字符串:
/9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
- RESULTS_INT:(可选)要返回的结果的整数值。如果您省略
"maxResults"字段及其值,则 API 会默认返回 10 个结果。此字段不适用于以下功能类型:TEXT_DETECTION、DOCUMENT_TEXT_DETECTION或CROP_HINTS。 - PROJECT_ID:您的 Google Cloud 项目 ID。
- CLOUD_STORAGE_IMAGE_URI:Cloud Storage 存储桶中有效图片文件的路径。您必须至少拥有该文件的读取权限。
示例:
gs://cloud-samples-data/vision/face/faces.jpeg
- RESULTS_INT:(可选)要返回的结果的整数值。如果您省略
"maxResults"字段及其值,则 API 会默认返回 10 个结果。此字段不适用于以下功能类型:TEXT_DETECTION、DOCUMENT_TEXT_DETECTION或CROP_HINTS。 - PROJECT_ID:您的 Google Cloud 项目 ID。
检测本地图片中的人脸
您可以使用 Vision API 对本地图片文件执行特征检测。
对于 REST 请求,请将图片文件的内容作为 base64 编码的字符串在请求正文中发送。
对于 gcloud 和客户端库请求,请在请求中指定本地图片的路径。
REST
在使用任何请求数据之前,请先进行以下替换:
HTTP 方法和网址:
POST https://vision.googleapis.com/v1/images:annotate
请求 JSON 正文:
{
"requests": [
{
"image": {
"content": "BASE64_ENCODED_IMAGE"
},
"features": [
{
"maxResults": RESULTS_INT,
"type": "FACE_DETECTION"
}
]
}
]
}
如需发送请求,请选择以下方式之一:
curl
将请求正文保存在名为 request.json 的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://vision.googleapis.com/v1/images:annotate"
PowerShell
将请求正文保存在名为 request.json 的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content
如果请求成功,服务器将返回一个 200 OK HTTP 状态代码以及 JSON 格式的响应。
FACE_DETECTION 响应包括检测到的所有人脸的边界框、在人脸上检测到的重要部位(眼睛、鼻子、嘴巴等)及人脸和图片属性(喜悦、悲伤、愤怒、惊奇等)的置信度评分。
响应
{
"responses": [
{
"faceAnnotations": [
{
"boundingPoly": {
"vertices": [
{
"x": 1077,
"y": 157
},
{
"x": 2146,
"y": 157
},
{
"x": 2146,
"y": 1399
},
{
"x": 1077,
"y": 1399
}
]
},
"fdBoundingPoly": {
"vertices": [
{
"x": 1112,
"y": 407
},
{
"x": 1946,
"y": 407
},
{
"x": 1946,
"y": 1270
},
{
"x": 1112,
"y": 1270
}
]
},
"landmarks": [
{
"type": "LEFT_EYE",
"position": {
"x": 1368.748,
"y": 739.0957,
"z": 0.0024604797
}
},
{
"type": "RIGHT_EYE",
"position": {
"x": 1660.6105,
"y": 751.5844,
"z": -117.06496
}
},
{
"type": "LEFT_OF_LEFT_EYEBROW",
"position": {
"x": 1284.3208,
"y": 666.61487,
"z": 63.41506
}
},
{
"type": "RIGHT_OF_LEFT_EYEBROW",
"position": {
"x": 1418.9249,
"y": 671.49414,
"z": -83.82396
}
},
{
"type": "LEFT_OF_RIGHT_EYEBROW",
"position": {
"x": 1556.9579,
"y": 672.2199,
"z": -139.39935
}
},
{
"type": "RIGHT_OF_RIGHT_EYEBROW",
"position": {
"x": 1771.4799,
"y": 682.65845,
"z": -131.66716
}
},
{
"type": "MIDPOINT_BETWEEN_EYES",
"position": {
"x": 1479.6194,
"y": 741.87305,
"z": -114.84635
}
},
{
"type": "NOSE_TIP",
"position": {
"x": 1443.3151,
"y": 917.5109,
"z": -194.49301
}
},
{
"type": "UPPER_LIP",
"position": {
"x": 1466.7897,
"y": 1025.3483,
"z": -130.1202
}
},
{
"type": "LOWER_LIP",
"position": {
"x": 1467.2588,
"y": 1147.0403,
"z": -109.24505
}
},
{
"type": "MOUTH_LEFT",
"position": {
"x": 1376.8649,
"y": 1066.0856,
"z": -6.8136826
}
},
{
"type": "MOUTH_RIGHT",
"position": {
"x": 1652,
"y": 1079.3108,
"z": -106.93649
}
},
{
"type": "MOUTH_CENTER",
"position": {
"x": 1485.5554,
"y": 1087.2388,
"z": -110.68126
}
},
{
"type": "NOSE_BOTTOM_RIGHT",
"position": {
"x": 1571.9475,
"y": 944.9213,
"z": -124.11806
}
},
{
"type": "NOSE_BOTTOM_LEFT",
"position": {
"x": 1395.2339,
"y": 938.12787,
"z": -58.072197
}
},
{
"type": "NOSE_BOTTOM_CENTER",
"position": {
"x": 1468.4205,
"y": 968.8732,
"z": -132.09975
}
},
{
"type": "LEFT_EYE_TOP_BOUNDARY",
"position": {
"x": 1357.8658,
"y": 711.2427,
"z": -14.618992
}
},
{
"type": "LEFT_EYE_RIGHT_CORNER",
"position": {
"x": 1423.6936,
"y": 750.4164,
"z": -23.540215
}
},
{
"type": "LEFT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 1360.5627,
"y": 762.87415,
"z": -1.2607727
}
},
{
"type": "LEFT_EYE_LEFT_CORNER",
"position": {
"x": 1313.72,
"y": 739.443,
"z": 50.216393
}
},
{
"type": "RIGHT_EYE_TOP_BOUNDARY",
"position": {
"x": 1661.6622,
"y": 718.6839,
"z": -134.17404
}
},
{
"type": "RIGHT_EYE_RIGHT_CORNER",
"position": {
"x": 1730.0901,
"y": 763.57104,
"z": -116.365845
}
},
{
"type": "RIGHT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 1660.8823,
"y": 777.3474,
"z": -120.8635
}
},
{
"type": "RIGHT_EYE_LEFT_CORNER",
"position": {
"x": 1590.8903,
"y": 753.5044,
"z": -91.84842
}
},
{
"type": "LEFT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 1345.7522,
"y": 640.18243,
"z": -27.887913
}
},
{
"type": "RIGHT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 1660.5848,
"y": 648.36145,
"z": -153.73691
}
},
{
"type": "LEFT_EAR_TRAGION",
"position": {
"x": 1274.1006,
"y": 826.2645,
"z": 422.6642
}
},
{
"type": "RIGHT_EAR_TRAGION",
"position": {
"x": 2014.8041,
"y": 908.56537,
"z": 149.61232
}
},
{
"type": "FOREHEAD_GLABELLA",
"position": {
"x": 1476.2395,
"y": 669.9625,
"z": -120.59111
}
},
{
"type": "CHIN_GNATHION",
"position": {
"x": 1477.3256,
"y": 1269.3269,
"z": -67.748795
}
},
{
"type": "CHIN_LEFT_GONION",
"position": {
"x": 1336.8848,
"y": 1096.2242,
"z": 286.73004
}
},
{
"type": "CHIN_RIGHT_GONION",
"position": {
"x": 1863.2197,
"y": 1128.6213,
"z": 68.90431
}
},
{
"type": "LEFT_CHEEK_CENTER",
"position": {
"x": 1317.8549,
"y": 940.8025,
"z": 50.863163
}
},
{
"type": "RIGHT_CHEEK_CENTER",
"position": {
"x": 1733.4912,
"y": 964.073,
"z": -112.43947
}
}
],
"rollAngle": 1.5912293,
"panAngle": -22.01964,
"tiltAngle": -1.4997566,
"detectionConfidence": 0.9310801,
"landmarkingConfidence": 0.5775582,
"joyLikelihood": "VERY_LIKELY",
"sorrowLikelihood": "VERY_UNLIKELY",
"angerLikelihood": "VERY_UNLIKELY",
"surpriseLikelihood": "VERY_UNLIKELY",
"underExposedLikelihood": "VERY_UNLIKELY",
"blurredLikelihood": "VERY_UNLIKELY",
"headwearLikelihood": "POSSIBLE"
},
{
"boundingPoly": {
"vertices": [
{
"x": 144,
"y": 1273
},
{
"x": 793,
"y": 1273
},
{
"x": 793,
"y": 1844
},
{
"x": 144,
"y": 1844
}
]
},
"fdBoundingPoly": {
"vertices": [
{
"x": 181,
"y": 1373
},
{
"x": 742,
"y": 1373
},
{
"x": 742,
"y": 1844
},
{
"x": 181,
"y": 1844
}
]
},
"landmarks": [
{
"type": "LEFT_EYE",
"position": {
"x": 356.13745,
"y": 1635.7034,
"z": 0.0045757294
}
},
{
"type": "RIGHT_EYE",
"position": {
"x": 557.07324,
"y": 1601.1769,
"z": -10.258446
}
},
{
"type": "LEFT_OF_LEFT_EYEBROW",
"position": {
"x": 284.70563,
"y": 1599.5238,
"z": 28.755493
}
},
{
"type": "RIGHT_OF_LEFT_EYEBROW",
"position": {
"x": 397.47183,
"y": 1574.1455,
"z": -28.716581
}
},
{
"type": "LEFT_OF_RIGHT_EYEBROW",
"position": {
"x": 484.00983,
"y": 1559.5669,
"z": -33.509003
}
},
{
"type": "RIGHT_OF_RIGHT_EYEBROW",
"position": {
"x": 607.31726,
"y": 1551.2396,
"z": 11.0225525
}
},
{
"type": "MIDPOINT_BETWEEN_EYES",
"position": {
"x": 447.86597,
"y": 1603.2458,
"z": -40.69277
}
},
{
"type": "NOSE_TIP",
"position": {
"x": 463.15356,
"y": 1705.7849,
"z": -114.36831
}
},
{
"type": "UPPER_LIP",
"position": {
"x": 475.02646,
"y": 1779.54,
"z": -85.219086
}
},
{
"type": "LOWER_LIP",
"position": {
"x": 483.2983,
"y": 1844.4594,
"z": -83.812
}
},
{
"type": "MOUTH_LEFT",
"position": {
"x": 391.11206,
"y": 1824.9432,
"z": -34.578503
}
},
{
"type": "MOUTH_RIGHT",
"position": {
"x": 559.85266,
"y": 1797.929,
"z": -44.700863
}
},
{
"type": "MOUTH_CENTER",
"position": {
"x": 478.21106,
"y": 1807.5089,
"z": -76.46759
}
},
{
"type": "NOSE_BOTTOM_RIGHT",
"position": {
"x": 522.9539,
"y": 1717.8636,
"z": -51.489075
}
},
{
"type": "NOSE_BOTTOM_LEFT",
"position": {
"x": 414.95767,
"y": 1739.2955,
"z": -46.75015
}
},
{
"type": "NOSE_BOTTOM_CENTER",
"position": {
"x": 468.7361,
"y": 1739.5958,
"z": -78.64168
}
},
{
"type": "LEFT_EYE_TOP_BOUNDARY",
"position": {
"x": 352.39365,
"y": 1618.0576,
"z": -7.2005444
}
},
{
"type": "LEFT_EYE_RIGHT_CORNER",
"position": {
"x": 395.81454,
"y": 1629.9379,
"z": -2.4021797
}
},
{
"type": "LEFT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 357.511,
"y": 1649.6553,
"z": -4.4735374
}
},
{
"type": "LEFT_EYE_LEFT_CORNER",
"position": {
"x": 316.1426,
"y": 1645.2771,
"z": 18.701395
}
},
{
"type": "RIGHT_EYE_TOP_BOUNDARY",
"position": {
"x": 553.78973,
"y": 1582.3448,
"z": -17.07942
}
},
{
"type": "RIGHT_EYE_RIGHT_CORNER",
"position": {
"x": 596.6489,
"y": 1599.1897,
"z": 4.014868
}
},
{
"type": "RIGHT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 558.60706,
"y": 1615.964,
"z": -15.077105
}
},
{
"type": "RIGHT_EYE_LEFT_CORNER",
"position": {
"x": 514.8054,
"y": 1605.6407,
"z": -7.929638
}
},
{
"type": "LEFT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 336.4973,
"y": 1567.6466,
"z": -7.853897
}
},
{
"type": "RIGHT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 542.3708,
"y": 1536.191,
"z": -19.405855
}
},
{
"type": "LEFT_EAR_TRAGION",
"position": {
"x": 231.38948,
"y": 1749.3823,
"z": 221.4534
}
},
{
"type": "RIGHT_EAR_TRAGION",
"position": {
"x": 712.5644,
"y": 1670.4897,
"z": 199.4929
}
},
{
"type": "FOREHEAD_GLABELLA",
"position": {
"x": 439.35938,
"y": 1561.1454,
"z": -36.451645
}
},
{
"type": "CHIN_GNATHION",
"position": {
"x": 501.61096,
"y": 1942.0133,
"z": -75.04764
}
},
{
"type": "CHIN_LEFT_GONION",
"position": {
"x": 304.9834,
"y": 1892.5361,
"z": 114.12407
}
},
{
"type": "CHIN_RIGHT_GONION",
"position": {
"x": 684.92535,
"y": 1824.337,
"z": 96.13425
}
},
{
"type": "LEFT_CHEEK_CENTER",
"position": {
"x": 334.5645,
"y": 1764.659,
"z": -2.0755844
}
},
{
"type": "RIGHT_CHEEK_CENTER",
"position": {
"x": 609.5919,
"y": 1719.6847,
"z": -16.861538
}
}
],
"rollAngle": -8.514851,
"panAngle": -3.096844,
"tiltAngle": 9.26052,
"detectionConfidence": 0.5463216,
"landmarkingConfidence": 0.55711126,
"joyLikelihood": "VERY_UNLIKELY",
"sorrowLikelihood": "VERY_UNLIKELY",
"angerLikelihood": "VERY_UNLIKELY",
"surpriseLikelihood": "VERY_UNLIKELY",
"underExposedLikelihood": "VERY_UNLIKELY",
"blurredLikelihood": "UNLIKELY",
"headwearLikelihood": "VERY_UNLIKELY"
},
{
"boundingPoly": {
"vertices": [
{
"x": 785,
"y": 167
},
{
"x": 1100,
"y": 167
},
{
"x": 1100,
"y": 534
},
{
"x": 785,
"y": 534
}
]
},
"fdBoundingPoly": {
"vertices": [
{
"x": 834,
"y": 220
},
{
"x": 1101,
"y": 220
},
{
"x": 1101,
"y": 506
},
{
"x": 834,
"y": 506
}
]
},
"landmarks": [
{
"type": "LEFT_EYE",
"position": {
"x": 933.74615,
"y": 351.82394,
"z": -0.00068986416
}
},
{
"type": "RIGHT_EYE",
"position": {
"x": 1005.8836,
"y": 329.02396,
"z": 43.38338
}
},
{
"type": "LEFT_OF_LEFT_EYEBROW",
"position": {
"x": 901.93494,
"y": 333.3503,
"z": -9.714935
}
},
{
"type": "RIGHT_OF_LEFT_EYEBROW",
"position": {
"x": 957.4015,
"y": 319.9436,
"z": -6.8983736
}
},
{
"type": "LEFT_OF_RIGHT_EYEBROW",
"position": {
"x": 987.50134,
"y": 308.46817,
"z": 13.108145
}
},
{
"type": "RIGHT_OF_RIGHT_EYEBROW",
"position": {
"x": 1031.5519,
"y": 298.8843,
"z": 65.60683
}
},
{
"type": "MIDPOINT_BETWEEN_EYES",
"position": {
"x": 979.4568,
"y": 336.0551,
"z": 3.8077774
}
},
{
"type": "NOSE_TIP",
"position": {
"x": 1003.45795,
"y": 398.80377,
"z": -17.351936
}
},
{
"type": "UPPER_LIP",
"position": {
"x": 1000.16614,
"y": 432.11664,
"z": 5.2740355
}
},
{
"type": "LOWER_LIP",
"position": {
"x": 1004.0378,
"y": 456.92422,
"z": 13.545323
}
},
{
"type": "MOUTH_LEFT",
"position": {
"x": 961.922,
"y": 448.64325,
"z": 11.117096
}
},
{
"type": "MOUTH_RIGHT",
"position": {
"x": 1025.2979,
"y": 432.70157,
"z": 47.89795
}
},
{
"type": "MOUTH_CENTER",
"position": {
"x": 1002.51434,
"y": 443.3482,
"z": 13.021965
}
},
{
"type": "NOSE_BOTTOM_RIGHT",
"position": {
"x": 1015.5027,
"y": 402.8421,
"z": 28.03568
}
},
{
"type": "NOSE_BOTTOM_LEFT",
"position": {
"x": 969.764,
"y": 413.05563,
"z": 3.1156778
}
},
{
"type": "NOSE_BOTTOM_CENTER",
"position": {
"x": 997.8564,
"y": 416.98083,
"z": 3.3404813
}
},
{
"type": "LEFT_EYE_TOP_BOUNDARY",
"position": {
"x": 930.542,
"y": 343.17078,
"z": -6.9020395
}
},
{
"type": "LEFT_EYE_RIGHT_CORNER",
"position": {
"x": 950.7726,
"y": 348.11346,
"z": 9.216144
}
},
{
"type": "LEFT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 933.6862,
"y": 359.50848,
"z": -1.3347243
}
},
{
"type": "LEFT_EYE_LEFT_CORNER",
"position": {
"x": 914.83966,
"y": 356.1447,
"z": -1.4299142
}
},
{
"type": "RIGHT_EYE_TOP_BOUNDARY",
"position": {
"x": 1006.59766,
"y": 319.50406,
"z": 38.31219
}
},
{
"type": "RIGHT_EYE_RIGHT_CORNER",
"position": {
"x": 1021.45886,
"y": 327.68784,
"z": 61.100002
}
},
{
"type": "RIGHT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 1009.46686,
"y": 336.0832,
"z": 43.87975
}
},
{
"type": "RIGHT_EYE_LEFT_CORNER",
"position": {
"x": 991.17535,
"y": 331.97632,
"z": 34.4881
}
},
{
"type": "LEFT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 928.40436,
"y": 317.13898,
"z": -14.411907
}
},
{
"type": "RIGHT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 1008.5887,
"y": 294.364,
"z": 32.917953
}
},
{
"type": "LEFT_EAR_TRAGION",
"position": {
"x": 835.18915,
"y": 395.7093,
"z": 81.31065
}
},
{
"type": "RIGHT_EAR_TRAGION",
"position": {
"x": 1024.4136,
"y": 360.64178,
"z": 182.02446
}
},
{
"type": "FOREHEAD_GLABELLA",
"position": {
"x": 975.5221,
"y": 315.06647,
"z": 0.31154716
}
},
{
"type": "CHIN_GNATHION",
"position": {
"x": 1010.74097,
"y": 503.23572,
"z": 29.966637
}
},
{
"type": "CHIN_LEFT_GONION",
"position": {
"x": 891.86237,
"y": 466.7829,
"z": 58.84553
}
},
{
"type": "CHIN_RIGHT_GONION",
"position": {
"x": 1031.9008,
"y": 428.13455,
"z": 145.42484
}
},
{
"type": "LEFT_CHEEK_CENTER",
"position": {
"x": 929.4197,
"y": 418.09122,
"z": 4.574672
}
},
{
"type": "RIGHT_CHEEK_CENTER",
"position": {
"x": 1033.7278,
"y": 390.5432,
"z": 65.6329
}
}
],
"rollAngle": -12.077273,
"panAngle": 27.194477,
"tiltAngle": -5.252778,
"detectionConfidence": 0.38126788,
"landmarkingConfidence": 0.040030442,
"joyLikelihood": "VERY_UNLIKELY",
"sorrowLikelihood": "VERY_UNLIKELY",
"angerLikelihood": "VERY_UNLIKELY",
"surpriseLikelihood": "VERY_UNLIKELY",
"underExposedLikelihood": "LIKELY",
"blurredLikelihood": "VERY_LIKELY",
"headwearLikelihood": "VERY_UNLIKELY"
}
]
}
]
}
Go
试用此示例之前,请按照《Vision 快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Vision Go API 参考文档。
如需向 Vision 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置身份验证。
// detectFaces gets faces from the Vision API for an image at the given file path.
func detectFaces(w io.Writer, file string) error {
ctx := context.Background()
client, err := vision.NewImageAnnotatorClient(ctx)
if err != nil {
return err
}
defer client.Close()
f, err := os.Open(file)
if err != nil {
return err
}
defer f.Close()
image, err := vision.NewImageFromReader(f)
if err != nil {
return err
}
annotations, err := client.DetectFaces(ctx, image, nil, 10)
if err != nil {
return err
}
if len(annotations) == 0 {
fmt.Fprintln(w, "No faces found.")
} else {
fmt.Fprintln(w, "Faces:")
for i, annotation := range annotations {
fmt.Fprintln(w, " Face", i)
fmt.Fprintln(w, " Anger:", annotation.AngerLikelihood)
fmt.Fprintln(w, " Joy:", annotation.JoyLikelihood)
fmt.Fprintln(w, " Surprise:", annotation.SurpriseLikelihood)
}
}
return nil
}
Java
在试用此示例之前,请按照Vision API 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 Vision API Java 参考文档。
import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.AnnotateImageResponse;
import com.google.cloud.vision.v1.BatchAnnotateImagesResponse;
import com.google.cloud.vision.v1.FaceAnnotation;
import com.google.cloud.vision.v1.Feature;
import com.google.cloud.vision.v1.Image;
import com.google.cloud.vision.v1.ImageAnnotatorClient;
import com.google.protobuf.ByteString;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class DetectFaces {
public static void detectFaces() throws IOException {
// TODO(developer): Replace these variables before running the sample.
String filePath = "path/to/your/image/file.jpg";
detectFaces(filePath);
}
// Detects faces in the specified local image.
public static void detectFaces(String filePath) throws IOException {
List<AnnotateImageRequest> requests = new ArrayList<>();
ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath));
Image img = Image.newBuilder().setContent(imgBytes).build();
Feature feat = Feature.newBuilder().setType(Feature.Type.FACE_DETECTION).build();
AnnotateImageRequest request =
AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
requests.add(request);
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests. After completing all of your requests, call
// the "close" method on the client to safely clean up any remaining background resources.
try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
List<AnnotateImageResponse> responses = response.getResponsesList();
for (AnnotateImageResponse res : responses) {
if (res.hasError()) {
System.out.format("Error: %s%n", res.getError().getMessage());
return;
}
// For full list of available annotations, see http://g.co/cloud/vision/docs
for (FaceAnnotation annotation : res.getFaceAnnotationsList()) {
System.out.format(
"anger: %s%njoy: %s%nsurprise: %s%nposition: %s",
annotation.getAngerLikelihood(),
annotation.getJoyLikelihood(),
annotation.getSurpriseLikelihood(),
annotation.getBoundingPoly());
}
}
}
}
}Node.js
试用此示例之前,请按照《Vision 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Vision Node.js API 参考文档。
如需向 Vision 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置身份验证。
// Imports the Google Cloud client library
const vision = require('@google-cloud/vision');
// Creates a client
const client = new vision.ImageAnnotatorClient();
async function detectFaces() {
/**
* TODO(developer): Uncomment the following line before running the sample.
*/
// const fileName = 'Local image file, e.g. /path/to/image.png';
const [result] = await client.faceDetection(fileName);
const faces = result.faceAnnotations;
console.log('Faces:');
faces.forEach((face, i) => {
console.log(` Face #${i + 1}:`);
console.log(` Joy: ${face.joyLikelihood}`);
console.log(` Anger: ${face.angerLikelihood}`);
console.log(` Sorrow: ${face.sorrowLikelihood}`);
console.log(` Surprise: ${face.surpriseLikelihood}`);
});
}
detectFaces();Python
试用此示例之前,请按照《Vision 快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Vision Python API 参考文档。
如需向 Vision 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置身份验证。
def detect_faces(path):
"""Detects faces in an image."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.face_detection(image=image)
faces = response.face_annotations
# Names of likelihood from google.cloud.vision.enums
likelihood_name = (
"UNKNOWN",
"VERY_UNLIKELY",
"UNLIKELY",
"POSSIBLE",
"LIKELY",
"VERY_LIKELY",
)
print("Faces:")
for face in faces:
print(f"anger: {likelihood_name[face.anger_likelihood]}")
print(f"joy: {likelihood_name[face.joy_likelihood]}")
print(f"surprise: {likelihood_name[face.surprise_likelihood]}")
vertices = [
f"({vertex.x},{vertex.y})" for vertex in face.bounding_poly.vertices
]
print("face bounds: {}".format(",".join(vertices)))
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
其他语言
C#: 请按照客户端库页面上的 C# 设置说明操作,然后访问 .NET 版 Vision 参考文档。
PHP: 请按照客户端库页面上的 PHP 设置说明操作,然后访问 PHP 版 Vision 参考文档。
Ruby 版: 请按照客户端库页面上的 Ruby 设置说明操作,然后访问 Ruby 版 Vision 参考文档。
检测远程图片中的人脸
您可以使用 Vision API 对位于 Cloud Storage 或网络中的远程图片文件执行特征检测。如需发送远程文件请求,请在请求正文中指定文件的网址或 Cloud Storage URI。
REST
在使用任何请求数据之前,请先进行以下替换:
HTTP 方法和网址:
POST https://vision.googleapis.com/v1/images:annotate
请求 JSON 正文:
{
"requests": [
{
"image": {
"source": {
"imageUri": "CLOUD_STORAGE_IMAGE_URI"
}
},
"features": [
{
"maxResults": RESULTS_INT,
"type": "FACE_DETECTION"
}
]
}
]
}
如需发送请求,请选择以下方式之一:
curl
将请求正文保存在名为 request.json 的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://vision.googleapis.com/v1/images:annotate"
PowerShell
将请求正文保存在名为 request.json 的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content
如果请求成功,服务器将返回一个 200 OK HTTP 状态代码以及 JSON 格式的响应。
FACE_DETECTION 响应包括检测到的所有人脸的边界框、在人脸上检测到的重要部位(眼睛、鼻子、嘴巴等)及人脸和图片属性(喜悦、悲伤、愤怒、惊奇等)的置信度评分。
响应
{
"responses": [
{
"faceAnnotations": [
{
"boundingPoly": {
"vertices": [
{
"x": 1077,
"y": 157
},
{
"x": 2146,
"y": 157
},
{
"x": 2146,
"y": 1399
},
{
"x": 1077,
"y": 1399
}
]
},
"fdBoundingPoly": {
"vertices": [
{
"x": 1112,
"y": 407
},
{
"x": 1946,
"y": 407
},
{
"x": 1946,
"y": 1270
},
{
"x": 1112,
"y": 1270
}
]
},
"landmarks": [
{
"type": "LEFT_EYE",
"position": {
"x": 1368.748,
"y": 739.0957,
"z": 0.0024604797
}
},
{
"type": "RIGHT_EYE",
"position": {
"x": 1660.6105,
"y": 751.5844,
"z": -117.06496
}
},
{
"type": "LEFT_OF_LEFT_EYEBROW",
"position": {
"x": 1284.3208,
"y": 666.61487,
"z": 63.41506
}
},
{
"type": "RIGHT_OF_LEFT_EYEBROW",
"position": {
"x": 1418.9249,
"y": 671.49414,
"z": -83.82396
}
},
{
"type": "LEFT_OF_RIGHT_EYEBROW",
"position": {
"x": 1556.9579,
"y": 672.2199,
"z": -139.39935
}
},
{
"type": "RIGHT_OF_RIGHT_EYEBROW",
"position": {
"x": 1771.4799,
"y": 682.65845,
"z": -131.66716
}
},
{
"type": "MIDPOINT_BETWEEN_EYES",
"position": {
"x": 1479.6194,
"y": 741.87305,
"z": -114.84635
}
},
{
"type": "NOSE_TIP",
"position": {
"x": 1443.3151,
"y": 917.5109,
"z": -194.49301
}
},
{
"type": "UPPER_LIP",
"position": {
"x": 1466.7897,
"y": 1025.3483,
"z": -130.1202
}
},
{
"type": "LOWER_LIP",
"position": {
"x": 1467.2588,
"y": 1147.0403,
"z": -109.24505
}
},
{
"type": "MOUTH_LEFT",
"position": {
"x": 1376.8649,
"y": 1066.0856,
"z": -6.8136826
}
},
{
"type": "MOUTH_RIGHT",
"position": {
"x": 1652,
"y": 1079.3108,
"z": -106.93649
}
},
{
"type": "MOUTH_CENTER",
"position": {
"x": 1485.5554,
"y": 1087.2388,
"z": -110.68126
}
},
{
"type": "NOSE_BOTTOM_RIGHT",
"position": {
"x": 1571.9475,
"y": 944.9213,
"z": -124.11806
}
},
{
"type": "NOSE_BOTTOM_LEFT",
"position": {
"x": 1395.2339,
"y": 938.12787,
"z": -58.072197
}
},
{
"type": "NOSE_BOTTOM_CENTER",
"position": {
"x": 1468.4205,
"y": 968.8732,
"z": -132.09975
}
},
{
"type": "LEFT_EYE_TOP_BOUNDARY",
"position": {
"x": 1357.8658,
"y": 711.2427,
"z": -14.618992
}
},
{
"type": "LEFT_EYE_RIGHT_CORNER",
"position": {
"x": 1423.6936,
"y": 750.4164,
"z": -23.540215
}
},
{
"type": "LEFT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 1360.5627,
"y": 762.87415,
"z": -1.2607727
}
},
{
"type": "LEFT_EYE_LEFT_CORNER",
"position": {
"x": 1313.72,
"y": 739.443,
"z": 50.216393
}
},
{
"type": "RIGHT_EYE_TOP_BOUNDARY",
"position": {
"x": 1661.6622,
"y": 718.6839,
"z": -134.17404
}
},
{
"type": "RIGHT_EYE_RIGHT_CORNER",
"position": {
"x": 1730.0901,
"y": 763.57104,
"z": -116.365845
}
},
{
"type": "RIGHT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 1660.8823,
"y": 777.3474,
"z": -120.8635
}
},
{
"type": "RIGHT_EYE_LEFT_CORNER",
"position": {
"x": 1590.8903,
"y": 753.5044,
"z": -91.84842
}
},
{
"type": "LEFT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 1345.7522,
"y": 640.18243,
"z": -27.887913
}
},
{
"type": "RIGHT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 1660.5848,
"y": 648.36145,
"z": -153.73691
}
},
{
"type": "LEFT_EAR_TRAGION",
"position": {
"x": 1274.1006,
"y": 826.2645,
"z": 422.6642
}
},
{
"type": "RIGHT_EAR_TRAGION",
"position": {
"x": 2014.8041,
"y": 908.56537,
"z": 149.61232
}
},
{
"type": "FOREHEAD_GLABELLA",
"position": {
"x": 1476.2395,
"y": 669.9625,
"z": -120.59111
}
},
{
"type": "CHIN_GNATHION",
"position": {
"x": 1477.3256,
"y": 1269.3269,
"z": -67.748795
}
},
{
"type": "CHIN_LEFT_GONION",
"position": {
"x": 1336.8848,
"y": 1096.2242,
"z": 286.73004
}
},
{
"type": "CHIN_RIGHT_GONION",
"position": {
"x": 1863.2197,
"y": 1128.6213,
"z": 68.90431
}
},
{
"type": "LEFT_CHEEK_CENTER",
"position": {
"x": 1317.8549,
"y": 940.8025,
"z": 50.863163
}
},
{
"type": "RIGHT_CHEEK_CENTER",
"position": {
"x": 1733.4912,
"y": 964.073,
"z": -112.43947
}
}
],
"rollAngle": 1.5912293,
"panAngle": -22.01964,
"tiltAngle": -1.4997566,
"detectionConfidence": 0.9310801,
"landmarkingConfidence": 0.5775582,
"joyLikelihood": "VERY_LIKELY",
"sorrowLikelihood": "VERY_UNLIKELY",
"angerLikelihood": "VERY_UNLIKELY",
"surpriseLikelihood": "VERY_UNLIKELY",
"underExposedLikelihood": "VERY_UNLIKELY",
"blurredLikelihood": "VERY_UNLIKELY",
"headwearLikelihood": "POSSIBLE"
},
{
"boundingPoly": {
"vertices": [
{
"x": 144,
"y": 1273
},
{
"x": 793,
"y": 1273
},
{
"x": 793,
"y": 1844
},
{
"x": 144,
"y": 1844
}
]
},
"fdBoundingPoly": {
"vertices": [
{
"x": 181,
"y": 1373
},
{
"x": 742,
"y": 1373
},
{
"x": 742,
"y": 1844
},
{
"x": 181,
"y": 1844
}
]
},
"landmarks": [
{
"type": "LEFT_EYE",
"position": {
"x": 356.13745,
"y": 1635.7034,
"z": 0.0045757294
}
},
{
"type": "RIGHT_EYE",
"position": {
"x": 557.07324,
"y": 1601.1769,
"z": -10.258446
}
},
{
"type": "LEFT_OF_LEFT_EYEBROW",
"position": {
"x": 284.70563,
"y": 1599.5238,
"z": 28.755493
}
},
{
"type": "RIGHT_OF_LEFT_EYEBROW",
"position": {
"x": 397.47183,
"y": 1574.1455,
"z": -28.716581
}
},
{
"type": "LEFT_OF_RIGHT_EYEBROW",
"position": {
"x": 484.00983,
"y": 1559.5669,
"z": -33.509003
}
},
{
"type": "RIGHT_OF_RIGHT_EYEBROW",
"position": {
"x": 607.31726,
"y": 1551.2396,
"z": 11.0225525
}
},
{
"type": "MIDPOINT_BETWEEN_EYES",
"position": {
"x": 447.86597,
"y": 1603.2458,
"z": -40.69277
}
},
{
"type": "NOSE_TIP",
"position": {
"x": 463.15356,
"y": 1705.7849,
"z": -114.36831
}
},
{
"type": "UPPER_LIP",
"position": {
"x": 475.02646,
"y": 1779.54,
"z": -85.219086
}
},
{
"type": "LOWER_LIP",
"position": {
"x": 483.2983,
"y": 1844.4594,
"z": -83.812
}
},
{
"type": "MOUTH_LEFT",
"position": {
"x": 391.11206,
"y": 1824.9432,
"z": -34.578503
}
},
{
"type": "MOUTH_RIGHT",
"position": {
"x": 559.85266,
"y": 1797.929,
"z": -44.700863
}
},
{
"type": "MOUTH_CENTER",
"position": {
"x": 478.21106,
"y": 1807.5089,
"z": -76.46759
}
},
{
"type": "NOSE_BOTTOM_RIGHT",
"position": {
"x": 522.9539,
"y": 1717.8636,
"z": -51.489075
}
},
{
"type": "NOSE_BOTTOM_LEFT",
"position": {
"x": 414.95767,
"y": 1739.2955,
"z": -46.75015
}
},
{
"type": "NOSE_BOTTOM_CENTER",
"position": {
"x": 468.7361,
"y": 1739.5958,
"z": -78.64168
}
},
{
"type": "LEFT_EYE_TOP_BOUNDARY",
"position": {
"x": 352.39365,
"y": 1618.0576,
"z": -7.2005444
}
},
{
"type": "LEFT_EYE_RIGHT_CORNER",
"position": {
"x": 395.81454,
"y": 1629.9379,
"z": -2.4021797
}
},
{
"type": "LEFT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 357.511,
"y": 1649.6553,
"z": -4.4735374
}
},
{
"type": "LEFT_EYE_LEFT_CORNER",
"position": {
"x": 316.1426,
"y": 1645.2771,
"z": 18.701395
}
},
{
"type": "RIGHT_EYE_TOP_BOUNDARY",
"position": {
"x": 553.78973,
"y": 1582.3448,
"z": -17.07942
}
},
{
"type": "RIGHT_EYE_RIGHT_CORNER",
"position": {
"x": 596.6489,
"y": 1599.1897,
"z": 4.014868
}
},
{
"type": "RIGHT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 558.60706,
"y": 1615.964,
"z": -15.077105
}
},
{
"type": "RIGHT_EYE_LEFT_CORNER",
"position": {
"x": 514.8054,
"y": 1605.6407,
"z": -7.929638
}
},
{
"type": "LEFT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 336.4973,
"y": 1567.6466,
"z": -7.853897
}
},
{
"type": "RIGHT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 542.3708,
"y": 1536.191,
"z": -19.405855
}
},
{
"type": "LEFT_EAR_TRAGION",
"position": {
"x": 231.38948,
"y": 1749.3823,
"z": 221.4534
}
},
{
"type": "RIGHT_EAR_TRAGION",
"position": {
"x": 712.5644,
"y": 1670.4897,
"z": 199.4929
}
},
{
"type": "FOREHEAD_GLABELLA",
"position": {
"x": 439.35938,
"y": 1561.1454,
"z": -36.451645
}
},
{
"type": "CHIN_GNATHION",
"position": {
"x": 501.61096,
"y": 1942.0133,
"z": -75.04764
}
},
{
"type": "CHIN_LEFT_GONION",
"position": {
"x": 304.9834,
"y": 1892.5361,
"z": 114.12407
}
},
{
"type": "CHIN_RIGHT_GONION",
"position": {
"x": 684.92535,
"y": 1824.337,
"z": 96.13425
}
},
{
"type": "LEFT_CHEEK_CENTER",
"position": {
"x": 334.5645,
"y": 1764.659,
"z": -2.0755844
}
},
{
"type": "RIGHT_CHEEK_CENTER",
"position": {
"x": 609.5919,
"y": 1719.6847,
"z": -16.861538
}
}
],
"rollAngle": -8.514851,
"panAngle": -3.096844,
"tiltAngle": 9.26052,
"detectionConfidence": 0.5463216,
"landmarkingConfidence": 0.55711126,
"joyLikelihood": "VERY_UNLIKELY",
"sorrowLikelihood": "VERY_UNLIKELY",
"angerLikelihood": "VERY_UNLIKELY",
"surpriseLikelihood": "VERY_UNLIKELY",
"underExposedLikelihood": "VERY_UNLIKELY",
"blurredLikelihood": "UNLIKELY",
"headwearLikelihood": "VERY_UNLIKELY"
},
{
"boundingPoly": {
"vertices": [
{
"x": 785,
"y": 167
},
{
"x": 1100,
"y": 167
},
{
"x": 1100,
"y": 534
},
{
"x": 785,
"y": 534
}
]
},
"fdBoundingPoly": {
"vertices": [
{
"x": 834,
"y": 220
},
{
"x": 1101,
"y": 220
},
{
"x": 1101,
"y": 506
},
{
"x": 834,
"y": 506
}
]
},
"landmarks": [
{
"type": "LEFT_EYE",
"position": {
"x": 933.74615,
"y": 351.82394,
"z": -0.00068986416
}
},
{
"type": "RIGHT_EYE",
"position": {
"x": 1005.8836,
"y": 329.02396,
"z": 43.38338
}
},
{
"type": "LEFT_OF_LEFT_EYEBROW",
"position": {
"x": 901.93494,
"y": 333.3503,
"z": -9.714935
}
},
{
"type": "RIGHT_OF_LEFT_EYEBROW",
"position": {
"x": 957.4015,
"y": 319.9436,
"z": -6.8983736
}
},
{
"type": "LEFT_OF_RIGHT_EYEBROW",
"position": {
"x": 987.50134,
"y": 308.46817,
"z": 13.108145
}
},
{
"type": "RIGHT_OF_RIGHT_EYEBROW",
"position": {
"x": 1031.5519,
"y": 298.8843,
"z": 65.60683
}
},
{
"type": "MIDPOINT_BETWEEN_EYES",
"position": {
"x": 979.4568,
"y": 336.0551,
"z": 3.8077774
}
},
{
"type": "NOSE_TIP",
"position": {
"x": 1003.45795,
"y": 398.80377,
"z": -17.351936
}
},
{
"type": "UPPER_LIP",
"position": {
"x": 1000.16614,
"y": 432.11664,
"z": 5.2740355
}
},
{
"type": "LOWER_LIP",
"position": {
"x": 1004.0378,
"y": 456.92422,
"z": 13.545323
}
},
{
"type": "MOUTH_LEFT",
"position": {
"x": 961.922,
"y": 448.64325,
"z": 11.117096
}
},
{
"type": "MOUTH_RIGHT",
"position": {
"x": 1025.2979,
"y": 432.70157,
"z": 47.89795
}
},
{
"type": "MOUTH_CENTER",
"position": {
"x": 1002.51434,
"y": 443.3482,
"z": 13.021965
}
},
{
"type": "NOSE_BOTTOM_RIGHT",
"position": {
"x": 1015.5027,
"y": 402.8421,
"z": 28.03568
}
},
{
"type": "NOSE_BOTTOM_LEFT",
"position": {
"x": 969.764,
"y": 413.05563,
"z": 3.1156778
}
},
{
"type": "NOSE_BOTTOM_CENTER",
"position": {
"x": 997.8564,
"y": 416.98083,
"z": 3.3404813
}
},
{
"type": "LEFT_EYE_TOP_BOUNDARY",
"position": {
"x": 930.542,
"y": 343.17078,
"z": -6.9020395
}
},
{
"type": "LEFT_EYE_RIGHT_CORNER",
"position": {
"x": 950.7726,
"y": 348.11346,
"z": 9.216144
}
},
{
"type": "LEFT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 933.6862,
"y": 359.50848,
"z": -1.3347243
}
},
{
"type": "LEFT_EYE_LEFT_CORNER",
"position": {
"x": 914.83966,
"y": 356.1447,
"z": -1.4299142
}
},
{
"type": "RIGHT_EYE_TOP_BOUNDARY",
"position": {
"x": 1006.59766,
"y": 319.50406,
"z": 38.31219
}
},
{
"type": "RIGHT_EYE_RIGHT_CORNER",
"position": {
"x": 1021.45886,
"y": 327.68784,
"z": 61.100002
}
},
{
"type": "RIGHT_EYE_BOTTOM_BOUNDARY",
"position": {
"x": 1009.46686,
"y": 336.0832,
"z": 43.87975
}
},
{
"type": "RIGHT_EYE_LEFT_CORNER",
"position": {
"x": 991.17535,
"y": 331.97632,
"z": 34.4881
}
},
{
"type": "LEFT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 928.40436,
"y": 317.13898,
"z": -14.411907
}
},
{
"type": "RIGHT_EYEBROW_UPPER_MIDPOINT",
"position": {
"x": 1008.5887,
"y": 294.364,
"z": 32.917953
}
},
{
"type": "LEFT_EAR_TRAGION",
"position": {
"x": 835.18915,
"y": 395.7093,
"z": 81.31065
}
},
{
"type": "RIGHT_EAR_TRAGION",
"position": {
"x": 1024.4136,
"y": 360.64178,
"z": 182.02446
}
},
{
"type": "FOREHEAD_GLABELLA",
"position": {
"x": 975.5221,
"y": 315.06647,
"z": 0.31154716
}
},
{
"type": "CHIN_GNATHION",
"position": {
"x": 1010.74097,
"y": 503.23572,
"z": 29.966637
}
},
{
"type": "CHIN_LEFT_GONION",
"position": {
"x": 891.86237,
"y": 466.7829,
"z": 58.84553
}
},
{
"type": "CHIN_RIGHT_GONION",
"position": {
"x": 1031.9008,
"y": 428.13455,
"z": 145.42484
}
},
{
"type": "LEFT_CHEEK_CENTER",
"position": {
"x": 929.4197,
"y": 418.09122,
"z": 4.574672
}
},
{
"type": "RIGHT_CHEEK_CENTER",
"position": {
"x": 1033.7278,
"y": 390.5432,
"z": 65.6329
}
}
],
"rollAngle": -12.077273,
"panAngle": 27.194477,
"tiltAngle": -5.252778,
"detectionConfidence": 0.38126788,
"landmarkingConfidence": 0.040030442,
"joyLikelihood": "VERY_UNLIKELY",
"sorrowLikelihood": "VERY_UNLIKELY",
"angerLikelihood": "VERY_UNLIKELY",
"surpriseLikelihood": "VERY_UNLIKELY",
"underExposedLikelihood": "LIKELY",
"blurredLikelihood": "VERY_LIKELY",
"headwearLikelihood": "VERY_UNLIKELY"
}
]
}
]
}
Go
试用此示例之前,请按照《Vision 快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Vision Go API 参考文档。
如需向 Vision 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置身份验证。
// detectFaces gets faces from the Vision API for an image at the given file path.
func detectFacesURI(w io.Writer, file string) error {
ctx := context.Background()
client, err := vision.NewImageAnnotatorClient(ctx)
if err != nil {
return err
}
image := vision.NewImageFromURI(file)
annotations, err := client.DetectFaces(ctx, image, nil, 10)
if err != nil {
return err
}
if len(annotations) == 0 {
fmt.Fprintln(w, "No faces found.")
} else {
fmt.Fprintln(w, "Faces:")
for i, annotation := range annotations {
fmt.Fprintln(w, " Face", i)
fmt.Fprintln(w, " Anger:", annotation.AngerLikelihood)
fmt.Fprintln(w, " Joy:", annotation.JoyLikelihood)
fmt.Fprintln(w, " Surprise:", annotation.SurpriseLikelihood)
}
}
return nil
}
Java
在试用此示例之前,请按照Vision API 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 Vision API Java 参考文档。
import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.AnnotateImageResponse;
import com.google.cloud.vision.v1.BatchAnnotateImagesResponse;
import com.google.cloud.vision.v1.FaceAnnotation;
import com.google.cloud.vision.v1.Feature;
import com.google.cloud.vision.v1.Image;
import com.google.cloud.vision.v1.ImageAnnotatorClient;
import com.google.cloud.vision.v1.ImageSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class DetectFacesGcs {
public static void detectFacesGcs() throws IOException {
// TODO(developer): Replace these variables before running the sample.
String filePath = "gs://your-gcs-bucket/path/to/image/file.jpg";
detectFacesGcs(filePath);
}
// Detects faces in the specified remote image on Google Cloud Storage.
public static void detectFacesGcs(String gcsPath) throws IOException {
List<AnnotateImageRequest> requests = new ArrayList<>();
ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build();
Image img = Image.newBuilder().setSource(imgSource).build();
Feature feat = Feature.newBuilder().setType(Feature.Type.FACE_DETECTION).build();
AnnotateImageRequest request =
AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
requests.add(request);
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests. After completing all of your requests, call
// the "close" method on the client to safely clean up any remaining background resources.
try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
List<AnnotateImageResponse> responses = response.getResponsesList();
for (AnnotateImageResponse res : responses) {
if (res.hasError()) {
System.out.format("Error: %s%n", res.getError().getMessage());
return;
}
// For full list of available annotations, see http://g.co/cloud/vision/docs
for (FaceAnnotation annotation : res.getFaceAnnotationsList()) {
System.out.format(
"anger: %s%njoy: %s%nsurprise: %s%nposition: %s",
annotation.getAngerLikelihood(),
annotation.getJoyLikelihood(),
annotation.getSurpriseLikelihood(),
annotation.getBoundingPoly());
}
}
}
}
}Node.js
试用此示例之前,请按照《Vision 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Vision Node.js API 参考文档。
如需向 Vision 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置身份验证。
// Imports the Google Cloud client libraries
const vision = require('@google-cloud/vision');
// Creates a client
const client = new vision.ImageAnnotatorClient();
/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const bucketName = 'Bucket where the file resides, e.g. my-bucket';
// const fileName = 'Path to file within bucket, e.g. path/to/image.png';
// Performs face detection on the gcs file
const [result] = await client.faceDetection(`gs://${bucketName}/${fileName}`);
const faces = result.faceAnnotations;
console.log('Faces:');
faces.forEach((face, i) => {
console.log(` Face #${i + 1}:`);
console.log(` Joy: ${face.joyLikelihood}`);
console.log(` Anger: ${face.angerLikelihood}`);
console.log(` Sorrow: ${face.sorrowLikelihood}`);
console.log(` Surprise: ${face.surpriseLikelihood}`);
});Python
试用此示例之前,请按照《Vision 快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Vision Python API 参考文档。
如需向 Vision 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置身份验证。
def detect_faces_uri(uri):
"""Detects faces in the file located in Google Cloud Storage or the web."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
image = vision.Image()
image.source.image_uri = uri
response = client.face_detection(image=image)
faces = response.face_annotations
# Names of likelihood from google.cloud.vision.enums
likelihood_name = (
"UNKNOWN",
"VERY_UNLIKELY",
"UNLIKELY",
"POSSIBLE",
"LIKELY",
"VERY_LIKELY",
)
print("Faces:")
for face in faces:
print(f"anger: {likelihood_name[face.anger_likelihood]}")
print(f"joy: {likelihood_name[face.joy_likelihood]}")
print(f"surprise: {likelihood_name[face.surprise_likelihood]}")
vertices = [
f"({vertex.x},{vertex.y})" for vertex in face.bounding_poly.vertices
]
print("face bounds: {}".format(",".join(vertices)))
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
gcloud
如需执行人脸检测,请使用 gcloud ml vision detect-faces 命令,如以下示例所示:
gcloud ml vision detect-faces gs://cloud-samples-data/vision/face/faces.jpeg
其他语言
C#: 请按照客户端库页面上的 C# 设置说明操作,然后访问 .NET 版 Vision 参考文档。
PHP: 请按照客户端库页面上的 PHP 设置说明操作,然后访问 PHP 版 Vision 参考文档。
Ruby 版: 请按照客户端库页面上的 Ruby 设置说明操作,然后访问 Ruby 版 Vision 参考文档。
试用
接下来,请尝试执行人脸检测。您可以使用已指定的图片 (gs://cloud-samples-data/vision/face/faces.jpeg) 或指定您自己的图片。选择执行即可发送请求。
请求正文:
{
"requests": [
{
"features": [
{
"maxResults": 10,
"type": "FACE_DETECTION"
}
],
"image": {
"source": {
"imageUri": "gs://cloud-samples-data/vision/face/faces.jpeg"
}
}
}
]
}