Лако откривање лица у вашој ПХП апликацији Ларавел

Откривање лица на сликама помоћу АПИ-ја Гоогле Цлоуд Висион

Вероватно сте већ видели детекцију лица. Чим отпремите ту породичну фотографију на Фацебоок, приметићете оквире око свих откривених лица. А препознавањем лица понекад чак и аутоматски означи тачног пријатеља. Није увек 100% тачно, али свеједно је сјајан инжењеринг!

Апликације за детекцију лица

У овом чланку ћемо покренути и користити Гоогле Цлоуд Висион АПИ за откривање лица. Користићемо постојећу слику и нацртаћемо оквир око сваког откривеног лица.

Постоји неколико случајева стварне употребе за откривање лица. Неки од њих укључују:

  • откривање да ли отпремљена слика има лица. Ово би могао бити корак прегледа као део процеса идентификације „упознајте свог купца“.
  • модерирање слике за апликације које омогућавају садржај који генеришу корисници.
  • могућност пружања означавања, на исти начин као што то чине друштвене мреже.

Остале функције доступне у АПИ-ју Цлоуд Висион

Откривање лица само је једна од многих функција доступних у овом АПИ-ју. Подржава следеће додатне функције:

  • откривање популарних логотипа.
  • могућност откривања свих категорија применљивих на слици. На пример, фотографија мачке може произвести категорије: мачка, сисар, кичмењак и перзијски.
  • откривање популарних природних и вештачких оријентира.
  • извлачење текста из слика.
  • покретање Детекције сигурне претраге ради означавања слика које садрже садржај за одрасле или насиље.

Подешавање Гоогле Цлоуд платформе

Први корак укључује стварање новог пројекта на конзоли Гоогле Цлоуд Платформ.

Крените на контролну таблу и направите нови пројекат.

Једном када се ваш пројекат креира, држите ИД пројекта при руци.

Пратите ове кораке:

  • када имате свој пројекат, идите на страницу Створи кључ налога услуге.
  • уверите се да је ваш пројекат Детекција лица одабран на врху.
  • у оквиру „Рачун услуге изаберите „Нови рачун услуге“.
  • унесите име у „Име рачуна услуге“.
  • под „Улога“ изаберите „Пројекат“> „Власник“.
  • На крају, кликните на „Направи“ да бисте аутоматски преузели датотеку ЈСОН акредитива.

Можда ће вам требати и да омогућите Цлоуд Висион АПИ путем одељка АПИ Либрари.

Постављање пројекта Ларавел

Следећи корак укључује постављање новог пројекта Ларавел. Ако имате постојећи Ларавел пројекат, можете прескочити овај корак.

За овај чланак користим Ларавел 5.5 ЛТС. У командној линији покрените следећу наредбу Цомпосер да бисте креирали нови пројекат (можете да користите и Ларавел инсталатер):

composer create-project --prefer-dist laravel/laravel sample "5.5.*"

Ако сте користили Цомпосер, преименујте .енв.екампле датотеку у .енв и покрените следећу наредбу да бисте поставили кључ апликације:

php artisan key:generate

Додајте Гоогле пакет за визију у облаку

Покрените следећу команду да бисте додали google/cloud-visionпакет у свој пројекат:

composer require google/cloud-vision

Преузету датотеку ЈСОН акредитива можете сместити у роот апликације. Не стављајте га у свој јавни директоријум. Слободно га преименујте. Не предајте ову датотеку свом репо-коду. Једна од могућности је ручно додавање на сервер.

Коначно, кренимо са кодирањем!

Прво, проверите да ли је инсталирана и активна ГД библиотека. На већини платформи ово је подразумевано омогућено.

У своју датотеку „роутес / веб.пхп“ додаћу следећу руту:

Route::get('/', '[email protected]');

Направио сам једноставан контролер за смештај кода. Додаћу сав код у контролер. У производној апликацији топло препоручујем употребу засебних класа услуга за било коју пословну логику. На овај начин, контролери су витки и држе се своје првобитне намере: контроле улаза / излаза.

