Thị giác máy tính tăng tốc SIMD trên vi điều khiển giá 2 USD

Công nghệ25 tháng 10, 2026·5 phút đọc

Một lập trình viên đã viết bộ phát hiện đặc trưng FAST tăng tốc bằng tập lệnh SIMD 128-bit cho ESP32-S3, đạt tốc độ gấp đôi bản tham chiếu và xử lý khung hình QVGA chỉ trong khoảng 6ms. Thành tựu này cho thấy vi điều khiển giá rẻ cũng có thể đảm nhận các tác vụ thị giác máy tính thời gian thực.

Thị giác máy tính tăng tốc SIMD trên vi điều khiển giá 2 USD

Khi nhắc đến thị giác máy tính, người ta thường nghĩ ngay tới GPU mạnh mẽ hay các máy chủ đám mây đắt tiền. Thế nhưng một lập trình viên đã chứng minh điều ngược lại: chỉ với một vi điều khiển ESP32-S3 giá khoảng 2 USD, anh đã xây dựng được bộ phát hiện đặc trưng FAST tăng tốc bằng tập lệnh SIMD 128-bit, đạt tốc độ xử lý khung hình QVGA (320x240) chỉ trong khoảng 6ms.

Sức mạnh bất ngờ của một con chip giá rẻ

ESP32-S3 là một vi điều khiển đáng chú ý trong phân khúc giá rẻ. Bên trong lớp vỏ nhựa khiêm tốn là bộ xử lý lõi kép chạy ở tần số tối đa 240MHz, cùng hàng loạt ngoại vi bao gồm cả radio WiFi và Bluetooth Low Energy.

Điều khiến tác giả bất ngờ là khi tra cứu tài liệu kỹ thuật tham chiếu, anh phát hiện con chip này hỗ trợ một tập lệnh SIMD giới hạn. Với mức giá còn rẻ hơn một ly cà phê, đây thực sự là một điểm cộng lớn cho các dự án nhúng.

"Với mức silicon còn rẻ hơn một ly cà phê trung bình, điều đó thật sự rất thú vị."

Hành trình viết assembly và tự xây dựng trình cấp phát thanh ghi

Quá trình viết bộ phát hiện góc FAST tăng tốc SIMD không hề đơn giản. Tác giả đã phải học những kiến thức cơ bản về assembly trên ESP32-S3, vượt qua những hạn chế kỳ quặc của kiến trúc, và cuối cùng là tự viết một trình cấp phát thanh ghi cơ bản có tên basm.

Khi tìm kiếm mã mẫu sử dụng SIMD, anh chỉ tìm được ba nguồn tham khảo: blog của Larry Bank với ví dụ tối giản, thư viện esp-dsp của Espressif cho các tính năng xử lý tín hiệu số, và thư viện esp-dl dùng cho tăng tốc AI trên chip.

Vượt qua những giới hạn của tập lệnh

Bài toán đặt ra với bộ tiền kiểm tra góc FAST khá rõ ràng: lấy mẫu một pixel theo mỗi hướng chính và kiểm tra xem có ít nhất ba pixel "cực trị" hay không, tức là có độ lệch tuyệt đối so với pixel trung tâm vượt ngưỡng cho trước.

Tác giả quyết định viết hàm tính số lượng cực trị cho 16 pixel cùng lúc, vì mỗi thanh ghi vector có thể lưu 16 giá trị 8-bit. Thế nhưng ngay lập tức anh gặp phải giới hạn đầu tiên:

  • Không cho phép đọc không căn chỉnh trực tiếp: Giả sử pixel trung tâm được căn chỉnh, thì các khối phía đông và phía tây sẽ bị lệch căn chỉnh.
  • Chỉ hỗ trợ so sánh số 8-bit có dấu: Đây là vấn đề lớn vì dữ liệu pixel đều là số 8-bit không dấu.
  • Các phép toán SIMD đều bão hòa: Nghĩa là mọi giá trị pixel trên 127 sẽ bị kẹp ở mức -128 thay vì tràn xuống giá trị thích hợp.

Với giới hạn đầu tiên, tác giả đã tận dụng một lệnh cho phép trích xuất một lát cắt từ hai thanh ghi được nối lại, từ đó lấy được các khối đông và tây từ hai khối liền kề khối trung tâm.

Mẹo XOR thông minh để chuyển đổi dải giá trị

Với giới hạn về số có dấu, tác giả cần dịch chuyển dải giá trị từ [0, 255] sang [-128, 127]. Đáng lẽ đây chỉ là một phép trừ đơn giản, nhưng tính chất bão hòa của tập lệnh khiến mọi giá trị trên 127 bị kẹp ở -128 thay vì tràn đúng cách.

Giải pháp mà tác giả tìm ra thực sự tinh tế. Xét giá trị của các chữ số trong biểu diễn nhị phân: -128, 64, 32, 16, 8, 4, 2, 1. Phép trừ tương đương với phép cộng với -128, nên để tính x - 128, ta chỉ cần "tăng" số đó thêm -128 bằng cách cộng một vào chữ số có trọng số cao nhất.

Điều này đạt được bằng cách lật bit cao nhất của x. Vì phép XOR bất kỳ bit nào với 1 tương đương với phép NOT bitwise, ta có thể lật chọn lọc bit cao nhất bằng cách XOR với mặt nạ bit 0b10000000, tức 0x80.

Kết quả là: x - 128 == x ^ 0x80. Từ đó, mỗi khi nạp giá trị 8-bit không dấu, chương trình sẽ XOR với 0x80 để chuyển sang dải tuyến tính phù hợp cho các phép tính và so sánh.

Kết quả ấn tượng

Nhờ hai mẹo trên, tác giả đã vượt qua các giới hạn của ESP32-S3 và hoàn thiện bộ tiền kiểm tra góc FAST tăng tốc SIMD. Anh cũng viết thêm một hàm tính điểm tăng tốc SIMD với các phép toán tương tự.

Thành quả cuối cùng rất đáng khích lệ:

  • Thông lượng tăng khoảng 220%, từ 5,1 MP/s lên 11,2 MP/s trong các thử nghiệm.
  • Nằm trong ngưỡng chấp nhận được cho các tác vụ thị giác máy tính thời gian thực.
  • ESP32-S3 có thể dễ dàng xử lý luồng video VGA ở 30fps.

Đối với các nhà phát triển thiết bị IoT và nhúng tại Việt Nam, đây là minh chứng thú vị rằng những vi điều khiển giá rẻ như ESP32-S3 hoàn toàn có thể đảm nhận các tác vụ xử lý ảnh phức tạp mà không cần đến phần cứng đắt tiền. Với mức giá chỉ khoảng 2 USD, đây thực sự là một lựa chọn hấp dẫn cho các dự án thị giác máy tính biên.

"Không tệ chút nào với mức giá 2 USD!"

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