Summary
Bài viết này khám phá cách xây dựng một hệ thống nhận diện cử chỉ thời gian thực bằng Raspberry Pi, mở ra những khả năng tương tác mới giữa người và máy. Đặc biệt, nó mang đến cái nhìn sâu sắc về những công nghệ tiên tiến đang được áp dụng trong lĩnh vực này. Key Points:
- Tích hợp AI tiên tiến giúp nhận diện cử chỉ đa dạng và chính xác hơn, cho phép phân biệt các biểu cảm phức tạp.
- Ứng dụng công nghệ sensor fusion với nhiều loại cảm biến để cải thiện độ tin cậy trong điều kiện thực tế khó khăn.
- Tối ưu hóa xử lý dữ liệu thời gian thực trên Raspberry Pi với các kỹ thuật tối ưu hóa và tăng hiệu suất.
Giới thiệu về hệ thống nhận diện cử chỉ thời gian thực
## Giới thiệu
Lần đầu tiên tôi thử Apple Vision Pro, tôi đã được giới thiệu về thế giới tương tác giữa người và máy tính, đặc biệt là giao diện người dùng tự nhiên (NUIs) và sự tương tác giữa con người với AI. Điều này khiến tôi suy nghĩ: thật tuyệt vời nếu có thể điều khiển các thiết bị hàng ngày như điều hòa nhiệt độ, TV, máy pha cà phê hay thậm chí là PC chỉ bằng tay không? Không cần remote. Không cần nút bấm. Không cần màn hình cảm ứng. Chỉ đơn giản là tương tác tự nhiên và không chạm - cách thoải mái nhất để giao tiếp với các thiết bị xung quanh nhà chúng ta.
Gần đây, khi có trong tay một chiếc Raspberry Pi, tôi quyết định đi sâu vào các ứng dụng AI Edge thực tế và từ đó, ý tưởng của tôi đã thành hiện thực: xây dựng một **hệ thống điều khiển dựa trên cử chỉ tay** hoàn chỉnh. Hệ thống này hoạt động hoàn toàn trên Raspberry Pi với dữ liệu thu thập từ cảm biến gia tốc và con quay hồi chuyển - không sử dụng camera để bảo vệ quyền riêng tư. Trong tương lai, tôi sẽ phát triển hệ thống này hơn nữa để nhận diện nhiều cử chỉ hơn và khám phá thêm các cảm biến khác như radar, âm thanh và ToF (Time-of-Flight) nhằm nâng cao khả năng của nó.
Vì vậy, hãy theo dõi hành trình phát triển dự án thú vị này cùng tôi! Trong bài viết này, tôi sẽ chia sẻ toàn bộ quá trình: từ việc thu thập dữ liệu chuyển động cho đến việc đào tạo mô hình học sâu và cuối cùng là triển khai nó cho nhận diện cử chỉ thời gian thực ngay tại chỗ.
Lần đầu tiên tôi thử Apple Vision Pro, tôi đã được giới thiệu về thế giới tương tác giữa người và máy tính, đặc biệt là giao diện người dùng tự nhiên (NUIs) và sự tương tác giữa con người với AI. Điều này khiến tôi suy nghĩ: thật tuyệt vời nếu có thể điều khiển các thiết bị hàng ngày như điều hòa nhiệt độ, TV, máy pha cà phê hay thậm chí là PC chỉ bằng tay không? Không cần remote. Không cần nút bấm. Không cần màn hình cảm ứng. Chỉ đơn giản là tương tác tự nhiên và không chạm - cách thoải mái nhất để giao tiếp với các thiết bị xung quanh nhà chúng ta.
Gần đây, khi có trong tay một chiếc Raspberry Pi, tôi quyết định đi sâu vào các ứng dụng AI Edge thực tế và từ đó, ý tưởng của tôi đã thành hiện thực: xây dựng một **hệ thống điều khiển dựa trên cử chỉ tay** hoàn chỉnh. Hệ thống này hoạt động hoàn toàn trên Raspberry Pi với dữ liệu thu thập từ cảm biến gia tốc và con quay hồi chuyển - không sử dụng camera để bảo vệ quyền riêng tư. Trong tương lai, tôi sẽ phát triển hệ thống này hơn nữa để nhận diện nhiều cử chỉ hơn và khám phá thêm các cảm biến khác như radar, âm thanh và ToF (Time-of-Flight) nhằm nâng cao khả năng của nó.
Vì vậy, hãy theo dõi hành trình phát triển dự án thú vị này cùng tôi! Trong bài viết này, tôi sẽ chia sẻ toàn bộ quá trình: từ việc thu thập dữ liệu chuyển động cho đến việc đào tạo mô hình học sâu và cuối cùng là triển khai nó cho nhận diện cử chỉ thời gian thực ngay tại chỗ.
Tìm hiểu về Giao diện Người-Máy Tự Nhiên
Để hiểu về **Giao diện Người-Máy Tự Nhiên (NUI)**, trước tiên chúng ta cần nắm rõ lĩnh vực rộng lớn hơn mà nó thuộc về - **Tương tác Người-Máy (HCI)**. HCI tập trung vào việc thiết kế những cách tương tác tự nhiên và trực quan hơn cho con người với công nghệ. Đây chính là lý do mà chúng ta có màn hình cảm ứng thay vì dòng lệnh, trợ lý giọng nói thay vì nút bấm, và các giao diện phản hồi lại cử chỉ, ánh mắt hay thậm chí là cảm xúc của người sử dụng. Khi công nghệ ngày càng thông minh hơn, cách chúng ta tương tác với nó cũng đã có nhiều sự thay đổi. Chúng ta đã từ việc gõ lệnh chuyển sang chạm màn hình, rồi giờ đây chỉ cần vẫy tay hay nói lên tiếng để thực hiện thao tác. Sự chuyển mình này hướng tới những trải nghiệm liền mạch và giống như con người chính là mục tiêu của NUIs.
**Nguyên lý hoạt động** của NUIs thường dựa trên việc nhận diện cử chỉ thông qua các cảm biến như camera hoặc cảm biến hồng ngoại kết hợp với thuật toán xử lý hình ảnh để phân tích hành động của người dùng. Các **vật liệu sử dụng** trong hệ thống này bao gồm camera ghi nhận hình ảnh, cảm biến hồng ngoại giúp phát hiện chuyển động, cùng với các thiết bị như Raspberry Pi đóng vai trò điều khiển và xử lý dữ liệu.
Về mặt **ứng dụng thực tiễn**, NUIs đang được áp dụng trong nhiều lĩnh vực khác nhau như y tế – nơi mà bác sĩ có thể tương tác với phần mềm bằng cử chỉ trong khi giữ tay sạch sẽ; giáo dục – nơi học sinh có thể tham gia vào bài học một cách năng động hơn; hoặc giải trí – nơi game thủ có thể điều khiển trò chơi chỉ bằng những cử chỉ đơn giản. Những ứng dụng này không chỉ làm nổi bật tính khả thi của Giao diện Người-Máy Tự Nhiên mà còn thể hiện sự tiến bộ vượt bậc trong công nghệ giao tiếp giữa con người và máy móc.
**Nguyên lý hoạt động** của NUIs thường dựa trên việc nhận diện cử chỉ thông qua các cảm biến như camera hoặc cảm biến hồng ngoại kết hợp với thuật toán xử lý hình ảnh để phân tích hành động của người dùng. Các **vật liệu sử dụng** trong hệ thống này bao gồm camera ghi nhận hình ảnh, cảm biến hồng ngoại giúp phát hiện chuyển động, cùng với các thiết bị như Raspberry Pi đóng vai trò điều khiển và xử lý dữ liệu.
Về mặt **ứng dụng thực tiễn**, NUIs đang được áp dụng trong nhiều lĩnh vực khác nhau như y tế – nơi mà bác sĩ có thể tương tác với phần mềm bằng cử chỉ trong khi giữ tay sạch sẽ; giáo dục – nơi học sinh có thể tham gia vào bài học một cách năng động hơn; hoặc giải trí – nơi game thủ có thể điều khiển trò chơi chỉ bằng những cử chỉ đơn giản. Những ứng dụng này không chỉ làm nổi bật tính khả thi của Giao diện Người-Máy Tự Nhiên mà còn thể hiện sự tiến bộ vượt bậc trong công nghệ giao tiếp giữa con người và máy móc.
Extended Perspectives Comparison:
Kết luận | Chi tiết |
---|---|
Số liệu thu thập | 20.000 điểm dữ liệu, 250 điểm cho mỗi cử chỉ, tổng cộng 80 mẫu cử chỉ được gán nhãn. |
Quá trình tiền xử lý | Phân đoạn, lọc và chuẩn hóa dữ liệu là quan trọng để đảm bảo mô hình hoạt động chính xác. |
Vấn đề với cửa sổ trượt | Cửa sổ trượt gây ra việc bỏ lỡ phần bắt đầu hoặc kết thúc của cử chỉ, dẫn đến tiếng ồn trong dữ liệu. |
Lọc tín hiệu | Mô hình hoạt động tốt hơn với dữ liệu chưa qua lọc (85.94% độ chính xác) so với dữ liệu đã qua lọc (81.25%). |
Chuẩn hóa dữ liệu | Chỉ sử dụng chuẩn hóa như một điều chỉnh tín hiệu duy nhất trước khi huấn luyện nhằm tránh ưu tiên sai cảm biến. |

