7.16. Tổng kết¶
Chương này đã đi qua các phần của ml mà một ứng dụng OpenMV cần đến khi bước suy luận là một phần của quy trình xử lý:
Khái niệm -- mạng nơ-ron là gì theo nghĩa số học (một ngăn xếp các toán tử có thể huấn luyện ánh xạ tensor sang tensor), học máy đã thay đổi gì so với xử lý ảnh cổ điển (thuật toán tóm tắt do con người viết đã biến mất, được thay thế bởi các trọng số học được từ dữ liệu có nhãn), và bản demo hello đã chạy bộ phát hiện khuôn mặt chỉ bằng vài dòng Python.
Module ml -- đối tượng
ml.Modelvà các thuộc tính của nó để kiểm tra các tensor đầu vào và đầu ra, các đường dẫn tệp mô hình mà nó chấp nhận, và nơi các tệp đó nằm: một phân vùng ROMFS chỉ đọc để thực thi trực tiếp từ bộ nhớ flash, hoặc bất kỳ hệ thống tệp MicroPython nào khác khi mô hình (ML) có thể được sao chép vào RAM lúc tải.Quy trình suy luận -- ba giai đoạn mà
predict()chạy theo thứ tự (tiền xử lý, gửi đến engine, hậu xử lý), bộ xử lýNormalizationở giai đoạn một, bộ xử lý hậu kỳ ở giai đoạn ba, và phép tính lượng tử hóa liên kết các tensor nguyên của camera trở lại với các số thực mà mạng đã được huấn luyện.Các engine suy luận -- TFLM (bộ thông dịch toán tử mà hầu hết các camera chạy), CMSIS-NN (thư viện kernel SIMD bên dưới nó trên Cortex-M), và các NPU (Ethos-U55 của Arm trên AE3 kết hợp với trình biên dịch offline Vela, Neural-ART của ST trên N6 kết hợp với STAI và STEdgeAI). Engine được cố định theo camera; tập lệnh không chọn nó.
Giải mã đầu ra -- các bộ xử lý hậu kỳ biến tensor đầu ra thô thành hộp giới hạn, điểm đặc trưng, hoặc danh sách theo từng lớp, lớp
NMSgộp các ứng viên chồng chéo, hướng dẫn YOLOv8 cho thấy cách giữ quá trình giải mã nhanh bằng cách áp ngưỡng trước khi giải lượng tử, và giao thức viết bộ giải mã tùy chỉnh khi danh mục không hỗ trợ mô hình (ML).
7.16.1. Những gì giờ đây có thể làm được¶
Ba điều mà chương này chuẩn bị cho:
Tải một mô hình đã huấn luyện và chạy nó. Bất cứ thứ gì trong
/rom/đều hoạt động mà không cần chuẩn bị thêm; bất cứ thứ gì được cung cấp bên ngoài dưới dạng.tflitetương thích sẽ hoạt động sau khi công cụ offline cho camera đích (Vela cho AE3, STEdgeAI cho N6) đã tạo ra bố cục đúng.Giải mã bất kỳ tensor đầu ra nào. Khi kiến trúc có trong danh mục, bộ xử lý hậu kỳ phù hợp rất đơn giản:
YoloV8cho mô hình (ML) YOLOv8,BlazeFacecho BlazeFace, và vân vân. Khi không có trong danh mục, giao thức writing-your-own trình bày hợp đồng và YOLOv8 walkthrough là tài liệu tham khảo sạch nhất để sao chép.Đánh giá hiệu năng. Một mô hình (ML) chạy ở 30 FPS trên NPU có thể chạy ở 3 FPS trên Cortex-M7; tỷ lệ này phụ thuộc vào mức độ camera có thể giảm tải mạng khỏi CPU. Lượng tử hóa, đặt vào ROMFS, biên dịch NPU, và độ phủ toán tử của engine đích là bốn đòn bẩy, và chương đã đề cập từng cái.
7.16.2. Huấn luyện mô hình của riêng bạn¶
Chương này bắt đầu từ một tệp .tflite đã được huấn luyện sẵn. Tạo một tệp như vậy cho tác vụ tùy chỉnh -- một tập hợp lớp đối tượng mới hay một bộ phân loại chuyên dụng -- không có nghĩa là phải xây dựng pipeline huấn luyện thủ công: hai dịch vụ lưu trữ bao phủ toàn bộ vòng lặp, từ thu thập và gán nhãn dữ liệu qua huấn luyện đến xuất mô hình mà camera có thể tải.
Edge Impulse -- nền tảng embedded-ML đầu-cuối; thu thập dữ liệu từ camera, gán nhãn, huấn luyện mô hình và xuất tệp
.tfliteđã lượng tử hóa, sẵn sàng cho bộ máy suy luận OpenMV.Roboflow -- quản lý tập dữ liệu và chú thích với huấn luyện lưu trữ, hướng tới phát hiện đối tượng; xuất mô hình YOLOv8 mà bộ hậu xử lý
YoloV8giải mã trực tiếp.
7.16.3. ML kết hợp với phần còn lại của camera¶
Một lần suy luận hiếm khi chạy độc lập. Module image chụp và tiền xử lý khung hình, module ml chạy mạng, và ulab.numpy thực hiện bất kỳ công việc số nào mà cả hai phía không có sẵn. Một tập lệnh phát hiện điển hình kết hợp cả ba: chụp bằng csi, tùy chọn điều chỉnh khung hình bằng image, chạy predict(), hậu xử lý kết quả bằng module phù hợp từ ml.postprocessing, và dùng ulab.numpy cho bất kỳ toán học tùy chỉnh nào mà ứng dụng muốn trên các hộp giới hạn mà bộ xử lý hậu kỳ trả về. Ba module dùng chung mô hình bộ nhớ; ranh giới giữa chúng là sao chép không (zero-copy) bất cứ khi nào có thể.