การใช้ Vision API กับ Python

1. ภาพรวม

5ab7829fc22b21c4.png

Vision API ช่วยให้นักพัฒนาซอฟต์แวร์ผสานรวมฟีเจอร์การตรวจจับการมองเห็นในแอปพลิเคชันได้โดยง่าย รวมถึงการติดป้ายกำกับรูปภาพ การตรวจจับใบหน้าและจุดสังเกต การรู้จำอักขระด้วยภาพ (OCR) และการติดแท็กเนื้อหาที่อาจไม่เหมาะสม

ในบทแนะนำนี้ คุณจะมุ่งเน้นที่การใช้ Vision API กับ Python

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่าสภาพแวดล้อม
  • วิธีตรวจหาป้ายกำกับ
  • วิธีตรวจหาข้อความ
  • วิธีตรวจหาจุดสังเกต
  • วิธีการตรวจจับใบหน้า
  • วิธีตรวจหาวัตถุ

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud
  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • ความคุ้นเคยกับการใช้ Python

แบบสำรวจ

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านเท่านั้น อ่านและทำแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์การใช้งาน Python อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

คุณจะให้คะแนนประสบการณ์การใช้งานบริการ Google Cloud อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตวิธีการชำระเงินได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในทุกโปรเจ็กต์ของ Google Cloud และจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากคุณไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอื่นได้ หรือคุณจะลองดำเนินการเองแล้วดูว่าพร้อมให้ใช้งานหรือไม่ คุณจะเปลี่ยนแปลงหลังจากขั้นตอนนี้ไม่ได้และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • สำหรับข้อมูลของคุณ ค่าที่ 3 คือหมายเลขโปรเจ็กต์ ซึ่ง API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้จะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินที่นอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud ใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรี$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Cloud Shell ใน Codelab ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

เปิดใช้งาน Cloud Shell

  1. คลิกเปิดใช้งาน Cloud Shell 853e55310c205094.png จาก Cloud Console

55efc1aaa7a4d3ad.png

หากเริ่มต้นใช้งาน Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอตรงกลางที่อธิบายว่านี่คืออะไร หากระบบแสดงหน้าจอตรงกลาง ให้คลิกต่อไป

9c92662c6a846a5c.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที

9f0e51b578fecce5.png

เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์

เมื่อเชื่อมต่อกับ 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 เพื่อเปิดใช้ API

gcloud services enable vision.googleapis.com

คุณควรจะเห็นบางสิ่งเช่นนี้:

Operation "operations/..." finished successfully.

คุณใช้ Vision API ได้แล้วในตอนนี้

ไปที่ไดเรกทอรีหน้าแรก

cd ~

สร้างสภาพแวดล้อมเสมือนของ Python เพื่อแยกทรัพยากร Dependency ต่อไปนี้

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 จะเลือกรูปภาพอินพุตและแสดงผลป้ายกำกับที่น่าจะใช้กับรูปภาพนั้นมากที่สุด โดยจะแสดงป้ายกำกับที่ตรงกันมากที่สุดพร้อมคะแนนความเชื่อมั่นของการจับคู่ที่ตรงกันกับรูปภาพ

ในตัวอย่างนี้ คุณจะดำเนินการตรวจจับป้ายกำกับในรูปภาพ (โดยได้รับความเอื้อเฟื้อจาก Alex Knight) ของ Setagaya ซึ่งเป็นเขตยอดนิยมในโตเกียว

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. ดำเนินการตรวจจับออบเจ็กต์

ในตัวอย่างนี้ คุณจะดำเนินการตรวจจับออบเจ็กต์ในรูปภาพก่อนหน้าที่เหมือนกัน (ได้รับความเอื้อเฟื้อจาก 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

สรุป

ในขั้นตอนนี้ คุณสามารถตรวจหาวัตถุได้ อ่านเพิ่มเติมเกี่ยวกับการตรวจจับวัตถุ

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 ให้กลับไปที่ Shell: 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