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 Tư thế yoga trong BigQuery, đồng thời triển khai mô hình phân loại bằng công nghệ học máy BigQuery để gắn nhãn các tư thế chỉ bằng cấu trúc SQL và không sử dụng 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 quy mô từ byte đến petabyte mà không có chi phí vận hành. Điều này khiến đây là một lựa chọn tuyệt vời để lưu trữ dữ liệu huấn luyện công nghệ học máy. Ngoài ra, các chức năng phân tích và học máy tích hợp sẵn của BigQuery ( BQML) cho phép bạn tạo thông tin dự đoán mà không cần mã chỉ bằng các truy vấn SQL. Ngoài ra, 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ờ đó mà không cần thực hiện các quy trình ETL phức tạp. Bạn có thể đọc thêm về mọi thứ mà BigQuery cung cấp trong trang BigQuery.
Cho đến nay, chúng tôi biết đến BigQuery là kho dữ liệu trên đám mây được quản lý toàn diện này, 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 cả mọi hoạt động phân tích và học máy đối với dữ liệu không có cấu trúc
- Chúng ta có thể sử dụng truy vấn SQL để thực hiện việc 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 phải viết mã bổ sung
- 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ể chúng tồn tại cùng nhau trong một bảng
Chúng ta sẽ thảo luận về những yếu tố này trong trường hợp sử dụng Phân loại tư thế yoga ở phần tiếp theo.
Phân loại dữ liệu hình ảnh bằng công nghệ học máy BigQuery
Có khả năng xử lý và phân tích hình ảnh bằng truy vấn có cấu trúc như thể chúng là dữ liệu có cấu trúc đầu tiên. Giờ đây, chúng tôi 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 nhờ công nghệ học máy của BigQuery. Tôi đã thu hẹp các giai đoạn có liên quan thành 5 bước để dễ hiểu:
Các bước trên có thể phức tạp nếu chúng ta chỉ xem chúng dưới dạng nhãn. Thông tin chi tiết về từng thành phần có liên quan như Tập dữ liệu BigQuery, kết nối BigLake, Bộ chứa trên đám mây (Vùng chứa), 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, trong đó BQML bao gồm những thông tin dưới đây:
- 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 tập yoga cho mô hình này
- Bảng bên ngoài để truy cập vào hình ảnh trong Cloud Storage
- 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 cả dữ liệu có cấu trúc và dữ liệu không có cấu trúc
Kiến thức bạn sẽ học được
- Cách tạo Bộ chứa trong 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 công nghệ học máy BigQuery
- 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
3. Tạo Tập dữ liệu và kết nối với BigLake
Đối với trường hợp sử dụng công cụ phát hiện 5 tư thế Yoga, tôi đã sử dụng tập dữ liệu công khai và bạn có thể truy cập vào tập dữ liệu trong kho lưu trữ này. Các tư thế Yoga mà chúng tôi đang xác định chỉ giới hạn ở Downdog, Goddess, Plank, Tree và Warrior2. 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 Google Cloud và kiểm tra xem tính năng 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 sử dụng trong quá trình triển khai này phải nằm trong cùng khu vực được chọn.
a. Tạo tập dữ liệu "yoga_set" bằng cách làm theo các bước dưới đây:
Chuyển đến Trình chỉnh sửa BigQuery và nhập lệnh:
CREATE SCHEMA `<<project_id>>.yoga_set`;
b. BigLake Connection giúp chúng tôi kết nối nguồn dữ liệu bên ngoài mà vẫn duy trì khả năng bảo mật và kiểm soát quyền truy cập chi tiết vào BigQuery, trong trường hợp của chúng tôi là Cloud Storage cho dữ liệu hình ảnh. Chúng ta sẽ sử dụng kết nối này để đọc đối tượng trong Cloud Storage. Hãy làm theo các bước bên dưới để tạo Kết nối với BigLake.
Nhấp vào THÊM DỮ LIỆU trên ngăn Explorer trên trang BigQuery:
"Thêm dữ liệu bên ngoài" của BigQuery màn hình
Nhấp vào Connections to external data source (Kết nối với nguồn dữ liệu bên ngoài), rồi chọn tuỳ chọn BigLake and Remote functions (Các chức năng từ xa và BigLake):
Đị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ụ. Mã này sẽ hiển thị trên màn hình sau khi tạo kết nối <<SERVICE_ACCOUNT>>. Trong ví dụ này, mã 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 của các tư thế Yoga mà chúng ta muốn tạo mô hình. Bộ chứa là vùng chứa trong Cloud Storage để chứa những hình ảnh mà chúng ta sẽ phân tích.
a. Truy cập vào 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
Trang 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 của bạn (tên duy nhất) và tiếp tục, đảm bảo thông tin đó ở 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 và nhấp vào tạo
Tạo trang bộ chứa trong Google Cloud Storage
Trước khi chuyển sang bước tiếp theo, hãy đảm bảo bạn đã ghi chú tài khoản dịch vụ, tên bộ chứa và đường dẫn của mình.
c. Sau khi tạo bộ chứa, hãy lưu trữ hình ảnh (thông qua các lệnh trong 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 (tài khoản 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 phi cấu trúc trong bộ chứa bằng kết nối mà chúng ta đã tạo. Chạy lệnh CREATE SQL 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ư sau:
Hãy truy vấn nhanh 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 hình ảnh phi cấu trúc như thể chúng là dữ liệu có cấu trúc:
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Ả và chọn "Tệp cục bộ CSV" để xuất kết quả. Sau đó, 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)
Hãy thực thi để xem kết quả như bên dưới:
Bây giờ, 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 truy vấn SQL, hãy chuyển sang phần tiếp theo là 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
Để triển khai việc này, chúng ta sẽ sử dụng Mô hình ResNet 50 đã 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 loạt vectơ biểu thị khả năng một hình ảnh thuộc về lớp tương ứng (logit).
Trước khi chuyển sang bước này, hãy đảm bảo bạn đã có sẵn mọi quyền cần thiết. Sau đó, hãy làm theo các bước dưới đây:
- Tải xuống mô hình từ vị trí này và lưu mô hình vào địa phương của bạn
- Tệp này sẽ mở gói vào saved_model.pb và một thư mục biến
- 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
Bộ chứa "yoga_images" trên Google Cloud Storage với các tệp Mô hình ResNet được tải lên
Sau khi bước này hoàn tất, các tệp liên quan đến mô hình của bạn phải xuất hiện trong cùng bộ chứa như hình ảnh bạn thấy ở hình trên.
7. Tải mô hình vào BQML và suy luận
Ở 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 BigQuery Editor, 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 chút thời gian tuỳ thuộc vào tập dữ liệu), bạn sẽ thấy mô hình được liệt kê trong mục Tập dữ liệu trong BigQuery.
Tậ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 và nhấp vào mô hình chúng tôi vừa tạo "yoga_poses_resnet". Nhấp vào thẻ Giản đồ:
Thẻ giản đồ định nghĩa mô hình BigQuery
Trong phần Nhãn, bạn sẽ thấy thông báo "Kích hoạt_49" trường đại diện cho trường đầu ra. Trong phần Tính năng, bạn có thể thấy "input_1" đại diện cho trường dự kiến sẽ làm dữ liệu đầ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) dưới dạng trường bạn đang chuyển vào cho "kiểm thử" .
c. Suy ra tư thế Yoga của bạn!
Hãy sử dụng mô hình chúng ta vừa tạo để phân loại dữ liệu hình ảnh thử nghiệm. Hãy đảm bảo rằng bạn có một số hình ảnh thử nghiệm (tư thế yoga) được xác định từ Bộ chứa Cloud Storage của bạn để đưa vào Bảng bên ngoài khi chúng tôi tạo. Chúng ta sẽ truy vấn có chọn lọc các hình ảnh thử nghiệm đó trong BigQuery để tiến hành suy luận bằng mô hình BQML vừa tạo. Hãy sử dụng truy vấn dưới đây để 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 có chứa 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ư dưới đây:
Bây giờ, đối với những người biết sâu về mô hình ResNet, điều này sẽ giúp hiểu việc phân loại. Nếu không, hãy viết mã một đoạn mã nhỏ để hiểu cách 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ị của trường kích hoạt_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ả ở bước trước. Nếu muốn gắn nhãn thêm bằng văn bản cho lớp kết quả, bạn có thể giới thiệu logic này thay cho phần giữ chỗ <<LABEL_LOGIC>> trong truy vấn (bỏ 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, dưới đây là kết quả cho truy vấn:
Tuy nhiên, trong trường hợp của tôi, tôi đã áp dụng logic mẫu và dưới đây là kết quả:
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 và đầu ra của mô hình.
e. Trực quan hoá suy luận
Cuối cùng, hãy cung cấp một đoạn mã Python ngắn gọn để trực quan hoá kết quả của quá trình phân loại! Xuất kết quả truy vấn ở trên ra tệp CSV và tham chiếu đến tệp đó trong mã Python.
Hình ảnh đầu ra ở trên đề cập đến Tư thế yoga "Chó hướng xuống" đây là dữ liệu đầu vào kiểm thử giống hệt như dữ liệu đầu vào mà chúng tôi đã 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 yêu thích của tôi 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 một tập dữ liệu với bảng bên ngoài để lưu tư thế đó và dữ liệu liên quan đến sức khoẻ.
Bảng có cấu trúc BigQuery "yoga_health" Lược đồ
Hình ảnh trên thể hiện 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à tư thế, tiêu điểm, sức khoẻ_lợi ích 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)];
Dưới đây là kết quả:
Lưu ý: Bạn có thể chạy tất cả những truy vấn mà chúng tôi đã đề cập trong blog này trực tiếp từ Sổ tay Python bằng cách sử dụng các lệnh BigQuery Magic.
9. Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho những tài nguyên sử dụng trong bài đăng này, hãy làm theo các bước sau.
- Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Quản lý tài nguyên
- 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á
- Trong hộp thoại, nhập ID 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ột Mô hình phân loại bằng BQML và dự đoán các tư thế yoga thử nghiệm bằng mô hình này. Nếu bạn muốn triển khai, 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 cách triển khai ứng dụng đầu cuối khác trong Google Cloud, vui lòng truy cập vào các blog của tôi.