Sử dụng Vision API với Python

1. Tổng quan

5ab7829fc22b21c4.png

Vision API giúp nhà phát triển dễ dàng tích hợp các tính năng sử dụng thị giác máy tính trong ứng dụng, bao gồm gắn nhãn hình ảnh, phát hiện khuôn mặt và điểm mốc, nhận dạng ký tự quang học (OCR) và gắn thẻ 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 thực hiện tính năng phát hiện nhãn
  • Cách thực hiện tính năng phát hiện văn bản
  • Cách thực hiện tính năng phát hiện địa điểm nổi tiếng
  • Cách thực hiện tính năng phát hiện khuôn mặt
  • Cách thực hiện tính năng phát hiện vật thể

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
  • Làm quen với cách sử dụng Python

Bản khảo sát

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

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

Bạn đánh giá thế nào về trải nghiệm của mình với Python?

Người mới bắt đầu Trung cấp Thành thạo

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

Người mới bắt đầu 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 tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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ự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là giá trị duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyê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í trị giá 300 USD.

Khởi động Cloud Shell

Mặc dù 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 trên đá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.png.

55efc1aaa7a4d3ad.png

Nếu đây là lần đầu tiên bạ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 thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

9f0e51b578fecce5.png

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạ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

Đầu ra của 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

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

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

Trước khi 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 chính:

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

Giờ đây, 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 một trình thông dịch Python tương tác có tên là IPython mà bạn đã cài đặt ở 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 thực hiện yêu cầu đầu tiên...

4. Thực hiện tính năng phát hiện nhãn

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

Trong ví dụ này, bạn sẽ thực hiện Phát hiện nhãn trên một hình ảnh (của Alex Knight) về Setagaya, một quận nổi tiếng ở Tokyo:

756f97f0b1e46c38.jpeg

Sao chép mã sau vào phiên 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=" | ",
        )
        

Hãy dành chút thời gian để nghiên cứu mã 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 một hình ảnh cho một tập hợp các đối tượ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

Trong bước này, bạn có thể thực hiện tính năng phát hiện nhãn trên một hình ảnh và hiển thị các nhãn có khả năng cao 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. Thực hiện tính năng phát hiện văn bản

Tính năng phát hiện văn bản thực hiện quy trình Nhận dạng ký tự quang học (OCR). API này phát hiện và trích xuất văn bản trong hình ảnh, đồng thời hỗ trợ nhiều ngôn ngữ. Công cụ này cũng 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 tính năng phát hiện văn bản trên hình ảnh biển báo giao thông:

4dedd3fcfd9ad99b.jpeg

Sao chép mã sau vào phiên 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=" | ",
        )
        

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.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 văn bản trên hình ảnh và hiển thị văn bản được nhận dạng từ hình ảnh. Tìm hiểu thêm về tính năng phát hiện văn bản.

6. Thực hiện tính năng phát hiện địa danh

Tính năng phát hiện địa danh sẽ phát hiện các cấu 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ẽ thực hiện tính năng phát hiện địa danh trên một hình ảnh (của John Towner) về Tháp Eiffel:

fb7801e36884b875.jpeg

Sao chép mã sau vào phiên 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=" | ",
        )
        

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.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 địa danh trên hình ảnh Tháp Eiffel. Đọc thêm về tính năng phát hiện địa danh.

7. Thực hiện tính năng 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 thuộc tính chính liên quan đến khuôn mặt, chẳng hạn như trạng thái cảm xúc hoặc việc đội mũ.

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

58c578ece524cf32.jpeg

Sao chép mã sau vào phiên 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)
        

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. Tìm hiểu thêm về tính năng phát hiện khuôn mặt.

8. Thực hiện tính năng phát hiện vật thể

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

756f97f0b1e46c38.jpeg

Sao chép mã sau vào phiên 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=" | ",
        )
        

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ể thực hiện quy trình phát hiện đối tượng. Đọc thêm về tính năng phát hiện đối tượng.

9. Nhiều tính năng

Bạn đã thấy cách sử dụng một số tính năng của Vision API, nhưng vẫn 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.

Sau đây là loại yêu cầu bạn có thể đưa ra để 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)

Ngoài ra, còn có 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 nhóm hình ảnh, đồng bộ hoặc không đồng bộ. Xem tất cả hướng dẫn cách thực hiện.

10. Xin chúc mừng!

5ab7829fc22b21c4.png

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, hãy làm như sau trong 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: cd ~ ; rm -rf ./venv-vision

Để xoá dự án trên đám mây của bạn, hãy làm như sau trong Cloud Shell:

  • Lấy mã dự án hiện tại: PROJECT_ID=$(gcloud config get-value core/project)
  • Hãy đảm bảo rằng đây là dự án 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 Ghi công theo Creative Commons 2.0 Chung.