Bộ lọc chuyển động cho Vertex AI Vision

1. Mục tiêu

Tổng quan

Lớp học lập trình này tập trung vào việc tạo một ứng dụng Vertex AI Vision toàn diện để minh hoạ cách gửi video có tính năng lọc chuyển động. Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các tham số khác nhau trong cấu hình bộ lọc chuyển động:

  • Độ nhạy phát hiện chuyển động
  • Thời lượng sự kiện tối thiểu
  • Giai đoạn xem lại
  • Thời gian chờ
  • Vùng phát hiện chuyển động

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

  • Cách truyền dẫn video để phát trực tuyến
  • Các tính năng có trong Bộ lọc chuyển động và cách sử dụng các tính năng đó
  • Nơi kiểm tra số liệu thống kê của Bộ lọc chuyển động
  • Cách điều chỉnh chế độ cài đặt dựa trên video của bạn

2. Trước khi bắt đầu

  1. Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo dự án Google Cloud. Lưu ý: Nếu bạn không định giữ lại các tài nguyên mà bạn tạo trong quy trình này, hãy tạo một dự án thay vì chọn một dự án hiện có. Sau khi hoàn tất những bước này, bạn có thể xoá dự án, đồng thời xoá tất cả tài nguyên được liên kết với dự án. Chuyển đến bộ chọn dự án
  2. Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Google Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên dự án hay không.
  3. Bật Compute Engine và API AI thị giác. Bật API

Tạo tài khoản dịch vụ:

  1. Trong Google Cloud Console, hãy chuyển đến trang Tạo tài khoản dịch vụ. Chuyển đến phần Tạo tài khoản dịch vụ
  2. Chọn dự án của bạn.
  3. Trong trường Tên tài khoản dịch vụ, hãy nhập tên. Bảng điều khiển Google Cloud sẽ điền vào trường Mã tài khoản dịch vụ dựa trên tên này. Trong trường Mô tả tài khoản dịch vụ, hãy nhập nội dung mô tả. Ví dụ: Tài khoản dịch vụ để bắt đầu nhanh.
  4. Nhấp vào Tạo và tiếp tục.
  5. Để cấp quyền truy cập vào dự án, hãy cấp(các) vai trò sau cho tài khoản dịch vụ của bạn: Vision AI > Vision AI Editor, Compute Engine > Compute Instance Admin (beta), Storage > Storage Object Viewer † . Trong danh sách Chọn vai trò, hãy chọn một vai trò. Để có các vai trò khác, hãy nhấp vào Thêm vai trò khác rồi thêm từng vai trò. Lưu ý: Trường Vai trò ảnh hưởng đến những tài nguyên mà tài khoản dịch vụ của bạn có thể truy cập trong dự án. Bạn có thể thu hồi các vai trò này hoặc cấp thêm vai trò sau này. Trong môi trường phát hành chính thức, đừng cấp vai trò Chủ sở hữu, Người chỉnh sửa hoặc Người xem. Thay vào đó, hãy cấp vai trò được xác định trước hoặc vai trò tuỳ chỉnh đáp ứng nhu cầu của bạn.
  6. Nhấp vào Tiếp tục.
  7. Nhấp vào Xong để hoàn tất việc tạo tài khoản dịch vụ. Đừng đóng cửa sổ trình duyệt. Bạn sẽ sử dụng nó trong bước tiếp theo.

Tạo khoá tài khoản dịch vụ:

  1. Trong bảng điều khiển Google Cloud, hãy nhấp vào địa chỉ email của tài khoản dịch vụ mà bạn đã tạo.
  2. Nhấp vào Keys (Phím).
  3. Nhấp vào Thêm khoá, rồi nhấp vào Tạo khoá mới.
  4. Nhấp vào Tạo. Tệp khoá JSON sẽ được tải xuống máy tính của bạn.
  5. Nhấp vào Close (Đóng).
  6. Cài đặtkhởi động Google Cloud CLI.

† Vai trò này chỉ cần thiết nếu bạn sao chép tệp video mẫu từ một bộ chứa trên Cloud Storage.

3. Bộ lọc chuyển động

Bộ lọc chuyển động ghi lại các phân đoạn video sản phẩm và chuyển động chứa sự kiện chuyển động. Bằng cách điều chỉnh độ nhạy chuyển động, thời lượng sự kiện tối thiểu, khoảng thời gian xem lại, khoảng thời gian chờ và vùng phát hiện chuyển động, người dùng có thể định cấu hình bộ lọc dựa trên nhu cầu của riêng họ.

Cấu hình bộ lọc chuyển động

