استخدام Vision API مع Python

1. نظرة عامة

5ab7829fc22b21c4.png

تسمح Vision API للمطوّرين بدمج ميزات كشف الرؤية بسهولة في التطبيقات، بما في ذلك تصنيف الصور ورصد الوجوه والمعالم والتعرُّف البصري على الأحرف (OCR) ووضع علامات على المحتوى الفاضح.

ستركز في هذا البرنامج التعليمي على استخدام Vision API مع Python.

المعلومات التي ستطّلع عليها

  • كيفية إعداد البيئة
  • كيفية رصد التصنيف
  • كيفية رصد النص
  • كيفية رصد المعالم
  • كيفية إجراء التعرّف على الوجوه
  • كيفية رصد العناصر

المتطلبات

  • مشروع على Google Cloud
  • متصفح، مثل Chrome أو Firefox
  • الإلمام باستخدام بايثون

استطلاع

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

القراءة فقط اقرأها وأكمِل التمارين

كيف تقيّم تجربتك مع Python؟

حديث متوسط بارع

كيف تقيّم تجربتك مع خدمات Google Cloud؟

حديث متوسط بارع

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (الذي يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع، الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. لن يؤدي إكمال هذا الدرس التطبيقي حول الترميز إلى فرض أي تكاليف، إن وُجدت. لإيقاف تشغيل الموارد لتجنب تحمُّل الفواتير إلى ما هو أبعد من هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

يمكنك إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، إلا أنّك ستستخدم في هذا الدرس التطبيقي Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة تصف ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

9c92662c6a846a5c.png

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.

9f0e51b578fecce5.png

يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير اللازمة. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح.

بعد الربط بخدمة Cloud Shell، من المفترض أن تتأكّد من أنّه تمّت مصادقتك وأنّ المشروع مضبوط على رقم تعريف مشروعك.

  1. شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list

مخرجات الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

مخرجات الأمر

Updated property [core/project].

3- إعداد البيئة

قبل أن تتمكن من البدء في استخدام Vision API، شغِّل الأمر التالي في Cloud Shell لتفعيل واجهة برمجة التطبيقات:

gcloud services enable vision.googleapis.com

ينبغي أن تظهر لك على النحو التالي:

Operation "operations/..." finished successfully.

يمكنك الآن استخدام Vision API.

انتقِل إلى الدليل الرئيسي:

cd ~

أنشئ بيئة بايثون افتراضية لعزل التبعيات:

virtualenv venv-vision

تفعيل البيئة الافتراضية:

source venv-vision/bin/activate

تثبيت IPython ومكتبة برامج Vision API:

pip install ipython google-cloud-vision

ينبغي أن تظهر لك على النحو التالي:

...
Installing collected packages: ..., ipython, google-cloud-vision
Successfully installed ... google-cloud-vision-3.4.0 ...

أصبحت الآن جاهزًا لاستخدام مكتبة برامج Vision API.

في الخطوات التالية، ستستخدم مترجمًا تفاعليًا بلغة Python يُسمى IPython، وقد تم تثبيته في الخطوة السابقة. يمكنك بدء جلسة من خلال تشغيل ipython في Cloud Shell:

ipython

ينبغي أن تظهر لك على النحو التالي:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.12.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

أنت على استعداد لتقديم طلبك الأول...

4. رصد التصنيف

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

في هذا المثال، سيتم رصد التصنيف على صورة (مقدمة من أليكس نايت) في حي "سيتاغايا" الشهير في طوكيو:

756f97f0b1e46c38.jpeg

انسخ الرمز التالي إلى جلسة IPython:

from typing import Sequence

from google.cloud import vision


def analyze_image_from_uri(
    image_uri: str,
    feature_types: Sequence,
) -> vision.AnnotateImageResponse:
    client = vision.ImageAnnotatorClient()

    image = vision.Image()
    image.source.image_uri = image_uri
    features = [vision.Feature(type_=feature_type) for feature_type in feature_types]
    request = vision.AnnotateImageRequest(image=image, features=features)

    response = client.annotate_image(request=request)

    return response


def print_labels(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for label in response.label_annotations:
        print(
            f"{label.score:4.0%}",
            f"{label.description:5}",
            sep=" | ",
        )
        

خصِّص بعض الوقت لدراسة الرمز البرمجي ومعرفة كيفية استخدامه لطريقة مكتبة برامج annotate_image لتحليل صورة لمجموعة من الميزات المحدّدة.

إرسال طلب باستخدام ميزة "LABEL_DETECTION":

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.LABEL_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_labels(response)

من المفترض أن تحصل على الناتج التالي:

================================================================================
 97% | Bicycle
 96% | Tire
 94% | Wheel
 91% | Automotive lighting
 89% | Infrastructure
 87% | Bicycle wheel
 86% | Mode of transport
 85% | Building
 83% | Electricity
 82% | Neighbourhood

إليك كيفية تقديم النتائج من خلال العرض التوضيحي عبر الإنترنت:

2191b0425c9c148f.png

ملخّص

في هذه الخطوة، تمكنت من رصد التصنيفات على صورة وعرض التصنيفات الأكثر احتمالاً المرتبطة بتلك الصورة. يمكنك قراءة المزيد من المعلومات عن اكتشاف التصنيفات.

5- إجراء رصد النص

تُجري ميزة "رصد النص" تقنية التعرّف البصري على الأحرف (OCR). ترصد هذه الميزة النصوص في صورة وتستخرجها وتُستخدم لمجموعة كبيرة من اللغات. كما تتميز بالتعرف التلقائي على اللغة.

في هذا المثال، ستُجري ميزة رصد النص على صورة علامة مرور:

4dedd3fcfd9ad99b.jpeg

انسخ الرمز التالي إلى جلسة IPython:

def print_text(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for annotation in response.text_annotations:
        vertices = [f"({v.x},{v.y})" for v in annotation.bounding_poly.vertices]
        print(
            f"{repr(annotation.description):42}",
            ",".join(vertices),
            sep=" | ",
        )
        

إرسال طلب باستخدام ميزة "TEXT_DETECTION":

image_uri = "gs://cloud-samples-data/vision/ocr/sign.jpg"
features = [vision.Feature.Type.TEXT_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_text(response)

من المفترض أن تحصل على الناتج التالي:

================================================================================
'WAITING?\nPLEASE\nTURN OFF\nYOUR\nENGINE' | (310,821),(2225,821),(2225,1965),(310,1965)
'WAITING'                                  | (344,821),(2025,879),(2016,1127),(335,1069)
'?'                                        | (2057,881),(2225,887),(2216,1134),(2048,1128)
'PLEASE'                                   | (1208,1230),(1895,1253),(1891,1374),(1204,1351)
'TURN'                                     | (1217,1414),(1718,1434),(1713,1558),(1212,1538)
'OFF'                                      | (1787,1437),(2133,1451),(2128,1575),(1782,1561)
'YOUR'                                     | (1211,1609),(1741,1626),(1737,1747),(1207,1731)
'ENGINE'                                   | (1213,1805),(1923,1819),(1920,1949),(1210,1935)

إليك كيفية تقديم النتائج من خلال العرض التوضيحي عبر الإنترنت:

9c70fbce871c5fe5.png

ملخّص

في هذه الخطوة، تمكنت من رصد النص في صورة وعرض النص الذي تم التعرّف عليه من الصورة. تعرَّف على مزيد من المعلومات حول اكتشاف النص.

6- إجراء رصد المعالم

ترصد ميزة "رصد المعالم" البِنى الطبيعية والمن صنع الإنسان في أي صورة.

في هذا المثال، ستُجري ميزة اكتشاف المعالم على صورة (مقدمة من John Towner) لبرج إيفل:

fb7801e36884b875.jpeg

انسخ الرمز التالي إلى جلسة IPython:

def print_landmarks(response: vision.AnnotateImageResponse, min_score: float = 0.5):
    print("=" * 80)
    for landmark in response.landmark_annotations:
        if landmark.score < min_score:
            continue
        vertices = [f"({v.x},{v.y})" for v in landmark.bounding_poly.vertices]
        lat_lng = landmark.locations[0].lat_lng
        print(
            f"{landmark.description:18}",
            ",".join(vertices),
            f"{lat_lng.latitude:.5f}",
            f"{lat_lng.longitude:.5f}",
            sep=" | ",
        )
        

إرسال طلب باستخدام ميزة "LANDMARK_DETECTION":

image_uri = "gs://cloud-samples-data/vision/landmark/eiffel_tower.jpg"
features = [vision.Feature.Type.LANDMARK_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_landmarks(response)

من المفترض أن تحصل على الناتج التالي:

================================================================================
Trocadéro Gardens  | (303,36),(520,36),(520,371),(303,371) | 48.86160 | 2.28928
Eiffel Tower       | (458,76),(512,76),(512,263),(458,263) | 48.85846 | 2.29435

إليك كيفية تقديم النتائج من خلال العرض التوضيحي عبر الإنترنت:

2788697365670985.png

ملخّص

في هذه الخطوة، تمكّنت من رصد المعالم على صورة لبرج إيفل. يمكنك الاطّلاع على مزيد من المعلومات حول رصد المعالم.

7. إجراء التعرّف على الوجه

ترصد ميزة "رصد ملامح الوجه" وجوهًا متعددة في الصورة، بالإضافة إلى سمات الوجه الرئيسية المرتبطة بها، مثل الحالة العاطفية أو ارتداء غطاء رأس.

في هذا المثال، سيتم اكتشاف الوجوه في الصورة التالية (مقدمة من Himanshu Singh Gurjar):

58c578ece524cf32.jpeg

انسخ الرمز التالي إلى جلسة IPython:

def print_faces(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for face_number, face in enumerate(response.face_annotations, 1):
        vertices = ",".join(f"({v.x},{v.y})" for v in face.bounding_poly.vertices)
        print(f"# Face {face_number} @ {vertices}")
        print(f"Joy:     {face.joy_likelihood.name}")
        print(f"Exposed: {face.under_exposed_likelihood.name}")
        print(f"Blurred: {face.blurred_likelihood.name}")
        print("-" * 80)
        

إرسال طلب باستخدام ميزة "FACE_DETECTION":

image_uri = "gs://cloud-samples-data/vision/face/faces.jpeg"
features = [vision.Feature.Type.FACE_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_faces(response)

من المفترض أن تحصل على الناتج التالي:

================================================================================
# Face 1 @ (1077,157),(2146,157),(2146,1399),(1077,1399)
Joy:     VERY_LIKELY
Exposed: VERY_UNLIKELY
Blurred: VERY_UNLIKELY
--------------------------------------------------------------------------------
# Face 2 @ (144,1273),(793,1273),(793,1844),(144,1844)
Joy:     VERY_UNLIKELY
Exposed: VERY_UNLIKELY
Blurred: UNLIKELY
--------------------------------------------------------------------------------
# Face 3 @ (785,167),(1100,167),(1100,534),(785,534)
Joy:     VERY_UNLIKELY
Exposed: LIKELY
Blurred: VERY_LIKELY
--------------------------------------------------------------------------------

إليك كيفية تقديم النتائج من خلال العرض التوضيحي عبر الإنترنت:

cbb7f59299651b83.png

ملخّص

في هذه الخطوة، كان بإمكانك إجراء عملية التعرّف على الوجوه. يمكنك الاطّلاع على مزيد من المعلومات حول التعرّف على الوجوه.

8. رصد العناصر

في هذا المثال، سيتم رصد الكائنات على الصورة السابقة نفسها (مقدمة من أليكس نايت) في سيتاغايا:

756f97f0b1e46c38.jpeg

انسخ الرمز التالي إلى جلسة IPython:

def print_objects(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for obj in response.localized_object_annotations:
        nvertices = obj.bounding_poly.normalized_vertices
        print(
            f"{obj.score:4.0%}",
            f"{obj.name:15}",
            f"{obj.mid:10}",
            ",".join(f"({v.x:.1f},{v.y:.1f})" for v in nvertices),
            sep=" | ",
        )
        

إرسال طلب باستخدام ميزة "OBJECT_LOCALIZATION":

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.OBJECT_LOCALIZATION]

response = analyze_image_from_uri(image_uri, features)
print_objects(response)

من المفترض أن تحصل على الناتج التالي:

================================================================================
 93% | Bicycle         | /m/0199g   | (0.6,0.6),(0.8,0.6),(0.8,0.9),(0.6,0.9)
 92% | Bicycle wheel   | /m/01bqk0  | (0.6,0.7),(0.7,0.7),(0.7,0.9),(0.6,0.9)
 91% | Tire            | /m/0h9mv   | (0.7,0.7),(0.8,0.7),(0.8,1.0),(0.7,1.0)
 75% | Bicycle         | /m/0199g   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)
 51% | Tire            | /m/0h9mv   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)

إليك كيفية تقديم النتائج من خلال العرض التوضيحي عبر الإنترنت:

e1c2ca803d874a6b.png

ملخّص

وفي هذه الخطوة، تمكنت من اكتشاف الكائنات. تعرَّف على مزيد من المعلومات حول رصد العناصر.

9. ميزات متعددة

لقد اطّلعت على كيفية استخدام بعض ميزات Vision API، ولكن هناك ميزات أخرى كثيرة ويمكنك طلب ميزات متعددة في طلب واحد.

هنا نوع الطلب الذي يمكنك تقديمه للحصول على جميع الإحصاءات في آنٍ واحد:

image_uri = "gs://..."
features = [
    vision.Feature.Type.OBJECT_LOCALIZATION,
    vision.Feature.Type.FACE_DETECTION,
    vision.Feature.Type.LANDMARK_DETECTION,
    vision.Feature.Type.LOGO_DETECTION,
    vision.Feature.Type.LABEL_DETECTION,
    vision.Feature.Type.TEXT_DETECTION,
    vision.Feature.Type.DOCUMENT_TEXT_DETECTION,
    vision.Feature.Type.SAFE_SEARCH_DETECTION,
    vision.Feature.Type.IMAGE_PROPERTIES,
    vision.Feature.Type.CROP_HINTS,
    vision.Feature.Type.WEB_DETECTION,
    vision.Feature.Type.PRODUCT_SEARCH,
    vision.Feature.Type.OBJECT_LOCALIZATION,
]

# response = analyze_image_from_uri(image_uri, features)

وهناك المزيد من الاحتمالات، مثل إجراء عمليات رصد على مجموعة من الصور، بشكل متزامن أو غير متزامن. يُرجى الاطّلاع على جميع الأدلّة الإرشادية.

10. تهانينا

5ab7829fc22b21c4.png

لقد تعلمت كيفية استخدام Vision API مع Python واختبرت بعض ميزات رصد الصور.

تَنظيم

لتنظيف بيئة التطوير، من Cloud Shell:

  • إذا كنت لا تزال في جلسة IPython، يُرجى الرجوع إلى واجهة الأوامر: exit
  • التوقف عن استخدام بيئة Python الافتراضية: deactivate
  • حذف مجلد البيئة الافتراضية: cd ~ ; rm -rf ./venv-vision

لحذف مشروعك على Google Cloud، اتّبِع الخطوات التالية من Cloud Shell:

  • استرداد رقم تعريف مشروعك الحالي: PROJECT_ID=$(gcloud config get-value core/project)
  • تأكَّد من أنّ هذا هو المشروع الذي تريد حذفه: echo $PROJECT_ID.
  • حذف المشروع: gcloud projects delete $PROJECT_ID

مزيد من المعلومات

الترخيص

هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.