التعرّف على التصنيفات والوجوه والمعالم في الصور باستخدام Cloud Vision API

تتيح لك واجهة Cloud Vision API فهم محتوى الصورة من خلال تضمين نماذج تعلُّم آلي فعّالة في واجهة REST API بسيطة.

في هذا التمرين العملي، سنرسل صورًا إلى Vision API وسنرى كيف يرصد الكائنات والوجوه والمعالم.

ما ستتعرّف عليه

  • إنشاء طلب Vision API وإرساله باستخدام curl
  • استخدام طرق رصد التصنيفات والويب والوجوه والمعالم في Vision API

المتطلبات

  • مشروع على Google Cloud Platform
  • متصفّح، مثل Chrome أو Firefox

كيف ستستخدم هذا البرنامج التعليمي؟

قراءة المحتوى فقط قراءة المحتوى وإكمال التمارين

ما هو تقييمك لتجربة استخدام Google Cloud Platform؟

مبتدئ متوسط متقدّم

إعداد البيئة بالسرعة التي تناسبك

إذا لم يكن لديك حساب على Google (Gmail أو Google Apps)، عليك إنشاء حساب. سجِّل الدخول إلى "وحدة تحكّم Google Cloud Platform" (console.cloud.google.com) وأنشِئ مشروعًا جديدًا:

لقطة شاشة من 2016-02-10 12:45:26.png

تذكَّر معرّف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس العملي باسم PROJECT_ID.

بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.

لن تكلفك تجربة هذا الدرس البرمجي أكثر من بضعة دولارات، ولكن قد تكون التكلفة أعلى إذا قررت استخدام المزيد من الموارد أو إذا تركتها قيد التشغيل (راجِع قسم "التنظيف" في نهاية هذا المستند).

يمكن للمستخدمين الجدد في Google Cloud Platform الاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

انقر على رمز القائمة في أعلى يمين الشاشة.

اختَر واجهات برمجة التطبيقات والخدمات من القائمة المنسدلة وانقر على "لوحة البيانات".

انقر على تفعيل واجهات برمجة التطبيقات والخدمات.

بعد ذلك، ابحث عن "الرؤية" في مربّع البحث. انقر على Google Cloud Vision API:

انقر على تفعيل لتفعيل Cloud Vision API:

انتظِر بضع ثوانٍ حتى يتم تفعيلها. سيظهر لك ما يلي بعد تفعيلها:

‫Google Cloud Shell هي بيئة سطر أوامر تعمل في السحابة الإلكترونية. تتضمّن هذه الآلة الافتراضية المستندة إلى Debian جميع أدوات التطوير التي تحتاج إليها (gcloud وbq وgit وغيرها)، كما توفّر دليلًا منزليًا ثابتًا بسعة 5 غيغابايت. سنستخدم Cloud Shell لإنشاء طلبنا إلى Speech API.

للبدء في استخدام Cloud Shell، انقر على رمز "تفعيل Google Cloud Shell" Screen Shot 2015-06-08 at 5.30.32 PM.png في أعلى يسار شريط العنوان.

يتم فتح جلسة Cloud Shell داخل إطار جديد في أسفل وحدة التحكّم وعرض موجه سطر الأوامر. انتظِر إلى أن يظهر الطلب user@project:~$

بما أنّنا سنستخدم curl لإرسال طلب إلى Vision API، علينا إنشاء مفتاح واجهة برمجة تطبيقات لتضمينه في عنوان URL الخاص بالطلب. لإنشاء مفتاح واجهة برمجة تطبيقات، انتقِل إلى قسم "بيانات الاعتماد" في "واجهات برمجة التطبيقات والخدمات" (APIs & services) في Cloud Console:

في القائمة المنسدلة، اختَر مفتاح واجهة برمجة التطبيقات:

بعد ذلك، انسخ المفتاح الذي أنشأته للتو.

بعد الحصول على مفتاح واجهة برمجة التطبيقات، احفظه في متغيّر بيئة لتجنُّب إدراج قيمة مفتاح واجهة برمجة التطبيقات في كل طلب. يمكنك إجراء ذلك في Cloud Shell. احرص على استبدال <your_api_key> بالمفتاح الذي نسخته للتو.

export API_KEY=<YOUR_API_KEY>

إنشاء حزمة في Cloud Storage

هناك طريقتان لإرسال صورة إلى Vision API من أجل رصد الصور: إما عن طريق إرسال سلسلة صور مشفّرة بتنسيق base64 إلى واجهة برمجة التطبيقات، أو عن طريق تمرير عنوان URL لملف مخزّن في Google Cloud Storage. سنستخدم عنوان URL في Cloud Storage. سننشئ حزمة في Google Cloud Storage لتخزين صورنا.

