FPEG обнаруживает лица на изображении и сжимает эти области меньше, чем окружающие пиксели. Теоретически зрительная кора человека более чувствительна к артефактам сжатия на лицах, чем к окружающему контексту, поэтому использование более высокого сжатия в нелицевых областях приведет к уменьшению изображений с сопоставимым воспринимаемым качеством. — Эндрю Шрайбер

Использование API обнаружения лиц в RapidAPI для снижения качества фона изображений при сохранении разрешения лиц и значительного уменьшения размера изображения. Название является игрой на Faces JPEG. Эта библиотека основана на стратегии FPEG Эндрю Шрайбера.

См. полную статью в Блоге RapidAPI

Пример использования распознавания лиц на PHP

Это одностраничный скрипт PHP, который принимает URL-адрес jpg, png, webp, bmp или gif и находит все лица на изображении, а затем уменьшает качество фона, сохраняя разрешение лиц. Эффект этого преобразования заключается в том, что изображение сохраняет разрешение исходного изображения, поскольку лица на изображении находятся в фокусе, а разрешение лиц не изменилось.

Пример изображения, которое мы используем, можно найти по адресу https://upload.wikimedia.org/wikipedia/en/7/7d/Lenna_%28test_image%29.png.

Размер вывода является гибким в зависимости от переменных -b=backgroundQuality и -f=foregroundQuality. Эффект этого преобразования на примере изображения, измеренного backgroundQuality/foregroundQuality @ 20/80, следующий:

Исходное изображение Изображение FPEG с качеством 20/80

Размер: 32 161

Размер: 473 831

Архитектура

  • Изображение загружается с URL-адреса.
  • Параметры сценария — это URL-адрес изображения и, при необходимости, качество изображения переднего плана, качество фонового изображения и повышение точности.
  • Отрегулируйте качество изображения по желанию.

RapidAPI Face Detection API используется для поиска всех лиц на изображении, затем каждое лицо копируется из исходного изображения в рабочее изображение в том же месте.

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

Затем сжатое изображение загружается обратно в скрипт, а лица из рабочего изображения копируются на исходное изображение. Затем исходное изображение сохраняется как output.jpg.

RapidAPI предлагает несколько других API-интерфейсов для обнаружения лиц, распознавания лиц и API-интерфейсов OCR, но для этого скрипта нам нужно только выполнить распознавание лиц.

Как выполнить распознавание лиц с помощью PHP (используя API детектора лиц)

Делать запросы к API несложно, всего 2 конечные точки и 2 параметра. Существует конечная точка для обнаружения лиц и вычисления возраста и пола, а также конечная точка только для обнаружения лиц.

В этой статье мы будем использовать вторую конечную точку, потому что нас интересует только положение лиц, а не детали каждого лица.

URL-адрес конечной точки находится по адресу https://face-detection6.p.rapidapi.com/img/face, который принимает только POST. Параметры POST

url: "path-to-image" 
accuracy_boost: default 2; range 1-4

API возвращает ответ, например

{
  "detected_faces": [
    {
      "BoundingBox": {
        "startX": 151, 
        "startY": 113, 
        "endX": 402, 
        "endY": 479
      }, 
      "Probability": 83.6599349975586
    }
  ]
}

Этот результат JSON говорит нам:

  • где каждое лицо,
  • где это начинается,
  • и размеры с самого начала.

"detected_faces' — это массив всех лиц, найденных на изображении url.

Параметры

-i Url to input image (required)
-a Accuracy Boost [1-4] default 2 (optional)
-b Background JPEG Quality default 20 (optional)
-f Foreground JPEG Quality default 80 (optional)

Выполнять

Скопируйте код в локальный файл fpeg.php. Затем запустите скрипт с параметрами изображения и качества

php fpeg.php -i=https://upload.wikimedia.org/wikipedia/en/7/7d/Lenna_%28test_image%29.png -b=20 -f=80

и в том же каталоге будет создан новый файл output.jpg.

1. Установите свой ключ API

// Set your RapidAPI key $rapidApiKey = '1234567890123456789012345678901234567890';

2. Установите параметры командной строки

// Command Line Parameters
$options = getopt(""
    . "i:"  // Image URL
    . "a::" // Accuracy Boost 1-4
    . "b::" // Background Quality (optional)
    . "f::" // Foreground Quality (optional)
    , []
);

3. Установите URL-адрес изображения и качество JPEG для выходного изображения.

// Set the image url and jpeg quality for the output image
$imageUrl = $options['i'] ?? '';
if (! filter_var($imageUrl, FILTER_VALIDATE_URL)) {
    throw new Exception('Invalid URL');
}

4. Повышение точности выборки, качество фона и качество переднего плана

// Fetch accuracy boost
$accuracyBoost = $options['a'] ?? 2;
if ($accuracyBoost < 1) {
    $accuracyBoost = 1;
} elseif ($accuracyBoost > 4) {
    $accuracyBoost = 4;
}
// Fetch background quality and validate
$backgroundQuality = $options['b'] ?? 20;
if ($backgroundQuality < 1) {
    $backgroundQuality = 1;
} elseif ($backgroundQuality > 100) {
    $backgroundQuality = 100;
}
// Fetch foreground quality and validate
$foregroundQuality = $options['f'] ?? 80;
if ($foregroundQuality < 1) {
    $foregroundQuality = 1;
} elseif ($foregroundQuality > 100) {
    $foregroundQuality = 100;
}

5. Получите размер файла изображения

