استفاده از Vision API با پایتون

۱. مرور کلی

5ab7829fc22b21c4.png

رابط برنامه‌نویسی کاربردی بینایی ( Vision API) به توسعه‌دهندگان اجازه می‌دهد تا به راحتی ویژگی‌های تشخیص بینایی، از جمله برچسب‌گذاری تصویر، تشخیص چهره و نقاط دیدنی، تشخیص کاراکتر نوری (OCR) و برچسب‌گذاری محتوای صریح را در برنامه‌ها ادغام کنند.

در این آموزش، شما بر استفاده از Vision API با پایتون تمرکز خواهید کرد.

آنچه یاد خواهید گرفت

  • چگونه محیط خود را تنظیم کنید
  • نحوه انجام تشخیص برچسب
  • نحوه انجام تشخیص متن
  • نحوه انجام تشخیص نقاط عطف
  • نحوه انجام تشخیص چهره
  • نحوه انجام تشخیص شیء

آنچه نیاز دارید

  • یک پروژه ابری گوگل
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با استفاده از پایتون

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را با پایتون چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

تجربه خود را با خدمات ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

اگرچه می‌توان گوگل کلود را از راه دور و از طریق لپ‌تاپ شما مدیریت کرد، اما در این آزمایشگاه کد از Cloud Shell ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر این اولین باری است که Cloud Shell را اجرا می‌کنید، یک صفحه میانی برای توضیح آن به شما نمایش داده می‌شود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

9c92662c6a846a5c.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

9f0e51b578fecce5.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به 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].

۳. تنظیمات محیطی

قبل از اینکه بتوانید از Vision API استفاده کنید، دستور زیر را در Cloud Shell اجرا کنید تا API فعال شود:

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 هستید!

در مراحل بعدی، از یک مفسر تعاملی پایتون به نام 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]:

آماده‌ای که اولین درخواستت رو مطرح کنی...

۴. تشخیص برچسب را انجام دهید

یکی از ویژگی‌های اصلی Vision API شناسایی اشیاء یا موجودیت‌ها در یک تصویر است که به عنوان حاشیه‌نویسی برچسب شناخته می‌شود. تشخیص برچسب، اشیاء عمومی، مکان‌ها، فعالیت‌ها، گونه‌های جانوری، محصولات و موارد دیگر را شناسایی می‌کند. Vision API یک تصویر ورودی را دریافت می‌کند و محتمل‌ترین برچسب‌هایی را که برای آن تصویر اعمال می‌شود، برمی‌گرداند. این 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

در اینجا نحوه نمایش نتایج توسط نسخه آزمایشی آنلاین آورده شده است:

۲۱۹۱b0425c9c148f.png

خلاصه

در این مرحله، شما توانستید تشخیص برچسب را روی یک تصویر انجام دهید و محتمل‌ترین برچسب‌های مرتبط با آن تصویر را نمایش دهید. درباره تشخیص برچسب بیشتر بخوانید.

۵. تشخیص متن را انجام دهید

تشخیص متن، تشخیص نوری کاراکتر (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

خلاصه

در این مرحله، شما توانستید تشخیص متن را روی یک تصویر انجام دهید و متن تشخیص داده شده از تصویر را نمایش دهید. درباره تشخیص متن بیشتر بخوانید.

۶. تشخیص نقاط برجسته را انجام دهید

تشخیص نقاط برجسته، ساختارهای طبیعی و مصنوعی رایج را در یک تصویر تشخیص می‌دهد.

در این مثال، شما تشخیص نقاط برجسته را روی تصویری (با اجازه جان تاونر ) از برج ایفل انجام خواهید داد:

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

در اینجا نحوه نمایش نتایج توسط نسخه آزمایشی آنلاین آورده شده است:

۲۷۸۸۶۹۷۳۶۵۶۷۰۹۸۵.png

خلاصه

در این مرحله، شما توانستید تشخیص نقاط برجسته را روی تصویری از برج ایفل انجام دهید. درباره تشخیص نقاط برجسته بیشتر بخوانید.

۷. تشخیص چهره را انجام دهید

تشخیص ویژگی‌های چهره، چندین چهره را در یک تصویر به همراه ویژگی‌های کلیدی چهره مرتبط مانند حالت عاطفی یا پوشیدن کلاه تشخیص می‌دهد.

در این مثال، شما چهره‌ها را در تصویر زیر تشخیص خواهید داد (با احترام از هیمانشو سینگ گورجار ):

۵۸c۵۷۸ece۵۲۴cf۳۲.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

خلاصه

در این مرحله، شما توانستید تشخیص چهره را انجام دهید. درباره تشخیص چهره بیشتر بخوانید.

۸. تشخیص اشیا را انجام دهید

در این مثال، شما تشخیص شیء را روی همان تصویر قبلی (با اجازه Alex Knight ) از Setagaya انجام خواهید داد:

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

خلاصه

در این مرحله، شما توانستید تشخیص شیء را انجام دهید. درباره تشخیص شیء بیشتر بخوانید.

۹. ویژگی‌های چندگانه

شما نحوه استفاده از برخی از ویژگی‌های 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)

و امکانات بیشتری نیز وجود دارد، مانند انجام تشخیص روی دسته‌ای از تصاویر، به صورت همزمان یا غیرهمزمان. تمام راهنماهای آموزشی را بررسی کنید.

۱۰. تبریک می‌گویم!

5ab7829fc22b21c4.png

شما یاد گرفتید که چگونه از Vision API با پایتون استفاده کنید و چند ویژگی تشخیص تصویر را آزمایش کردید!

تمیز کردن

برای پاکسازی محیط توسعه خود، از Cloud Shell:

  • اگر هنوز در جلسه IPython خود هستید، به پوسته برگردید: exit
  • استفاده از محیط مجازی پایتون را متوقف کنید: 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

اطلاعات بیشتر

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.