Phân loại dữ liệu hình ảnh bằng công nghệ học máy BigQuery

1. Giới thiệu

Trong lớp học lập trình này, chúng ta sẽ thảo luận về trường hợp sử dụng lưu trữ và phân tích hình ảnh về các tư thế Yoga trong BigQuery, đồng thời triển khai mô hình phân loại bằng BigQuery ML để gắn nhãn các tư thế chỉ bằng các cấu trúc SQL và không dùng bất kỳ dạng mã nào khác.

BigQuery và BQML

BigQuery là một kho dữ liệu đa đám mây, không máy chủ, có thể mở rộng từ byte đến petabyte mà không tốn chi phí vận hành. Điều này khiến BigQuery trở thành lựa chọn tuyệt vời để lưu trữ dữ liệu huấn luyện mô hình học máy. Ngoài ra, các tính năng phân tích và học máy ( BQML) tích hợp của BigQuery cho phép bạn tạo thông tin dự đoán không cần mã chỉ bằng các truy vấn SQL. Bạn có thể truy cập dữ liệu từ các nguồn bên ngoài bằng các truy vấn liên kết, nhờ đó, bạn không cần đến các quy trình ETL phức tạp. Bạn có thể đọc thêm về mọi tính năng mà BigQuery cung cấp trên trang BigQuery.

Cho đến nay, chúng ta biết BigQuery là kho dữ liệu đám mây được quản lý toàn phần, giúp người dùng phân tích dữ liệu có cấu trúc và bán cấu trúc. Tuy nhiên,

  • BigQuery đã mở rộng để thực hiện mọi hoạt động phân tích và học máy trên cả dữ liệu không có cấu trúc
  • Chúng ta có thể sử dụng các truy vấn SQL để thực hiện phân tích, phân tích và học máy chuyên sâu trên hình ảnh, video, âm thanh, v.v. ở quy mô lớn mà không cần viết thêm mã
  • Chúng ta có thể kết hợp dữ liệu có cấu trúc và không có cấu trúc như thể tất cả dữ liệu đó cùng tồn tại trong một bảng

Chúng ta sẽ thảo luận về những điều này trong trường hợp sử dụng Phân loại tư thế Yoga được đề cập trong phần tiếp theo.

Phân loại dữ liệu hình ảnh bằng BigQuery ML

Khả năng xử lý và phân tích hình ảnh bằng các truy vấn có cấu trúc như thể đó là dữ liệu có cấu trúc là khả năng đầu tiên thuộc loại này. Giờ đây, chúng ta thậm chí có thể dự đoán kết quả bằng các mô hình phân loại học máy bằng BigQuery ML. Tôi đã thu hẹp các giai đoạn liên quan thành 5 bước để bạn dễ hiểu:

fe97945bce996e1.jpeg

Các bước trên có thể phức tạp nếu chúng ta chỉ xem các bước đó là nhãn. Thông tin chi tiết về từng thành phần liên quan, chẳng hạn như Tập dữ liệu BigQuery, Lakehouse cho kết nối Apache Iceberg, Bộ chứa Cloud Storage, Bảng đối tượng (Nguồn dữ liệu bên ngoài), BQML, v.v. đều được xác định trong phần triển khai. Vì vậy, đừng nản lòng nếu bạn chưa quen với những thuật ngữ này.

Sản phẩm bạn sẽ tạo ra

Bạn sẽ tạo một mô hình Phân loại dữ liệu hình ảnh bằng BQML bao gồm những nội dung sau:

  • Tập dữ liệu BigQuery chứa các thành phần bảng và mô hình
  • Bộ chứa Google Cloud Storage (GCS) để lưu trữ Hình ảnh Yoga cho mô hình
  • Bảng bên ngoài để truy cập Hình ảnh trong Cloud Storage
  • Kết nối Lakehouse cho bảng bên ngoài để truy cập hình ảnh trong GCS
  • Mô hình ResNet trong BigQuery ML
  • Suy luận bằng mô hình đã tạo
  • BigQuery SQL để phân tích dữ liệu hình ảnh
  • BigQuery SQL để truy vấn dữ liệu có cấu trúc và không có cấu trúc cùng nhau

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

  • Cách tạo Bộ chứa Cloud Storage và lưu trữ hình ảnh
  • Cách tạo tập dữ liệu, bảng và kết nối BigQuery
  • Cách tạo mô hình phân loại dữ liệu hình ảnh bằng BQML
  • Cách dự đoán bằng mô hình đã tạo bằng BigQuery ML
  • Cách truy vấn hình ảnh và kết hợp với dữ liệu có cấu trúc bằng BigQuery SQL

