1. Giới thiệu

Ngày cập nhật gần đây nhất: Ngày 11/4/2022
Trong Lớp học lập trình này, bạn sẽ tìm hiểu cách huấn luyện một mô hình phân loại hình ảnh bằng Dạy cho máy và kích hoạt mô hình đó bằng tính năng tăng tốc phần cứng Coral bằng TensorFlow.js, một thư viện học máy mạnh mẽ và linh hoạt cho JavaScript. Bạn sẽ tạo một ứng dụng Electron hiển thị hình ảnh từ webcam và phân loại hình ảnh đó bằng TPU biên Coral. Bạn có thể xem phiên bản hoạt động đầy đủ của Lớp học lập trình này trong kho lưu trữ sig-tfjs trên GitHub.
Tôi có cần thiết bị Coral không?
Không. Bạn có thể thử lớp học lập trình này mà không cần thiết bị Coral và vẫn đạt được hiệu suất tốt trên máy tính để bàn bằng cách sử dụng trình tăng tốc WebNN.
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ tạo một ứng dụng Electron phân loại hình ảnh. Ứng dụng của bạn:
- Phân loại hình ảnh từ webcam thành các danh mục được xác định trong mô hình mà bạn đã huấn luyện.
- Sử dụng bộ tăng tốc Coral để tăng hiệu suất (nếu có).
- Sử dụng WebNN để tăng hiệu suất, nếu nền tảng của bạn có hỗ trợ.
Kiến thức bạn sẽ học được
- Cách cài đặt và thiết lập gói NPM tfjs-tflite-node để chạy các mô hình TFLite trong Node.js.
- Cách cài đặt thư viện thời gian chạy Edge TPU để chạy các mô hình trên thiết bị Coral.
- Cách tăng tốc suy luận mô hình bằng cách sử dụng một TPU biên Coral.
- Cách tăng tốc suy luận mô hình bằng WebNN.
Lớp học lập trình này tập trung vào TFLite trong Node.js. Các khái niệm và khối mã không liên quan được tinh chỉnh và cung cấp cho bạn, chỉ cần sao chép và dán.
Bạn cần có
Để hoàn tất Lớp học lập trình này, bạn cần:
- Máy tính có webcam.
- Đối với Coral, bạn nên dùng Raspberry Pi chạy Raspberry Pi OS (64 bit) có màn hình.
- Đối với WebNN, bạn nên dùng máy Intel x86-64 chạy Ubuntu 20.04 hoặc Windows 10.
- Node.js phiên bản >= 12.
- Có kiến thức về JavaScript.
- (Khuyến nghị) Coral USB Accelerator để tăng tốc mô hình.
2. Bắt đầu thiết lập
Lấy mã nguồn
Chúng tôi đã đặt tất cả mã bạn cần cho dự án này vào một kho lưu trữ Git. Để bắt đầu, hãy lấy mã và mở mã đó trong môi trường phát triển mà bạn yêu thích. Trong lớp học lập trình này, bạn nên dùng Raspberry Pi chạy Raspberry Pi OS (64 bit) có giao diện người dùng. Nhờ đó, bạn có thể dễ dàng kết nối một bộ tăng tốc Coral.
Khuyến nghị: Sử dụng Git để sao chép repo trên Raspberry Pi
Để lấy mã, hãy mở một cửa sổ dòng lệnh mới và sao chép kho lưu trữ:
git clone https://github.com/tensorflow/sig-tfjs.git
Tất cả các tệp bạn cần chỉnh sửa cho lớp học lập trình đều nằm trong thư mục tfjs-tflite-node-codelab (bên trong sig-tfjs). Trong thư mục này, bạn sẽ thấy các thư mục con có tên starter_code, cpu_inference_working, coral_inference_working và webnn_inference_working. Đây là các điểm kiểm tra cho các bước của lớp học lập trình này.
Trong số các tệp khác trong kho lưu trữ có các gói NPM mà tfjs-tflite-node-codelab phụ thuộc vào. Bạn không cần chỉnh sửa bất kỳ tệp nào trong số này, nhưng bạn cần chạy một số kiểm thử của các tệp đó để đảm bảo rằng môi trường của bạn được thiết lập đúng cách.
Cài đặt thư viện thời gian chạy Edge TPU
Các thiết bị Coral yêu cầu bạn cài đặt thư viện thời gian chạy Edge TPU trước khi sử dụng. Cài đặt bằng cách làm theo hướng dẫn dành cho nền tảng của bạn.
Trên Linux / Raspberry Pi
Trên Linux, thư viện này có trong PPA của Google dưới dạng gói Debian, libedgetpu1-std, cho các kiến trúc x86-64 và Armv8 (64 bit). Nếu bộ xử lý của bạn sử dụng một cấu trúc khác, bạn sẽ cần biên dịch bộ xử lý đó từ nguồn.
Chạy lệnh này để thêm PPA của Coral của Google và cài đặt thư viện Thời gian chạy Edge TPU.
# None of this is needed on Coral boards
# This repo is needed for almost all packages below
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
# This repo is needed for only python3-coral-cloudiot and python3-coral-enviro
echo "deb https://packages.cloud.google.com/apt coral-cloud-stable main" | sudo tee /etc/apt/sources.list.d/coral-cloud.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install libedgetpu1-std
Trên Windows / Các hệ điều hành khác
Tệp nhị phân được biên dịch sẵn có sẵn cho các phiên bản x86-64 của MacOS và Windows và có thể được cài đặt bằng cách chạy tập lệnh install.sh hoặc install.bat trong tệp lưu trữ sau khi tải xuống.
Khởi động lại thiết bị
Sau khi cài đặt Edge TPU Runtime, hãy khởi động lại thiết bị để kích hoạt quy tắc Udev mới của Coral mà trình cài đặt đã thêm.
Xác minh rằng thiết bị Coral của bạn đã được phát hiện
Để xác minh rằng thiết bị Coral của bạn được phát hiện và hoạt động, hãy chạy các kiểm thử tích hợp cho gói coral-tflite-delegate. Bạn có thể tìm thấy gói này trong thư mục gốc của kho lưu trữ. Để chạy các kiểm thử tích hợp, hãy cắm bộ tăng tốc Coral rồi chạy các lệnh sau trong thư mục của gói:
npx yarn
npx yarn build-deps
npx yarn test-integration
Bạn sẽ thấy kết quả như sau:
yarn run v1.22.17
$ yarn build && yarn test-integration-dev
$ tsc
$ jasmine --config=jasmine-integration.json
Platform node has already been set. Overwriting the platform with node.
Randomized with seed 78904
Started
============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
WARNING: converting 'int32' to 'uint8'
.
1 spec, 0 failures
Finished in 2.777 seconds
Randomized with seed 78904 (jasmine --random=true --seed=78904)
Done in 6.36s.
Đừng lo lắng về việc cài đặt @tensorflow/tfjs-node, như đã đề cập trong nhật ký, vì bạn sẽ chạy mô hình trong TFLite.
Nếu đầu ra chứa Encountered unresolved custom op: edgetpu-custom-op, tức là thiết bị Coral của bạn không được phát hiện. Đảm bảo bạn đã cài đặt thư viện thời gian chạy TPU biên và cắm thiết bị Coral vào máy tính. Bạn cũng có thể làm theo Hướng dẫn bắt đầu của Coral để kiểm thử phiên bản Python của các liên kết Coral. Nếu phiên bản Python hoạt động nhưng các kiểm thử này vẫn không thành công, vui lòng cho chúng tôi biết bằng cách gửi báo cáo lỗi.
Chạy mã khởi đầu
Giờ thì bạn đã sẵn sàng chạy mã khởi đầu. Hãy làm theo các bước sau để bắt đầu.
- Di chuyển đến thư mục
starter_codetrong thư mụctfjs-tflite-node-codelab. - chạy
npm installđể cài đặt các phần phụ thuộc. - Chạy
npm startđể khởi chạy dự án. Một ứng dụng hiển thị nguồn cấp video từ webcam của máy tính sẽ mở ra.
Điểm xuất phát của chúng ta là gì?
Điểm xuất phát của chúng ta là một ứng dụng camera Electron cơ bản được thiết kế cho lớp học lập trình này. Mã này đã được đơn giản hoá để minh hoạ các khái niệm trong lớp học lập trình và có rất ít tính năng xử lý lỗi. Nếu bạn chọn sử dụng lại bất kỳ mã nào trong ứng dụng phát hành công khai, hãy đảm bảo rằng bạn xử lý mọi lỗi và kiểm thử đầy đủ tất cả mã.