انتقِل إلى "متصفّح مساحة التخزين" في Cloud Console لمشروعك:

بعد ذلك، انقر على إنشاء حزمة. امنح الحزمة اسمًا فريدًا (مثل رقم تعريف مشروعك) وانقر على إنشاء.

تحميل صورة إلى الحزمة

انقر بزر الماوس الأيمن على صورة الكعك المحلّى التالية، ثم انقر على حفظ الصورة باسم واحفظها في مجلد "المحتوى الذي تم تنزيله" باسم donuts.png.

انتقِل إلى الحزمة التي أنشأتها للتو في "متصفّح التخزين" وانقر على تحميل الملفات. بعد ذلك، اختَر donuts.png.

يجب أن يظهر الملف في الحزمة:

بعد ذلك، عدِّل إذن الوصول إلى الصورة.

انقر على إضافة عنصر.

أضِف كيانًا جديدًا من النوع Group، واسمًا من النوع allUsers:

انقر على حفظ.

بعد أن أصبح الملف في الحزمة، يمكنك إنشاء طلب Vision API، مع تمرير عنوان URL لصورة الكعك المحلّى.

في بيئة Cloud Shell، أنشئ ملف request.json باستخدام الرمز البرمجي أدناه، مع الحرص على استبدال my-bucket-name باسم حزمة Cloud Storage التي أنشأتها. يمكنك إنشاء الملف باستخدام أحد محرّرات سطر الأوامر المفضّلة لديك (nano أو vim أو emacs) أو استخدام محرّر Orion المضمّن في Cloud Shell:

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          } 
        },
        "features": [
          {
            "type": "LABEL_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

أول ميزة سنتعرّف عليها في Cloud Vision API هي رصد التصنيفات. ستعرض هذه الطريقة قائمة بالتصنيفات (الكلمات) التي تصف محتوى الصورة.

يمكننا الآن استدعاء Vision API باستخدام curl:

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

يجب أن تبدو الاستجابة على النحو التالي:

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/01dk8s",
          "description": "powdered sugar",
          "score": 0.9436922
        },
        {
          "mid": "/m/01wydv",
          "description": "beignet",
          "score": 0.7160288
        },
        {
          "mid": "/m/06_dn",
          "description": "snow",
          "score": 0.71219236
        },
        {
          "mid": "/m/02wvn_6",
          "mid": "/m/0bp3f6m",
          "description": "fried food",
          "score": 0.7075312
        },
        {
          "mid": "/m/02wvn_6",
          "description": "ricciarelli",
          "score": 0.5625
        },
        {
          "mid": "/m/052lwg6",
          "description": "baked goods",
          "score": 0.53270763
        }
      ]
    }
  ]
}

تمكّنت واجهة برمجة التطبيقات من تحديد النوع المحدّد من الكعك (beignets)، هذا رائع! لكل تصنيف عثرت عليه Vision API، تعرض description يتضمّن اسم العنصر. تعرض أيضًا score، وهو رقم يتراوح بين 0 و100 يشير إلى مدى ثقتها في أنّ الوصف يتطابق مع محتوى الصورة. يتم ربط القيمة mid بمعرّف العنصر في الرسم البياني المعرفي من Google. يمكنك استخدام mid عند طلب Knowledge Graph API للحصول على مزيد من المعلومات حول العنصر.

بالإضافة إلى الحصول على تصنيفات لما تتضمّنه صورتنا، يمكن لواجهة Vision API أيضًا البحث على الإنترنت عن تفاصيل إضافية حول صورتنا. من خلال طريقة webDetection في واجهة برمجة التطبيقات، نحصل على الكثير من البيانات المفيدة:

  • قائمة بالكيانات التي تم العثور عليها في صورتنا، استنادًا إلى محتوى من صفحات تتضمّن صورًا مشابهة
  • عناوين URL الخاصة بالصور المطابقة تمامًا أو جزئيًا التي تم العثور عليها على الويب، بالإضافة إلى عناوين URL الخاصة بتلك الصفحات
  • عناوين URL لصور مشابهة، مثل إجراء بحث بالصورة

