Sử dụng Vision API với Python

1. Tổng quan

5ab7829fc22b21c4.pngS

Vision API cho phép nhà phát triển dễ dàng tích hợp các tính năng phát hiện thị giác vào các ứng dụng, chẳng hạn như gắn nhãn hình ảnh, phát hiện khuôn mặt và mốc, nhận dạng ký tự quang học (OCR) và gắn thẻ cho nội dung phản cảm.

Trong hướng dẫn này, bạn sẽ tập trung vào việc sử dụng Vision API với Python.

Kiến thức bạn sẽ học được

  • Cách thiết lập môi trường
  • Cách phát hiện nhãn
  • Cách phát hiện văn bản
  • Cách phát hiện mốc
  • Cách thực hiện tính năng phát hiện khuôn mặt
  • Cách phát hiện đối tượng

Bạn cần có

  • Một dự án trên Google Cloud
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Quen thuộc với Python

Khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ có thể đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm sử dụng Python?

Người mới tập Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm khi sử dụng các dịch vụ của Google Cloud?

Người mới tập Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật ứng dụng.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án của mình (thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án), mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.pngs.

55efc1aaa7a4d3ad.pngS

Nếu đây là lần đầu tiên khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.pngS

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.pngs

Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Thiết lập môi trường

Trước khi bạn có thể bắt đầu sử dụng Vision API, hãy chạy lệnh sau trong Cloud Shell để bật API này:

gcloud services enable vision.googleapis.com

Bạn sẽ thấy như sau:

Operation "operations/..." finished successfully.

Giờ đây, bạn có thể sử dụng Vision API!

Chuyển đến thư mục gốc:

cd ~

Tạo một môi trường ảo Python để tách biệt các phần phụ thuộc:

virtualenv venv-vision

Kích hoạt môi trường ảo:

source venv-vision/bin/activate

Cài đặt IPython và thư viện ứng dụng Vision API:

pip install ipython google-cloud-vision

Bạn sẽ thấy như sau:

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

Bây giờ, bạn đã sẵn sàng sử dụng thư viện ứng dụng Vision API!

Trong các bước tiếp theo, bạn sẽ sử dụng trình thông dịch Python tương tác có tên IPython mà bạn đã cài đặt trong bước trước. Bắt đầu một phiên bằng cách chạy ipython trong Cloud Shell:

ipython

Bạn sẽ thấy như sau:

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]:

Bạn đã sẵn sàng đưa ra yêu cầu đầu tiên...

4. Phát hiện nhãn

Một trong những tính năng cốt lõi của Vision API là nhận dạng các đối tượng hoặc thực thể trong một hình ảnh, còn được gọi là chú thích nhãn. Tính năng phát hiện nhãn giúp xác định các vật thể, vị trí, hoạt động, các loài động vật, sản phẩm chung và nhiều thông tin khác. Vision API lấy hình ảnh đầu vào và trả về các nhãn có nhiều khả năng nhất áp dụng cho hình ảnh đó. Chỉ số này sẽ trả về các nhãn phù hợp nhất cùng với điểm số tin cậy về kết quả trùng khớp với hình ảnh.

Trong ví dụ này, bạn sẽ phát hiện nhãn trên một hình ảnh (được phép tặng cho Alex Knight) ở Setagaya, một quận nổi tiếng ở Tokyo:

756f97f0b1e46c38.jpeg

Sao chép mã sau vào phiên IPython của bạn:

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=" | ",
        )
        

Hãy dành chút thời gian nghiên cứu mã này và xem cách mã này sử dụng phương thức thư viện ứng dụng annotate_image để phân tích hình ảnh cho một tập hợp tính năng nhất định.

Gửi yêu cầu bằng tính năng 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)

Bạn sẽ nhận được kết quả sau:

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

Sau đây là cách bản minh hoạ trực tuyến trình bày kết quả:

2191b0425c9c148f.png.

Tóm tắt

Ở bước này, bạn có thể thực hiện việc phát hiện nhãn trên một hình ảnh và hiển thị các nhãn có nhiều khả năng nhất được liên kết với hình ảnh đó. Đọc thêm về tính năng phát hiện nhãn.

5. Phát hiện văn bản

Tính năng phát hiện văn bản thực hiện công nghệ Nhận dạng ký tự quang học (OCR). Công cụ này phát hiện và trích xuất văn bản trong một hình ảnh nhờ tính năng hỗ trợ nhiều ngôn ngữ. Ngoài ra, Gemini còn có tính năng tự động nhận dạng ngôn ngữ.

Trong ví dụ này, bạn sẽ thực hiện phát hiện văn bản trên hình ảnh biển báo giao thông:

4dd3fcfd9ad99b.jpeg

