Как использовать Rest API распознавания лиц AZURE?

Я использую Face API с завитком в PHP. Но у меня проблема при сопоставлении изображений. Я могу генерировать faceId, но при сопоставлении я получаю результаты, отличные от ожидаемых. У меня есть два изображения, принадлежащие одному и тому же человеку, но API указывает, что эти изображения разные. Но при использовании демонстрации Microsoft для сравнения изображений я получаю правильный результат.

Вот демонстрационная ссылка Microsoft: https://azure.microsoft.com/en-in/services/cognitive-services/face/#demo

Вот URL моих изображений

$img1 = http://nexever.in/LibTravelSuperAdmin/images/temporary/1645715403_1.jpg; $img2 = http://nexever.in/LibTravelSuperAdmin/images/temporary/3.png;

Вот мой код

<?php

function compare($image1, $image2)
{
    $faceid = array();
    $images = array($image1 , $image2);

$headers      = ["Ocp-Apim-Subscription-Key: ********* ","Content-Type:application/json" ]; 
/* Getting faceId */    
    foreach($images as $data)
    {   
        /* First step is to detect face */
        $request_url='https://nexever.cognitiveservices.azure.com/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false';        
        
        /* Image to get faceid */
    $detect = array('url' => $data); 
    $curl = curl_init(); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($curl, CURLOPT_URL, $request_url); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($detect)); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);      
    $strResponse = curl_exec($curl);
    $curlErrno   = curl_errno($curl);
    if ($curlErrno) { $curlError = curl_error($curl);throw new Exception($curlError); }
    $http_status = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl);
    $strResponse = json_decode($strResponse , true);
    print_r($strResponse);
    array_push($faceid , $strResponse[0]['faceId']);        
    }       
    
// comparing by face ID     
/* Match face url */
$request_url = 'https://nexever.cognitiveservices.azure.com/face/v1.0/verify';      

/* Face ID to compare */
print_r($faceid);

$match = array("faceId1"=>$faceid[0], "faceId2"=>$faceid[1],"maxNumOfCandidatesReturned" =>10,"mode"=> "matchFace");
 

    $curl = curl_init(); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($curl, CURLOPT_URL, $request_url);   curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($match)); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $strResponse = curl_exec($curl);  $curlErrno   = curl_errno($curl);
    if ($curlErrno) {$curlError = curl_error($curl); throw new Exception($curlError); }
    $http_status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    curl_close($curl);
    return json_decode($strResponse, true);
    
}

$img1 = "http://nexever.in/LibTravelSuperAdmin/images/temporary/1645715403_1.jpg";
$img2 = "http://nexever.in/LibTravelSuperAdmin/images/temporary/3.png";
$ret =  compare($img1, $img2);

//print_r($ret);
if(isset($ret['isIdentical']))
{
    if($ret['isIdentical'] == 1)
    {
        echo "Same Person ";
    }
    else if($ret['isIdentical'] == 0)
    {
        echo "Different Person ";
    }
}


?>

Я успешно получил идентификатор лица, но не могу сопоставить. Если я пробую другие изображения одного и того же человека, иногда они совпадают. Проблема в том, что результат неточный.

но на демо майкрософт работает нормально.


person dummy user    schedule 01.04.2021    source источник


Ответы (1)


Пожалуйста, попробуйте указать параметр запроса: recognitionModel=recognition_04 при обнаружении лиц как официальный документ рекомендуется: введите здесь описание изображения

Я изменил ваш код, как показано ниже, он отлично работает для меня:

<?php

function compare($image1, $image2)
{
    $faceid = array();
    $images = array($image1 , $image2);

    $faceAPIName = "nexever";
    $apikey = "<your api key>";

    $faceidAPIHost = "https://$faceAPIName.cognitiveservices.azure.com";
        
    foreach($images as $data)
    {   
        $detect = array('url' => $data); 
        $result = do_post("$faceidAPIHost/face/v1.0/detect?recognitionModel=recognition_04&detectionModel=detection_03",json_encode($detect),$apikey);
        array_push($faceid , $result[0]['faceId']);
    }       

    $request_url = "$faceidAPIHost/face/v1.0/verify";      

    /* Face ID to compare */
    print_r($faceid);

    $match = array("faceId1"=>$faceid[0], "faceId2"=>$faceid[1],"maxNumOfCandidatesReturned" =>10,"mode"=> "matchFace");
 
    return do_post($request_url,json_encode($match),$apikey);
    
}

function do_post($url, $params,$key) {
    $options = array(
        'http' => array(
            'header'  => "Content-type: application/json\r\nOcp-Apim-Subscription-Key: $key",
            'method'  => 'POST',
            'content' => $params
        )
    );
    $result = file_get_contents($url, false, stream_context_create($options));
    
    return json_decode($result, true);
}

$img1 = "http://nexever.in/LibTravelSuperAdmin/images/temporary/1645715403_1.jpg";
$img2 = "http://nexever.in/LibTravelSuperAdmin/images/temporary/3.png";
$ret =  compare($img1, $img2);

//print_r($ret);
if(isset($ret['isIdentical']))
{
    if($ret['isIdentical'] == 1)
    {
        echo "Same Person ";
    }
    else if($ret['isIdentical'] == 0)
    {
        echo "Different Person ";
    }
}

?>

Результат вашего кода: введите здесь описание изображения

person Stanley Gong    schedule 02.04.2021
comment
Спасибо за это @Stanley Gong. Но я решил это вчера. Все равно спасибо. - person dummy user; 02.04.2021
comment
@dummyuser Рад узнать, что ваша проблема решена. Пожалуйста, нажмите на галочку рядом с ответом, чтобы переключить его с серого на заполнение, чтобы принять его в качестве ответа, чтобы он помог другим и закрыл этот запрос :) - person Stanley Gong; 05.04.2021