Có 5 cấu hình có sẵn trong bộ lọc chuyển động để tuỳ chỉnh.

  1. Độ nhạy chuyển động: mức độ nhạy của cảm biến chuyển động.
  2. Thời lượng sự kiện tối thiểu: thời lượng tối thiểu để ghi lại một sự kiện chuyển động.
  3. Giai đoạn xem lại: khoảng thời gian video bắt đầu quay trước khi phát hiện sự kiện chuyển động.
  4. Thời gian chờ: sau khi một sự kiện chuyển động kết thúc, thời gian chờ trong khoảng thời gian đã chỉ định sẽ diễn ra. Trong thời gian chờ, các sự kiện chuyển động sẽ không được kích hoạt.
  5. Vùng phát hiện chuyển động: vùng do người dùng định cấu hình để chỉ định vị trí chạy tính năng phát hiện chuyển động. (Sẽ được trình bày chi tiết trong phần sau)

Độ nhạy chuyển động

Sử dụng cờ motion_detection_sensitivity trong lệnh vaictl.Chuỗi
. Phương tiện mặc định. Có thể chọn trong số các mức thấp, trung bình hoặc cao.

Độ nhạy phát hiện chuyển động càng cao thì càng nhạy với tiếng ồn và các chuyển động nhỏ hơn. Bạn nên sử dụng chế độ cài đặt này cho các chế độ cài đặt có các vật thể đang chuyển động nhỏ hơn (chẳng hạn như những người ở xa) và ánh sáng ổn định.

Mặt khác, độ nhạy thấp ít nhạy cảm hơn với sự can thiệp của ánh sáng. Chế độ cài đặt này phù hợp khi có nhiều nhiễu ánh sáng hơn, chẳng hạn như môi trường ngoài trời, và khi video có chất lượng thấp, nơi có thể có nhiều tiếng ồn hơn. Vì chế độ cài đặt này là chế độ lọc mạnh nhất, nên chế độ này có thể bỏ qua chuyển động của các đối tượng nhỏ.

Thời lượng tối thiểu của sự kiện

Sử dụng cờ min_event_length_in_seconds trong lệnh vaictl.
Số nguyên. Mặc định là 10 giây. Phạm vi từ 0 giây đến 3600 giây.

Thời lượng tối thiểu của video sự kiện chuyển động sẽ được phân tích cú pháp sau khi phát hiện một đoạn sự kiện chuyển động trong khung.

Giai đoạn xem lại

Sử dụng cờ look_back_window_in_seconds trong lệnh vaictl.
Số nguyên. Mặc định là 3 giây. Phạm vi từ 0 giây đến 3600 giây.

Giai đoạn xem lại là khoảng thời gian được lưu vào bộ nhớ đệm trước khi phát hiện sự kiện chuyển động. Tính năng này rất hữu ích khi chúng ta muốn xem những gì xảy ra trong khung hình một vài giây trước khi phát hiện sự kiện chuyển động.

Thời gian chờ

Sử dụng cờ cool_down_period_in_seconds trong lệnh vaictl.
Số nguyên. Mặc định 300 giây. Phạm vi từ 0 giây đến 3600 giây.

Khoảng thời gian chờ là khoảng thời gian tính từ khi một sự kiện chuyển động được ghi lại cho đến khi tính năng phát hiện chuyển động tạm dừng. Trong thời gian chờ, hệ thống sẽ không chạy phép tính nào để phát hiện chuyển động.

4. Ví dụ về bộ lọc chuyển động cơ bản

Hướng dẫn sử dụng SDK Vaictl

Để xem hướng dẫn sử dụng của vaictl về luồng đầu vào có bộ lọc chuyển động, hãy dùng lệnh dưới đây.

vaictl send video-file applying motion-filter -h

