1. Tổng quan
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?
Bạn đánh giá thế nào về trải nghiệm sử dụng Python?
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?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đă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.
- 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.
- 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
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell .
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.
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
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.
- 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`
- 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:
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ả:
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:
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ả:
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:
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ả:
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):
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ả:
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:
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ả:
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!
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
- Kiểm tra bản minh hoạ trực tuyến trong trình duyệt: https://cloud.google.com/vision
- Tài liệu về Vision API: https://cloud.google.com/vision/docs
- Python trên Google Cloud: https://cloud.google.com/python
- Thư viện ứng dụng Cloud dành cho Python: https://github.com/googleapis/google-cloud-python
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.