Trong thời đại số hóa ngày nay, việc nhận diện khuôn mặt không chỉ là một phần quan trọng của nhiều ứng dụng công nghệ, mà còn đóng vai trò quyết định trong việc cải thiện trải nghiệm người dùng và tăng cường an ninh. Tuy nhiên, việc triển khai các hệ thống nhận diện khuôn mặt trên các thiết bị nhúng với nguồn tài nguyên hạn chế đã gặp phải nhiều thách thức. Trong bối cảnh này, đề tài TinyML đã nổi lên như một giải pháp tiềm năng cho việc triển khai các mô hình máy học trên các thiết bị nhúng. Với sự kết hợp giữa tính nhỏ gọn, hiệu suất và tiêu thụ năng lượng thấp, đề tài TinyML đang trở thành một lựa chọn hấp dẫn cho việc xây dựng các hệ thống nhận diện khuôn mặt trên các thiết bị cấp thấp. Trong đề tài này chúng ta sẽ khám phá các cách để triển khai mô hình học máy lên trên vi điều khiển cụ thể là mô hình phát hiện khuân mặt. Hy vọng rằng đề tài sẽ cung cấp cái nhìn tổng quan và chi tiết về việc sử dụng TinyML trong ứng dụng nhận diện khuôn mặt, từ đó giúp đẩy mạnh sự phát triển của các hệ thống AI trên thiết bị nhúng và tạo ra những ứng dụng mới có ích trong cuộc sống hàng ngày.
TỔNG QUAN VỀ ĐỀ TÀI
Giới thiệu đề tài
Mục tiêu của dự án là tạo ra một hệ thống nhận diện khuôn mặt nhỏ gọn, hiệu quả và có khả năng hoạt động trực tiếp trên các thiết bị di động hoặc IoT Các ứng dụng tiềm năng của dự án này có thể làm nền tảng cho các hệ thống an ninh, xác thực người dùng, hoặc tạo trải nghiệm tương tác cá nhân hóa trong các ứng dụng di động.
Hình 1-1: Phát hiện khuân mặt
Dự án sẽ tập trung vào việc thu thập và xử lý dữ liệu khuôn mặt, huấn luyện một mô hình nhận diện khuôn mặt sử dụng các thuật toán học máy như CNN trênEdge Impulse, và sau đó triển khai mô hình đã huấn luyện trực tiếp trên các thiết bị nhúng cụ thể là ESP32 Cam
Cơ sở lý thuyết của đề tài
Trí tuệ nhân tạo (Artificial Intelligence - AI) là một lĩnh vực của khoa học máy tính và công nghệ thông tin tập trung vào việc phát triển các hệ thống hoạt động giống hoặc tốt hơn con người trong việc thực hiện nhiều nhiệm vụ thông minh.
Học máy (Machine Learning): Là một phương pháp trong trí tuệ nhân tạo, mà hệ thống máy tính được lập trình để tự động học từ dữ liệu mà không cần phải lập trình cụ thể cho từng nhiệm vụ Học máy giúp máy tính nhận biết mẫu trong dữ liệu và tạo ra các dự đoán hay quyết định.
Học sâu (Deep Learning): Là một phân nhánh của học máy, nơi mô hình máy tính có nhiều lớp (layer) để biểu diễn và học cách biểu diễn các khái niệm phức tạp. Đây là một phương pháp mạnh mẽ trong việc xử lý các nhiệm vụ như nhận diện hình ảnh, giọng nói hay ngôn ngữ tự nhiên.
Học có giám sát (Supervised Learning): Một dạng học máy trong đó mô hình máy tính được huấn luyện trên một tập dữ liệu đã được gán nhãn Mục tiêu là để dự đoán hoặc phân loại dữ liệu mới.
Học không giám sát (Unsupervised Learning): Một dạng học máy trong đó mô hình máy tính được huấn luyện trên một tập dữ liệu không có nhãn Mục tiêu là để tìm ra cấu trúc ẩn trong dữ liệu.
Học tăng cường (Reinforcement Learning): Một dạng học máy mà một hệ thống máy tính học từ trải nghiệm, thông qua thử và sai, để đạt được mục tiêu cụ thể
Mạng nơ-ron tích chập (Convolutional Neural Network - CNN) là một loại mạng nơ-ron sâu (deep neural network) thường được sử dụng trong các ứng dụng xử lý hình ảnh và thị giác máy tính CNN được thiết kế để tự động học và trích xuất các đặc trưng từ dữ liệu hình ảnh một cách hiệu quả.
Hình 1-3: Convolutional Neural Network – CNN
Một số khái niệm cơ bản về CNN:
Tích chập (Convolution): Là một phép toán trong xử lý tín hiệu, được sử dụng để áp dụng một bộ lọc (filter) qua từng phần của hình ảnh để tạo ra các feature map. Tích chập giúp mạng nơ-ron tự động học các đặc trưng như cạnh, góc, hoặc texture từ dữ liệu hình ảnh.
Lớp tích chập (Convolutional Layer): Là lớp chính của CNN, trong đó các bộ lọc được áp dụng qua dữ liệu đầu vào để tạo ra các feature map Mỗi bộ lọc trong lớp này sẽ tìm kiếm các đặc trưng cụ thể trong hình ảnh.
Lớp gộp (Pooling Layer): Là lớp được sử dụng để giảm kích thước của feature map bằng cách lấy giá trị trung bình hoặc giá trị lớn nhất từ các vùng nhỏ của feature map Điều này giúp giảm độ phức tạp của mạng và làm giảm lượng tính toán.
Hàm kích hoạt (Activation Function): Là một hàm phi tuyến tính được áp dụng sau mỗi lớp tích chập để thêm tính phi tuyến tính vào mô hình Hàm kích hoạt phổ biến nhất trong CNN là ReLU (Rectified Linear Unit).
Lớp kết nối đầy đủ (Fully Connected Layer): Là lớp cuối cùng của mạng, nơi các feature map được "flatten" thành một vector và đưa vào một hoặc nhiều lớp nơ-ron để thực hiện phân loại hoặc dự đoán.
Trong thời đại hiện nay của các thiết bị thông minh như camera trí tuệ nhân tạo (AI), máy giặt trí tuệ nhân tạo và các thiết bị điện tử AI khác, Machine Learning (ML) đóng vai trò quan trọng trong việc hiểu dữ liệu từ các cảm biến nhiễu Tuy nhiên, một thách thức lớn xuất phát khi làm việc với các thiết bị nhúng: chúng thường nhỏ gọn và hoạt động trên nguồn pin hạn chế Các mô hình Machine Learning truyền thống thường đòi hỏi tài nguyên tính toán đáng kể, khiến chúng không thích hợp cho việc triển khai trên các thiết bị chạy bằng pin Đây là lúc tiny Machine Learning (tinyML) xuất hiện.
TinyML là một nhánh chuyên biệt của Machine Learning tập trung vào việc phát triển và triển khai các mô hình Machine Learning trên các vi điều khiển nhỏ công suất, có tài nguyên hạn chế như các vi điều khiển được tìm thấy trong các bo mạch Arduino Bằng cách tối ưu hóa các thuật toán và kiến trúc mô hình, tinyML cho phép thực hiện các nhiệm vụ ML trực tiếp trên các vi điều khiển này, vượt qua các hạn chế về nguồn năng lượng và kích thước.
MLOps, viết tắt của Machine Learning Operations, là một tập hợp các thực tiễn và nguyên tắc nhằm tối ưu hóa và tự động hóa việc triển khai, giám sát và quản lý các mô hình ML trong môi trường sản xuất Mặc dù MLOps truyền thống thường được liên kết với các hệ thống ML quy mô lớn triển khai trong các trung tâm dữ liệu, các nguyên tắc của nó cũng hoàn toàn áp dụng cho các triển khai tinyML.
Công cụ và thiết bị cần thiết
Edge Impulse là một nền tảng phần mềm nhúng dựa trên trí tuệ nhân tạo (AI) được thiết kế để giúp các nhà phát triển xây dựng, huấn luyện và triển khai các mô hình máy học và trí tuệ nhân tạo trên các thiết bị nhúng Nền tảng này giúp các nhà phát triển tạo ra các ứng dụng thông minh trên các thiết bị nhúng, từ cảm biến đến vi điều khiển Với Edge Impulse, các nhà phát triển có thể dễ dàng xây dựng các ứng dụng thông minh như phát hiện động tác, nhận diện âm thanh, hoặc dự đoán dữ liệu từ các cảm biến, mà không cần có kiến thức chuyên sâu về trí tuệ nhân tạo hay lập trình nhúng.
Edge Impulse cung cấp một loạt các công cụ và tính năng để hỗ trợ quá trình phát triển và triển khai mô hình máy học như sau:
Thu thập dữ liệu: Edge Impulse cung cấp các công cụ để thu thập dữ liệu từ các cảm biến như camera, microphone, accelerometer và các loại cảm biến khác trên các thiết bị nhúng.
Tiền xử lý dữ liệu: Sau khi thu thập dữ liệu, Edge Impulse cho phép tiền xử lý dữ liệu để chuẩn hóa và làm sạch dữ liệu trước khi đưa vào huấn luyện mô hình.
.Huấn luyện mô hình: Edge Impulse cung cấp giao diện dễ sử dụng để huấn luyện mô hình máy học từ dữ liệu đã được tiền xử lý Người dùng có thể chọn từ các thuật toán máy học phổ biến như học sâu (deep learning), máy học có giám sát (supervised learning), hay các kỹ thuật khác như phân loại, phát hiện và dự đoán.
Kiểm tra và đánh giá mô hình: Edge Impulse cung cấp công cụ để kiểm tra và đánh giá hiệu suất của mô hình máy học trên dữ liệu thử nghiệm.
Triển khai trên thiết bị nhúng: Một điểm mạnh của Edge Impulse là khả năng triển khai mô hình máy học trực tiếp trên các thiết bị nhúng như microcontroller mà không cần kết nối Internet Điều này giúp giảm thiểu độ trễ (latency) và bảo vệ sự riêng tư của dữ liệu.
Quản lý mô hình: Edge Impulse cung cấp các công cụ để quản lý các mô hình máy học đã được huấn luyện và triển khai trên các thiết bị.
Thư viện ESP-DL bao gồm các thông số lượng tử hóa, định dạng bố cục dữ liệu và hỗ trợ cho các lớp tăng tốc.Cho phép triển khai các mô hình đã được đào tạo trên dòng chip ESP Cung cấp quy định về lượng tử hóa, định dạng dữ liệu và lớp tăng tốc hỗ trợ.
ONNX (Open Neural Network Exchange)
ONNX là định dạng mở để biểu diễn các mô hình học sâu.
Được sử dụng như một định dạng trung gian cho việc chuyển đổi giữa các framework học sâu khác nhau.
Lưu trữ cấu trúc và tham số của mô hình theo định dạng chuẩn.
TVM là khung biên dịch học sâu từ đầu đến cuối, hỗ trợ nhiều nền tảng phần cứng.
Hỗ trợ biên dịch và tối ưu hóa mô hình học sâu cho CPU, GPU và các chip tăng tốc khác.
Cung cấp công cụ biên dịch, bước tối ưu hóa và hỗ trợ thời gian chạy cho mô hình
ESP32-CAM là một mô-đun tích hợp camera và Wi-Fi dựa trên vi điều khiển ESP32 của Espressif Systems, được thiết kế để dễ dàng triển khai các ứng dụng IoT (Internet of Things) liên quan đến hình ảnh và video Dưới đây là một số điểm quan trọng về ESP32-CAM:
Camera: ESP32-CAM đi kèm với một camera OV2640 hoặc OV7670 Camera OV2640 có độ phân giải cao (2 megapixel) và chất lượng hình ảnh tốt Điều này làm cho mô-đun này phù hợp cho nhiều ứng dụng như giám sát, nhận diện khuôn mặt, hoặc nhận diện vật thể.
Hình 1-8: ESP32-CAM và sơ đồ chân
Vi điều khiển ESP32: ESP32 là một vi điều khiển mạnh mẽ với khả năng xử lý nhanh chóng và tích hợp các module Wi-Fi và Bluetooth Điều này cho phép ESP32- CAM kết nối với mạng Wi-Fi và truyền dữ liệu hình ảnh lên Internet hoặc điều khiển từ xa.
Kết nối Wi-Fi: ESP32-CAM có khả năng kết nối với mạng Wi-Fi, cho phép truy cập và điều khiển mô-đun từ xa qua Internet Điều này làm cho nó trở thành một lựa chọn lý tưởng cho các ứng dụng giám sát từ xa hoặc gửi hình ảnh đến máy chủ.
Giao tiếp: Mô-đun ESP32-CAM có các chân GPIO (General Purpose Input/Output) để kết nối với các thiết bị ngoại vi như cảm biến, màn hình hoặc các module khác Nó cũng hỗ trợ giao tiếp SPI, I2C và UART.
Linh hoạt và dễ sử dụng: ESP32-CAM có thể lập trình bằng Arduino IDE hoặc PlatformIO, hai môi trường lập trình phổ biến cho vi điều khiển ESP32 Nó cũng hỗ trợ việc lập trình bằng MicroPython, một ngôn ngữ lập trình dễ học và dễ sử dụng. Ứng dụng: ESP32-CAM có thể được sử dụng trong nhiều ứng dụng như giám sát nhà, hệ thống an ninh, máy ảnh tự động, hệ thống nhận diện, và nhiều ứng dụng khác liên quan đến hình ảnh và video trong môi trường IoT.
Arduino IDE (Integrated Development Environment) là một môi trường phát triển tích hợp được thiết kế đặc biệt cho việc lập trình và nạp chương trình vào các bo mạch Arduino Đây là một công cụ phổ biến và dễ sử dụng cho người mới bắt đầu và cũng được sử dụng rộng rãi trong cộng đồng DIY (tự làm) và IoT Dưới đây là một số điểm quan trọng về Arduino IDE:
HƯỚNG DẪN TIẾN HÀNH
Triển khai mô hình phát hiện khuân mặt trên nền tảng Edge Impulse
Tại giao diện chính của Edge Impulse, chúng ta sẽ lựa chọn “create new project” tại vị trí số 1 và chọn các tuỳ chọn như trong hình 6 Khi đã đặt xong các tuỳ chọn của bản thân thì ta sẽ nhấn vị trí số 2 để tạo project.
Hình 2-11: Giao diện tạo project
Hình 2-12: Giao diện chính của project Edge Impulse
Trong giao diện chính của project chúng ta cần phải chú ý một chỗ như trong ảnh dưới đây:
Hình 2-13: Lựa chọn Labeling method
Labeling method (phương pháp gắn nhãn) là quy trình xác định nhãn cho các mẫu dữ liệu trong một tập dữ liệu Quá trình này là quan trọng trong học máy và trí tuệ nhân tạo để huấn luyện và kiểm định các mô hình Cụ thể, labeling method xác định rõ ràng cách gắn nhãn cho dữ liệu Các nhãn có thể là các danh mục, loại, hoặc các giá trị có thể được dùng để phân loại hoặc dự đoán.
Việc lựa chọn Labeling method sẽ ảnh hưởng trực tiếp đến phương pháp training model về sau Cụ thể là “One label per data item” sẽ chỉ yêu cầu ta đặt nhãn cho dữ liệu, còn “Bounding boxes” sẽ yêu cầu phải vẽ 1 lớp mask cụ thể cho dữ liệu để train Trong bài này chúng ta chọn phương án chỉ đặt nhãn cho dữ liệu.
Sau khi đã lựa chọn xong, chúng ta click đúp vào “add existing data” để tiến hành thêm dữ liệu vào project.
Hình 2-15: Data giao diện phần thêm
Trong giao diện thêm data, lựa chọn theo hướng sau “add data” >” Upload data” và ta sẽ đến giao diện sau
Có 2 chế độ upload, 1 là upload theo file( tự chọn ), 2 là upload cả folder Tuỳ vào việc bạn sắp xếp dữ liệu có thể chọn cách phù hợp nhất cho bản thân.
Trong tệp data sẽ có 2 phần riêng biệt: Train và Test Tệp train sẽ được sử dụng trực tiếp để làm dữ liệu huấn luyện cho model còn dữ liệu test sẽ được sử dụng để kiểm tra mức độ chính xác về kết quả của model sau khi được train xong Khi upload data có thể để auto hoặc là lựa chọn khu vực up theo cách setup data của bản thân.
Hình 2-17: Giao diện sau khi được upload data
Hình 2-18: Giao diện sau khi được upload data ( Bounding boxes )
Bước gán nhãn (labeling) trong quá trình xử lý dữ liệu là một phần quan trọng để chuẩn bị dữ liệu cho việc huấn luyện mô hình máy học Cụ thể, bước này được thực hiện với mục đích sau Phân loại dữ liệu: Gán nhãn giúp phân loại các mẫu dữ liệu vào các nhóm, lớp, hoặc danh mục khác nhau Điều này làm cho dữ liệu trở nên có tổ chức hơn và dễ dàng quản lý hơn Huấn luyện mô hình máy học: Mô hình máy học cần biết đâu là đầu vào (input) và nhãn tương ứng (output) để học từ dữ liệu Bằng cách gán nhãn cho các mẫu dữ liệu, chúng ta cung cấp thông tin cho mô hình về nhãn mà nó cần dự đoán Tạo ra thông tin thống kê và phân tích: Gán nhãn cũng cho phép chúng ta thực hiện các phân tích và thống kê trên dữ liệu theo các nhóm hoặc lớp khác nhau. Ấn vào dấu tuỳ chọn trên mỗi một mẫu data để hiện tuỳ chọn “edit label” như hình 2-9 hướng Bounding boxes.
Hình 2-19: Tuỳ chọn edit label
Tại giao diện như hình 2-10 chúng ta sẽ click giữ chuột trái và kéo 1 lớp mask vào vật thể mà chúng ta muốn nhận diện sau đó nhấn save là xong edit label Chúng ta sẽ làm như vậy với toàn bộ dữ liệu.
Hình 2-20: giao diện edit label
Thực tế khi add dữ liệu thì có thể nhấn trực tiếp vào “Labeling queue” để chỉnh sửa nhanh Các bước làm vẫn như trên.
Về cơ bản các bước sẽ không khác gì so với hướng Bounding boxes, điểm khác nhau bây giờ là ta chỉ cần đặt tên label của dữ liệu.
Hình 2-22: Đặt tên Label cho data
"Impulse design" trong Edge Impulse là quá trình thiết kế và tạo ra các mô hình AI trên nền tảng này Đây là một bước quan trọng trong quá trình train model, nó sẽ setup phần đầu vào và xử lý dữ liệu cho quá trình train model
Khối Image data: sẽ chỉnh sửa lại kích thước của data thành một loạt dữ liệu có cùng kích thước giống nhau
Khối processing block: lựa chọn Image vì đó là loại dữ liệu mà người dùng add vào
Khối learning block: lựa chọn transfer learning vì đây là loại sẽ hỗ trợ tối đa cho huấn luyện đa label
Hình 2-23: Create Impulse sau khi setup
Trong phần này chúng ta sẽ lựa chọn loại thông số cho ảnh: grayscale hoặc sRGB ( ảnh màu ) Nên chọn grayscale để tối ưu dung lượng.
Hình 2-24: Lựa chọn thông số ảnh
Sau bước “ Save parameters “ thì ta sẽ được đưa tới cửa sổ “ Generate feature “ Tại đây Edge Impulse sẽ tạo ra các đặc trưng (features) từ dữ liệu đầu vào để sử dụng cho việc huấn luyện mô hình Các đặc trưng là các thuộc tính hoặc các biến số mô tả dữ liệu, và chúng được sử dụng để đại diện cho các mẫu dữ liệu trong không gian đặc trưng Quá trình này là quan trọng bởi vì chất lượng và sự phong phú của các đặc trưng có thể ảnh hưởng lớn đến hiệu suất của mô hình.
Hình 2-25: Bản đồ Feature Map sau khi tạo
2.1.6 Tranfer Learning (bước training) Đây là bước cuối cùng trong việc train model nhận diện của đề tài Tại đây có một số thứ chúng ta cần phải chú ý:
Number of training cycles: là một tham số quan trọng quyết định số lần mà mô hình sẽ được huấn luyện trên dữ liệu Mỗi lần huấn luyện được gọi là một "cycle" hoặc một "epoch" Mỗi cycle, mô hình sẽ đi qua toàn bộ tập dữ liệu đào tạo một lần, cập nhật các trọng số (weights) dựa trên sự sai khác giữa dự đoán của mô hình và nhãn thực tế Khi số lượng training cycles tăng, mô hình có cơ hội học được thông tin từ dữ liệu đào tạo nhiều hơn và có thể cải thiện hiệu suất của nó.
Learing rate: Tốc độ học của Model sẽ ảnh hưởng đến khả năng chính xác của model Tốc độ học càng thấp thì kết quả chính xác về đầu ra sẽ càng cao
Lựa chọn mô hình mạng neutron: Đây là một bước quan trọng liên quan đến kết quả của quá trình train và mức độ tương thích với thiết bị mà ta muốn sử dụng Cụ thể như sau:
MobileNetV2: Đây là tên của mô hình mạng neural, được sử dụng để xây dựng bộ phân loại trong Edge Impulse MobileNetV2 là một mạng neural architecture được thiết kế đặc biệt cho các thiết bị di động, với kích thước nhỏ gọn và khả năng phân loại ảnh nhanh chóng.
96x96: Đây là kích thước của ảnh đầu vào mà mô hình yêu cầu Trong trường hợp này, kích thước của mỗi ảnh đầu vào là 96x96 pixel.
0.35: Đây là hệ số alpha của mô hình MobileNetV2, quyết định về kích thước của mạng neural Giá trị này thường được chọn để điều chỉnh độ phức tạp của mô hình và dung lượng bộ nhớ, với giá trị thấp hơn sẽ tạo ra một mạng neural nhỏ hơn và dễ dàng triển khai trên các thiết bị có tài nguyên hạn chế.
Final layer: 10 neurons, 0.1 dropout: Đây là phần quan trọng của mô hình, mô tả kiến trúc của lớp cuối cùng của mạng neural, thường là một lớp fully connected layer.
Hình 2-26: Setup và kết quả sau khi train
Triển khai mô hình phát hiện khuân mặt dựa trên thư viện ESP-DL
Trong phần này ta sẽ triển khai mô hình phát hiện khuân mặt trên chính esp32 cam thông qua thư viện ESP-DL của hãng Espressif Đầu tiên ta sẽ chạy mô hình phát hiện khuân mặt được xây dựng sẵn trong model zoo của hàng, tiếp theo ta tự tạo một mô hình riêng cho mình.
Bước 1: Truy cập vào đường dẫn sau để tải phần mềm https://dl.espressif.com/dl/esp- idf/.
Bước 2: Click chuột vào file vừa tài và tiến hành cài đặt phần mềm như bình thường, mặc định ta bấm next hết.
Hình 2-34: Cài đặt esp-idf
Bước 3: Sau khi cài đặt phần mềm ta có 2 thứ cần quan tâm là ESP-IDF và Espressif-IDE
Hình 2-35: Tool và IDE của ESP-DIF
ESP-IDF là một công cụ của hãng Espressif được viết bằng python giúp chúng ta tạo ra môi trường có thể xây dựng chương trình của mình qua terminal Ta có thể sử dụng các trình soạn thảo quen thuộc như notepad++, Vscode, … để có thẻ viết chương trình và dùng công cụ này để xây dựng chương trình.
Espressif-IDE tích hợp sẵn cho ta từ việc soạn thảo đến việc build và flash chương trình thông qua giao diện dễ dàng tiếp cận với người mới.
2.3 Chạy mô hình phát hiện khuân mặt trong model zoo
Bước 1: Click vào biểu tượng để tiên hành mờ ESP-IDF tools Tải mã nguồn esp-who: git clone recursive https://github.com/espressif/esp-who.git
Hình 2-36: Tải mã nguồn ESP-DL
Bước 2: Di chuyển vào thư mục cd \esp-who\examples\human_face_detect\terminal
Bước 3: Kết mối esp32cam với máy tính gõ lệnh idf.py set-target esp32s2
Bước 4: Nạp và build chương trình idf.py build flash monitor
Hình 2-37: Phát hiện khuân mặt thành công
2.4 Xây dựng một mô hình riêng
2.4.1 Chuyển đổi mô hình sang định dạng ONNX
ONNX là viết tắt của Open Neural Network Exchange, là một công cụ đóng vai trò như một trung gian hỗ trợ chuyển đổi mô hình học máy từ các framework khác nhau về dạng ONNX cung cấp nhờ đó giúp chúng ta chuyển đổi dễ dàng giữa các framework khác nhau ONNX hỗ trợ chuyển đổi giữa nhiều framework phổ biến hiện nay như Keras, Tensorfow, Scikit-learn, Pytorch và XGBoost.
Vậy ONNX có bí quyết gì để thực hiện điều đó:
Cung cấp đồ thị biểu diễn chuẩn: Mỗi framework khác nhau sẽ có đồ thị biểu diễn tính toán khác nhau ONNX cung cấp một đồ thị chuẩn được biểu diễn bằng nhiều nút tính toán có thể biểu diễn đồ thị của tất cả framework.
Cách chuyển đổi mô hình
Cung cấp kiểu dữ liệu chuẩn: ONNX cung cấp các kiểu dữ liệu chuẩn bao gồm int8,int16, float16,
Cung cấp các hàm chuẩn: ONNX cung cấp các hàm có thể chuyển đổi với các hàm tương ứng trong framework mong muốn Ví dụ hàm softmax trong torch sẽ được chuyển tương ứng thành hàm softmax trong ONNX.
ONNX cung cấp hai kiểu chuyển đổi:
Trace-based: cung cấp cho mô hình một đầu vào và tiến hành chạy mô hình Các hàm (operators) được mô hình dùng trong quá trình chạy sẽ được lưu vết lại Có một chú ý nếu mô hình của bạn là mô hình động ví dụ như mô hình sẽ dùng các hàm khác nhay tùy dữ liệu đầu vào thì mô hình sau khi chuyển đổi sẽ không chính xác.
Script-based: ở dạng này, mô hình sẽ được export như ScriptModule.
2.4.1.2 Cách chuyển đổi mô hình Để thu nhỏ (quantization) dựa trên định dạng mô hình trí tuệ nhân tạo mã nguồn mở ONNX Các mô hình được đào tạo trên các nền tảng khác cần được chuyển đổi sang định dạng ONNX để sử dụng toolkit này.
Lấy ví dụ với nền tảng TensorFlow Để chuyển đổi mô hình TensorFlow đã được đào tạo sang định dạng mô hình ONNX, bạn có thể sử dụng tf2onnx trong một kịch bản model_proto, _ = tf2onnx.convert.from_keras(tf_model, input_signature=spec, opset, output_path="mnist_model.onnx")
tf2onnx là công cụ hỗ trợ chuyển đổi mô hình TensorFlow sang định dạng ONNX.
tf_model là mô hình TensorFlow đã được đào tạo mà bạn muốn chuyển đổi.
input_signature là chữ ký đầu vào của mô hình, giúp tf2onnx hiểu cấu trúc đầu vào của mô hình TensorFlow.
opset là phiên bản của tập toán tử ONNX sẽ được sử dụng, ở đây là 13.
output_path là đường dẫn nơi tệp mô hình ONNX sẽ được lưu trữ, trong ví dụ này là "mnist_model.onnx".
2.4.2 Tiền xử lý mô hình (Preprocess the Model)
Di chuyển vào thư mục esp-dl\tutorial\tvm_example để thực hiện thử các tool dưới đây.
Trong TinyML, quá trình preprocess đóng vai trò rất quan trọng, nó giúp làm sạch và chuẩn bị dữ liệu thô để tiếp tục xử lý Nói cách khác, preprocess là bước cần thiết để làm cho dữ liệu thô phù hợp để sử dụng trong việc huấn luyện một mô hình học máy Đặc biệt khi làm việc với các dự án TinyML, do cấu hình phần cứng giới hạn (như bộ nhớ, tốc độ xử lý, vv), preprocess dữ liệu trở nên quan trọng hơn nữa Có thể sử dụng các kỹ thuật tiền xử lý dữ liệu như loại bỏ giá trị trống, chuẩn hóa dữ liệu, chuyển đổi định dạng dữ liệu, vv.
Trong quá trình tiền xử lý, một loạt thao tác sẽ được thực hiện trên mô hình float32 để chuẩn bị cho lượng tử hóa python -m onnxruntime.quantization.preprocess input model.onnx output model_opt.onnx
input: Chỉ định đường dẫn của tệp mô hình float32 cần xử lý.
output: Chỉ định đường dẫn của tệp mô hình float32 đã xử lý.
Tiền xử lý bao gồm các bước sau đây (không bắt buộc):
Suy diễn Hình dạng Ký hiệu: Suy diễn hình dạng của các tensor đầu vào và đầu ra Suy diễn hình dạng biểu tượng có thể giúp xác định hình dạng của tensor trước khi suy diễn, để thực hiện tốt hơn việc tối ưu hóa và xử lý tiếp theo.
Tối ưu hóa Mô hình ONNX Runtime: Tối ưu hóa mô hình với ONNX Runtime, một máy công cụ suy diễn hiệu suất cao có thể tối ưu hóa mô hình cho phần cứng và nền tảng cụ thể để cải thiện tốc độ và hiệu quả suy diễn Các mô hình có thể được tối ưu hóa bằng các kỹ thuật như tối ưu hóa đồ thị, kết hợp kernel, lượng tử hóa để thực hiện tốt hơn.
Suy diễn hình dạng ONNX: Suy luận hình dạng của tensor dựa trên mô hình định dạng ONNX để hiểu và tối ưu hóa mô hình tốt hơn ONNX shape inference có thể phân bổ hình dạng chính xác cho các tensor trong mô hình và giúp với việc tối ưu hóa và suy diễn tiếp theo.
2.4.3 Lượng tử hóa mô hình (Quantize the Mode)
Mô hình chầm phẩy động (floating-point model) là một loại mô hình trong đó các tham số và tính toán được biểu diễn bằng số thực dạng chấm động, cho phép biểu diễn các giá trị với độ chính xác cao Tuy nhiên, khi chạy mô hình trên các thiết bị nhúng hoặc chip có hạn chế về tài nguyên tính toán, việc sử dụng mô hình chầm phẩy động có thể gây ra tốn kém về hiệu suất và tài nguyên. Để giảm tải cho các thiết bị có tài nguyên hạn chế, mô hình chầm phẩy động thường được chuyển đổi sang mô hình số cố định (fixed-point model) thông qua quá trình định lượng (quantization) Quá trình định lượng giúp giảm độ phức tạp tính toán bằng cách biểu diễn các tham số và tính toán bằng các giá trị số nguyên hoặc số cố định, giúp tăng tốc độ tính toán và giảm tải cho các thiết bị nhúng. Để chuyển đổi mô hình học sâu dạng chấm động đã được huấn luyện sang mô hình số cố định để triển khai nhanh chóng trên chip, ta có thể tuân theo các bước tổng quát dưới đây. Định lượng sau quá trình huấn luyện
Việc sử dụng máy tính có cấu hình cao trong quá trình huấn luyện mô hình sẽ giúp tối ưu hóa quá trình đào tạo và đạt được kết quả tốt hơn Khi đã có một mô hình đã được huấn luyện trên máy tính cấu hình cao, việc áp dụng định lượng sau quá trình huấn luyện có thể giúp tối ưu hóa mô hình cho việc triển khai trên các thiết bị có tài nguyên tính toán hạn chế mà vẫn giữ được hiệu suất tốt.