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), то этот метод действительно может изменить предложение вашей компании.
Связанные ресурсы
- API распознавания лиц с JavaScript
- Создать приложение для распознавания лиц (Python)
- Документация по RapidAPI PHP
- Как построить API
- с PHP
- Распознавание лиц с помощью глубокого обучения
Первоначально опубликовано на https://rapidapi.com 14 февраля 2020 г.