Tổng quan về hệ thống nhận diện cử chỉ tay
Tổng quan, tôi đã phát triển một hệ thống có khả năng nhận diện bốn cử chỉ tay chính: **lên**, **xuống**, **quẹt trái** và **quẹt phải**. Những cử chỉ này có thể được sử dụng như những lệnh đơn giản và trực quan để tương tác với các thiết bị kỹ thuật số. Mục tiêu của dự án là tạo ra một phương pháp điều khiển không chạm mà nhẹ nhàng, thoải mái, tiết kiệm chi phí và tôn trọng quyền riêng tư. Hệ thống hoàn toàn hoạt động trên Raspberry Pi và được thiết kế để chạy trong thời gian thực, phù hợp cho việc sử dụng hàng ngày.
Trong phần tiếp theo của bài viết này, tôi sẽ hướng dẫn bạn qua các bước chính trong quá trình phát triển hệ thống, bao gồm: ⚙️ Thiết lập phần cứng 📈 Thu thập dữ liệu cảm biến 🧹 Tiền xử lý 🧠 Đào tạo mô hình 🚀 Triển khai trên thiết bị biên 👋💡 Kết nối hệ thống với thế giới bên ngoài.
Hệ thống này sử dụng cảm biến như camera hoặc cảm biến hồng ngoại để thu thập thông tin về cử chỉ tay. Để cải thiện độ chính xác, tôi đã áp dụng các thuật toán xử lý hình ảnh như OpenCV kết hợp với Machine Learning. Việc lựa chọn vật liệu cũng rất quan trọng; việc sử dụng Raspberry Pi cùng với một mô-đun camera chất lượng cao giúp tăng khả năng nhận diện trong môi trường thực tế. Tính linh hoạt và ứng dụng đa dạng của hệ thống mở ra nhiều cơ hội mới cho tương tác giữa con người và máy móc.
Trong phần tiếp theo của bài viết này, tôi sẽ hướng dẫn bạn qua các bước chính trong quá trình phát triển hệ thống, bao gồm: ⚙️ Thiết lập phần cứng 📈 Thu thập dữ liệu cảm biến 🧹 Tiền xử lý 🧠 Đào tạo mô hình 🚀 Triển khai trên thiết bị biên 👋💡 Kết nối hệ thống với thế giới bên ngoài.
Hệ thống này sử dụng cảm biến như camera hoặc cảm biến hồng ngoại để thu thập thông tin về cử chỉ tay. Để cải thiện độ chính xác, tôi đã áp dụng các thuật toán xử lý hình ảnh như OpenCV kết hợp với Machine Learning. Việc lựa chọn vật liệu cũng rất quan trọng; việc sử dụng Raspberry Pi cùng với một mô-đun camera chất lượng cao giúp tăng khả năng nhận diện trong môi trường thực tế. Tính linh hoạt và ứng dụng đa dạng của hệ thống mở ra nhiều cơ hội mới cho tương tác giữa con người và máy móc.
Cách thiết lập phần cứng cho dự án
Trong phần thiết lập phần cứng cho dự án, tôi đã có một cảm giác thú vị khi bắt đầu xây dựng. Tôi quyết định sử dụng Raspberry Pi 4 làm bộ xử lý chính và kết hợp với module cảm biến GY-85, bao gồm cảm biến gia tốc (ADXL345), con quay hồi chuyển (ITG-3205) và từ kế (HMC5883L). Với việc sử dụng giao thức I2C để kết nối, tôi muốn tạo ra một hệ thống nhận diện cử chỉ tay mà không cần đến camera. Mục tiêu là phát triển một giải pháp hiệu quả cho những thiết bị tiết kiệm năng lượng như Raspberry Pi.
Sau đây là cách tôi thiết lập mọi thứ: Đầu tiên, tôi đã **bật I2C trên Raspberry Pi** bằng cách chạy lệnh sau:
Sau đó, điều hướng đến **Interface Options** → **I2C** và chọn **Enable**, rồi khởi động lại Raspberry Pi.
Tiếp theo, tôi đã **kết nối GY-85 với Raspberry Pi** theo sơ đồ kết nối mà mình chuẩn bị. Nếu mọi thứ diễn ra tốt đẹp, bạn sẽ thấy địa chỉ của cảm biến xuất hiện trong bảng điều khiển I2C bằng lệnh:
Tiếp theo là bước quan trọng: **cài đặt các thư viện cần thiết** trên Raspberry Pi để giao tiếp với GY-85. Trước tiên, tôi tạo một **môi trường ảo** nhằm tách biệt dự án này khỏi hệ thống chính và tránh xung đột khi cài đặt các gói khác nhau sau này. Để thực hiện điều này, tôi chạy lệnh:
Sau đó, cài đặt các thư viện cần thiết trong môi trường ảo với lệnh:
Ban đầu, tôi đã sử dụng thư viện `smbus` ở mức độ thấp để giao tiếp với các cảm biến qua I2C trên Pi. Tuy nhiên, cuối cùng tôi đã chuyển sang thí điểm dùng thư viện CircuitPython cao cấp hơn của [Adafruit] (`busio` và `board`), giúp đơn giản hóa quá trình truyền thông qua I2C. Đối với cảm biến gia tốc ADXL345, tôi đã dùng driver chính thức của Adafruit mà không cần phải truy cập vào các thanh ghi ở mức độ thấp nữa. Vì không có driver chính thức cho gyroscope ITG-3205 từ Adafruit nên tôi sử dụng `busio.I2C` để tự viết vào các thanh ghi và đọc dữ liệu thô.
Toàn bộ mã nguồn để đọc dữ liệu từ module GY-85 được tổ chức trong tập tin có tên **IMU.py**.
Sau đây là cách tôi thiết lập mọi thứ: Đầu tiên, tôi đã **bật I2C trên Raspberry Pi** bằng cách chạy lệnh sau:
sudo raspi-config
Sau đó, điều hướng đến **Interface Options** → **I2C** và chọn **Enable**, rồi khởi động lại Raspberry Pi.
Tiếp theo, tôi đã **kết nối GY-85 với Raspberry Pi** theo sơ đồ kết nối mà mình chuẩn bị. Nếu mọi thứ diễn ra tốt đẹp, bạn sẽ thấy địa chỉ của cảm biến xuất hiện trong bảng điều khiển I2C bằng lệnh:
sudo i2cdetect -y 1
Tiếp theo là bước quan trọng: **cài đặt các thư viện cần thiết** trên Raspberry Pi để giao tiếp với GY-85. Trước tiên, tôi tạo một **môi trường ảo** nhằm tách biệt dự án này khỏi hệ thống chính và tránh xung đột khi cài đặt các gói khác nhau sau này. Để thực hiện điều này, tôi chạy lệnh:
sudo apt-get install python3-venv
python3 -m venv <tên_môi_trường>
source <tên_môi_trường>/bin/activate
Sau đó, cài đặt các thư viện cần thiết trong môi trường ảo với lệnh:
pip3 install Adafruit-Blinka adafruit_adxl34x
Ban đầu, tôi đã sử dụng thư viện `smbus` ở mức độ thấp để giao tiếp với các cảm biến qua I2C trên Pi. Tuy nhiên, cuối cùng tôi đã chuyển sang thí điểm dùng thư viện CircuitPython cao cấp hơn của [Adafruit] (`busio` và `board`), giúp đơn giản hóa quá trình truyền thông qua I2C. Đối với cảm biến gia tốc ADXL345, tôi đã dùng driver chính thức của Adafruit mà không cần phải truy cập vào các thanh ghi ở mức độ thấp nữa. Vì không có driver chính thức cho gyroscope ITG-3205 từ Adafruit nên tôi sử dụng `busio.I2C` để tự viết vào các thanh ghi và đọc dữ liệu thô.
Toàn bộ mã nguồn để đọc dữ liệu từ module GY-85 được tổ chức trong tập tin có tên **IMU.py**.

