Tôi sẽ nâng cấp thành chương trình Python chạy trên PyCharm 2025.3.4, sử dụng YOLO + OpenCV + Flask, có giao diện web tiếng Việt để giám sát bằng USB Camera.
Phiên bản này tập trung vào việc phân biệt người đang ngồi trên xe với người đứng cạnh xe, giảm cảnh báo nhầm tại cổng trường.
1. Các chức năng chính
Chức năng
Thiết kế
Camera
USB Webcam, lựa chọn Camera 0–5
Độ phân giải
640×480, 1280×720, 1920×1080
Xem trực tiếp
Trình duyệt web trên máy tính hoặc điện thoại
Nhận diện
Người, xe đạp, xe máy
Ghép người–xe
Kết hợp YOLO và tư thế cơ thể (Pose)
Cảnh báo
Khung đỏ, thông báo phát hiện
Thống kê
Tổng người, phương tiện, người đang ngồi trên xe
Lưu sự kiện
Ảnh JPG, thời gian, loại phương tiện
Xem lại
Thư viện ảnh sự kiện trên web
Cài đặt
Camera, độ phân giải, độ nhạy, bật/tắt lưu ảnh
Về xe điện: mô hình YOLO chuẩn chưa có nhãn riêng cho xe đạp điện và xe máy điện. Phiên bản này nhận diện chúng theo nhóm xe đạp/xe máy tương ứng, chưa thể phân loại chính xác động cơ điện hay xăng.
2. Cách nâng độ chính xác
Thay vì chỉ kiểm tra hai hình chữ nhật có chồng lên nhau, chương trình sẽ sử dụng các đặc điểm:
Người và xe phải nằm gần nhau.
Vị trí hông của người phải phù hợp với khu vực yên xe.
Tư thế đầu gối, mắt cá chân và thân người phải phù hợp với tư thế ngồi.
Kết quả phải xuất hiện ổn định trong nhiều khung hình liên tiếp.
Một người đứng cạnh xe sẽ bị loại nếu tư thế và vị trí không phù hợp.
Phương pháp này vẫn là nhận diện xác suất, không đảm bảo chính xác tuyệt đối. Đặc biệt, camera nhìn từ trên xuống quá dốc hoặc người bị che khuất sẽ làm giảm độ chính xác.
3. Tải chương trình Python
School Gate AI – Python Web
Mã nguồn Flask, YOLO, Pose, giao diện web và cơ sở dữ liệu SQLite
Lần đầu chương trình sẽ tải hai mô hình AI yolo11n.pt và yolo11n-pose.pt.
5. Những gì phiên bản này đã thực hiện
Giao diện web có xem camera trực tiếp.
Chọn USB Camera và độ phân giải.
Nhận diện người, xe đạp và xe máy.
Kết hợp tư thế hông, đầu gối và chân để đánh giá khả năng ngồi trên xe.
Vẽ khung đỏ và lưu ảnh sự kiện.
Thống kê số đối tượng trong hình.
Xem lại tối đa 100 sự kiện gần nhất trên giao diện.
Hai điểm cần phân biệt: Số người đang ngồi trên xe là số lượng trong hình, chưa phải tổng số lượt đi qua cổng. Ngoài ra, phiên bản này mới cảnh báo bằng hình ảnh, chưa phát âm thanh.
Mã nguồn đã được kiểm tra cú pháp Python, nhưng chưa kiểm thử trực tiếp với USB Camera thực tế.
6. Đề xuất nâng cấp tiếp theo
Đối với cổng trường, tôi đề xuất bổ sung ByteTrack và đường đếm ảo để mỗi người đi xe qua cổng chỉ được tính một lần, đồng thời dùng thời gian theo dõi để giảm nhầm người đứng cạnh xe.
Một thông tin rất quan trọng: Camera USB của bạn sẽ đặt ở độ cao bao nhiêu mét, và nhìn từ trên xuống hay nhìn ngang về phía cổng? Tôi sẽ dựa vào góc lắp đặt đó để điều chỉnh thuật toán nhận diện tư thế người ngồi trên xe.
Tôi đã bổ sung chức năng gửi ký tự A từ Python sang Arduino qua cổng USB Serial khi AI xác nhận có người đang ngồi trên xe, đồng thời giữ nguyên các chức năng nhận diện, camera và lưu ảnh hiện tại.
1. Chương trình Python đã nâng cấp
Tải project School Gate AI + Arduino Serial
Trong phần Cài đặt trên giao diện web đã bổ sung:
Bật/tắt kết nối Arduino.
Quét và chọn cổng COM, ví dụ COM3, COM4.
Chọn tốc độ Baud: 9600–115200.
Hiển thị trạng thái kết nối Arduino.
Nút Gửi thử A để kiểm tra kết nối.
Khi AI xác nhận người ngồi trên xe qua số khung hình đã cài đặt, Python gửi:
A\n
Tín hiệu chỉ được gửi một lần khi bắt đầu một đợt phát hiện đã xác nhận, không gửi liên tục ở mỗi khung hình. Nếu hết phát hiện rồi xuất hiện đợt phát hiện mới, chương trình sẽ gửi lại.
2. Code Arduino nhận tín hiệu A
File arduino_receiver.ino đã có sẵn trong project.
Nguyên lý hoạt động
9600 baud
Python AI phát hiện người ngồi trên xe
USB Serial gửi ký tự A
Arduino nhận A → D8 HIGH trong 2 giây
D8 LOW trở lại
Bạn có thể dùng D8 để kích module relay, còi hoặc đèn cảnh báo thông qua mạch điều khiển phù hợp. Không đấu trực tiếp tải công suất vào chân Arduino.
3. Hướng dẫn sử dụng
Nạp file arduino_receiver.ino vào Arduino Uno hoặc Nano.
Kết nối Arduino với máy tính bằng USB.
Giải nén project mới, mở trong PyCharm.
Cài thêm thư viện Serial:
pip install pyserial
Chạy app.py, vào trang web, mở phần Cài đặt Arduino USB.
Nhấn Quét cổng COM, chọn cổng Arduino, chọn 9600 baud và bật kết nối.
Nhấn Lưu cài đặt, sau đó Gửi thử A.
Khi Arduino nhận được A, chân D8 sẽ lên HIGH trong 2 giây rồi trở về LOW.
Lưu ý: Đóng Serial Monitor của Arduino IDE trước khi kết nối từ Python vì một cổng COM thường không thể mở đồng thời bởi hai chương trình.
4. Một điểm cần xác nhận
Hiện tại tôi thiết kế Arduino nhận A rồi kích chân D8 trong 2 giây.