Почећемо са једноставним контролером, додајући useизјаву која укључује ServiceBuilderкласу Гоогле Цлоуд :


    
namespace App\Http\Controllers;
use Google\Cloud\Core\ServiceBuilder;
class SampleController extends Controller{ public function detectFaces() { // Code will be added here }}

The first thing we’ll do is create an instance of the ServiceBuilder class so we can specify our Project ID and JSON credentials.

$cloud = new ServiceBuilder([ 'keyFilePath' => base_path('fda.json'), 'projectId' => 'facial-detection-app' ]);

You specify the location of the JSON file using the keyFilePath key. I’ve used the Laravel base_path() helper to refer to the fully qualified app root path.

The next option is the projectId. This is the value you grabbed when you created the project in the GCP console.

Next, we’ll create an instance of the VisionClient class. The ServiceBuilder class makes it easy by exposing various factory methods which grant access to services in the API.

$vision = $cloud->vision();

Now that we have an instance of the class, we can start making use of the Vision API. We’ll be using the following image as the example. Feel free to download this image, name it “friends.jpg” and place it in your “public” folder.

We’ll first create a new image using the GD imagecreatefromjpeg() function. We’ll use the public_path() Laravel helper to refer to our image placed in the “public” folder.

$output = imagecreatefromjpeg(public_path('friends.jpg'));

Next, we’ll create a Cloud Vision Image object with this same image and specify that we want to run facial detection:

$image = $vision->image(file_get_contents(public_path('friends.jpg')), ['FACE_DETECTION']);

You’ll notice a slight change here. Instead of providing the path to the image, we’re supplying the actual image as a string using file_get_contents().

Then we run the annote() method on the image:

$results = $vision->annotate($image);

Now that we have the results, we simply need to loop through the found faces and draw boxes around the them using the vertices supplied in the result:

foreach ($results->faces() as $face) { $vertices = $face->boundingPoly()['vertices'];
 $x1 = $vertices[0]['x']; $y1 = $vertices[0]['y']; $x2 = $vertices[2]['x']; $y2 = $vertices[2]['y'];
 imagerectangle($output, $x1, $y1, $x2, $y2, 0x00ff00);}

Once this is done, we can output the image and destroy it to free up the memory:

header('Content-Type: image/jpeg'); imagejpeg($output); imagedestroy($output);

And this is the result:

Here is the final controller class code:


     
namespace App\Http\Controllers;
use Google\Cloud\Core\ServiceBuilder;
class SampleController extends Controller{ public function detectFaces() { $cloud = new ServiceBuilder([ 'keyFilePath' => base_path('fda.json'), 'projectId' => 'facial-detection-app' ]);
 $vision = $cloud->vision();
 $output = imagecreatefromjpeg(public_path('friends.jpg')); $image = $vision->image(file_get_contents(public_path('friends.jpg')), ['FACE_DETECTION']); $results = $vision->annotate($image);
 foreach ($results->faces() as $face) { $vertices = $face->boundingPoly()['vertices'];
 $x1 = $vertices[0]['x']; $y1 = $vertices[0]['y']; $x2 = $vertices[2]['x']; $y2 = $vertices[2]['y'];
 imagerectangle($output, $x1, $y1, $x2, $y2, 0x00ff00); }
 header('Content-Type: image/jpeg');
 imagejpeg($output); imagedestroy($output); }}

Additional functionality

In addition to grabbing the vertices, the response also includes a trove of useful information. This includes the locations of mouths, eyes, eyebrows, noses, etc. Simply print_r() the $face variable for a quick peek into the available data.

Another great feature is checking whether the detected face is happy, sad, angry, or surprised. You can even detect whether the face is blurry or underexposed, and whether they’re wearing headwear.

If you use this and end up doing something cool as a result, please let me know!

Upgrade your web dev skills!

Sign up to my newsletter where I’ll share insightful web development articles to supercharge your skills.

Originally published at www.chowles.com on July 6, 2018.