Quá trình thu thập dữ liệu và những thách thức gặp phải
Để giữ cho dự án này **đơn giản và khả thi**, tôi đã bắt đầu với bốn cử chỉ cơ bản: lên, xuống, vuốt trái và vuốt phải. Đối với mỗi cử chỉ, tôi đã ghi lại dữ liệu từ cảm biến gia tốc và cảm biến con quay hồi chuyển trong vòng 5 giây với tần số **50 Hz**, thực hiện lại 20 lần bởi hai người để **đảm bảo sự đa dạng trong dữ liệu**.
Chuẩn bị dữ liệu để cải thiện độ chính xác của mô hình
Tôi đã thu thập tổng cộng 20.000 điểm dữ liệu—250 điểm cho mỗi cử chỉ—và cuối cùng có được 80 mẫu cử chỉ được gán nhãn. Nghe có vẻ đơn giản, phải không? Nhưng vì đây là lần đầu tiên tôi làm việc với tín hiệu từ cảm biến chuyển động, nên việc tìm ra chiến lược thu thập dữ liệu thích hợp đã trở thành một trong những phần mất nhiều thời gian nhất. Những chi tiết nhỏ như loại và tốc độ chuyển động, thời gian ghi âm, hướng của cảm biến hoặc cách hai người thực hiện cùng một cử chỉ khác nhau đều ảnh hưởng lớn đến độ chính xác của mô hình. Tôi đã phải điều chỉnh bước này nhiều lần và nhận ra rằng cách bạn thu thập dữ liệu còn quan trọng hơn cả việc bạn chọn mô hình nào. 🙂 Đây là cách mà thiết lập cuối cùng của tôi trông như thế nào: Tôi đã ghi lại mỗi cử chỉ trong vòng 1 giây. Còn nhiều điều hơn nữa về vấn đề này trong phần Tiền xử lý.