Khám phá mã khởi đầu
Có rất nhiều tệp trong mã khởi đầu này, nhưng bạn chỉ cần chỉnh sửa tệp renderer.js. Tệp này kiểm soát những nội dung xuất hiện trên trang, bao gồm cả nguồn cấp dữ liệu video và các phần tử HTML, đồng thời là nơi bạn thêm mô hình học máy vào ứng dụng. Trong số các tệp khác có một tệp index.html, nhưng tệp này chỉ tải tệp renderer.js. Ngoài ra còn có một tệp main.js, đây là điểm truy cập cho Electron. Nó kiểm soát vòng đời của ứng dụng, bao gồm cả nội dung cần hiển thị khi ứng dụng được mở và việc cần làm khi ứng dụng được đóng, nhưng bạn sẽ không cần thực hiện bất kỳ thay đổi nào đối với nó.
Mở trình gỡ lỗi
Bạn có thể cần gỡ lỗi ứng dụng khi làm theo lớp học lập trình này. Vì ứng dụng này dựa trên Electron, nên ứng dụng này có trình gỡ lỗi Chrome tích hợp. Trên hầu hết các nền tảng, bạn có thể mở công cụ này bằng tổ hợp phím Ctrl + Shift + i. Nhấp vào thẻ Bảng điều khiển để xem nhật ký và thông báo lỗi của ứng dụng.
Không còn nhiều điều để khám phá ở đây, vì vậy, hãy bắt tay ngay vào việc huấn luyện trình phân loại hình ảnh!
3. Huấn luyện trình phân loại hình ảnh
Trong phần này, bạn sẽ huấn luyện các phiên bản TFLite và Coral của một mô hình phân loại hình ảnh tuỳ chỉnh.
Huấn luyện Bộ phân loại
Trình phân loại hình ảnh nhận hình ảnh đầu vào và chỉ định nhãn cho các hình ảnh đó. Trong lớp học lập trình này, bạn sẽ sử dụng Dạy cho máy để huấn luyện một mô hình trong trình duyệt. Để tăng tốc quá trình huấn luyện cho phần này, bạn có thể sử dụng máy tính để bàn hoặc máy tính xách tay thay vì Raspberry Pi, nhưng bạn sẽ phải sao chép các tệp kết quả vào Pi.
Giờ thì bạn đã sẵn sàng huấn luyện một mô hình. Nếu bạn không chắc chắn về loại mô hình cần huấn luyện, thì mô hình dễ huấn luyện là mô hình phát hiện người. Mô hình này chỉ phát hiện xem có người trong khung hình hay không.
- Mở trang huấn luyện Dạy cho máy trong một thẻ mới.
- Chọn Dự án hình ảnh, rồi chọn Mô hình hình ảnh chuẩn.
- Thêm mẫu hình ảnh cho từng loại. Cách dễ nhất để thực hiện việc này là sử dụng đầu vào webcam. Bạn cũng có thể đổi tên các lớp học.
- Khi bạn đã thu thập đủ dữ liệu cho mỗi lớp (thường là 50 mẫu), hãy nhấn vào Train Model (Huấn luyện mô hình).
Khi mô hình hoàn tất quá trình huấn luyện, bạn sẽ thấy bản xem trước về đầu ra của mô hình.

