Nem ansigtsgenkendelse i din Laravel PHP-applikation

Registrer ansigter i billeder ved hjælp af Google Cloud Vision API

Du har sandsynligvis set ansigtsgenkendelse før. Så snart du uploader dette familiefoto til Facebook, bemærker du boksene omkring alle opdagede ansigter. Og med ansigts genkendelse , det nogle gange endda auto-tags den rigtige ven også. Det er ikke altid 100% nøjagtigt, men det er stadig en god teknik!

Ansøgninger til ansigtsgenkendelse

I denne artikel kommer vi i gang med Google Cloud Vision API til at opdage ansigter. Vi bruger et eksisterende billede, og vi tegner en boks omkring hvert detekterede ansigt.

Der er flere virkelige brugssager til ansigtsgenkendelse. Nogle af disse inkluderer:

  • registrere, om et uploadet billede har ansigter. Dette kan være et screeningstrin som led i en "kend din kunde" -identifikationsworkflow.
  • billedmodering til applikationer, der tillader brugergenereret indhold.
  • evnen til at levere tagging på samme måde som sociale netværk gør.

Andre funktioner tilgængelige i Cloud Vision API

Ansigtsgenkendelse er kun en af ​​de mange funktioner, der er tilgængelige i denne API. Det understøtter følgende ekstra funktionalitet:

  • afsløring af populære logoer.
  • evnen til at registrere alle kategorier, der gælder for et billede. For eksempel kan et foto af en kat producere kategorierne: kat, pattedyr, hvirveldyr og perser.
  • at opdage populære naturlige og menneskeskabte vartegn.
  • udpakning af tekst fra billeder.
  • kører Safe Search Detection for at markere billeder, der indeholder voksenindhold eller vold.

Opsætning af Google Cloud Platform

Det første trin involverer oprettelse af et nyt projekt i Google Cloud Platform-konsollen.

Gå over til instrumentbrættet, og opret et nyt projekt.

Når projektet er oprettet, skal du holde projekt-id'et praktisk.

Følg disse trin:

  • når du har dit projekt, skal du gå til siden Opret servicekontonøgle.
  • sørg for, at dit ansigtsgenkendelsesprojekt er valgt øverst.
  • under "Servicekonto " skal du vælge "Ny servicekonto".
  • indtast et navn i "Servicekontonavn".
  • under "Rolle" skal du vælge "Projekt"> "Ejer".
  • Klik endelig på "Opret" for at få JSON-legitimationsfilen downloadet automatisk.

Du skal muligvis også aktivere Cloud Vision API via afsnittet API-bibliotek.

Laravel projektopsætning

Det næste trin indebærer oprettelse af et nyt Laravel-projekt. Hvis du har et eksisterende Laravel-projekt, kan du springe dette trin over.

Jeg bruger Laravel 5.5 LTS til denne artikel. Kør følgende komponistkommando på kommandolinjen for at oprette et nyt projekt (du kan også bruge Laravel-installationsprogrammet):

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

Hvis du brugte Composer, skal du omdøbe .env.example- filen til .env og køre følgende kommando bagefter for at indstille applikationsnøglen:

php artisan key:generate

Tilføj Google cloud-vision-pakken

Kør følgende kommando for at tilføje google/cloud-visionpakken til dit projekt:

composer require google/cloud-vision

Du kan placere den downloadede JSON-legitimationsfil i din applikationsrod. Placer det ikke i din offentlige bibliotek. Du er velkommen til at omdøbe det. Forpligt ikke denne fil til din kode repo. En mulighed er at tilføje den manuelt til serveren.

Lad os endelig begynde at kode!

For det første skal du sikre dig, at GD-biblioteket er installeret og aktivt. De fleste platforme har dette aktiveret som standard.

Jeg tilføjer følgende rute til min "routes / web.php" -fil:

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

Jeg har oprettet en simpel controller til at huse koden. Jeg tilføjer al koden i controlleren. I en produktionsapplikation foreslår jeg kraftigt, at du bruger separate serviceklasser til enhver forretningslogik. På denne måde er controllere magre og holder sig til deres oprindelige intention: at kontrollere input / output.

Vi starter med en simpel controller, der tilføjer en useerklæring for at inkludere Google Cloud- ServiceBuilderklassen:


    
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.