Helppo kasvojentunnistus Laravel PHP -sovelluksessa

Tunnista kuvien kasvot Google Cloud Vision -sovellusliittymän avulla

Olet todennäköisesti nähnyt kasvojentunnistuksen aiemmin. Heti kun lähetät perhekuvan Facebookiin, huomaat ruudut kaikkien havaittujen kasvojen ympärillä. Ja kasvojen tunnustamista , se joskus jopa auto-tunnisteet oikea ystävä myös. Se ei ole aina 100% tarkka, mutta se on silti hienoa tekniikkaa!

Sovellukset kasvojen havaitsemiseen

Tässä artikkelissa aloitamme käytön Google Cloud Vision -sovellusliittymän avulla kasvojen havaitsemiseen. Käytämme olemassa olevaa kuvaa ja piirrämme laatikon jokaisen havaitun kasvon ympärille.

Kasvojen havaitsemiseen on useita todellisia käyttötapauksia. Jotkut näistä ovat:

  • havaitaan, onko lähetetyllä kuvalla kasvoja. Tämä voi olla seulontavaihe osana "tunne asiakkaasi" -tunnistuksen työnkulkua.
  • kuvan valvonta sovelluksille, jotka sallivat käyttäjän luoman sisällön.
  • kyky tarjota tunnisteita samalla tavalla kuin sosiaaliset verkostot.

Muut Cloud Vision -sovellusliittymässä käytettävissä olevat toiminnot

Kasvojentunnistus on vain yksi monista tässä sovellusliittymässä käytettävissä olevista toiminnoista. Se tukee seuraavia lisätoimintoja:

  • suosittujen logojen havaitseminen.
  • kyky tunnistaa kaikki kuvaan sovellettavat luokat. Esimerkiksi valokuva kissasta saattaa tuottaa luokat: kissa, nisäkäs, selkärankainen ja persia.
  • tunnistaa suosittuja luonnollisia ja ihmisen tekemiä maamerkkejä.
  • poimitaan tekstiä kuvista.
  • suorittamalla Turvallisen haun tunnistus -toiminnon vain aikuisille suunnattua sisältöä tai väkivaltaa sisältävien kuvien merkitsemiseksi.

Google Cloud Platform -asetus

Ensimmäinen vaihe on uuden projektin luominen Google Cloud Platform -konsoliin.

Siirry kojelautaan ja luo uusi projekti.

Kun projektisi on luotu, pidä projektitunnus kätevä.

Toimi seuraavasti:

  • kun olet saanut projektisi, siirry Luo palvelutilin avain -sivulle.
  • Varmista, että kasvojentunnistusprojektisi on valittu ylhäältä.
  • kohdassa ”Palvelutili , valitse ”Uusi palvelutili”.
  • kirjoita nimi Palvelutilin nimi -kohtaan.
  • valitse "Rooli" -kohdassa "Projekti"> "Omistaja".
  • Napsauta lopuksi Luo, jos haluat ladata JSON-tunnistetiedoston automaattisesti.

Saatat joutua myös ottamaan Cloud Vision -sovellusliittymän käyttöön API-kirjasto-osion kautta.

Laravel-projektin määritys

Seuraava vaihe on uuden Laravel-projektin perustaminen. Jos sinulla on olemassa oleva Laravel-projekti, voit ohittaa tämän vaiheen.

Käytän Laravel 5.5 LTS: ää tähän artikkeliin. Suorita seuraava projekti kirjoittamalla komentorivillä uusi projekti (voit käyttää myös Laravel-asennusohjelmaa):

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

Jos käytit Composeria, nimeä .env.esimerkkitiedosto uudelleen .env : ksi ja aseta sovellusavaimen suorittamalla seuraava komento:

php artisan key:generate

Lisää Google cloud-vision -paketti

Suorita seuraava komento lisätäksesi google/cloud-visionpaketin projektiisi:

composer require google/cloud-vision

Voit sijoittaa ladatun JSON-tunnistetiedoston sovelluksen pääkäyttäjään. Älä sijoita sitä julkiseen hakemistoon. Nimeä se uudelleen vapaasti. Älä sido tätä tiedostoa koodivarastoon. Yksi vaihtoehto on lisätä se palvelimelle manuaalisesti.

Aloitetaan lopuksi koodaus!

Ensinnäkin varmista, että GD-kirjasto on asennettu ja aktiivinen. Useimmissa käyttöympäristöissä tämä on oletusarvoisesti käytössä.

Lisään seuraavan reitin tiedostoon "route / web.php":

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

Olen luonut yksinkertaisen ohjaimen koodin sijoittamiseksi. Lisään kaiken koodin ohjaimeen. Tuotantosovelluksessa suosittelen voimakkaasti erillisten palveluluokkien käyttämistä mille tahansa liiketoimintalogiikalle. Tällä tavalla ohjaimet ovat laihoja ja pysyvät alkuperäisessä tarkoituksessaan: ohjaavat tuloa / lähtöä.

Aloitamme yksinkertaisella ohjaimella ja lisäämme uselauseen, joka sisältää Google Cloud ServiceBuilder-luokan:


    
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.