2. Yêu cầu

  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Một dự án trên Google Cloud có bật tính năng thanh toán, chứa các dịch vụ BigQuery, Cloud Storage và Kết nối Lakehouse
  • Phần tiếp theo có danh sách các bước để tạo ứng dụng phân loại dữ liệu hình ảnh

3. Tạo tập dữ liệu và kết nối Lakehouse

Đối với trường hợp sử dụng phát hiện hình ảnh của 5 tư thế Yoga, tôi đã sử dụng tập dữ liệu có sẵn công khai và bạn có thể truy cập tập dữ liệu đó từ kho lưu trữ này. Các tư thế Yoga mà chúng ta đang xác định chỉ giới hạn ở Tư thế chó úp mặt, Tư thế nữ thần, Tư thế tấm ván, Tư thế cây và Tư thế chiến binh 2. Trước khi bắt đầu tạo Tập dữ liệu BigQuery, hãy nhớ chọn hoặc tạo một Dự án trên Google Cloud và kiểm tra xem dự án đó có bật tính năng thanh toán hay không. Bật BigQuery API và BigQuery Connection API. Xin lưu ý rằng tất cả các dịch vụ được sử dụng trong quá trình triển khai này phải ở cùng một khu vực mà bạn chọn.

a. Tạo tập dữ liệu "yoga_set" theo các bước bên dưới:

Chuyển đến Trình chỉnh sửa BigQuery rồi nhập lệnh:

CREATE SCHEMA `<<project_id>>.yoga_set`;

b. Kết nối Lakehouse cho phép chúng ta kết nối nguồn dữ liệu bên ngoài trong khi vẫn giữ được quyền kiểm soát và bảo mật chi tiết đối với quyền truy cập vào BigQuery. Trong trường hợp của chúng ta, đó là Cloud Storage cho dữ liệu hình ảnh. Chúng ta sẽ sử dụng kết nối này để đọc các đối tượng từ Cloud Storage. Hãy làm theo các bước bên dưới để tạo Kết nối Lakehouse.

Nhấp vào THÊM DỮ LIỆU trên ngăn Trình khám phá của trang BigQuery:

4cb42b1245bb0ba6.pngMàn hình "Thêm dữ liệu bên ngoài" của BigQuery

Nhấp vào Kết nối với các nguồn dữ liệu bên ngoài rồi chọn tuỳ chọn Lakehouse và Hàm từ xa:

9ffec2b2bfcc3cd5.pngĐịnh cấu hình kết nối nguồn dữ liệu bên ngoài

Cung cấp Mã kết nối và tạo kết nối. Hãy nhớ ghi lại mã Tài khoản dịch vụ sẽ xuất hiện trên màn hình sau khi tạo kết nối <<SERVICE_ACCOUNT>>. Trong ví dụ của chúng ta, mã kết nối là "yoga-pose-conn". Hãy nhớ ghi lại khu vực.

4. Tạo Bộ chứa Google Cloud Storage và cấp quyền

Chúng ta sẽ sử dụng bộ chứa Google Cloud Storage để chứa các tệp hình ảnh về các tư thế Yoga mà chúng ta muốn tạo mô hình. Bộ chứa là các vùng chứa Cloud Storage để chứa những hình ảnh mà chúng ta sẽ phân tích.

a. Chuyển đến Google Cloud Storage bằng cách tìm kiếm trong bảng điều khiển, sau đó nhấp vào Bộ chứa để chuyển đến trang chủ Bộ chứa rồi nhấp vào TẠO