لتجربة ميزة "التعرّف على الويب"، سنستخدم صورة كعك البيغنيت نفسها من الأعلى، لذا كل ما علينا تغييره هو سطر واحد في ملف request.json (يمكنك أيضًا تجربة صورة مختلفة تمامًا). ضمن قائمة الميزات، ما عليك سوى تغيير النوع من LABEL_DETECTION إلى WEB_DETECTION. يجب أن يبدو request.json الآن على النحو التالي:

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          } 
        },
        "features": [
          {
            "type": "WEB_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

لإرسالها إلى Vision API، يمكنك استخدام أمر curl نفسه كما في السابق (ما عليك سوى الضغط على السهم المتّجه للأعلى في Cloud Shell):

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

لنستعرض الردّ، بدءًا من webEntities. في ما يلي بعض الكيانات التي عرضتها هذه الصورة:

 "webEntities": [
          {
            "entityId": "/m/01hyh_",
            "score": 0.7155,
            "description": "Machine learning"
          },
          {
            "entityId": "/m/01wydv",
            "score": 0.48758492,
            "description": "Beignet"
          },
          {
            "entityId": "/m/0105pbj4",
            "score": 0.3976,
            "description": "Google Cloud Platform"
          },
          {
            "entityId": "/m/02y_9m3",
            "score": 0.3782,
            "description": "Cloud computing"
          },
          ...
        ]

تمت إعادة استخدام هذه الصورة في العديد من العروض التقديمية حول واجهات Cloud ML API، ولهذا السبب عثرت واجهة برمجة التطبيقات على الكيانات "تعلُّم الآلة" و"منصّة Google Cloud" و "الحوسبة السحابية".

إذا فحصنا عناوين URL ضمن fullMatchingImages وpartialMatchingImages وpagesWithMatchingImages، سنلاحظ أنّ العديد من عناوين URL تشير إلى هذا الموقع الإلكتروني الخاص ببرنامج التدريب العملي (محتوى وصفي للغاية!).

لنفترض أنّنا نريد العثور على صور أخرى من كعك البيغنيت، ولكن ليس الصور نفسها بالضبط. وهنا يأتي دور الجزء visuallySimilarImages من الردّ الذي تقدّمه واجهة برمجة التطبيقات. في ما يلي بعض الصور المتشابهة من الناحية المرئية التي عثر عليها:

"visuallySimilarImages": [
          {
            "url": "https://igx.4sqi.net/img/general/558x200/21646809_fe8K-bZGnLLqWQeWruymGEhDGfyl-6HSouI2BFPGh8o.jpg"
          },
          {
            "url": "https://spoilednyc.com//2016/02/16/beignetszzzzzz-852.jpg"
          },
          {
            "url": "https://img-global.cpcdn.com/001_recipes/a66a9a6fc2696648/1200x630cq70/photo.jpg"
          },
          ...
]

يمكننا الانتقال إلى عناوين URL هذه للاطّلاع على الصور المشابهة:

رائع! ربما تشتهي الآن تناول كعكة البيينييه (نعتذر منك). يشبه ذلك البحث باستخدام صورة على صور Google:

ولكن باستخدام Cloud Vision، يمكننا الوصول إلى هذه الوظيفة من خلال واجهة برمجة تطبيقات REST سهلة الاستخدام ودمجها في تطبيقاتنا.

بعد ذلك، سنتعرّف على طُرق التعرّف على الوجوه والمعالم في Vision API. تعرض طريقة "اكتشاف الوجوه" بيانات عن الوجوه التي تم العثور عليها في صورة، بما في ذلك المشاعر التي تعبّر عنها الوجوه وموقعها في الصورة. يمكن أن تحدّد ميزة "التعرّف على المعالم" المعالم الشائعة (وغير الشائعة)، وتعرض اسم المَعلم وإحداثيات خط العرض وخط الطول والموقع الجغرافي الذي تم التعرّف على المَعلم فيه في الصورة.

تحميل صورة جديدة

لاستخدام هاتين الطريقتين الجديدتين، لنحمّل صورة جديدة تتضمّن وجوهًا ومعالم إلى حزمة Cloud Storage. انقر بزر الماوس الأيمن على الصورة التالية، ثم انقر على حفظ الصورة باسم واحفظها في مجلد "عمليات التنزيل" باسم selfie.png.

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

تعديل طلبنا

بعد ذلك، سنعدّل ملف request.json ليشمل عنوان URL للصورة الجديدة، وسنستخدم ميزة رصد الوجوه والمعالم بدلاً من ميزة رصد التصنيفات. احرص على استبدال my-bucket-name باسم حزمة Cloud Storage:

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/selfie.png"
          } 
        },
        "features": [
          {
            "type": "FACE_DETECTION"
          },
          {
            "type": "LANDMARK_DETECTION"
          }
        ]
      }
  ]
}

استدعاء Vision API وتحليل الرد

أنت الآن جاهز لطلب بيانات من Vision API باستخدام أمر curl نفسه الذي استخدمته أعلاه:

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

لنلقِ نظرة على عنصر faceAnnotations في ردّنا أولاً. ستلاحظ أنّ واجهة برمجة التطبيقات تعرض عنصرًا لكل وجه تم العثور عليه في الصورة، أي ثلاثة وجوه في هذه الحالة. إليك نسخة مقتطعة من ردّنا:

