智能媒體管理(IMM)人臉分組PHP DEMO

智能媒體管理(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);

如果您有任何問題,都可以聯繫 @宜和 @大邪 @劉傑 處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章