Hãy thử cung cấp cho mô hình các dữ liệu đầu vào khác nhau. Nếu bạn thấy một thông tin đầu vào được phân loại không chính xác, hãy thêm dữ liệu đó vào dữ liệu huấn luyện và huấn luyện lại mô hình.
- Khi bạn hài lòng với độ chính xác của mô hình, hãy nhấp vào Xuất mô hình. Bạn sẽ cần tải 2 phiên bản riêng biệt của mô hình xuống.
- Xuất mô hình của bạn dưới dạng mô hình số thực TensorFlow Lite. Thao tác này sẽ tải một tệp có tên là
converted_tflite.zipxuống. chạy trên CPU. - Xuất mô hình của bạn dưới dạng mô hình Tensorflow Lite EdgeTPU. Thao tác này sẽ tải một tệp có tên là
converted_edgetpu.zipxuống. Tệp này chạy trên Coral Edge TPU.
4. Chạy mô hình CPU trong ứng dụng
Giờ đây khi đã huấn luyện một mô hình, bạn có thể thêm mô hình đó vào ứng dụng. Đến cuối phần này, ứng dụng sẽ có thể chạy mô hình của bạn bằng CPU của thiết bị.
Thêm tệp mô hình vào ứng dụng
Giải nén tệp mô hình converted_tflite.zip mà bạn đã tải xuống khi huấn luyện trình phân loại. Có 2 tệp trong kho lưu trữ. model_uquant.tflite là mô hình TFLite đã lưu, bao gồm cả biểu đồ mô hình và trọng số. labels.txt chứa các nhãn mà con người đọc được cho các lớp mà mô hình dự đoán. Đặt cả hai tệp này vào modeldirectory.
Cài đặt các phần phụ thuộc
Việc tải một mô hình và xử lý trước các đầu vào đòi hỏi một số phần phụ thuộc từ TensorFlow.js:
tfjs-tflite-node: Gói của TensorFlow.js để chạy các mô hình TFLite trong Node.js.@tensorflow/tfjs: Gói chính của TensorFlow.js.
@tensorflow/tfjs đã được cài đặt, nhưng bạn cần cài đặt tfjs-tflite-node bằng lệnh sau:
npm install --save tfjs-tflite-node
Sau khi cài đặt, hãy thêm trình kết xuất này vào ứng dụng ở đầu renderer.js:
PHẦN 1 CỦA LỚP HỌC LẬP TRÌNH: Nhập tfjs-tflite-node.
const {loadTFLiteModel} = require('tfjs-tflite-node');
Tải mô hình
Giờ thì bạn đã sẵn sàng tải mô hình. tfjs-tflite-node cung cấp hàm loadTFLiteModel để thực hiện việc này. Bạn có thể tải các mô hình từ đường dẫn tệp, ArrayBuffer hoặc URL TFHub. Để tải mô hình và các trọng số của mô hình đó, hãy thêm nội dung này vào hàm main:
Phần 1 của LỚP HỌC LẬP TRÌNH: Tải mô hình tại đây.
const modelPath = './model/model_unquant.tflite';
const model = await loadTFLiteModel(modelPath);
const labels = fs.readFileSync('./model/labels.txt', 'utf8')
.split('\n');
Chạy mô hình
Bạn cần thực hiện 3 bước để chạy mô hình. Trước tiên, bạn sẽ kéo và tiền xử lý một khung hình đầu vào từ webcam. Sau đó, bạn chạy mô hình trên khung hình đó và nhận được một dự đoán. Sau đó, bạn sẽ hiển thị kết quả dự đoán trên trang.
Xử lý trước dữ liệu đầu vào của webcam
Hiện tại, webcam chỉ là một phần tử HTML và tệp renderer.js của JavaScript không truy cập được vào các khung hình mà webcam hiển thị. Để kéo khung hình từ webcam, TensorFlow.js cung cấp tf.data.webcam. Hàm này cung cấp phương thức capture() dễ sử dụng để chụp khung hình từ camera.
Để sử dụng, hãy thêm mã thiết lập này vào main():
CODELAB phần 1: Thiết lập tf.data.webcam tại đây.
const tensorCam = await tf.data.webcam(webcam);
Sau đó, để chụp ảnh mỗi khung hình, hãy thêm nội dung sau vào run():
CODELAB phần 1: Chụp khung hình webcam tại đây.
const image = await tensorCam.capture();
Bạn cũng cần phải xử lý trước từng khung hình để tương thích với mô hình. Mô hình mà lớp học lập trình này sử dụng có hình dạng đầu vào là [1, 224, 224, 3], vì vậy, mô hình này dự kiến sẽ có một hình ảnh RGB 224 x 224 pixel. tensorCam.capture() có hình dạng là [224, 224, 3], vì vậy, bạn cần thêm một phương diện bổ sung ở phía trước Tensor bằng tf.expandDims. Ngoài ra, mô hình CPU dự kiến sẽ nhận được một thông tin đầu vào Float32 trong khoảng từ -1 đến 1, nhưng webcam lại ghi nhận các giá trị từ 0 đến 255. Bạn có thể chia Tensor đầu vào cho 127 để thay đổi dải ô từ [0, 255] thành [0, ~2], sau đó trừ đi 1 để có được dải ô mong muốn [-1, ~1]. Thêm các dòng này vào tf.tidy() trong hàm run() để thực hiện việc này:
CODELAB phần 1: Xử lý trước các khung hình webcam tại đây.
const expanded = tf.expandDims(image, 0);
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));
Điều quan trọng là bạn phải loại bỏ các tensor sau khi sử dụng. tf.tidy() sẽ tự động thực hiện việc này cho mã có trong lệnh gọi lại, nhưng không hỗ trợ các hàm không đồng bộ. Bạn cần huỷ bỏ tensor hình ảnh mà bạn đã tạo trước đó theo cách thủ công bằng cách gọi phương thức dispose() của tensor đó.
CODELAB part 1: Dispose webcam frames here.
image.dispose();
Chạy mô hình và hiển thị kết quả
Để chạy mô hình trên dữ liệu đầu vào đã xử lý trước, hãy gọi model.predict() trên tensor được chuẩn hoá. Hàm này trả về một tensor một chiều chứa xác suất dự đoán của từng nhãn. Nhân xác suất này với 100 để tính tỷ lệ phần trăm cơ hội của từng nhãn và sử dụng hàm showPrediction có trong mã khởi đầu để hiển thị dự đoán của mô hình trên màn hình.
Mã này cũng sử dụng stats.js để tính thời gian dự đoán bằng cách đặt các lệnh gọi đến stats.begin và stats.end xung quanh model.predict.
CODELAB phần 1: Chạy mô hình và hiển thị kết quả tại đây.
stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);
Chạy lại ứng dụng bằng yarn start và bạn sẽ thấy các phân loại từ mô hình của mình.