Chuẩn bị một video mẫu

  1. Bạn có thể sao chép một video mẫu bằng lệnh gsutil cp sau đây. Thay thế biến sau:
  • NGUỒN: Vị trí của tệp video cần sử dụng. Bạn có thể sử dụng nguồn tệp video của riêng mình (ví dụ: gs://BUCKET_NAME/FILENAME.mp4) hoặc sử dụng video mẫu (gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4 )(video có người và xe cộ, nguồn)
export SOURCE=gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4
gsutil cp $SOURCE .

Chuẩn bị biến môi trường

Thiết lập các biến môi trường bên dưới để sử dụng mẫu lệnh được cung cấp.

biến vaictl

  • PROJECT_ID: Mã dự án của bạn trên Google Cloud.
  • LOCATION_ID: Mã nhận dạng vị trí của bạn. Ví dụ: us-central1. Để biết thêm thông tin, hãy xem phần Vị trí trên đám mây.
  • LOCAL_FILE: Tên tệp của tệp video cục bộ. Ví dụ: street_vehicles_people.mp4.
  • – cờ lặp: Không bắt buộc. Lặp lại dữ liệu tệp để mô phỏng việc truyền trực tuyến.
export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1

Biến bộ lọc chuyển động

  • MOTION_SENSITIVITY: Độ nhạy của tính năng phát hiện chuyển động.
  • MIN_EVENT_LENGTH: Thời lượng tối thiểu của sự kiện chuyển động.
  • Look_BACK_WINDOW: Thời gian để chụp trước chuyển động đầu tiên trong một sự kiện chuyển động.
  • COOL_DOWN_PERIOD: Khoảng thời gian mà tính năng phát hiện chuyển động sẽ tạm dừng sau khi một sự kiện chuyển động được ghi lại.
export MOTION_SENSITIVITY=<low or medium or high>
export MIN_EVENT_LENGTH=<0-3600>
export LOOK_BACK_WINDOW=<0-3600>
export COOL_DOWN_PERIOD=<0-3600>

Chuẩn bị lệnh bộ lọc chuyển động

Có hai cách để sử dụng bộ lọc chuyển động với luồng đầu vào. Lựa chọn đầu tiên là gửi các sự kiện chuyển động đến một luồng trong bảng điều khiển trên đám mây. Cách thứ hai là gửi các sự kiện chuyển động đến bộ nhớ cục bộ.

Gửi kết quả đến bảng điều khiển trên đám mây

Bạn có thể sử dụng vaictl để truyền dữ liệu video đầu ra lên Cloud Console. Bắt đầu bằng cách kích hoạt API AI cho thị giác trong Cloud Console.

Đăng ký sự kiện phát trực tiếp mới

  1. Nhấp vào thẻ luồng trên bảng điều khiển bên trái của Vertex AI Vision.
  2. Nhấp vào Đăng ký
  3. Trong tên Luồng, hãy nhập motion-detection-stream
  4. Trong vùng, hãy nhập us-central1
  5. Đăng ký lượt nhấp

Gửi kết quả đến luồng

Lệnh này truyền trực tuyến tệp video đến một luồng. Nếu bạn sử dụng cờ –loop, video sẽ được lặp lại trong luồng cho đến khi bạn dừng lệnh. Chúng ta sẽ chạy lệnh này dưới dạng công việc ở chế độ nền để tiếp tục truyền trực tuyến.

Thêm nohup ở đầu và & ở cuối để biến công việc này thành công việc ở chế độ nền.

INPUT_VIDEO=street_vehicles_people.mp4

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
  to streams motion-detection-stream --loop

Có thể mất khoảng 100 giây từ khi bắt đầu thao tác truyền dẫn vaictl đến khi video xuất hiện trong trang tổng quan.

Sau khi quá trình truyền trực tuyến bắt đầu, bạn có thể thấy nguồn cấp dữ liệu video trong thẻ Luồng của trang tổng quan Vertex AI Vision bằng cách chọn luồng lưu lượng truy cập.

Chuyển đến thẻ Luồng

Gửi kết quả đến bộ nhớ cục bộ

Lệnh này truyền trực tuyến tệp video đến một luồng.

Thêm nohup ở đầu và & ở cuối để biến công việc này thành công việc ở chế độ nền.

INPUT_VIDEO=street_vehicles_people.mp4
OUTPUT_PATH=<path_to_store_motion_events_on_local_disk>

nohup vaictl -p $PROJECT \
             -l $LOCATION_ID \
             -c application-cluster-0 \
             --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
  to mp4file --mp4-file-path=$OUTPUT_PATH --loop

5. Vùng phát hiện chuyển động

Trong phần này, chúng ta sẽ tìm hiểu cách sử dụng vùng phát hiện chuyển động và cách định cấu hình vùng này. Vùng này nhằm cải thiện tính năng phát hiện chuyển động bằng cách che đi chuyển động đến từ những khu vực mà bạn không quan tâm.

Vùng phát hiện chuyển động có hai loại, (1) vùng dương tính, trong đó tính năng phát hiện chuyển động chỉ chạy trong khu vực được chú thích; (2) vùng âm tính, trong đó tính năng phát hiện chuyển động bỏ qua mọi chuyển động trong khu vực được chú thích.

Chú giải vùng

Sử dụng cờ zone_annotation trong lệnh vaictl để nhập toạ độ cho đa giác vùng.Chuỗi
. Mặc định là trống đối với chú thích vùng.

Chú thích vùng sẽ là một chuỗi đầu vào của người dùng, biểu thị các vùng trong khung mà người dùng muốn ẩn hoặc tập trung vào. Để chú thích vùng, người dùng sẽ cần chỉ định toạ độ hình ảnh của trục x và y cho mỗi nút trong vùng đó. Một vùng cần có từ 3 nút trở lên để tạo thành một đa giác. Một khung hình có thể có nhiều vùng. Nếu các khu vực chồng lên nhau, thì khu vực bị che phủ bởi cả hai khu vực vẫn sẽ bị che phủ.

Chú giải vùng có cú pháp đầu vào cụ thể để tuân theo.

  • Để biểu thị một nút, hãy sử dụng : để kết nối trục x và y của một toạ độ hình ảnh. Ví dụ: nút của (0,0) ở góc trên bên trái sẽ được biểu thị là 0:0.
  • Để biểu thị tất cả các nút trong một vùng, hãy sử dụng ; để kết nối các nút. Ví dụ: đối với một vùng có các nút là (0,0), (100,0), (100,100)(0, 100), vùng đó sẽ được biểu thị là 0:0;100:0;100:100;0:100. Luôn nhập các nút dưới dạng các nút kết nối cạnh nhau, thứ tự có thể là cả chiều kim đồng hồ hoặc ngược chiều kim đồng hồ.

Vùng phát hiện chuyển động – hình vuông*Một vùng hình vuông có bốn nút.

Vùng phát hiện chuyển động – hình tam giác*Vùng tam giác có ba nút.

  • Để biểu thị nhiều vùng trong một khung, hãy sử dụng - để kết nối các vùng khác nhau. Ví dụ: nếu chúng ta muốn nhập cả (0,0), (100,0), (100,100), (0,100)(120,120), (110,150), (200,160), thì chú thích vùng nhập sẽ là 0:0;100:0;100:100;0:100-120:120;110:150;200:160.

Vùng phát hiện chuyển động – một khung hình có hai vùng*Hai vùng trong một khung hình.

Để lấy toạ độ từ hình ảnh, bạn có thể sử dụng một số công cụ trên mạng để lấy toạ độ. Ví dụ: xem Wolfram – Lấy toạ độ từ hình ảnh

Loại trừ vùng được chú thích

Sử dụng cờ exclude_annotated_zone trong lệnh vaictl để định cấu hình phát hiện chuyển động trong vùng hoặc bên ngoài vùng.
Boolean. Giá trị mặc định là false.

Loại trừ vùng được chú thích là giá trị nhập vào boolean từ người dùng, cho biết liệu người dùng có muốn loại trừ vùng được chú thích trong tính năng phát hiện chuyển động hay không.

  • Nếu bạn đặt thành true, vùng được chú thích sẽ đóng vai trò là vùng âm. Hệ thống sẽ không phát hiện chuyển động trong các vùng được chú thích.

Vùng phát hiện chuyển động – lựa chọn loại trừ *Chỉ chạy tính năng phát hiện chuyển động bên ngoài các vùng đầu vào.

  • Nếu bạn đặt thành false, thì vùng này sẽ hoạt động như một vùng dương, nơi tính năng phát hiện chuyển động sẽ tập trung vào.

Vùng phát hiện chuyển động – có cả lựa chọn *Chỉ chạy tính năng phát hiện chuyển động trong các vùng đầu vào.

6. Ví dụ về bộ lọc chuyển động cho vùng phát hiện chuyển động

Trong ví dụ này, chúng ta sẽ sử dụng video có một cái cây liên tục di chuyển ở tiền cảnh. Ở chế độ cài đặt bộ lọc chuyển động thông thường, video sẽ chỉ tạo ra một sự kiện chuyển động có thời lượng của video gốc vì bộ lọc chuyển động ghi nhận cây chuyển động là "di chuyển liên tục trong toàn bộ video". Tuy nhiên, nhờ có vùng phát hiện chuyển động, chúng ta có thể che đi chuyển động của cây và tập trung vào chuyển động của ô tô và người đi bộ.

Chuẩn bị video

Video mẫu (gs://cloud-samples-data/vertex-ai-vision/dynamic-background-fall.mp4 ) chứa cây, ô tô và người đi bộ từ www.changedetection.net.

Ghi nhận quyền tác giả của video: N. Goyette, P.-M. Jodoin, F. Tiếng Porikli, J. Konrad và P. Ishwar, changedetection.net: Tập dữ liệu điểm chuẩn phát hiện thay đổi mới, trong Hội thảo Proc. IEEE về Phát hiện thay đổi (CDW-2012) tại CVPR-2012, Offernce, RI, 16-21 tháng 6, 2012

Chuẩn bị biến môi trường

Các biến dự án trên Google Cloud.

export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1
export LOCAL_FILE=street_vehicles_people.mp4

Cấu hình bộ lọc chuyển động cơ bản.

export MOTION_SENSITIVITY=<low or medium or high>
export MIN_EVENT_LENGTH=<0-3600>
export LOOK_BACK_WINDOW=<0-3600>
export COOL_DOWN_PERIOD=<0-3600>

Cấu hình vùng phát hiện chuyển động.

Chọn một mục bên dưới để xem các loại cách sử dụng khác nhau cho vùng phát hiện chuyển động.

Loại trừ cây khỏi tính năng phát hiện chuyển động.

export ZONE_ANNOTATION="0:0;680:0;660:70;380:320;100:150"
export EXCLUDE_ANNOTATED_ZONE=true

Khu vực phát hiện chuyển động – loại trừ tính năng phát hiện chuyển động khỏi khu vực được chú thích trong video mẫu *Chỉ chạy tính năng phát hiện chuyển động bên ngoài các vùng đầu vào.

Tập trung phát hiện chuyển động trên đường.

export ZONE_ANNOTATION="0:300;780:300;780:480;0:480"
export EXCLUDE_ANNOTATED_ZONE=false

Vùng phát hiện chuyển động – chạy tính năng phát hiện chuyển động từ vùng được chú thích trong video ví dụ *Chỉ chạy tính năng phát hiện chuyển động bên ngoài vùng đầu vào.

Gửi luồng video có bộ lọc chuyển động

Gửi sự kiện chuyển động đến bảng điều khiển trên đám mây

Bạn có thể sử dụng vaictl để truyền dữ liệu video đầu ra lên Cloud Console. Bắt đầu bằng cách kích hoạt Vision AI API trong Cloud Console.

Đăng ký sự kiện phát trực tiếp mới

  1. Nhấp vào thẻ luồng trên bảng điều khiển bên trái của Vertex AI Vision.
  2. Nhấp vào Đăng ký
  3. Trong tên Luồng, hãy nhập motion-detection-stream
  4. Trong vùng, hãy nhập us-central1
  5. Đăng ký lượt nhấp

Gửi kết quả đến luồng

Lệnh này truyền trực tuyến tệp video đến một luồng. Nếu bạn sử dụng cờ –loop, video sẽ được lặp lại trong luồng cho đến khi bạn dừng lệnh. Chúng ta sẽ chạy lệnh này dưới dạng công việc ở chế độ nền để tiếp tục truyền trực tuyến.

Thêm nohup ở đầu và & ở cuối để biến công việc này thành công việc ở chế độ nền.

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
         --zone_annotation=ZONE_ANNOTATION \
         --exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
  to streams motion-detection-stream --loop

Có thể mất khoảng 100 giây từ khi bắt đầu thao tác truyền dẫn vaictl đến khi video xuất hiện trong trang tổng quan.

Sau khi quá trình truyền trực tuyến có sẵn, bạn có thể thấy nguồn cấp dữ liệu video trong thẻ Luồng của trang tổng quan Vertex AI Vision bằng cách chọn luồng lưu lượng truy cập.

Chuyển đến thẻ Luồng

Gửi kết quả đến bộ nhớ cục bộ

Lệnh này truyền trực tuyến tệp video đến một luồng. Nếu bạn sử dụng cờ –loop, video sẽ được lặp lại trong luồng cho đến khi bạn dừng lệnh. Chúng ta sẽ chạy lệnh này dưới dạng công việc ở chế độ nền để tiếp tục truyền trực tuyến.

Thêm nohup ở đầu và & ở cuối để biến công việc này thành công việc trong nền.

OUTPUT_PATH=<path_to_store_motion_events>

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
         --zone_annotation=$ZONE_ANNOTATION \
         --exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
  to mp4file --mp4-file-path=$OUTPUT_PATH --loop

7. Xin chúc mừng

Xin chúc mừng, bạn đã hoàn thành lớp học lập trình!

Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được sử dụng trong hướng dẫn này, hãy kết thúc hoạt động vaictl SDK thông qua dòng lệnh bằng ctrl + z.

Tài nguyên

https://cloud.google.com/vision-ai/docs/overview

https://cloud.google.com/vision-ai/docs/motion-filtering-model

https://cloud.google.com/vision-ai/docs/create-manage-streams

Phản hồi

Nhấp vào đây để cung cấp ý kiến phản hồi

Bài khảo sát

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

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

Lớp học lập trình này có hữu ích không?

Rất hữu ích Có phần hữu ích