a6f6b26cffb53ae0.pngTrang Bộ chứa Google Cloud Storage

b. Trên trang Tạo bộ chứa, hãy nhập thông tin bộ chứa (tên duy nhất) rồi tiếp tục. Hãy đảm bảo rằng bộ chứa đó ở cùng khu vực với tập dữ liệu và kết nối được thảo luận trong các bước ở trên rồi nhấp vào tạo

1280366a42b7bdf6.pngTrang Tạo bộ chứa Google Cloud Storage

Trước khi chuyển sang bước tiếp theo, hãy đảm bảo bạn đã ghi lại tài khoản dịch vụ, tên bộ chứa và đường dẫn.

c. Sau khi tạo bộ chứa, hãy lưu trữ hình ảnh (thông qua bảng điều khiển hoặc các lệnh Cloud Shell hoặc theo phương thức lập trình) và cấp các quyền cần thiết cho tài khoản dịch vụ của kết nối (mà chúng ta đã lưu trước đó) để truy cập vào hình ảnh

> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"

5. Tạo Bảng đối tượng

Tạo bảng đối tượng bên ngoài từ BigQuery để truy cập dữ liệu không có cấu trúc trong bộ chứa bằng kết nối mà chúng ta đã tạo. Chạy SQL CREATE bên dưới từ trình chỉnh sửa BigQuery:

CREATE OR REPLACE EXTERNAL TABLE `<<dataset>>.<<table_name>>`
WITH CONNECTION `us.<<connection-name>>`
OPTIONS(
object_metadata="SIMPLE", uris=["gs://<<bucket>>/<<folder_if_exists>>/*.jpg"]);

Bảng bên ngoài được tạo như minh hoạ bên dưới:

bda48f566e0c292f.png

Hãy nhanh chóng truy vấn một tư thế từ bảng bên ngoài mới tạo:

SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;

Như bạn có thể thấy trong ảnh chụp màn hình bên dưới, bạn có thể tạo và thao tác trên các hình ảnh không có cấu trúc như thể đó là dữ liệu có cấu trúc:

7d1784122b5013f.png

Bây giờ, hãy xuất kết quả truy vấn ở trên thành một đoạn mã Python nhỏ để trực quan hoá kết quả:

Nhấp vào LƯU KẾT QUẢ rồi chọn tuỳ chọn "CSV Localfile" để xuất kết quả. Sau đó, hãy mở Sổ ghi chú Colab (hoặc tạo một sổ ghi chú) rồi nhập mã bên dưới

from IPython.display import display
from PIL import Image
import io
import pandas as pd
import base64
df = pd.read_csv('/content/sample_data/<<your_csv>>')
imgdata = base64.b64decode(str(df.data[0]))
image = Image.open(io.BytesIO(imgdata))
display(image)

Thực thi để xem kết quả như bên dưới:

b8edd68cb281786a.png

Bây giờ, chúng ta đã tạo bảng bên ngoài và truy cập hình ảnh từ Cloud Storage chỉ bằng các truy vấn SQL. Hãy chuyển sang phần tiếp theo để tạo Mô hình phân loại.

6. Tạo mô hình và tải mô hình đó lên Google Cloud Storage

Đối với quá trình triển khai này, chúng ta sẽ sử dụng Mô hình ResNet 50 được huấn luyện trước để chạy suy luận trên bảng đối tượng mà chúng ta vừa tạo. Mô hình ResNet 50 phân tích các tệp hình ảnh và xuất ra một lô vectơ biểu thị khả năng một hình ảnh thuộc về lớp tương ứng (logits).

Trước khi chuyển sang bước này, hãy đảm bảo bạn đã có tất cả các quyền cần thiết. Sau đó, hãy làm theo các bước bên dưới:

  1. Tải mô hình xuống từ vị trí này rồi lưu vào thiết bị
  2. Mô hình này sẽ giải nén thành saved_model.pb và một thư mục biến
  3. Tải hai tệp này (tệp và thư mục) lên bộ chứa mà chúng ta đã tạo ở phần trước