Khám phá các phương pháp lọc và tầm quan trọng của chúng
Khi bắt tay vào quá trình tiền xử lý dữ liệu, tôi đã vội vàng thực hiện các bước như phân đoạn, lọc và chuẩn hóa trước khi đưa mô hình vào huấn luyện. Nhưng kết quả không như mong đợi. Đó là lúc tôi nhận ra rằng tiền xử lý không chỉ đơn thuần là thực hiện các bước tiêu chuẩn mà còn liên quan đến việc hiểu rõ dữ liệu của bạn và biết tại sao mỗi bước lại quan trọng.
Ban đầu, tôi đã **phân đoạn** dữ liệu thành các cửa sổ gồm **125 điểm dữ liệu** với độ chồng chéo 50% để tăng số lượng mẫu huấn luyện và rút ngắn chuỗi đầu vào cho mô hình LSTM. Tôi cũng áp dụng một **bộ lọc Kalman** nhằm giảm nhiễu và cải thiện chất lượng tín hiệu, sau đó tiến hành **chuẩn hóa** dữ liệu. Tuy nhiên, khi trực quan hóa các tín hiệu đã được xử lý, tôi nhận thấy một điều rất quan trọng: những cử chỉ này rất **tinh tế**, **nhanh chóng**, và là những sự kiện tạm thời, chứ không phải là tín hiệu liên tục. Chúng bắt đầu, đạt đỉnh điểm và kết thúc trong khoảng thời gian khoảng **một giây**. Vì vậy, để bảo toàn hình dạng tạm thời của chúng, mô hình cần phải nhìn thấy **toàn bộ cử chỉ trong mỗi cửa sổ**.
Ban đầu, tôi đã **phân đoạn** dữ liệu thành các cửa sổ gồm **125 điểm dữ liệu** với độ chồng chéo 50% để tăng số lượng mẫu huấn luyện và rút ngắn chuỗi đầu vào cho mô hình LSTM. Tôi cũng áp dụng một **bộ lọc Kalman** nhằm giảm nhiễu và cải thiện chất lượng tín hiệu, sau đó tiến hành **chuẩn hóa** dữ liệu. Tuy nhiên, khi trực quan hóa các tín hiệu đã được xử lý, tôi nhận thấy một điều rất quan trọng: những cử chỉ này rất **tinh tế**, **nhanh chóng**, và là những sự kiện tạm thời, chứ không phải là tín hiệu liên tục. Chúng bắt đầu, đạt đỉnh điểm và kết thúc trong khoảng thời gian khoảng **một giây**. Vì vậy, để bảo toàn hình dạng tạm thời của chúng, mô hình cần phải nhìn thấy **toàn bộ cử chỉ trong mỗi cửa sổ**.
So sánh hiệu quả giữa các phương pháp chuẩn hóa dữ liệu
Sử dụng **thời gian ghi âm cố định 5 giây** với các cửa sổ chồng chéo **2,5 giây** đã gây ra hai vấn đề chính: - Bắt đầu và kết thúc của mỗi cử chỉ thường bao gồm những trạng thái tay không hoạt động. - Cửa sổ trượt đôi khi bỏ lỡ phần bắt đầu hoặc kết thúc của cử chỉ. Điều này không chỉ tạo ra tiếng ồn mà còn gây nhầm lẫn cho mô hình khi gán nhãn các mẫu hỗn hợp (một phần cử chỉ, một phần không có cử chỉ) như là một lớp duy nhất. Do đó, tôi đã tinh chỉnh dữ liệu bằng cách cắt giảm mỗi cử chỉ xuống còn khoảng thời gian chuyển động thực tế của nó - một giây - và loại bỏ các khoảng thời gian không hoạt động. Đối với phần còn lại của quá trình thu thập dữ liệu, tôi đã ghi lại từng chuyển động trong vòng một giây và hoàn toàn loại bỏ sự chồng chéo trong quá trình tiền xử lý để đảm bảo rằng mỗi mẫu đều nắm bắt được đầy đủ cử chỉ từ đầu đến cuối.
Hình ảnh bên trái cho thấy dữ liệu được ghi lại trong 5 giây cho bốn cử chỉ khác nhau. Biểu đồ ở giữa trực quan hóa việc phân đoạn sử dụng các cửa sổ 125 điểm với độ chồng chéo 50% cho mẫu thứ ba. Như bạn có thể thấy, cửa sổ đầu tiên (500–625) bỏ lỡ phần cuối của cử chỉ, cửa sổ thứ hai (562–687) chỉ ghi lại phần cuối, và cửa sổ cuối cùng (625–750) bao gồm cả dữ liệu khi tay đang nghỉ ngơi. Ngược lại, biểu đồ bên phải cho thấy điều gì xảy ra khi tôi ghi lại mỗi cử chỉ trong đúng một giây - nó nắm bắt được toàn bộ cử chỉ trong một lần duy nhất, loại bỏ nhu cầu về các cửa sổ trượt.
Hình ảnh bên trái cho thấy dữ liệu được ghi lại trong 5 giây cho bốn cử chỉ khác nhau. Biểu đồ ở giữa trực quan hóa việc phân đoạn sử dụng các cửa sổ 125 điểm với độ chồng chéo 50% cho mẫu thứ ba. Như bạn có thể thấy, cửa sổ đầu tiên (500–625) bỏ lỡ phần cuối của cử chỉ, cửa sổ thứ hai (562–687) chỉ ghi lại phần cuối, và cửa sổ cuối cùng (625–750) bao gồm cả dữ liệu khi tay đang nghỉ ngơi. Ngược lại, biểu đồ bên phải cho thấy điều gì xảy ra khi tôi ghi lại mỗi cử chỉ trong đúng một giây - nó nắm bắt được toàn bộ cử chỉ trong một lần duy nhất, loại bỏ nhu cầu về các cửa sổ trượt.

