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ề Tư thế Yoga trong BigQuery, đồng thời triển khai một 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 có 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 một lựa chọn tuyệt vời để lưu trữ dữ liệu huấn luyện ML. Ngoài ra, các chức năng phân tích và công nghệ học máy ( BQML) tích hợp sẵn của BigQuery cho phép bạn tạo kết quả dự đoán không cần mã chỉ bằng cách sử dụng các truy vấn SQL. Bạn có thể truy cập vào 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 phải có 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ý hoàn toà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. Nhưng,

  • BigQuery đã mở rộng để thực hiện tất cả 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 dữ liệu 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 tôi có khả năng kết hợp dữ liệu có cấu trúc và dữ liệu không có cấu trúc như thể tất cả dữ liệu đó đều nằm trong một bảng

Chúng ta sẽ thảo luận về những vấn đề 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ách sử dụng các truy vấn có cấu trúc như thể chúng 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 thông qua 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 xét chúng dưới dạng 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, kết nối BigLake, Thùng (Vùng 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:

  • Một 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 về Yoga cho mô hình
  • Bảng bên ngoài để truy cập vào hình ảnh trên Cloud Storage
  • Một mối kết nối BigLake cho bảng bên ngoài để truy cập vào 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à dữ liệu 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à mối 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à BigLake Connection
  • 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à mối kết nối BigLake

Đối với trường hợp sử dụng của chúng tôi là 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 vào tập dữ liệu này từ kho lưu trữ này. Các tư thế Yoga mà chúng tôi xác định chỉ bao gồm tư thế Chó úp mặt, Nữ thần, Tấm ván, Cây và 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 thanh toán có được bật trên dự á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 dùng trong quá trình triển khai này phải nằm trong cùng một khu vực mà bạn chọn.

a. Tạo tập dữ liệu "yoga_set" bằng 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. BigLake Connection cho phép chúng tôi kết nối nguồn dữ liệu bên ngoài trong khi vẫn duy trì chế độ kiểm soát quyền truy cập và bảo mật chi tiết của BigQuery. Trong trường hợp này, đó là Cloud Storage cho dữ liệu hình ảnh. Chúng tôi 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 BigLake Connection.

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 nguồn dữ liệu bên ngoài rồi chọn BigLake 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ã nhận dạng kết nối và tạo kết nối. Hãy nhớ ghi lại mã nhận dạng tài khoản dịch vụ sẽ xuất hiện trên màn hình sau khi bạn tạo kết nối <<SERVICE_ACCOUNT>>. Trong ví dụ của chúng tôi, mã nhận dạng kết nối là "yoga-pose-conn". Hãy nhớ ghi chú 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ề tư thế Yoga mà chúng ta muốn tạo mô hình. Bộ chứa là các vùng chứa trong Cloud Storage để lưu trữ 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 Buckets (Thùng chứa) để chuyển đến trang chủ Buckets (Thùng chứa) rồi nhấp vào CREATE (TẠO)

a6f6b26cffb53ae0.pngTrang bộ chứa Google Cloud Storage

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

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

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

c. Sau khi tạo bộ chứa, hãy lưu trữ hình ảnh (thông qua các lệnh của bảng điều khiển hoặc 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 một bảng đối tượng bên ngoài từ BigQuery để truy cập vào dữ liệu không có cấu trúc trong bộ chứa bằng cách sử dụng kết nối mà chúng ta đã tạo. Chạy SQL CREATE bên dưới trong 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ạ dưới đây:

bda48f566e0c292f.png

Hãy nhanh chóng truy vấn một tư thế từ bảng bên ngoài vừa 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 hình ảnh không có cấu trúc như thể chúng 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 vào 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 "Tệp CSV cục bộ" để xuất kết quả. Sau đó, hãy mở Sổ tay Colab (hoặc tạo một sổ tay) 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

Giờ đây, chúng ta đã tạo bảng bên ngoài và truy cập vào hình ảnh từ Cloud Storage chỉ bằng cách sử dụ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 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 rằng bạn đã có tất cả quyền cần thiết. Sau đó, hãy làm theo các bước dưới đây:

  1. Tải mô hình xuống từ vị trí này và lưu vào thiết bị của bạn
  2. Thư mục 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 ả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 như 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ẻ giản đồ định nghĩa mô hình BigQuery

Trong phần Nhãn, bạn sẽ thấy trường "activation_49" đại diện cho trường đầu ra. Trong phần Features (Tính năng), bạn có thể thấy "input_1" (đầu vào 1) đại diện cho trường dự kiến sẽ được nhập vào 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 "thử nghiệm".

c. Suy luận tư thế Yoga của bạn!

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ử. Đảm bảo bạn có một số hình ảnh thử nghiệm (tư thế Yoga) được xác định từ Cloud Storage Bucket đã được đưa vào Bảng bên ngoài khi chúng tôi tạo bảng này. Chúng ta sẽ chọn lọc để truy vấn những hình ảnh kiểm thử đó trong BigQuery nhằm 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 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à có 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ạ dưới đây:

867018993845e943.png

Đối với những người hiểu rõ mô hình ResNet, điều này sẽ giúp họ hiểu được quá trình phân loại. Nếu không, hãy viết một đoạn mã nhỏ để hiểu rõ việc 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á đầu ra ở trên là làm phẳng các giá trị trường activation_49 bằng cách sử dụ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 muốn gắn nhãn thêm cho lớp kết quả bằng văn bản, bạn có thể đưa logic vào thay cho phần giữ chỗ <<LABEL_LOGIC>> trong truy vấn (xoá dấu nhận xét 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, thì dưới đây là kết quả cho truy vấn:

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 này và áp dụng logic phù hợp nhất với dữ liệu cũng như đầu ra của mô hình.

e. Trực quan hoá suy luận

Cuối cùng, một đoạn mã Python ngắn để 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

Đầu ra hình ảnh ở trên đề cập đến Tư thế yoga "Chó úp mặt", đây chính xác là thông tin đầ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à dữ liệu 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 trong 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 tập dữ liệu với bảng bên ngoài để lưu trữ tư thế và dữ liệu liên quan đến sức khoẻ của tư thế đó.

125bdf848c86fbe.pngGiản đồ Bảng có cấu trúc "yoga_health" của BigQuery

Hình ảnh trên minh hoạ giản đồ của bảng dữ liệu có cấu trúc có tên là "yoga_health" và các trường là pose, focus, health_benefit và breath. Truy vấn bên dưới kết hợp cả dữ liệu có cấu trúc và dữ liệu 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)];

Sau đây là kết quả:

469bdfcffa9e19fd.png

Lưu ý: Bạn có thể chạy tất cả các truy vấn mà chúng tôi đã đề cập trong blog này ngay từ Sổ tay Python bằng cách sử dụng các lệnh BigQuery Magic.

9. Dọn dẹp

Để tránh phát sinh phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được 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á rồi nhấp vào Xoá
  3. Trong hộp thoại, hãy nhập mã dự án rồi 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 trong bài kiểm tra bằng mô hình này. Nếu bạn muốn triển khai tính năng này, hãy bắt đầu với dự á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 hoạt động triển khai ứng dụng khác từ đầu đến cuối trong Google Cloud, vui lòng truy cập vào blog của tôi.