2629ff3eda214946.pngBộ chứa Google Cloud Storage "yoga_images" có các tệp Mô hình ResNet đã tải lên

Sau khi hoàn tất bước này, các tệp liên quan đến mô hình của bạn sẽ có trong cùng một bộ chứa với hình ảnh của bạn như trong hình ở trên.

7. Tải mô hình vào BQML và suy luận

Trong bước này, chúng ta sẽ tải mô hình vào cùng một Tập dữ liệu BigQuery với bảng bên ngoài mà chúng ta đã tạo trước đó và áp dụng mô hình đó cho những hình ảnh mà chúng ta đã lưu trữ trong Cloud Storage.

a. Trong Trình chỉnh sửa BigQuery, hãy chạy câu lệnh SQL sau

CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');

Sau khi quá trình thực thi hoàn tất (có thể mất một khoảng thời gian tuỳ thuộc vào tập dữ liệu của bạn), bạn sẽ thấy mô hình được liệt kê trong phần Tập dữ liệu trong BigQuery.

435fa0919aeb57a6.pngTập dữ liệu BigQuery liệt kê mô hình đã tạo

b. Kiểm tra mô hình để xem các trường đầu vào và đầu ra của mô hình đó.

Mở rộng tập dữ liệu rồi nhấp vào mô hình mà chúng ta vừa tạo "yoga_poses_resnet". Nhấp vào thẻ Lược đồ:

e88928764f10f6ff.pngThẻ Lược đồ định nghĩa mô hình BigQuery

Trong phần Nhãn, bạn sẽ thấy trường "activation_49" biểu thị trường đầu ra. Trong phần Tính năng, bạn có thể thấy "input_1" biểu thị trường dự kiến sẽ là đầu vào cho mô hình. Bạn sẽ tham chiếu "input_1" trong truy vấn suy luận (hoặc truy vấn dự đoán) làm trường mà bạn đang truyền vào cho dữ liệu "kiểm thử".

c. Suy luận tư thế Yoga!

Hãy sử dụng mô hình mà chúng ta vừa tạo để phân loại dữ liệu hình ảnh kiểm thử. Hãy đảm bảo bạn có một số hình ảnh kiểm thử (tư thế Yoga) được xác định từ Bộ chứa Cloud Storage đã được đưa vào Bảng bên ngoài khi chúng ta tạo bảng đó. Chúng ta sẽ chọn lọc truy vấn những hình ảnh kiểm thử đó trong BigQuery để thực hiện suy luận bằng mô hình BQML mà chúng ta vừa tạo. Sử dụng truy vấn bên dưới để kích hoạt quá trình kiểm thử.

SELECT *
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses where REGEXP_CONTAINS(uri,
'gs://yoga_images/Downdog/00000097.jpg')));

Trong truy vấn ở trên, chúng ta chọn một hình ảnh kiểm thử được xác định là chứa một giá trị URI cụ thể (00000097.jpg) trong bảng bên ngoài. Ngoài ra, phần SELECT sử dụng cấu trúc ML.DECODE_IMAGE làm trường "input_1" để hàm ML.PREDICT hoạt động.

Sau khi quá trình thực thi hoàn tất, bạn sẽ thấy kết quả như minh hoạ bên dưới:

867018993845e943.png

Đối với những người hiểu rõ về mô hình ResNet, điều này sẽ giúp bạn hiểu rõ về quá trình phân loại. Nếu không, hãy viết mã một đoạn mã nhỏ để hiểu rõ về quá trình phân loại một cách trực quan.

d. Làm phẳng kết quả

Một cách để trực quan hoá kết quả ở trên là làm phẳng các giá trị trường activation_49 bằng cấu trúc UNNEST của BigQuery SQL. Vui lòng tham khảo truy vấn bên dưới để làm phẳng kết quả từ bước trước. Nếu bạn muốn gắn nhãn bằng văn bản cho lớp kết quả, bạn có thể đưa logic vào thay cho trình giữ chỗ <<LABEL_LOGIC>> trong truy vấn (bỏ chú thích khi sử dụng).