Hiệu suất
Theo thiết lập hiện tại, mô hình này chạy trên CPU. Điều này không có vấn đề gì đối với máy tính và hầu hết máy tính xách tay, nhưng có thể không phù hợp nếu bạn chạy trên Raspberry Pi hoặc một thiết bị có công suất thấp khác. Trên Raspberry Pi 4, có thể bạn sẽ thấy khoảng 10 FPS, có thể không đủ nhanh cho một số ứng dụng. Để có hiệu suất tốt hơn mà không cần dùng máy có tốc độ cao hơn, bạn có thể sử dụng silicon dành riêng cho ứng dụng dưới dạng Coral Edge TPU.
5. Chạy mô hình Coral trong ứng dụng
Nếu không có thiết bị Coral, bạn có thể bỏ qua phần này.
Bước này của lớp học lập trình được xây dựng dựa trên mã mà bạn đã viết trong phần trước. Tuy nhiên, bạn có thể sử dụng điểm kiểm tra cpu_inference_working nếu muốn bắt đầu lại từ đầu.
Các bước chạy mô hình Coral gần giống với các bước chạy mô hình CPU. Điểm khác biệt chính là định dạng mô hình. Vì Coral chỉ hỗ trợ các tensor uint8, nên mô hình được lượng tử hoá. Điều này ảnh hưởng đến các tensor đầu vào được truyền đến mô hình và các tensor đầu ra mà mô hình trả về. Một điểm khác biệt nữa là các mô hình cần được biên dịch bằng trình biên dịch Edge TPU để chạy trên Coral TPU. Teachable Machine đã thực hiện bước này, nhưng bạn có thể tìm hiểu cách thực hiện bước này cho các mô hình khác bằng cách truy cập vào tài liệu của Coral.
Thêm tệp mô hình Coral vào ứng dụng
Giải nén tệp mô hình converted_edgetpu.zip mà bạn đã tải xuống khi huấn luyện trình phân loại. Có 2 tệp trong tệp lưu trữ. model_edgetpu.tflite là mô hình TFLite đã lưu, bao gồm cả biểu đồ mô hình và trọng số. labels.txt chứa các nhãn mà con người đọc được cho các lớp mà mô hình dự đoán. Đặt tệp mô hình vào thư mục coral_model.
Cài đặt các phần phụ thuộc
Để chạy các mô hình Coral, bạn cần có thư viện thời gian chạy Edge TPU. Hãy đảm bảo bạn đã cài đặt bằng cách làm theo hướng dẫn thiết lập trước khi tiếp tục.
Các thiết bị Coral được truy cập dưới dạng các đại biểu TFLite. Để truy cập vào các đối tượng này từ JavaScript, hãy cài đặt gói coral-tflite-delegate:
npm install --save coral-tflite-delegate
Sau đó, hãy nhập uỷ quyền bằng cách thêm dòng này vào đầu tệp renderer.js:
CODELAB phần 2: Nhập uỷ quyền tại đây.
const {CoralDelegate} = require('coral-tflite-delegate');
Tải mô hình
Giờ đây, bạn đã sẵn sàng tải mô hình Coral. Bạn thực hiện việc này theo cách tương tự như đối với mô hình CPU, ngoại trừ việc giờ đây bạn sẽ truyền các lựa chọn cho hàm loadTFLiteModel để tải đại biểu Coral.
CODELAB phần 2: Tải mô hình uỷ quyền tại đây.
const coralModelPath = './coral_model/model_edgetpu.tflite';
const options = {delegates: [new CoralDelegate()]};
const coralModel = await loadTFLiteModel(coralModelPath, options);
Bạn không cần tải nhãn vì chúng giống với nhãn của mô hình CPU.
Thêm một nút để chuyển đổi giữa CPU và Coral
Bạn sẽ thêm mô hình Coral cùng với mô hình CPU mà bạn đã thêm trong phần trước. Việc chạy cả hai cùng lúc khiến bạn khó nhận thấy sự khác biệt về hiệu suất, vì vậy, nút bật/tắt sẽ chuyển đổi giữa việc thực thi trên Coral và CPU.
Thêm nút bằng mã sau:
PHẦN HƯỚNG DẪN 2: Tạo nút uỷ quyền tại đây.
let useCoralDelegate = false;
const toggleCoralButton = document.createElement('button');
function toggleCoral() {
useCoralDelegate = !useCoralDelegate;
toggleCoralButton.innerText = useCoralDelegate
? 'Using Coral. Press to switch to CPU.'
: 'Using CPU. Press to switch to Coral.';
}
toggleCoralButton.addEventListener('click', toggleCoral);
toggleCoral();
document.body.appendChild(toggleCoralButton);
Hãy kết nối điều kiện này trong hàm run(). Khi useCoralDelegate là false, nó sẽ chạy phiên bản CPU. Nếu không, nó sẽ chạy phiên bản Coral (nhưng hiện tại, nó sẽ không làm gì cả). Bao bọc mã từ việc chạy mô hình CPU trong câu lệnh if. Xin lưu ý rằng tensor expanded bị loại khỏi câu lệnh if vì mô hình Coral sử dụng tensor này.
CODELAB phần 2: Kiểm tra xem có nên sử dụng uỷ quyền ở đây hay không.
// NOTE: Don't just copy-paste this code into the app.
// You'll need to edit the code from the CPU section.
const expanded = tf.expandDims(image, 0);
if (useCoralDelegate) {
// CODELAB part 2: Run Coral prediction here.
} else {
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));
stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);
}
Chạy mô hình
Phiên bản Coral của mô hình này dự kiến sẽ nhận các tensor uint8 từ 0 đến 255, vì vậy, đầu vào của mô hình này không cần được chuẩn hoá. Tuy nhiên, đầu ra cũng là một tensor uint8 trong phạm vi từ 0 đến 255. Bạn cần chuyển đổi giá trị này thành số thực từ 0 đến 100 trước khi hiển thị.
CODELAB part 2: Run Coral prediction here. (Đây là một phần của đoạn mã ở trên)
stats.begin();
const prediction = coralModel.predict(expanded);
stats.end();
const percentage = tf.div(tf.mul(prediction, tf.scalar(100)), tf.scalar(255));
showPrediction(percentage.dataSync(), labels);
Chạy lại ứng dụng bằng yarn start và ứng dụng sẽ cho thấy các phân loại từ bộ tăng tốc Coral.

