Εύκολη ανίχνευση προσώπου στην εφαρμογή Laravel PHP

Εντοπίστε πρόσωπα σε εικόνες χρησιμοποιώντας το Google Cloud Vision API

Πιθανότατα έχετε δει ανίχνευση προσώπου στο παρελθόν. Μόλις ανεβάσετε αυτήν την οικογενειακή φωτογραφία στο Facebook, θα παρατηρήσετε τα κουτιά γύρω από όλα τα πρόσωπα που εντοπίστηκαν. Και με την αναγνώριση προσώπου , μερικές φορές ακόμη και αυτοματοποιεί τον σωστό φίλο. Δεν είναι πάντα 100% ακριβές, αλλά εξακολουθεί να είναι εξαιρετικό μηχανικό!

Εφαρμογές για ανίχνευση προσώπου

Σε αυτό το άρθρο, θα ξεκινήσουμε να χρησιμοποιούμε το Google Cloud Vision API για τον εντοπισμό προσώπων. Θα χρησιμοποιούμε μια υπάρχουσα εικόνα και θα σχεδιάσουμε ένα πλαίσιο γύρω από κάθε ανιχνευμένο πρόσωπο.

Υπάρχουν αρκετές περιπτώσεις πραγματικής χρήσης για την ανίχνευση προσώπου. Μερικά από αυτά περιλαμβάνουν:

  • ανιχνεύει εάν μια μεταφορτωμένη εικόνα έχει πρόσωπα. Αυτό μπορεί να είναι ένα βήμα διαλογής ως μέρος της ροής εργασιών ταυτοποίησης «γνωρίστε τον πελάτη σας».
  • εποπτεία εικόνας για εφαρμογές που επιτρέπουν περιεχόμενο που δημιουργείται από τους χρήστες.
  • τη δυνατότητα παροχής ετικετών, όπως κάνουν τα κοινωνικά δίκτυα.

Άλλες λειτουργίες είναι διαθέσιμες στο Cloud Vision API

Η ανίχνευση προσώπου είναι μόνο μία από τις πολλές διαθέσιμες λειτουργίες σε αυτό το API. Υποστηρίζει τις ακόλουθες πρόσθετες λειτουργίες:

  • ανίχνευση δημοφιλών λογότυπων.
  • τη δυνατότητα εντοπισμού όλων των κατηγοριών που ισχύουν για μια εικόνα. Για παράδειγμα, μια φωτογραφία μιας γάτας μπορεί να παράγει τις κατηγορίες: γάτα, θηλαστικό, σπονδυλωτό και περσική.
  • εντοπισμός δημοφιλών φυσικών και τεχνητών ορόσημων.
  • εξαγωγή κειμένου από εικόνες.
  • εκτέλεση της Ανίχνευσης ασφαλούς αναζήτησης για να επισημάνετε εικόνες που περιέχουν περιεχόμενο ή βία για ενήλικες

Ρύθμιση του Google Cloud Platform

Το πρώτο βήμα περιλαμβάνει τη δημιουργία ενός νέου έργου στην κονσόλα Google Cloud Platform.

Μεταβείτε στον πίνακα ελέγχου και δημιουργήστε ένα νέο έργο.

Μόλις δημιουργηθεί το έργο σας, διατηρήστε εύχρηστο το αναγνωριστικό έργου.

Ακολουθήστε αυτά τα βήματα:

  • Μόλις έχετε το έργο σας, μεταβείτε στη σελίδα Δημιουργία λογαριασμού κλειδιού υπηρεσίας.
  • βεβαιωθείτε ότι το έργο Ανίχνευσης προσώπου είναι επιλεγμένο στην κορυφή.
  • στην ενότητα "Λογαριασμός υπηρεσίας " , επιλέξτε "Νέος λογαριασμός υπηρεσίας".
  • εισαγάγετε ένα όνομα στο "Όνομα λογαριασμού υπηρεσίας".
  • στην ενότητα "Ρόλος", επιλέξτε "Έργο"> "Κάτοχος".
  • Τέλος, κάντε κλικ στο "Δημιουργία" για να γίνει αυτόματα λήψη του αρχείου διαπιστευτηρίων JSON.

Ίσως χρειαστεί επίσης να ενεργοποιήσετε το Cloud Vision API μέσω της ενότητας Βιβλιοθήκη API.

Ρύθμιση έργου Laravel

Το επόμενο βήμα περιλαμβάνει τη δημιουργία ενός νέου έργου Laravel. Εάν έχετε ένα υπάρχον έργο Laravel, μπορείτε να παραλείψετε αυτό το βήμα.

Χρησιμοποιώ Laravel 5.5 LTS για αυτό το άρθρο. Στη γραμμή εντολών, εκτελέστε την ακόλουθη εντολή Composer για να δημιουργήσετε ένα νέο έργο (μπορείτε επίσης να χρησιμοποιήσετε το πρόγραμμα εγκατάστασης Laravel):

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

Εάν χρησιμοποιήσατε το Composer, μετονομάστε το αρχείο .env.example σε .env και εκτελέστε την ακόλουθη εντολή στη συνέχεια για να ορίσετε το κλειδί εφαρμογής:

php artisan key:generate

Προσθέστε το πακέτο Google cloud-vision

Εκτελέστε την ακόλουθη εντολή για να προσθέσετε το google/cloud-visionπακέτο στο έργο σας:

composer require google/cloud-vision

Μπορείτε να τοποθετήσετε το αρχείο διαπιστευτηρίων JSON που έχετε λάβει στη ρίζα της εφαρμογής σας. Μην το τοποθετείτε στον δημόσιο κατάλογό σας. Μη διστάσετε να το μετονομάσετε. Μην δεσμεύσετε αυτό το αρχείο στο repo κώδικα. Μια επιλογή είναι να το προσθέσετε με μη αυτόματο τρόπο στο διακομιστή.

Τέλος, ας ξεκινήσουμε την κωδικοποίηση!

Πρώτον, βεβαιωθείτε ότι έχετε εγκατεστημένη και ενεργή τη βιβλιοθήκη GD. Οι περισσότερες πλατφόρμες το έχουν ενεργοποιήσει από προεπιλογή.

Θα προσθέσω την ακόλουθη διαδρομή στο αρχείο "Routes / web.php" μου:

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

Έχω δημιουργήσει έναν απλό ελεγκτή για να φιλοξενήσει τον κωδικό. Θα προσθέσω όλο τον κώδικα στον ελεγκτή. Σε μια εφαρμογή παραγωγής, προτείνω έντονα τη χρήση ξεχωριστών κλάσεων υπηρεσιών για οποιαδήποτε επιχειρηματική λογική. Με αυτόν τον τρόπο, οι ελεγκτές είναι άπαχοι και διατηρούν την αρχική τους πρόθεση: τον έλεγχο της εισόδου / εξόδου.

Θα ξεκινήσουμε με έναν απλό ελεγκτή, προσθέτοντας μια useδήλωση για να συμπεριλάβουμε την ServiceBuilderκλάση Google Cloud :


    
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.