with predictions as (
SELECT
Uri, data, SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 1)] as img,  
i as label_i,
<<LABEL_LOGIC>> label,
Score
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT data, uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses 
WHERE
REGEXP_CONTAINS(uri,'gs://yoga_images/Goddess/00000007.jpg'))),
UNNEST(activation_49) as score WITH OFFSET i)
SELECT * FROM predictions 
ORDER BY score DESC
LIMIT  5;

Nếu không có logic gắn nhãn lớp, kết quả của truy vấn sẽ như sau:

71f580f41f0811f3.png

Tuy nhiên, trong trường hợp của tôi, tôi đã áp dụng một logic mẫu và kết quả như sau:

1c6df6ecd14fba1.png

Bạn có thể đọc thêm về mô hình và áp dụng logic phù hợp nhất với dữ liệu và kết quả mô hình của bạn.

e. Trực quan hoá quá trình suy luận

Cuối cùng, một đoạn mã Python nhanh để trực quan hoá kết quả từ quá trình phân loại! Xuất kết quả truy vấn ở trên sang tệp CSV và tham chiếu kết quả đó trong mã Python.

68756e7e4b8d7a29.png

Kết quả hình ảnh ở trên đề cập đến Tư thế Yoga "Chó úp mặt", đây chính xác là dữ liệu đầu vào kiểm thử mà chúng ta đã truyền vào truy vấn ML.PREDICT để phân loại bằng BQML!

8. Hợp nhất dữ liệu có cấu trúc và không có cấu trúc

Cuối cùng, phần tôi thích nhất trong quá trình triển khai này là hợp nhất các trường từ bảng quan hệ có cấu trúc với dữ liệu hình ảnh không có cấu trúc này. Tôi đã tạo một bảng BigQuery có cấu trúc trong cùng một tập dữ liệu với bảng bên ngoài để lưu giữ tư thế và dữ liệu liên quan đến sức khoẻ của tư thế đó.

125bdf848c86fbe.pngLược đồ Bảng có cấu trúc "yoga_health" của BigQuery

Hình ảnh ở trên biểu thị lược đồ của bảng dữ liệu có cấu trúc có tên là "yoga_health" và các trường là tư thế, tiêu điểm, lợi ích về sức khoẻ và hơi thở. Truy vấn bên dưới kết hợp cả dữ liệu có cấu trúc và không có cấu trúc:

SELECT SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)] as pose,
a.health_benefit, breath, focus, data
FROM `abis-345004.yoga_set.yoga_health` a, yoga_set.yoga_poses b
WHERE a.pose = SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)];

Kết quả như sau:

469bdfcffa9e19fd.png

Lưu ý: Bạn có thể chạy tất cả các truy vấn mà chúng ta đã đề cập trong blog này trực tiếp từ Sổ ghi chú Python bằng các lệnh Magic của BigQuery.

9. Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud cho các tài nguyên được sử dụng trong bài đăng này, hãy làm theo các bước sau.

  1. Trong bảng điều khiển Cloud, hãy chuyển đến trang Quản lý tài nguyên
  2. Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá, sau đó nhấp vào Xoá
  3. Trong hộp thoại, hãy nhập mã dự án, sau đó nhấp vào Tắt để xoá dự án

10. Xin chúc mừng

Xin chúc mừng! Bạn đã lưu trữ và truy vấn thành công dữ liệu không có cấu trúc trong BigQuery, tạo Mô hình phân loại bằng BQML và dự đoán các tư thế yoga kiểm thử bằng mô hình. Nếu bạn muốn triển khai mô hình này, hãy bắt đầu với dự án trên Google Cloud. Ngoài ra, nếu bạn muốn tìm hiểu thêm về cơ sở dữ liệu hoặc các cách triển khai ứng dụng đầu cuối khác trong Google Cloud, vui lòng truy cập vào blog của tôi.