Bạn có thể chuyển đổi giữa suy luận bằng Coral và suy luận bằng CPU bằng cách nhấn vào nút này. Bạn có thể nhận thấy rằng bảng xếp hạng độ tin cậy của mô hình Coral ít chính xác hơn so với mô hình CPU và thường kết thúc bằng một chữ số thập phân chẵn. Việc giảm độ chính xác này là một điểm đánh đổi khi chạy mô hình được lượng tử hoá trên Coral. Trên thực tế, điều này thường không quan trọng, nhưng bạn nên lưu ý.
Lưu ý về hiệu suất
Tốc độ khung hình mà bạn thấy bao gồm cả quá trình xử lý trước và xử lý sau, vì vậy, tốc độ này không thể hiện được khả năng của phần cứng Coral. Bạn có thể hiểu rõ hơn về hiệu suất bằng cách nhấp vào đồng hồ đo FPS cho đến khi đồng hồ này hiển thị độ trễ (tính bằng mili giây), chỉ đo lường lệnh gọi đến model.predict. Tuy nhiên, điều đó vẫn bao gồm thời gian cần thiết để di chuyển các Tensor đến các liên kết C gốc của TFLite, rồi đến thiết bị Coral, vì vậy, đây không phải là một phép đo hoàn hảo. Để biết các điểm chuẩn hiệu quả chính xác hơn được viết bằng C++, hãy xem trang điểm chuẩn EdgeTPU.
Ngoài ra, xin lưu ý rằng video này được quay trên máy tính xách tay chứ không phải Raspberry Pi, nên bạn có thể thấy tốc độ khung hình/giây khác.
Tăng tốc quá trình tiền xử lý Coral
Trong một số trường hợp, bạn có thể tăng tốc quá trình tiền xử lý bằng cách chuyển đổi các phần phụ trợ TFJS. Phần phụ trợ mặc định là WebGL, phù hợp với các hoạt động lớn, có thể song song hoá, nhưng ứng dụng này không thực hiện nhiều hoạt động như vậy trong giai đoạn tiền xử lý (op duy nhất mà ứng dụng này sử dụng là expandDims, không song song). Bạn có thể chuyển sang phần phụ trợ CPU để tránh độ trễ bổ sung khi di chuyển các tensor đến và đi từ GPU bằng cách thêm dòng này sau các lệnh nhập ở đầu tệp.
tf.setBackend(‘cpu');
Điều này cũng ảnh hưởng đến quá trình tiền xử lý cho mô hình CPU TFLite, được song song hoá, do đó, mô hình chạy chậm hơn nhiều khi có thay đổi này.
6. Tăng tốc mô hình CPU bằng WebNN
Nếu không có bộ tăng tốc Coral hoặc nếu chỉ muốn thử một cách khác để tăng tốc mô hình, bạn có thể sử dụng delegate WebNN TFLite. Uỷ quyền này sử dụng phần cứng học máy được tích hợp trong bộ xử lý Intel để tăng tốc quá trình suy luận mô hình bằng bộ công cụ OpenVINO. Do đó, nó có các yêu cầu bổ sung không được đề cập trong phần thiết lập của lớp học lập trình này và bạn sẽ cần cài đặt bộ công cụ OpenVINO. Hãy nhớ kiểm tra chế độ thiết lập của bạn dựa trên Các nền tảng hệ thống mục tiêu được hỗ trợ trước khi tiếp tục. Tuy nhiên, xin lưu ý rằng uỷ quyền WebNN hiện chưa hỗ trợ macOS.
Cài đặt bộ công cụ OpenVINO
Bộ công cụ OpenVINO sử dụng phần cứng học máy được tích hợp trong bộ xử lý Intel để tăng tốc các mô hình. Bạn có thể tải phiên bản được biên dịch sẵn xuống từ Intel hoặc tạo phiên bản đó từ nguồn. Có nhiều cách để cài đặt OpenVINO, nhưng cho mục đích của Lớp học lập trình này, bạn nên sử dụng tập lệnh trình cài đặt cho Windows hoặc Linux. Hãy nhớ cài đặt phiên bản thời gian chạy LTS 2021.4.2 vì các phiên bản khác có thể không tương thích. Sau khi chạy trình cài đặt, hãy nhớ định cấu hình các biến môi trường của trình bao như mô tả trong hướng dẫn cài đặt cho Linux hoặc Windows ( giải pháp lâu dài) hoặc bằng cách chạy lệnh setupvars.sh (Linux) hoặc setupvars.bat (Windows) nằm trong thư mục webnn-tflite-delegate.
Xác minh rằng Uỷ quyền WebNN đang hoạt động
Để xác minh rằng uỷ quyền WebNN đang hoạt động chính xác, hãy chạy các kiểm thử tích hợp cho gói webnn-tflite-delegate có trong thư mục gốc của kho lưu trữ. Để chạy các kiểm thử tích hợp, hãy chạy các lệnh sau trong thư mục của gói:
# In webnn-tflite-delegate/
npx yarn
npx yarn test-integration
Bạn sẽ thấy kết quả như sau:
WebNN delegate: WebNN device set to 0.
INFO: Created TensorFlow Lite WebNN delegate for device Default and power Default.
============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
label: wine bottle
score: 0.934505045413971
.
1 spec, 0 failures
Finished in 0.446 seconds
Randomized with seed 58441 (jasmine --random=true --seed=58441)
Done in 8.07s.
Nếu bạn thấy một kết quả như sau, thì tức là có lỗi về cấu hình:
Platform node has already been set. Overwriting the platform with node.
Randomized with seed 05938
Started
error Command failed with exit code 3221225477.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Đầu ra này có nghĩa là bạn chưa đặt các biến môi trường của OpenVINO. Hiện tại, bạn có thể thiết lập các biến này bằng cách chạy lệnh setupvars.sh (Linux) hoặc setupvars.bat (Windows), nhưng bạn có thể muốn thiết lập các biến này vĩnh viễn bằng cách làm theo hướng dẫn về Linux hoặc Windows ( giải pháp vĩnh viễn). Nếu bạn đang sử dụng Windows, hãy
setupvars.bat
không hỗ trợ Git bash, vì vậy, hãy nhớ chạy lệnh này và các lệnh khác trong lớp học lập trình này từ dấu nhắc lệnh của Windows.
Cài đặt Uỷ quyền WebNN
Sau khi cài đặt OpenVINO, bạn đã sẵn sàng tăng tốc mô hình CPU bằng WebNN. Phần này của lớp học lập trình được xây dựng dựa trên mã mà bạn đã viết trong phần "Chạy mô hình CPU trong ứng dụng". Bạn có thể sử dụng mã mà bạn đã viết trong bước này, nhưng nếu đã hoàn tất phần Coral, hãy sử dụng điểm kiểm tra cpu_inference_working để bắt đầu lại từ đầu.
Phần Node.js của uỷ quyền WebNN được phân phối trên npmjs. Để cài đặt, hãy chạy lệnh sau:
npm install --save webnn-tflite-delegate
Sau đó, hãy nhập uỷ quyền bằng cách thêm dòng này vào đầu tệp renderer.js:
CODELAB phần 2: Nhập uỷ quyền tại đây.
const {WebNNDelegate, WebNNDevice} = require('webnn-tflite-delegate');
Uỷ quyền WebNN hỗ trợ chạy trên CPU hoặc GPU; WebNNDevice cho phép bạn chọn sử dụng thiết bị nào.
Tải mô hình
Giờ đây, bạn đã sẵn sàng tải mô hình khi đã bật uỷ quyền WebNN. Đối với Coral, bạn phải tải một tệp mô hình khác, nhưng WebNN hỗ trợ cùng một định dạng mô hình như TFLite. Thêm WebNNDelegate vào danh sách các đại biểu được truyền đến mô hình để bật mô hình đó:
CODELAB phần 2: Tải mô hình uỷ quyền tại đây.
let webnnModel = await loadTFLiteModel(modelPath, {
delegates: [new WebNNDelegate({webnnDevice: WebNNDevice.DEFAULT})],
});
Bạn không cần tải lại nhãn vì đây là cùng một mô hình.
Thêm nút để chuyển đổi giữa CPU TfLite và WebNN
Giờ đây, khi phiên bản WebNN của mô hình đã sẵn sàng, hãy thêm một nút để chuyển đổi giữa suy luận WebNN và suy luận CPU TfLite. Việc chạy cả hai cùng lúc sẽ khiến bạn khó nhận thấy sự khác biệt về hiệu suất.
Thêm nút bằng mã này (lưu ý rằng nút này chưa thực sự chuyển đổi mô hình):
PHẦN HƯỚNG DẪN 2: Tạo nút uỷ quyền tại đây.
let useWebNNDelegate = false;
const divElem = document.createElement('div');
const toggleWebNNButton = document.createElement('button');
function toggleWebNN() {
useWebNNDelegate = !useWebNNDelegate;
toggleWebNNButton.innerHTML = useWebNNDelegate
? 'Using WebNN. Press to switch to TFLite CPU.'
: 'Using TFLite CPU. Press to switch to WebNN.';
divElem.hidden = useWebNNDelegate ? false : true;
}
toggleWebNNButton.addEventListener('click', toggleWebNN);
toggleWebNN();
document.body.appendChild(toggleWebNNButton);
document.body.appendChild(divElem);
Đoạn mã này cũng thêm một phần tử div mà bạn dùng để định cấu hình các chế độ cài đặt WebNN trong phần tiếp theo.
Thêm một trình đơn thả xuống để chuyển đổi giữa các thiết bị WebNN
WebNN hỗ trợ chạy trên CPU và GPU, vì vậy, hãy thêm một trình đơn thả xuống để chuyển đổi giữa hai loại này. Thêm mã này sau mã tạo nút:
// Create elements for WebNN device selection
divElem.innerHTML = '<br/>WebNN Device: ';
const selectElem = document.createElement('select');
divElem.appendChild(selectElem);
const webnnDevices = ['Default', 'GPU', 'CPU'];
// append the options
for (let i = 0; i < webnnDevices.length; i++) {
var optionElem = document.createElement('option');
optionElem.value = i;
optionElem.text = webnnDevices[i];
selectElem.appendChild(optionElem);
}
Bây giờ, nếu chạy ứng dụng, bạn sẽ thấy một trình đơn thả xuống liệt kê Default (Mặc định), GPU và CPU. Hiện tại, việc chọn một trong các lựa chọn này sẽ không có tác dụng gì vì trình đơn thả xuống chưa được kết nối. 
Thay đổi thiết bị bằng trình đơn thả xuống
Để kết nối trình đơn thả xuống để thay đổi thiết bị WebNN được dùng, hãy thêm một trình nghe vào sự kiện change của phần tử bộ chọn trình đơn thả xuống. Khi giá trị đã chọn thay đổi, hãy tạo lại mô hình WebNN bằng thiết bị WebNN tương ứng được chọn trong các lựa chọn uỷ quyền.
Thêm mã sau vào sau mã đã thêm trình đơn thả xuống:
selectElem.addEventListener('change', async () => {
let webnnDevice;
switch(selectElem.value) {
case '1':
webnnDevice = WebNNDevice.GPU;
break;
case '2':
webnnDevice = WebNNDevice.CPU;
break;
default:
webnnDevice = WebNNDevice.DEFAULT;
break;
}
webnnModel = await loadTFLiteModel(modelPath, {
delegates: [new WebNNDelegate({webnnDevice})],
});
});
Với thay đổi này, trình đơn thả xuống sẽ tạo một mô hình mới có chế độ cài đặt chính xác mỗi khi bạn thay đổi. Giờ là lúc kết nối mô hình WebNN và dùng mô hình này để suy luận.
Chạy mô hình WebNN
Mô hình WebNN đã sẵn sàng để sử dụng, nhưng nút chuyển đổi giữa WebNN và CPU TfLite chưa thực sự chuyển đổi mô hình. Để chuyển đổi mô hình, trước tiên, bạn cần đổi tên biến model từ khi tải mô hình CPU TfLite trong phần đầu tiên của lớp học lập trình.
Thay đổi dòng sau...
const model = await loadTFLiteModel(modelPath);
...để khớp với dòng này.
const cpuModel = await loadTFLiteModel(modelPath);
Khi đổi tên biến model thành cpuModel, hãy thêm biến này vào hàm run để chọn mô hình phù hợp dựa trên trạng thái của nút:
CODELAB phần 2: Kiểm tra xem có nên sử dụng uỷ quyền ở đây hay không.
let model;
if (useWebNNDelegate) {
model = webnnModel;
} else {
model = cpuModel;
}
Giờ đây, khi bạn chạy ứng dụng, nút này sẽ chuyển đổi giữa CPU TfLite và WebNN. 
Bạn cũng có thể chuyển đổi giữa suy luận WebNN CPU và GPU nếu có GPU Intel tích hợp.
Lưu ý về hiệu suất
Tốc độ khung hình mà bạn thấy bao gồm cả quá trình xử lý trước và xử lý sau, vì vậy, tốc độ này không thể hiện khả năng của WebNN. Bạn có thể hiểu rõ hơn về hiệu suất bằng cách nhấp vào đồng hồ đo FPS cho đến khi đồng hồ này hiển thị độ trễ (tính bằng mili giây), chỉ đo lường lệnh gọi đến model.predict. Tuy nhiên, điều đó vẫn bao gồm thời gian cần thiết để di chuyển các Tensor sang các liên kết C gốc của TFLite, vì vậy, đây không phải là một phép đo hoàn hảo.
7. Xin chúc mừng
Xin chúc mừng! Bạn vừa hoàn thành dự án Coral / WebNN đầu tiên bằng cách sử dụng tfjs-tflite-node trong Electron.
Hãy dùng thử và kiểm tra tính năng này trên nhiều hình ảnh. Bạn cũng có thể huấn luyện một mô hình mới trên Teachable Machine để phân loại một thứ hoàn toàn khác.
Tóm tắt
Trong lớp học lập trình này, bạn đã tìm hiểu:
- Cách cài đặt và thiết lập gói npm tfjs-tflite-node để chạy các mô hình TFLite trong Node.js.
- Cách cài đặt thư viện thời gian chạy Edge TPU để chạy các mô hình trên thiết bị Coral.
- Cách tăng tốc suy luận mô hình bằng cách sử dụng một TPU biên Coral.
- Cách tăng tốc suy luận mô hình bằng WebNN.
Tiếp theo là gì?
Giờ đây, khi đã có một cơ sở hoạt động để bắt đầu, bạn có thể nghĩ ra những ý tưởng sáng tạo nào để mở rộng trình chạy mô hình học máy này cho một trường hợp sử dụng thực tế mà bạn có thể đang thực hiện? Có thể bạn sẽ tạo ra một cuộc cách mạng trong ngành mà bạn đang làm việc bằng suy luận nhanh chóng và hợp lý, hoặc có thể bạn sẽ sửa đổi một chiếc máy nướng bánh mì để máy ngừng nướng khi bánh mì có vẻ vừa chín tới. Có vô vàn hành động để bạn lựa chọn.
Để tìm hiểu thêm về cách Teachable Machine huấn luyện mô hình mà bạn đã sử dụng, hãy xem lớp học lập trình của chúng tôi về Học chuyển giao. Nếu bạn đang tìm các mô hình khác hoạt động với Coral, chẳng hạn như nhận dạng giọng nói và ước tính tư thế, hãy xem coral.ai/models. Bạn cũng có thể tìm thấy các phiên bản CPU của những mô hình đó và nhiều mô hình khác trên TensorFlow Hub.
Chia sẻ những nội dung bạn tạo với chúng tôi
Bạn cũng có thể dễ dàng mở rộng những gì mình đã tạo hôm nay cho các trường hợp sử dụng sáng tạo khác. Chúng tôi khuyến khích bạn tư duy đột phá và tiếp tục khám phá.
Đừng quên gắn thẻ chúng tôi trên mạng xã hội bằng hashtag #MadeWithTFJS để có cơ hội xuất hiện trên blog TensorFlow hoặc thậm chí là các sự kiện trong tương lai. Chúng tôi rất mong được xem tác phẩm của bạn.