智能媒體管理(IMM)提供了高效、準確的人臉識別、人臉分組等相關功能。通過簡單的API調用即可實現。以下給出一個PHP的DEMO供參考。
引入SDK
首先,從Github上獲取阿里雲OpenAPI的PHP版本SDK,引入相關類庫,並初始化客戶端。
include_once './aliyun-php-sdk-core/Config.php';
use imm\Request\V20170906 as Imm;
//初始化客戶端
$iClientProfile = DefaultProfile::getProfile(
"cn-beijing", //服務區域Region,根據需要修改
"xxxxxxx", //您的AccessKey
"xxxxxxxxxxxx" //您的AccessSecret
);
$client = new DefaultAcsClient($iClientProfile);
創建Project
接下來需要創建一個Project,隨後的操作均歸屬於該Project。Project的CU需要配置爲>0的數字,CU的意義爲每秒鐘允許請求API的次數,即QPS。同時也是計費用的標準。具體計費詳情可以參考這裏。
//設置您的項目名稱
$projectName = "face-group-demo-project";
$request = new Imm\PutProjectRequest();
$request->setProject($projectName);
//設置爲圖片專業型,以便使用人臉聚類功能
$request->setType("PhotoProfessional");
//需要設置CU爲大於1的值以便使用接口
$request->setCU(1);
$response = $client->getAcsResponse($request);
print_r($response);
打出的內容應類似
stdClass Object
(
[CU] => 1
[Type] => PhotoProfessional
[CreateTime] => 2018-10-10T02:31:18Z
[RequestId] => 0B1917D5-DB51-4430-91E7-7DA727171BCF
[ModifyTime] => 2018-10-10T03:02:43Z
[Project] => face-group-demo-project
[Endpoint] => imm.cn-beijing.aliyuncs.com
[ServiceRole] =>
)
創建FaceSet
接下來創建一個FaceSet。FaceSet即人臉集合。人臉分組的操作是以FaceSet集合爲單元進行分組的。不同FaceSet之間的分組是隔離的。
//創建Set
$request = new Imm\CreateFaceSetRequest();
$request->setProject($projectName);
$response = $client->getAcsResponse($request);
print_r($response);
//獲取SetId
$setId = $response->SetId;
打出的內容如下。其中SetId即當前創建的FaceSet的SetId。
stdClass Object
(
[Status] => Running
[Photos] => 0
[CreateTime] => 2018-10-10T03:02:44.184Z
[RequestId] => 8A396F02-87B5-4440-B5CD-5AD7CB64F5C4
[Faces] => 0
[ModifyTime] => 2018-10-10T03:02:44.184Z
[SetId] => FACE-b8729472-d392-4667-8ad6-0b7f0a80945b
)
進行IndexFace人臉檢測
隨後即可使用IndexFace人臉檢測接口,添加照片到該FaceSet集合中。我們上一步已經通過$setId
記錄了該FaceSet的SetId
。
//調用IndexFace接口,進行人臉檢測
for($i=0;$i<5;$i++){
$request = new Imm\IndexFaceRequest();
$request->setProject($projectName);
$request->setSetId($setId);
//您可以替換爲您所需要圖片的OSS路徑
$request->setSrcUris(json_encode(["oss://imm-user-wmt-cn-beijing/faces/".$i.".bmp"]));
$response = $client->getAcsResponse($request);
print_r($response);
}
每一次IndexFace都會返回該照片的檢測信息,字段意義請參考官方文檔,您可以根據需要取用。舉例如下。
stdClass Object
(
[SrcUris] => Array
(
[0] => oss://imm-user-wmt-cn-beijing/faces/0.bmp
)
[RequestId] => AC8D2509-5C40-454C-813D-34986563D857
[SuccessDetails] => Array
(
[0] => stdClass Object
(
[SrcUri] => oss://imm-user-wmt-cn-beijing/faces/0.bmp
[Faces] => Array
(
[0] => stdClass Object
(
[FaceAttribute] => stdClass Object
(
[Blur] => stdClass Object
(
[Blurness] => stdClass Object
(
[Value] => 12.217
[Threshold] => 50
)
)
[FaceQuality] => stdClass Object
(
[Value] => 100
[Threshold] => 70.1
)
[HeadPose] => stdClass Object
(
[RollAngle] => 2.934
[PitchAngle] => 10.529
[YawAngle] => -3.145
)
[Age] => stdClass Object
(
[Value] => 21
)
[EyeStatus] => stdClass Object
(
[RightEyeStatus] => stdClass Object
(
[DarkGlasses] => 0
[NoGlassEyeClose] => 0.001
[Occlusion] => 0.049
[NormalGlassEyeOpen] => 0.106
[NormalGlassEyeClose] => 0.001
[NoGlassEyeOpen] => 99.842
)
[LeftEyeStatus] => stdClass Object
(
[DarkGlasses] => 0.014
[NoGlassEyeClose] => 0.006
[Occlusion] => 0.504
[NormalGlassEyeOpen] => 4.954
[NormalGlassEyeClose] => 0.004
[NoGlassEyeOpen] => 94.517
)
)
[Gender] => stdClass Object
(
[Value] => Male
)
)
[FaceRectangle] => stdClass Object
(
[Top] => 17
[Height] => 89
[Width] => 89
[Left] => 4
)
[FaceId] => 66690675bd0bc2599170fc63e7f8dbd8
)
)
[PhotoId] => 77f6e9ce630b83956192e8bd4af3cf39
)
)
[FailDetails] => Array
(
)
[SetId] => FACE-b8729472-d392-4667-8ad6-0b7f0a80945b
)
進行GroupFace人臉分組
檢測完畢後,可以對該FaceSet進行GroupFace操作,即人臉分組。該步可將當前FaceSet中相似的人臉歸位一類。
//進行人臉分組操作
$request = new Imm\GroupFacesRequest();
$request->setProject($projectName);
$request->setSetId($setId);
$response = $client->getAcsResponse($request);
print_r($response);
結果在下方打出。我們可以看出,數組中0和2號圖片被分爲1組,即我們推測爲同一個人的不同照片。1號和3號圖片暫時沒有相似的人臉,因此GroupId爲0。隨着之後我們再添加更多的人臉,這兩張圖片可能會被歸類到不同組中。
stdClass Object
(
[Groups] => Array
(
[0] => stdClass Object
(
[UnGroupReason] =>
[GroupId] => 1
[FaceId] => dadddf6bdd41d02aadc9fc4f2b54ca2b
)
[1] => stdClass Object
(
[UnGroupReason] => FaceNoSimilar
[GroupId] => 0
[FaceId] => 8342bcf23d66223048e10b287293754e
)
[2] => stdClass Object
(
[UnGroupReason] =>
[GroupId] => 1
[FaceId] => 7c551fd6aae5e09d58d52fee8bf72da1
)
[3] => stdClass Object
(
[UnGroupReason] => FaceNoSimilar
[GroupId] => 0
[FaceId] => 66690675bd0bc2599170fc63e7f8dbd8
)
)
[RequestId] => 3063F833-1C71-470B-B24A-CEF4F9C14A02
[HasMore] => 0
[SetId] => FACE-b8729472-d392-4667-8ad6-0b7f0a80945b
)
通過GetFaceSetDetail獲取FaceSet信息
我們可以隨時通過GetFaceSetDetail接口來獲取當前FaceSet的分組詳情,以及照片識別的詳情。
//獲取當前Set的信息
$request = new Imm\GetFaceSetDetailRequest();
$request->setProject($projectName);
$request->setSetId($setId);
$response = $client->getAcsResponse($request);
print_r($response);
返回值包括GroupFace和IndexFace中的所有信息,在此不再列出。
完整代碼
下面給出完整代碼供複製。
<?php
include_once './aliyun-php-sdk-core/Config.php';
use imm\Request\V20170906 as Imm;
//初始化客戶端
$iClientProfile = DefaultProfile::getProfile(
"cn-beijing", //服務區域Region,根據需要修改
"xxxxxxx", //您的AccessKey
"xxxxxxxxxxxx" //您的AccessSecret
);
$client = new DefaultAcsClient($iClientProfile);
//設置您的項目名稱
$projectName = "face-group-demo-project";
$request = new Imm\PutProjectRequest();
$request->setProject($projectName);
//設置爲圖片專業型,以便使用人臉聚類功能
$request->setType("PhotoProfessional");
//需要設置CU爲大於1的值以便使用接口
$request->setCU(1);
$response = $client->getAcsResponse($request);
print_r($response);
//創建Set
$request = new Imm\CreateFaceSetRequest();
$request->setProject($projectName);
$response = $client->getAcsResponse($request);
print_r($response);
//獲取SetId
$setId = $response->SetId;
//調用IndexFace接口,進行人臉檢測
for($i=0;$i<5;$i++){
$request = new Imm\IndexFaceRequest();
$request->setProject($projectName);
$request->setSetId($setId);
//您可以替換爲您所需要圖片的OSS路徑
$request->setSrcUris(json_encode(["oss://imm-user-wmt-cn-beijing/faces/".$i.".bmp"]));
$response = $client->getAcsResponse($request);
print_r($response);
}
//進行人臉分組操作
$request = new Imm\GroupFacesRequest();
$request->setProject($projectName);
$request->setSetId($setId);
$response = $client->getAcsResponse($request);
print_r($response);
//獲取當前Set的信息
$request = new Imm\GetFaceSetDetailRequest();
$request->setProject($projectName);
$request->setSetId($setId);
$response = $client->getAcsResponse($request);
print_r($response);
如果您有任何問題,都可以聯繫 @宜和 @大邪 @劉傑 處理。