Học hỏi từ quá trình tiền xử lý dữ liệu
Từ góc độ lọc tín hiệu, tôi muốn hiểu rõ hơn về tác động thực sự của việc áp dụng bộ lọc Kalman, vì vậy tôi đã hình dung cả tín hiệu chưa qua lọc và đã qua lọc trên năm mẫu. Như dự đoán, các tín hiệu đã được lọc mượt mà hơn nhiều, và ban đầu tôi nghĩ rằng điều này sẽ giúp mô hình học được các mẫu dễ dàng hơn bằng cách giảm thiểu nhiễu từ cảm biến. Để đánh giá ảnh hưởng của việc lọc, tôi đã so sánh hiệu suất của mô hình sử dụng kiến trúc CNN-LSTM với dữ liệu chưa qua lọc và đã qua lọc. Mặc dù sự khác biệt là nhỏ, nhưng mô hình đào tạo bằng dữ liệu chưa qua lọc lại hoạt động tốt hơn, đạt 85.94% độ chính xác trong khi phiên bản đã qua lọc chỉ đạt 81.25%.
Việc lọc cũng dường như ảnh hưởng đáng kể đến một số cử chỉ như "lên" và "phải", có thể do quá trình làm mượt đã loại bỏ những biến đổi tinh tế nhưng quan trọng. Trong khi đó, mô hình được đào tạo trên dữ liệu đã qua lọc cuối cùng nhẹ đi khoảng 30 KB sau khi chuyển sang TFLite (tức là một mô hình đơn giản hơn), nhưng cái giá phải trả cho điều đó không xứng đáng với lợi ích mang lại.
Kinh nghiệm này khiến tôi nhận ra rằng **những mô hình sâu thường đủ mạnh để xử lý tiếng ồn nhỏ mà không cần phải tiền xử lý quá mức**. Vì vậy, để tránh tính toán không cần thiết và tăng tốc độ suy diễn, **tôi quyết định tiếp tục sử dụng dữ liệu cảm biến thô mà không qua xử lý**.
Việc lọc cũng dường như ảnh hưởng đáng kể đến một số cử chỉ như "lên" và "phải", có thể do quá trình làm mượt đã loại bỏ những biến đổi tinh tế nhưng quan trọng. Trong khi đó, mô hình được đào tạo trên dữ liệu đã qua lọc cuối cùng nhẹ đi khoảng 30 KB sau khi chuyển sang TFLite (tức là một mô hình đơn giản hơn), nhưng cái giá phải trả cho điều đó không xứng đáng với lợi ích mang lại.
Kinh nghiệm này khiến tôi nhận ra rằng **những mô hình sâu thường đủ mạnh để xử lý tiếng ồn nhỏ mà không cần phải tiền xử lý quá mức**. Vì vậy, để tránh tính toán không cần thiết và tăng tốc độ suy diễn, **tôi quyết định tiếp tục sử dụng dữ liệu cảm biến thô mà không qua xử lý**.
Kết thúc và hướng đi tiếp theo cho dự án
Dựa trên những gì tôi đã quan sát trong quá trình tiền xử lý, tôi quyết định chỉ sử dụng **chuẩn hóa** như một điều chỉnh tín hiệu duy nhất trước khi huấn luyện. Lý do rất rõ ràng: các đầu vào từ **gia tốc kế** và **con quay hồi chuyển** có khoảng giá trị rất khác nhau - dữ liệu gia tốc thường dao động trong khoảng **-19.6 đến +19.6 m/s²**, trong khi đầu ra của con quay hồi chuyển có thể chênh lệch từ **-2000 đến +2000°/s**. Nếu không có **chuẩn hóa**, mô hình có thể ưu tiên một cảm biến hơn cảm biến kia. Tôi đã thử nghiệm cả hai phương pháp **StandardScaler** (chuẩn hóa các đặc trưng bằng cách loại bỏ trung bình và tỷ lệ về phương sai đơn vị) và **MinMaxScaler** (đưa tất cả các đặc trưng vào một khoảng cố định như [-1, 1]) và chọn cái nào phù hợp nhất với kiến trúc mô hình.
Để so sánh tác động của các phương pháp chuẩn hóa này, tôi đã trực quan hóa một tập con của các tín hiệu huấn luyện dưới ba phiên bản: dữ liệu thô (bên trái), dữ liệu được chuẩn hóa bằng StandardScaler (ở giữa) và dữ liệu được chuẩn hóa bằng MinMaxScaler (bên phải).
Cuối cùng, việc tiền xử lý cho các tín hiệu của tôi, dựa trên tính chất của vấn đề, đã chỉ dừng lại ở việc thực hiện **chuẩn hóa đúng cách**. Giờ thì hãy kết thúc phần này và tiếp tục với quá trình huấn luyện mô hình. Trong bài viết tiếp theo, tôi sẽ giải thích chi tiết quá trình huấn luyện mô hình, cách mọi thứ kết hợp với Raspberry Pi và cách nó được dùng để điều khiển đèn thông minh bằng cử chỉ tay. Nói chung là... mọi thứ sắp trở nên thú vị hơn nữa! 😊
Để so sánh tác động của các phương pháp chuẩn hóa này, tôi đã trực quan hóa một tập con của các tín hiệu huấn luyện dưới ba phiên bản: dữ liệu thô (bên trái), dữ liệu được chuẩn hóa bằng StandardScaler (ở giữa) và dữ liệu được chuẩn hóa bằng MinMaxScaler (bên phải).
Cuối cùng, việc tiền xử lý cho các tín hiệu của tôi, dựa trên tính chất của vấn đề, đã chỉ dừng lại ở việc thực hiện **chuẩn hóa đúng cách**. Giờ thì hãy kết thúc phần này và tiếp tục với quá trình huấn luyện mô hình. Trong bài viết tiếp theo, tôi sẽ giải thích chi tiết quá trình huấn luyện mô hình, cách mọi thứ kết hợp với Raspberry Pi và cách nó được dùng để điều khiển đèn thông minh bằng cử chỉ tay. Nói chung là... mọi thứ sắp trở nên thú vị hơn nữa! 😊
Reference Articles
Related Discussions