{
      "faceAnnotations": [
        {
          "boundingPoly": {
            "vertices": [
              {
                "x": 669,
                "y": 324
              },
              ...
            ]
          },
          "fdBoundingPoly": {
            ...
          },
          "landmarks": [
            {
              "type": "LEFT_EYE",
              "position": {
                "x": 692.05646,
                "y": 372.95868,
                "z": -0.00025268539
              }
            },
            ...
          ],
          "rollAngle": 0.21619819,
          "panAngle": -23.027969,
          "tiltAngle": -1.5531756,
          "detectionConfidence": 0.72354823,
          "landmarkingConfidence": 0.20047489,
          "joyLikelihood": "POSSIBLE",
          "sorrowLikelihood": "VERY_UNLIKELY",
          "angerLikelihood": "VERY_UNLIKELY",
          "surpriseLikelihood": "VERY_UNLIKELY",
          "underExposedLikelihood": "VERY_UNLIKELY",
          "blurredLikelihood": "VERY_UNLIKELY",
          "headwearLikelihood": "VERY_LIKELY"
        }
        ...
     }
}

تمنحنا boundingPoly إحداثيات س وص حول الوجه في الصورة. fdBoundingPoly هو مربّع أصغر من boundingPoly، ويتم ترميزه على جزء البشرة من الوجه. ‫landmarks هي مجموعة من العناصر لكل ميزة من ميزات الوجه (بعضها قد لا تعرفه حتى). يخبرنا هذا النوع من البيانات بنوع المعلم، بالإضافة إلى الموضع الثلاثي الأبعاد لهذا العنصر (إحداثيات x وy وz) حيث تمثّل الإحداثية z العمق. تمنحنا القيم المتبقية المزيد من التفاصيل حول الوجه، بما في ذلك احتمال ظهور علامات الفرح والحزن والغضب والدهشة. العنصر أعلاه مخصّص للشخص الذي يظهر في الخلفية البعيدة للصورة، ويمكنك ملاحظة أنّه يعبّر عن وجه مضحك، ما يفسّر حصوله على joyLikelihood من أصل POSSIBLE.

لنلقِ نظرة الآن على الجزء landmarkAnnotations من ردّنا:

"landmarkAnnotations": [
        {
          "mid": "/m/0c7zy",
          "description": "Petra",
          "score": 0.5403372,
          "boundingPoly": {
            "vertices": [
              {
                "x": 153,
                "y": 64
              },
              ...
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 30.323975,
                "longitude": 35.449361
              }
            }
          ]

في هذه الحالة، تمكّنت واجهة Vision API من تحديد أنّ هذه الصورة تم التقاطها في البتراء، وهذا أمر مثير للإعجاب نظرًا إلى أنّ المؤشرات المرئية في هذه الصورة قليلة جدًا. يجب أن تبدو القيم في هذه الاستجابة مشابهة لاستجابة labelAnnotations أعلاه.

نحصل على mid للمعلم، واسمه (description)، بالإضافة إلى درجة ثقة score. تعرض boundingPoly المنطقة في الصورة التي تم فيها تحديد المعلم. يخبرنا المفتاح locations بإحداثيات خطوط العرض والطول لهذا المعلم.

لقد اطّلعنا على طرق رصد التصنيفات والوجوه والمعالم في Vision API، ولكن هناك ثلاث طرق أخرى لم نستكشفها بعد. يمكنك الاطّلاع على المستندات للتعرّف على الأنواع الثلاثة الأخرى:

  • رصد الشعارات: تحديد الشعارات الشائعة وموقعها في الصورة
  • الرصد في "البحث الآمن": تحديد ما إذا كانت الصورة تتضمّن محتوًى فاضحًا أم لا ويكون ذلك مفيدًا لأي تطبيق يتضمّن محتوًى من إنشاء المستخدمين. يمكنك فلترة الصور استنادًا إلى أربعة عوامل: المحتوى المخصّص للبالغين والمحتوى الطبي والمحتوى العنيف والمحتوى الزائف.
  • اكتشاف النص: يمكنك استخدام تقنية التعرّف البصري على الأحرف (OCR) لاستخراج النص من الصور. يمكن لهذه الطريقة حتى التعرّف على لغة النص الظاهر في صورة.

لقد تعرّفت على كيفية تحليل الصور باستخدام Vision API. في هذا المثال، مرّرت إلى واجهة برمجة التطبيقات عنوان URL الخاص بصورتك على Google Cloud Storage. بدلاً من ذلك، يمكنك تمرير سلسلة base64 مشفَّرة من صورتك.

المواضيع التي تناولناها

  • طلب بيانات من Vision API باستخدام curl من خلال تمرير عنوان URL لصورة في حزمة Cloud Storage
  • استخدام طرق رصد التصنيفات والويب والوجوه والمعالم في Vision API

الخطوات التالية