// Get the file size of the remote image
$curl = curl_init($imageUrl);
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => true,
    CURLOPT_NOBODY => true,
]);
curl_exec($curl);
$error = curl_error($curl);
if ($error) {
    throw new Exception(
        "Unable to fetch remote image size.  Curl Error #:" . $error
    );
}
$imageFileSize = curl_getinfo($curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
curl_close($curl);
// Init curl for the request to RapidAPI
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => "https://face-detection6.p.rapidapi.com/img/face",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "{\"url\":\"$imageUrl\",\"accuracy_boost\":$accuracyBoost}",
    CURLOPT_HTTPHEADER => array(
        "accept: application/json",
        "content-type: application/json",
        "x-rapidapi-host: face-detection6.p.rapidapi.com",
        "x-rapidapi-key: $rapidApiKey"
    ),
));
// Execute the curl and decode the response
$response = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
if ($error) {
    throw new Exception(
        "Error response from Face Detection API. curl Error #:" . $error
    );
}
$response = json_decode($response, true);

6. Инициируйте и выполните запрос на завивание

// Init curl for the request to RapidAPI
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => "https://face-detection6.p.rapidapi.com/img/face",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "{\"url\":\"$imageUrl\",\"accuracy_boost\":$accuracyBoost}",
    CURLOPT_HTTPHEADER => array(
        "accept: application/json",
        "content-type: application/json",
        "x-rapidapi-host: face-detection6.p.rapidapi.com",
        "x-rapidapi-key: $rapidApiKey"
    ),
));
// Execute the curl and decode the response
$response = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
if ($error) {
    throw new Exception(
        "Error response from Face Detection API. curl Error #:" . $error
    );
}
$response = json_decode($response, true);

7. Инициализируйте рабочие образы

// Initialize the working images
$imageDimentions = getimagesize($imageUrl);
switch($imageDimentions['mime']) {
    case 'image/gif':
        $imageResource = imagecreatefromgif($imageUrl);
        break;
    case 'image/png':
        $imageResource = imagecreatefrompng($imageUrl);
        break;
    case 'image/webp':
        $imageResource = imagecreatefromwebp($imageUrl);
        break;
    case 'image/x-ms-bmp':
        $imageResource = imagecreatefrombmp($imageUrl);
        break;
    case 'image/jpeg':
        $imageResource = imagecreatefromjpeg($imageUrl);
        break;
    default:
        throw new Exception('Unsupported image type');
}
$workingImageResource = 
    imagecreatetruecolor($imageDimentions[0], $imageDimentions[1]);

8. Скопируйте лица с исходного изображения на рабочее изображение.

// Copy faces from initial image onto working image
$faceCount = 0;
foreach ($response['detected_faces'] as $face) {
    $boundingBox = $face['BoundingBox'];
    $success = imagecopy(
        $workingImageResource,
        $imageResource,
        $boundingBox['startX'], // Source X
        $boundingBox['startY'], // Source Y
        $boundingBox['startX'], // Destination X
        $boundingBox['startY'], // Destination Y
        $boundingBox['endX'] - $boundingBox['startX'], // width
        $boundingBox['endY'] - $boundingBox['startY'] // height
    );
$faceCount ++;
if (! $success) {
        throw new Exception(error_get_last()['message']);
    }
}
// All faces are now copied into the working image

9. Уменьшите качество исходного изображения и примените лица к уменьшенному фоновому изображению.

// Reduce image quality of Source image
$imageTempName = tempnam(sys_get_temp_dir(), 'fpeg');
imagejpeg($imageResource, $imageTempName, $backgroundQuality);
// Load quality reduced image
$imageResource = imagecreatefromjpeg($imageTempName);
unlink($imageTempName);
// Apply faces to reduced background quality image
foreach ($response['detected_faces'] as $face) {
    $boundingBox = $face['BoundingBox'];
    $success = imagecopy(
        $imageResource,
        $workingImageResource,
        $boundingBox['startX'], // Source X
        $boundingBox['startY'], // Source Y
        $boundingBox['startX'], // Destination X
        $boundingBox['startY'], // Destination Y
        $boundingBox['endX'] - $boundingBox['startX'], // width
        $boundingBox['endY'] - $boundingBox['startY'] // height
    );
if (! $success) {
        throw new Exception(error_get_last()['message']);
    }
}

10. Убедитесь, что лица были найдены, и сохраните изображение.

// Verify faces were found
if (! $faceCount) {
    throw new Exception('No faces were found in image');
}
// Save the created image and output statistics
imagejpeg($imageResource, 'output.jpg', $foregroundQuality);
$imageOutputSize = filesize('output.jpg');
if ($imageFileSize <= $imageOutputSize) {
   throw new Exception("FPEG DID NOT IMPROVE COMPRESSION");
}
echo 'Original Size: ' . $imageFileSize . "\n";
echo 'FPEG Size: ' . $imageOutputSize . "\n";
echo 'Faces: ' . $faceCount . "\n";
imagedestroy($imageResource);
imagedestroy($workingImageResource);

Полный код

See the full code at: https://rapidapi.com/blog/php-face-detection-fpeg/

Вывод

Умная техника, созданная этим скриптом с использованием API распознавания лиц в RapidAPI, сократит время загрузки вашего сайта на любом устройстве.

Если у вас есть большое количество изображений, в основном лиц (например, LinkedIn), то этот метод действительно может изменить предложение вашей компании.

Связанные ресурсы

Первоначально опубликовано на https://rapidapi.com 14 февраля 2020 г.