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

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

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ เม.ย. 4, 2023
account_circleเขียนโดย multiple Googlers

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