Sao chép mã sau vào phiên IPython của bạn:

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=" | ",
        )
        

Gửi yêu cầu bằng tính năng 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)

Bạn sẽ nhận được kết quả sau:

================================================================================
'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)

Sau đây là cách bản minh hoạ trực tuyến trình bày kết quả:

9c70fbce871c5fe5.pngS

Tóm tắt

Ở bước này, bạn có thể phát hiện văn bản trên một hình ảnh và hiển thị văn bản được nhận dạng trong hình ảnh đó. Đọc thêm về tính năng phát hiện văn bản.

6. Phát hiện mốc

Tính năng phát hiện địa danh phát hiện các công trình kiến trúc tự nhiên và nhân tạo phổ biến trong một hình ảnh.

Trong ví dụ này, bạn sẽ phát hiện mốc trên một hình ảnh (nhờ sự cho phép của John Towner) của Tháp Eiffel:

fb7801e36884b875.jpeg

Sao chép mã sau vào phiên IPython của bạn:

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=" | ",
        )
        

Gửi yêu cầu bằng tính năng 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)

Bạn sẽ nhận được kết quả sau:

================================================================================
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

Sau đây là cách bản minh hoạ trực tuyến trình bày kết quả:

2788697365670985.pngS

Tóm tắt

Ở bước này, bạn có thể phát hiện mốc trên hình ảnh Tháp Eiffel. Đọc thêm về tính năng phát hiện dấu vết.

7. Phát hiện khuôn mặt

Tính năng phát hiện đặc điểm khuôn mặt phát hiện nhiều khuôn mặt trong một hình ảnh cùng với các đặc điểm chính trên khuôn mặt có liên quan, chẳng hạn như trạng thái cảm xúc hoặc việc đội mũ nón.

Trong ví dụ này, bạn sẽ phát hiện các khuôn mặt trong ảnh sau (do Himanshu Singh Gurjar cung cấp):

58c578ece524cf32.jpeg

Sao chép mã sau vào phiên IPython của bạn:

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)
        

Gửi yêu cầu bằng tính năng 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)

Bạn sẽ nhận được kết quả sau:

================================================================================
# 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
--------------------------------------------------------------------------------

Sau đây là cách bản minh hoạ trực tuyến trình bày kết quả:

cbb7f59299651b83.png

Tóm tắt

Ở bước này, bạn đã có thể thực hiện tính năng phát hiện khuôn mặt. Hãy đọc thêm về tính năng phát hiện khuôn mặt.

8. Phát hiện vật thể

Trong ví dụ này, bạn sẽ thực hiện việc phát hiện đối tượng trên chính hình ảnh trước đó (với sự cho phép của Alex Knight) tại Setagaya:

756f97f0b1e46c38.jpeg

Sao chép mã sau vào phiên IPython của bạn:

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=" | ",
        )
        

Gửi yêu cầu bằng tính năng 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)

Bạn sẽ nhận được kết quả sau:

================================================================================
 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)

Sau đây là cách bản minh hoạ trực tuyến trình bày kết quả:

e1c2ca803d874a6b.png

Tóm tắt

Ở bước này, bạn đã có thể phát hiện đối tượng. Hãy đọc thêm về tính năng phát hiện đối tượng.

9. Nhiều đối tượng

Bạn đã biết cách sử dụng một số tính năng của Vision API, nhưng còn nhiều tính năng khác và bạn có thể yêu cầu nhiều tính năng trong một yêu cầu duy nhất.

Đây là loại yêu cầu bạn có thể thực hiện để nhận tất cả thông tin chi tiết cùng một lúc:

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)

Và còn nhiều khả năng khác, chẳng hạn như thực hiện việc phát hiện trên một loạt hình ảnh, một cách đồng bộ hoặc không đồng bộ. Hãy xem tất cả hướng dẫn cách thực hiện.

10. Xin chúc mừng!

5ab7829fc22b21c4.pngS

Bạn đã tìm hiểu cách sử dụng Vision API với Python và thử nghiệm một số tính năng phát hiện hình ảnh!

Dọn dẹp

Để dọn dẹp môi trường phát triển, từ Cloud Shell:

  • Nếu bạn vẫn đang trong phiên IPython, hãy quay lại shell: exit
  • Ngừng sử dụng môi trường ảo Python: deactivate
  • Xoá thư mục môi trường ảo của bạn: cd ~ ; rm -rf ./venv-vision

Cách xoá dự án của bạn trên Google Cloud khỏi Cloud Shell:

  • Truy xuất mã dự án hiện tại của bạn: PROJECT_ID=$(gcloud config get-value core/project)
  • Hãy đảm bảo đây là dự án mà bạn muốn xoá: echo $PROJECT_ID
  • Xoá dự án: gcloud projects delete $PROJECT_ID

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.