1. סקירה כללית
Vision API מאפשר למפתחים לשלב בקלות תכונות של זיהוי ראייה באפליקציות, כולל הוספת תוויות לתמונות, זיהוי פנים וציוני דרך, זיהוי תווים אופטי (OCR) ותיוג של תוכן בוטה.
במדריך הזה תתמקדו בשימוש ב-Vision API עם Python.
מה תלמדו
- איך מגדירים את הסביבה
- איך לבצע זיהוי תוויות
- איך לבצע זיהוי טקסט
- איך לבצע זיהוי של ציוני דרך
- איך לבצע זיהוי פנים
- איך לבצע זיהוי אובייקטים
מה צריך להכין
סקר
איך תשתמשו במדריך הזה?
איזה דירוג מגיע לדעתך לחוויה שלך עם Python?
איזה דירוג מגיע לחוויה שלך בשירותי Google Cloud?
2. הגדרה ודרישות
הגדרת סביבה בקצב עצמאי
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. תמיד אפשר לעדכן.
- Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-codelabs תצטרכו להפנות למזהה הפרויקט שלכם (בדרך כלל מזוהה כ-
PROJECT_ID
). אם המזהה שנוצר לא מוצא חן בעיניכם, אתם יכולים ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות שם משלך ולראות אם הוא זמין. לא ניתן לשנות אותו אחרי השלב הזה, והוא נשאר למשך הפרויקט. - לידיעתך, יש ערך שלישי, Project Number, שבו משתמשים בחלק מממשקי ה-API. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא יעלה הרבה כסף, אם בכלל. כדי להשבית משאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
הפעלת Cloud Shell
אומנם אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה משתמשים ב-Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.
הפעלת Cloud Shell
- במסוף Cloud, לוחצים על Activate Cloud Shell .
אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים שמתוארת בו. אם הוצג לכם מסך ביניים, לוחצים על המשך.
ההקצאה וההתחברות ל-Cloud Shell נמשכת כמה דקות.
במכונה הווירטואלית הזו נמצאים כל כלי הפיתוח הדרושים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. אם לא את כולן, ניתן לבצע חלק גדול מהעבודה ב-Codelab הזה באמצעות דפדפן.
אחרי ההתחברות ל-Cloud Shell, אתם אמורים לראות שהפרויקט מאומת ושהפרויקט מוגדר לפי מזהה הפרויקט שלכם.
- מריצים את הפקודה הבאה ב-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`
- מריצים את הפקודה הבאה ב-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 כדי להפעיל את ה-API:
gcloud services enable vision.googleapis.com
אתם אמורים לראות משהו כזה:
Operation "operations/..." finished successfully.
עכשיו אפשר להשתמש ב-Vision API!
מנווטים לספריית הבית:
cd ~
יוצרים סביבה וירטואלית של Python כדי לבודד את יחסי התלות:
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 מקבל תמונת קלט ומחזיר את התוויות בעלות הסבירות הגבוהה ביותר שרלוונטיות לאותה תמונה. היא מחזירה את התוויות המתאימות ביותר יחד עם ציון ודאות של ההתאמה לתמונה.
בדוגמה הזו, תבוצע זיהוי תוויות בתמונה (באדיבות אלכס Knight) בסטאגאיה, מחוז פופולרי בטוקיו:
מעתיקים את הקוד הבא לסשן 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
כך מוצגות התוצאות בהדגמה אונליין:
סיכום
בשלב הזה הייתה לכם אפשרות לבצע זיהוי תוויות בתמונה ולהציג את התוויות שיש בהן סבירות גבוהה ביותר שמשויכות לאותה תמונה. מידע נוסף על זיהוי תוויות.
5. ביצוע זיהוי טקסט
התכונה הזו מבצעת זיהוי תווים אופטי (OCR). הוא מזהה ומחלץ טקסט בתוך תמונה, תוך תמיכה במגוון שפות. הוא כולל גם זיהוי שפה אוטומטי.
בדוגמה הבאה תבצע זיהוי טקסט בתמונה של תמרור:
מעתיקים את הקוד הבא לסשן 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)
כך מוצגות התוצאות בהדגמה אונליין:
סיכום
בשלב הזה הצלחתם לזהות טקסט בתמונה ולהציג את הטקסט שזוהה מהתמונה. מידע נוסף על זיהוי טקסט.
6. ביצוע זיהוי של ציוני דרך
במסגרת זיהוי ציוני דרך, המערכת מזהה בתוך תמונה מבנים פופולריים ומבנים מעשה ידי אדם.
בדוגמה הזו, תבצעו זיהוי של ציון דרך בתמונה (באדיבות ג'ון טאונר) של מגדל אייפל:
מעתיקים את הקוד הבא לסשן 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
כך מוצגות התוצאות בהדגמה אונליין:
סיכום
בשלב הזה הצלחת לבצע זיהוי של ציוני דרך בתמונה של מגדל אייפל. מידע נוסף על זיהוי סימני קרקע.
7. ביצוע זיהוי פנים
זיהוי תווי פנים מזהה פנים מרובות בתוך תמונה, יחד עם מאפייני הפנים העיקריים הקשורים, כמו מצב רגשי או שימוש בכיסוי ראש.
בדוגמה הזו תוכלו לזהות פנים בתמונה הבאה (באדיבות הימנשו סינג גורג'ר):
מעתיקים את הקוד הבא לסשן 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 --------------------------------------------------------------------------------
כך מוצגות התוצאות בהדגמה אונליין:
סיכום
בשלב הזה הצלחת לבצע זיהוי פנים. מידע נוסף על זיהוי פנים
8. ביצוע זיהוי אובייקטים
בדוגמה הזו, תבצעו זיהוי אובייקטים באותה תמונה קודמת (באדיבות Alex Knight) של Setagaya:
מעתיקים את הקוד הבא לסשן 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)
כך מוצגות התוצאות בהדגמה אונליין:
סיכום
בשלב הזה הצלחתם לבצע זיהוי אובייקטים. מידע נוסף על זיהוי אובייקטים.
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. מעולה!
למדתם איך להשתמש ב-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
מידע נוסף
- אפשר לבדוק את ההדגמה (דמו) אונליין בדפדפן: https://cloud.google.com/vision
- מאמרי העזרה של Vision API: https://cloud.google.com/vision/docs
- Python ב-Google Cloud: https://cloud.google.com/python
- ספריות לקוח של Cloud ל-Python: https://github.com/googleapis/google-cloud-python
רישיון
היצירה הזו בשימוש ברישיון Creative Commons Attribution 2.0 גנרי.