Laravel PHP uygulamanızda kolay yüz algılama

Google Cloud Vision API'yi kullanarak görüntülerdeki yüzleri tespit edin

Muhtemelen daha önce yüz algılama görmüşsünüzdür. Bu aile fotoğrafını Facebook'a yüklediğiniz anda, tespit edilen tüm yüzlerin etrafındaki kutuları fark edeceksiniz. Ve yüz tanıma ile bazen doğru arkadaşı da otomatik olarak etiketler. Her zaman% 100 doğru değildir, ancak yine de harika bir mühendisliktir!

Yüz tanıma uygulamaları

Bu makalede, yüzleri algılamak için Google Cloud Vision API'yi kullanmaya başlayacağız. Mevcut bir resmi kullanacağız ve tespit edilen her yüzün etrafına bir kutu çizeceğiz.

Yüz algılama için birkaç gerçek dünya kullanım durumu vardır. Bunlardan bazıları şunları içerir:

  • Yüklenen bir görüntünün herhangi bir yüze sahip olup olmadığını algılama. Bu, "müşterinizi tanıyın" tanımlama iş akışının bir parçası olarak bir eleme adımı olabilir.
  • kullanıcı tarafından oluşturulan içeriğe izin veren uygulamalar için görüntü denetimi.
  • sosyal ağların yaptığı gibi etiketleme sağlama yeteneği.

Cloud Vision API'de bulunan diğer işlevler

Yüz algılama, bu API'de bulunan birçok işlevden yalnızca biridir. Aşağıdaki ek işlevleri destekler:

  • popüler logoların tespiti.
  • bir görüntü için geçerli tüm kategorileri algılama yeteneği. Örneğin, bir kedinin fotoğrafı şu kategorileri oluşturabilir: kedi, memeli, omurgalılar ve Farsça.
  • popüler doğal ve insan yapımı yer işaretlerini tespit etmek.
  • görüntülerden metin çıkarmak.
  • yetişkinlere uygun içerik veya şiddet içeren resimleri işaretlemek için Güvenli Arama Algılaması'nı çalıştırmak.

Google Cloud Platform kurulumu

İlk adım, Google Cloud Platform konsolunda yeni bir proje oluşturmayı içerir.

Kontrol paneline gidin ve yeni bir proje oluşturun.

Projeniz oluşturulduktan sonra Proje Kimliğini elinizin altında tutun.

Bu adımları takip et:

  • Projenizi aldıktan sonra, Hizmet hesabı anahtarı oluştur sayfasına gidin.
  • Üst kısımda Yüz Algılama projenizin seçildiğinden emin olun.
  • "Hizmet hesabı " altında , "Yeni hizmet hesabı" nı seçin.
  • "Hizmet hesabı adı" alanına bir ad girin.
  • "Rol" altında, "Proje"> "Sahip" i seçin.
  • Son olarak, JSON kimlik bilgileri dosyasının otomatik olarak indirilmesi için "Oluştur" u tıklayın.

Ayrıca, API Kitaplığı bölümü aracılığıyla Cloud Vision API'yi etkinleştirmeniz gerekebilir.

Laravel proje kurulumu

Bir sonraki adım, yeni bir Laravel projesi oluşturmayı içerir. Mevcut bir Laravel projeniz varsa bu adımı atlayabilirsiniz.

Bu makale için Laravel 5.5 LTS kullanıyorum. Komut satırında, yeni bir proje oluşturmak için aşağıdaki Composer komutunu çalıştırın (Laravel yükleyicisini de kullanabilirsiniz):

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

Eğer Besteci kullandıysanız, yeniden adlandırma .env.example dosyayı .env uygulama anahtarını ayarlayın ve daha sonra aşağıdaki komutu çalıştırın:

php artisan key:generate

Google bulut vizyon paketini ekleyin

google/cloud-visionPaketi projenize eklemek için aşağıdaki komutu çalıştırın :

composer require google/cloud-vision

İndirilen JSON kimlik bilgileri dosyasını uygulamanızın kök dizinine yerleştirebilirsiniz. Bunu genel dizininize yerleştirmeyin. Yeniden adlandırmaktan çekinmeyin. Yapmayın kodunuzu repo için bu dosyayı işlemek. Bir seçenek, onu sunucuya manuel olarak eklemektir.

Son olarak kodlamaya başlayalım!

İlk olarak, GD kütüphanesinin kurulu ve aktif olduğundan emin olun. Çoğu platformda bu varsayılan olarak etkindir.

"Route / web.php" dosyama aşağıdaki rotayı ekleyeceğim:

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

Kodu barındırmak için basit bir kontrolör oluşturdum. Denetleyicideki tüm kodu ekleyeceğim. Bir üretim uygulamasında, herhangi bir iş mantığı için ayrı hizmet sınıfları kullanmanızı şiddetle öneririm . Bu şekilde, kontrolörler zayıftır ve asıl amaçlarına sadık kalırlar: girişi / çıkışı kontrol etmek.

useGoogle Cloud ServiceBuildersınıfını dahil etmek için bir ifade ekleyerek basit bir denetleyiciyle başlayacağız :


    
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.