الكشف السهل عن الوجه في تطبيق Laravel PHP الخاص بك

اكتشف الوجوه في الصور باستخدام Google Cloud Vision API

ربما تكون قد رأيت اكتشاف الوجه من قبل. بمجرد تحميل تلك الصورة العائلية على Facebook ، ستلاحظ المربعات حول جميع الوجوه المكتشفة. ومن خلال التعرف على الوجه ، يقوم أحيانًا بوضع علامات تلقائية على الصديق الصحيح أيضًا. إنها ليست دقيقة دائمًا بنسبة 100٪ ، لكنها لا تزال بعض الهندسة الرائعة!

تطبيقات لكشف الوجه

في هذه المقالة ، سنبدأ العمل باستخدام Google Cloud Vision API لاكتشاف الوجوه. سنستخدم صورة موجودة وسنرسم مربعًا حول كل وجه تم اكتشافه.

هناك العديد من حالات الاستخدام الواقعية لاكتشاف الوجه. بعض هذه تشمل:

  • اكتشاف ما إذا كانت الصورة التي تم تحميلها لها أي وجوه. قد تكون هذه خطوة فرز كجزء من سير عمل تحديد "اعرف عميلك".
  • تعديل الصور للتطبيقات التي تسمح بالمحتوى من إنشاء المستخدمين.
  • القدرة على توفير العلامات ، بنفس طريقة الشبكات الاجتماعية.

تتوفر وظائف أخرى في Cloud Vision 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 الذي تم تنزيله في جذر التطبيق الخاص بك. لا تضعه في دليلك العام. لا تتردد في إعادة تسميته. لا تلتزم بهذا الملف في الريبو الخاص بك. أحد الخيارات هو إضافته إلى الخادم يدويًا.

أخيرًا ، لنبدأ في البرمجة!

أولاً ، تأكد من أن مكتبة GD مثبتة ونشطة. تم تمكين هذا افتراضيًا في معظم الأنظمة الأساسية.

سأضيف المسار التالي إلى ملف "التوجيهات / 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.