1. Trang chủ
  2. » Giáo Dục - Đào Tạo

nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái

136 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nghiên cứu, Chế tạo Module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Tác giả Trần Văn Tính, Lưu Trọng Tuấn
Người hướng dẫn Th.S Nguyễn Quang Trãi
Trường học Trường Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh
Chuyên ngành Công nghệ Kỹ thuật Ô tô
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2024
Thành phố Tp. Hồ Chí Minh
Định dạng
Số trang 136
Dung lượng 12,65 MB

Cấu trúc

  • 1.1. Lý do chọn đề tài (21)
  • 1.2. Mục tiêu nghiên cứu (21)
  • 1.3. Phạm vi nghiên cứu (22)
  • 1.4. Phương pháp nghiên cứu (22)
  • Chương 2: CƠ SỞ LÝ THUYẾT (23)
    • 2.1. Mạng CAN trên ô tô (23)
      • 2.1.1. Tổng quan về mạng CAN (23)
      • 2.1.2. Cấu trúc mạng CAN (28)
      • 2.1.3. Nguyên lý hoạt động của mạng CAN (30)
      • 2.1.4. Lớp vật lý (Physical Layer) (34)
      • 2.1.5. Lớp liên kết dữ liệu (Data Link Layer) trong mạng CAN (40)
      • 2.1.6. Các chế độ hoạt động của mạng CAN (44)
      • 2.1.7. An toàn và bảo mật trong mạng CAN (45)
    • 2.2. Giao thức OBD-II (46)
      • 2.2.1. Tổng quan về giao thức OBD-II (47)
      • 2.2.2. Các chế độ (service mode) của OBD-II (53)
      • 2.2.3. Cấu trúc lệnh và dữ liệu trong OBD-II (58)
      • 2.2.4. Cách truy cập dữ liệu CAN thông qua OBD-II (61)
    • 2.3. Các công cụ và phần mềm hỗ trợ trong việc lấy dữ liệu mạng CAN qua OBD-II (63)
      • 2.3.1. Thiết bị đọc OBD-II (ELM327) (0)
      • 2.3.2. Vi điều khiển ESP32 và Raspberry Pi (65)
    • 2.4. Tổng quan về xử lý ảnh (69)
      • 2.4.1. Giới thiệu về xử lý ảnh (69)
      • 2.4.2. Các thành phần cơ bản của xử lý ảnh (70)
    • 2.5. Đặc trưng HOG (73)
    • 2.6. Bộ phân loại SVM (78)
    • 2.7. Thuật toán Adaboost (81)
    • 2.8. Đặc trưng Haar-like (82)
    • 2.9. Phương pháp Facial Landmark (85)
      • 2.9.1. Giới thiệu về Facial Landmark (85)
      • 2.9.2. Bộ đánh dấu mốc trên khuôn mặt của Dlib (86)
    • 2.10. Tính toán tỷ lệ mắt trong xử lý ảnh (87)
    • 2.11. Ngôn ngữ lập trình Python (88)
    • 2.12. Thư viện OpenCv và Dlib (90)
      • 2.12.1. Thư viện OpenCv (90)
      • 2.12.2. Thư viện Dlib (91)
  • Chương 3: THIẾT KẾ VÀ TRIỂN KHAI HỆ THỐNG (92)
    • 3.1. Thiết kế phần cứng (92)
    • 3.2. Thiết kế phần mềm (93)
      • 3.2.1. Phần mềm trên ESP32 (93)
      • 3.2.2. Phần mềm trên Raspberry Pi (100)
      • 3.2.3. Cài đặt thư viện cho xử lý ảnh (0)
    • 3.3. Triển khai thực tế (108)
      • 3.3.1. Cài đặt phần mềm (109)
      • 3.3.2. Thi công hệ thống (110)
      • 3.3.3. Kiểm tra hoạt động (114)
      • 3.3.4. Ghi nhận và phân tích kết quả (114)
  • Chương 4: KẾT QUẢ VÀ ĐÁNH GIÁ (115)
    • 4.1. Kết quả thử nghiệm (115)
    • 4.2. Ưu điểm và hạn chế (131)
      • 4.2.1. Ưu điểm (131)
      • 4.2.2. Hạn chế (132)
  • Chương 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN (133)
    • 5.1. Kết luận (133)
    • 5.2. Hướng phát triển (133)
  • TÀI LIỆU THAM KHẢO (135)

Nội dung

Mạng CAN là một hệ thống truyền thông không thể thiếu trên các xe hiện đại, cho phép các bộ điều khiển điện tử ECU trao đổi dữ liệu với nhau.. Hệ thống sẽ tập trung vào việc thu thập và

Mục tiêu nghiên cứu

Nhằm hiện thực hóa tiềm năng của dữ liệu CAN và giải quyết những hạn chế hiện tại, đề tài này đặt ra những mục tiêu cụ thể như sau:

- Thiết kế và xây dựng hệ thống thu thập dữ liệu CAN qua OBD2: Xây dựng một hệ thống hoàn chỉnh, bao gồm phần cứng và phần mềm, có khả năng kết nối với cổng OBD2 trên xe, đọc và giải mã dữ liệu CAN một cách hiệu quả

- Xử lý và hiển thị dữ liệu CAN lên màn hình một cách trực quan: Phát triển các thuật toán xử lý dữ liệu CAN, lọc bỏ các thông tin không cần thiết, và trình bày những thông tin quan trọng lên màn hình giao diện một cách trực quan, dễ hiểu, giúp người dùng dễ dàng nắm bắt tình trạng hoạt động của xe

- Đảm bảo độ chính xác, tin cậy và thời gian thực của dữ liệu hiển thị: Đề cao tính chính xác và tin cậy của dữ liệu hiển thị, đảm bảo thông tin được cập nhật liên tục, phản ánh đúng tình trạng thực tế của xe trong thời gian thực

Xây dựng được hệ thống phát hiện ngủ gật cho người lái xe, đáp ứng được thời gian từ lúc phát hiện đến lúc phát tín hiệu cảnh báo

Phương pháp nghiên cứu

- Nghiên cứu tài liệu J1979 và ELM327 để hiểu rõ về giao thức OBD-II và cách thức giao tiếp với ECU của xe

- Phân tích cấu trúc dữ liệu CAN, xác định các mã PID cần thiết để thu thập thông tin LiveData, Freeze Frame Data và DTC

- Sử dụng thiết bị đọc OBD2 tích hợp chip ELM327 để kết nối với xe và thu thập dữ liệu CAN

- Xây dựng phần mềm để xử lý và giải mã dữ liệu CAN thu được, chuyển đổi thành các thông tin dễ hiểu bằng C/C++

- Thiết kế giao diện người dùng trực quan để hiển thị các thông tin thu thập được một cách rõ ràng và dễ hiểu bằng python

CƠ SỞ LÝ THUYẾT

Mạng CAN trên ô tô

2.1.1 Tổng quan về mạng CAN

Mạng CAN, hay còn được gọi là "mạng khu vực điều khiển", là một giao thức truyền thông nối tiếp được phát triển bởi Robert Bosch vào đầu những năm 1980 Ban đầu, CAN được thiết kế đặc biệt để phục vụ cho ngành công nghiệp ô tô, nhằm giải quyết bài toán truyền thông phức tạp giữa các bộ điều khiển điện tử (ECU) trên xe Tuy nhiên, với những ưu điểm vượt trội, CAN đã nhanh chóng được ứng dụng rộng rãi trong nhiều lĩnh vực khác như tự động hóa công nghiệp, hàng không, y tế và nhiều hơn nữa

Về bản chất, CAN là một mạng bus đa chủ (multi-master serial bus) hoạt động ở hai lớp chính: lớp vật lý và lớp liên kết dữ liệu

- Lớp vật lý (Physical Layer): Lớp này định nghĩa các đặc tính điện và cơ chế truyền tín hiệu trên đường truyền vật lý CAN sử dụng hai dây xoắn đôi (CAN_H và CAN_L) để truyền tín hiệu vi sai, giúp giảm thiểu nhiễu điện từ và đảm bảo tính toàn vẹn của dữ liệu Tốc độ truyền dữ liệu của CAN có thể lên tới 1 Mbps, tùy thuộc vào chiều dài của bus và loại dây dẫn được sử dụng Các tiêu chuẩn ISO 11898-2 và ISO 11898-3 định nghĩa các yêu cầu về lớp vật lý cho CAN tốc độ cao và CAN tốc độ thấp

- Lớp liên kết dữ liệu (Data Link Layer): Lớp này chịu trách nhiệm đóng gói dữ liệu thành các khung (frame) và điều khiển việc truy cập bus Mỗi khung CAN bao gồm các trường như định danh (identifier), dữ liệu (data), mã kiểm tra dư thừa vòng (CRC), và các trường điều khiển khác Định danh được sử dụng để phân biệt các thông điệp khác nhau và xác định mức độ ưu tiên của chúng

Một trong những đặc điểm nổi bật của CAN là cơ chế phân giải xung đột không phá hủy (non-destructive arbitration) Khi nhiều ECU muốn truyền dữ liệu cùng lúc, ECU có định danh nhỏ nhất (mức ưu tiên cao nhất) sẽ được phép truyền, trong khi các ECU khác sẽ tự động lùi lại và chờ đến lượt Cơ chế này đảm bảo rằng dữ liệu quan trọng nhất luôn được truyền đi trước, đồng thời tránh được việc mất dữ liệu do xung đột

CAN cũng được trang bị các cơ chế kiểm tra lỗi và sửa lỗi mạnh mẽ, giúp đảm bảo tính

4 toàn vẹn của dữ liệu truyền đi Các ECU có thể phát hiện và báo cáo các lỗi như lỗi bit, lỗi khung, lỗi CRC, và lỗi ACK Trong trường hợp xảy ra lỗi, ECU có thể yêu cầu truyền lại dữ liệu hoặc thực hiện các hành động khắc phục khác:

- Lỗi CRC là lỗi xảy ra khi giá trị CRC tính toán bởi ECU nhận không khớp với giá trị

CRC được gửi kèm trong khung dữ liệu CRC là một mã kiểm tra dư thừa vòng, được sử dụng để phát hiện các lỗi trong dữ liệu truyền đi

- Lỗi ACK (Acknowledge) là lỗi xảy ra khi ECU gửi không nhận được tín hiệu ACK từ bất kỳ ECU nhận nào trong một khoảng thời gian nhất định Tín hiệu ACK là một bit thống trị (dominant bit) được gửi bởi ECU nhận để xác nhận đã nhận được khung dữ liệu một cách chính xác

Nhờ những ưu điểm như tốc độ cao, độ tin cậy, khả năng chống nhiễu tốt, và cơ chế phân giải xung đột hiệu quả, CAN đã trở thành một lựa chọn phổ biến cho các ứng dụng truyền thông trong nhiều lĩnh vực, đặc biệt là trong ngành công nghiệp ô tô

2.1.1.2 Lịch sử ra đời và phát triển của mạng CAN

Vào những năm 1980, khi ngành công nghiệp ô tô đang trên đà phát triển mạnh mẽ Sự phức tạp ngày càng tăng của các hệ thống điện tử trên xe hơi, từ hệ thống điều khiển động cơ, hệ thống phanh, đến hệ thống điều hòa và giải trí, đã đặt ra một thách thức lớn về việc truyền thông và trao đổi dữ liệu giữa các bộ phận này

Nhận thấy nhu cầu cấp thiết về một giải pháp truyền thông hiệu quả, đáng tin cậy và tiết kiệm chi phí, Bosch – một "ông lớn" trong ngành công nghiệp ô tô – đã bắt tay vào nghiên cứu và phát triển một giao thức mới Kết quả của quá trình nghiên cứu đó chính là sự ra đời của CAN (Controller Area Network) vào năm 1986

CAN được thiết kế để giải quyết những hạn chế của các phương pháp truyền thông truyền thống, như việc sử dụng quá nhiều dây dẫn, tốc độ truyền dữ liệu chậm, và khả năng chống nhiễu kém Với việc sử dụng hai dây xoắn đôi để truyền tín hiệu vi sai, CAN có thể truyền dữ liệu với tốc độ cao (lên tới 1 Mbps), đồng thời giảm thiểu nhiễu điện từ và đảm bảo tính toàn vẹn của dữ liệu

Sau khi ra mắt, CAN nhanh chóng được các nhà sản xuất ô tô trên toàn thế giới đón nhận và ứng dụng rộng rãi Năm 1991, Bosch đã công bố phiên bản CAN 2.0, bổ sung thêm

5 các tính năng mới và cải thiện hiệu suất của giao thức Đến năm 1993, CAN 2.0 đã trở thành tiêu chuẩn quốc tế ISO 11898, khẳng định vị thế của mình như một giải pháp truyền thông hàng đầu trong ngành công nghiệp ô tô

Ngày nay, CAN không chỉ là một giao thức truyền thông mà còn là một nền tảng quan trọng cho sự phát triển của các công nghệ xe hơi hiện đại Từ các hệ thống an toàn chủ động như ABS, ESP, đến các hệ thống hỗ trợ lái xe như adaptive cruise control, lane keeping assist, tất cả đều dựa trên mạng CAN để hoạt động một cách hiệu quả và an toàn

Sự phát triển không ngừng của công nghệ CAN đã mở ra những cơ hội mới cho ngành công nghiệp ô tô, giúp các nhà sản xuất tạo ra những chiếc xe thông minh, an toàn và tiết kiệm nhiên liệu hơn Trong tương lai, CAN được kỳ vọng sẽ tiếp tục đóng vai trò quan trọng trong việc định hình tương lai của ngành công nghiệp ô tô, đặc biệt là trong bối cảnh xe tự lái và xe điện đang ngày càng trở nên phổ biến

2.1.1.3 Ưu và nhược điểm của mạng CAN

Mạng CAN được đánh giá cao bởi những ưu điểm vượt trội, tuy nhiên cũng tồn tại một số hạn chế nhất định Cụ thể:

Giao thức OBD-II

2.2.1 Tổng quan về giao thức OBD-II

OBD-II (On-Board Diagnostics 2) là một tiêu chuẩn chẩn đoán trên ô tô được phát triển từ những năm 1990, nhằm mục đích cung cấp một giao diện chung để truy cập vào dữ liệu từ hệ thống máy tính của xe OBD-II đã trải qua nhiều giai đoạn phát triển, từ OBD-I ban đầu chỉ cung cấp thông tin cơ bản về khí thải, đến OBD-II hiện đại cho phép truy cập vào một lượng lớn dữ liệu về hoạt động của động cơ, hệ thống truyền động, hệ thống phanh, và nhiều hệ thống khác

2.2.1.1 Định nghĩa và lịch sử phát triển của OBD-II

OBD-II hay còn được gọi là hệ thống chẩn đoán trên ô tô thế hệ thứ hai, là một tiêu chuẩn giao tiếp giữa các thiết bị bên ngoài (như máy chẩn đoán) và hệ thống máy tính của ô tô OBD-II không chỉ đơn thuần là một cổng kết nối mà còn là một hệ thống phức tạp, cho phép truy cập vào một lượng lớn dữ liệu từ các ECU - những "bộ não" điều khiển các hệ thống khác nhau trên xe

Lịch sử hình thành và phát triển:

- Giai đoạn sơ khai (trước 1996): Trước khi OBD-II ra đời, các nhà sản xuất ô tô sử dụng các hệ thống chẩn đoán riêng biệt, không có sự thống nhất về giao thức và cổng kết nối Điều này gây khó khăn cho việc chẩn đoán và sửa chữa xe, đặc biệt là khi xe được đưa đến các gara không thuộc hãng

- OBD-I (1988 - 1995): OBD-I là phiên bản đầu tiên của hệ thống chẩn đoán trên xe, được giới thiệu vào cuối những năm 1980 Tuy nhiên, OBD-I chỉ cung cấp thông tin cơ bản về hệ thống kiểm soát khí thải và chưa được tiêu chuẩn hóa, dẫn đến sự khác biệt lớn giữa các nhà sản xuất

- OBD-II (1996 - nay): Năm 1996, OBD-II ra đời như một cuộc cách mạng trong lĩnh vực chẩn đoán ô tô Tiêu chuẩn này được phát triển bởi Hiệp hội Kỹ sư Ô tô (SAE) và được áp dụng rộng rãi trên toàn thế giới OBD-II cung cấp khả năng truy cập vào nhiều dữ liệu hơn, bao gồm cả dữ liệu về hoạt động của động cơ, hệ thống truyền động, hệ thống phanh, và các hệ thống khác Đặc biệt, OBD-II được tiêu chuẩn hóa về giao thức truyền thông, cổng kết nối, và mã lỗi, giúp đơn giản hóa quá trình chẩn đoán và sửa chữa xe

- OBD-II ngày nay: Ngày nay, OBD-II đã trở thành một phần không thể thiếu trên hầu

28 hết các ô tô hiện đại Các nhà sản xuất ô tô liên tục cải tiến và phát triển OBD-II, tích hợp thêm nhiều tính năng mới như giám sát từ xa, cập nhật phần mềm qua mạng, và kết nối với điện thoại thông minh

2.2.1.2 Mục đích và lợi ích của việc sử dụng OBD-II

OBD-II không chỉ đơn thuần là một hệ thống chẩn đoán, mà còn là một công cụ đa năng mang lại nhiều lợi ích thiết thực cho cả người dùng và nhà sản xuất ô tô:

- Chẩn đoán và khắc phục sự cố nhanh chóng: OBD-II cho phép kỹ thuật viên dễ dàng truy cập vào các mã lỗi (DTC) và dữ liệu đóng băng (freeze frame data) từ ECU Nhờ đó, việc xác định nguyên nhân gốc rễ của các sự cố trên xe trở nên nhanh chóng và chính xác hơn, giúp tiết kiệm thời gian và chi phí sửa chữa

- Giám sát tình trạng hoạt động liên tục: OBD-II cung cấp thông tin chi tiết và liên tục về các thông số hoạt động của xe, như tốc độ, vòng tua máy, nhiệt độ động cơ, áp suất nhiên liệu, và nhiều thông số khác Điều này giúp người dùng và kỹ thuật viên theo dõi sát sao tình trạng của xe, phát hiện sớm các dấu hiệu bất thường và đưa ra biện pháp bảo dưỡng kịp thời

- Tối ưu hóa hiệu suất và tiết kiệm nhiên liệu: Dữ liệu OBD-II không chỉ giúp chẩn đoán sự cố mà còn giúp tối ưu hóa hiệu suất của động cơ và các hệ thống khác trên xe Bằng cách phân tích các thông số hoạt động, người dùng và kỹ thuật viên có thể điều chỉnh các cài đặt để đạt được hiệu suất tối ưu, tiết kiệm nhiên liệu và giảm thiểu lượng khí thải độc hại

- Đảm bảo tuân thủ các quy định về khí thải: OBD-II được sử dụng để kiểm tra và xác minh xem xe có đáp ứng các tiêu chuẩn khí thải nghiêm ngặt của chính phủ hay không Điều này giúp bảo vệ môi trường và đảm bảo sức khỏe cộng đồng

- Nâng cao trải nghiệm người dùng: Với sự phát triển của các ứng dụng di động và thiết bị đọc lỗi OBD-II thông minh, người dùng có thể dễ dàng truy cập và theo dõi dữ liệu OBD-II của xe mình Điều này giúp họ hiểu rõ hơn về chiếc xe của mình, chủ động trong việc bảo dưỡng và nâng cao trải nghiệm lái xe

2.2.1.3 Các thành phần của hệ thống OBD-II

Hệ thống OBD-II bao gồm ba thành phần chính:

* ECU (Electronic Control Unit) - Bộ não của xe hơi:

ECU là viết tắt của Electronic Control Unit, hay còn gọi là bộ điều khiển điện tử Đây chính là "bộ não" của xe hơi, chịu trách nhiệm giám sát và điều khiển hoạt động của các hệ thống khác nhau trên xe, từ động cơ, hộp số, đến hệ thống phanh, hệ thống an toàn, và hệ thống giải trí

ECU hoạt động như một máy tính thu nhỏ, nhận dữ liệu từ các cảm biến trên xe, xử lý dữ liệu đó theo các thuật toán được lập trình sẵn, và gửi các tín hiệu điều khiển đến các bộ phận chấp hành để điều chỉnh hoạt động của xe Ví dụ, ECU động cơ sẽ nhận dữ liệu từ cảm biến oxy, cảm biến nhiệt độ, và cảm biến vị trí bướm ga để tính toán lượng nhiên liệu cần thiết và thời điểm đánh lửa tối ưu, từ đó điều khiển kim phun nhiên liệu và hệ thống đánh lửa để đảm bảo động cơ hoạt động hiệu quả

* Cổng kết nối OBD-II:

Cổng OBD-II là một cổng kết nối 16 chân, thường nằm dưới bảng điều khiển của xe, phía người lái Cổng này được tiêu chuẩn hóa, có nghĩa là nó có cùng hình dạng và chân cắm trên tất cả các xe hơi được sản xuất sau năm 1996

Hình 2.8 Cổng kết nối OBD-II

Các công cụ và phần mềm hỗ trợ trong việc lấy dữ liệu mạng CAN qua OBD-II

Để thực hiện đề tài này, cần sử dụng một số công cụ và phần mềm hỗ trợ Các công cụ này giúp chúng ta kết nối với xe, đọc và giải mã dữ liệu từ ECU, cũng như xử lý và hiển thị dữ liệu trên màn hình

2.3.1 Thiết bị hỗ trợ đọc OBD-II (chip ELM327)

ELM327 là một trong những thiết bị đọc OBD-II phổ biến nhất hiện nay Nó có khả năng giao tiếp với ECU của xe thông qua các giao thức OBD-II khác nhau, bao gồm cả CAN bus ELM327 có thể được kết nối với máy tính, điện thoại thông minh hoặc máy tính bảng thông qua Bluetooth hoặc Wi-Fi, cho phép người dùng đọc và phân tích dữ liệu OBD-II một cách dễ dàng

ELM327 là một vi điều khiển nhỏ gọn, được tích hợp chip ELM327 Chip này có khả năng giao tiếp với ECU của xe thông qua các giao thức OBD-II khác nhau, bao gồm cả CAN bus ELM327 nhận các lệnh từ thiết bị bên ngoài thông qua giao diện UART (Universal Asynchronous Receiver/Transmitter) hoặc Bluetooth/Wi-Fi, sau đó chuyển đổi chúng thành các lệnh OBD-II và gửi đến ECU ECU sẽ phản hồi lại bằng cách gửi dữ liệu trở lại ELM327, sau đó được chuyển đổi thành dạng mà thiết bị bên ngoài có thể hiểu được

- Đọc và xóa mã lỗi (DTC): ELM327 cho phép người dùng đọc và xóa các mã lỗi được

45 lưu trữ trong ECU, giúp xác định và khắc phục các sự cố trên xe

- Xem Live Data: ELM327 có thể truy cập và hiển thị các thông số hoạt động của xe trong thời gian thực, chẳng hạn như tốc độ, vòng tua máy, nhiệt độ động cơ, áp suất nhiên liệu, v.v

- Xem Freeze Frame Data: ELM327 cho phép xem các thông số hoạt động của xe tại thời điểm xảy ra lỗi, giúp chẩn đoán nguyên nhân gây ra lỗi

- Thực hiện các bài kiểm tra chẩn đoán: Một số thiết bị ELM327 còn có khả năng thực hiện các bài kiểm tra chẩn đoán khác nhau, chẳng hạn như kiểm tra hệ thống cảm biến oxy hoặc kiểm tra hệ thống EVAP Ưu điểm:

- Giá cả phải chăng: ELM327 có giá thành khá rẻ, phù hợp với túi tiền của nhiều người dùng

- Dễ sử dụng: Giao diện của ELM327 thường đơn giản và dễ sử dụng, không yêu cầu kiến thức kỹ thuật chuyên sâu

- Hỗ trợ nhiều giao thức OBD-II: ELM327 có thể giao tiếp với hầu hết các xe hơi hỗ trợ OBD-II, bất kể giao thức truyền thông được sử dụng

- Kết nối linh hoạt: ELM327 có thể kết nối với nhiều thiết bị khác nhau như máy tính, điện thoại thông minh, và máy tính bảng thông qua Bluetooth hoặc Wi-Fi

2.3.2 Vi điều khiển ESP32 và Raspberry Pi

Trong đề tài này, chúng ta sẽ tận dụng sự kết hợp mạnh mẽ giữa vi điều khiển ESP32 và Raspberry Pi để xây dựng một hệ thống hiển thị dữ liệu CAN hiệu quả và linh hoạt

ESP32, với khả năng kết nối linh hoạt và sức mạnh xử lý đáng kể, sẽ đảm nhận vai trò trung gian quan trọng, kết nối và truyền tải dữ liệu giữa thiết bị đọc OBD-II (ELM327) và Raspberry Pi

Kết nối với ELM327 thông qua Bluetooth: ESP32 sẽ sử dụng giao tiếp Bluetooth để thiết lập kết nối không dây với ELM327 Điều này giúp giảm thiểu sự rườm rà của dây cáp và tăng tính linh hoạt cho việc lắp đặt hệ thống trên xe

Giao tiếp với Raspberry Pi thông qua Serial Port: Sau khi nhận dữ liệu từ ELM327, ESP32 sẽ xử lý và chuyển đổi dữ liệu thành định dạng phù hợp Sau đó, ESP32 sẽ truyền dữ liệu này đến Raspberry Pi thông qua giao tiếp Serial Đây là một giao thức truyền thông đơn giản và hiệu quả, cho phép truyền dữ liệu với tốc độ cao giữa hai thiết bị

* Các chức năng của ESP32:

- Kết nối và giao tiếp với ELM327: ESP32 sẽ gửi các lệnh AT đến ELM327 để yêu cầu dữ liệu OBD-II và nhận dữ liệu trả về từ ELM327 thông qua Bluetooth

- Xử lý dữ liệu OBD-II: ESP32 sẽ giải mã các mã PID (Parameter ID) trong dữ liệu OBD-II, chuyển đổi dữ liệu sang định dạng phù hợp với Raspberry Pi, và lọc bỏ các thông tin không cần thiết

- Truyền dữ liệu đến Raspberry Pi: ESP32 sẽ gửi dữ liệu đã xử lý đến Raspberry Pi thông qua cổng Serial

* Ưu điểm của việc sử dụng ESP32:

- Kết nối không dây: Giúp giảm thiểu sự rườm rà của dây cáp và tăng tính linh hoạt cho việc lắp đặt hệ thống

- Khả năng xử lý mạnh mẽ: ESP32 có khả năng xử lý dữ liệu nhanh chóng và hiệu quả, đáp ứng được yêu cầu của hệ thống hiển thị dữ liệu CAN thời gian thực

- Dễ dàng lập trình: ESP32 có thể được lập trình bằng Arduino IDE hoặc các công cụ khác, giúp việc phát triển phần mềm trở nên dễ dàng và thuận tiện

Tổng quan về xử lý ảnh

2.4.1 Giới thiệu về xử lý ảnh

Chuyển đổi hình ảnh thành dạng kỹ thuật số và trích xuất thông tin hữu ích là quy trình của xử lý dữ liệu hình ảnh, điều này thường được thực hiện thông qua việc áp dụng các phương pháp xử lý tín hiệu đã được xác định trên tín hiệu 2D của hình ảnh để thực hiện các thao tác này Điều này giúp tạo ra các bước tiền xử lý cần thiết để phân tích và hiểu rõ hơn về nội dung của hình ảnh và có thể áp dụng các thuật toán thông minh để trích xuất thông tin quan trọng từ hình ảnh đó

Hình 2.17 Các bước cơ bản của xử lý ảnh

Xử lý hình ảnh cho phép chúng ta thực hiện việc phân tích, nhận dạng đối tượng, định vị vị trí, và nhận diện các đặc điểm trong hình ảnh Các kết quả từ quá trình này có ứng dụng rộng rãi trong nhiều lĩnh vực, như xác minh và nhận dạng trong lĩnh vực y học, giám sát an ninh, xe tự lái, quy trình ngăn chặn gian lận và làm giả tài liệu, cũng như phân tích hành vi con người

2.4.2 Các thành phần cơ bản của xử lý ảnh

2.4.2.1 Một số khái niệm cơ bản Điểm ảnh thường được hiểu là mức độ sáng tại một vị trí cụ thể trong không gian của một đối tượng Ảnh được tạo thành từ việc tổ hợp các điểm ảnh, mỗi điểm này chứa các thông tin như màu sắc, độ sáng, vị trí và các yếu tố khác Do đó, một bức ảnh có thể được hiểu như một hàm số của n biến P(c1, c2, , cn) Ảnh mức xám là loại ảnh mà mỗi điểm ảnh (pixel) biểu thị một mẫu duy nhất của ánh sáng, chỉ chứa thông tin về cường độ và không chứa thông tin về màu sắc Điều này có nghĩa là mỗi pixel trong ảnh mức xám chỉ thể hiện mức độ độ sáng tại vị trí đó trên bức ảnh Đây là một loại ảnh đơn sắc, thường là đen-trắng hoặc các sắc thái của màu xám, và thường được sử dụng trong các ứng dụng cần tập trung vào cường độ ánh sáng hơn là màu sắc, như trong việc phân tích các cấu trúc, kết cấu hoặc các đặc điểm khác của hình ảnh

Nắn chỉnh biến dạng trong xử lý ảnh là quá trình điều chỉnh hình dạng hoặc kích thước của một hình ảnh để phù hợp với mục đích xử lý cụ thể Có nhiều kỹ thuật được sử dụng để nắn chỉnh biến dạng, bao gồm:

- Biến đổi hình học: Sử dụng các phép biến đổi như xoay, phóng to, thu nhỏ và chuyển đổi tọa độ để thay đổi hình dạng của hình ảnh

- Biến đổi phi tuyến tính: Áp dụng các kỹ thuật như biến đổi đa giác, biến đổi Splines hoặc biến đổi tự do để tạo ra các biến dạng phi tuyến tính, giúp nắn chỉnh hình dạng một cách linh hoạt và tự nhiên hơn

Chỉnh mức xám là quá trình nhằm khắc phục tính không đồng đều của hệ thống gây ra trong xử lý ảnh Thông thường, có hai hướng tiếp cận chính:

- Giảm số mức xám: Được thực hiện bằng cách nhóm các mức xám gần nhau lại thành một nhóm Trong trường hợp chỉ có hai mức xám, quá trình này sẽ chuyển đổi ảnh thành ảnh đen trắng Một trong những ứng dụng phổ biến của phương pháp này là khi in ảnh màu ra máy in đen trắng

- Tăng số mức xám: Được thực hiện thông qua kỹ thuật nội suy để tạo ra các mức xám trung gian Mục tiêu của kỹ thuật này là tăng cường độ mịn của ảnh, giúp hiển thị chi tiết và độ sắc nét tốt hơn

Thông thường trong xử lý ảnh sẽ xử dụng 8 Bits để mã hóa 256 mức xám

Trong xử lý ảnh, trích xuất đặc trưng là quá trình lấy thông tin quan trọng từ hình ảnh để đại diện cho đặc tính của đối tượng Đặc trưng có thể là các đặc điểm như cạnh, góc, điểm nổi bật, màu sắc, texture, hoặc các thông tin khác giúp nhận dạng đối tượng Quá trình này bao gồm các bước chính:

1 Tiền xử lý: Chuẩn bị ảnh bằng cách làm mịn, làm sáng, làm nổi bật đối tượng và loại bỏ nhiễu để tăng đồng nhất và giảm nhiễu

2 Trích xuất đặc trưng: Sử dụng các phương pháp như phát hiện cạnh, phân đoạn, trích xuất texture và màu sắc để nhận biết và rút trích thông tin quan trọng

3 Biểu diễn đặc trưng: Biểu diễn dưới dạng dữ liệu dễ sử dụng như các vector hoặc ma trận đặc trưng

Nhận dạng trong xử lý ảnh là quá trình tự động xác định và nhận biết các đối tượng, vật thể, hoặc các biểu hiện trong một bức ảnh dựa trên các đặc trưng và thông tin được trích xuất từ ảnh đó Đây là một lĩnh vực quan trọng trong trí tuệ nhân tạo và xử lý ảnh, có nhiều

53 ứng dụng thực tế như nhận dạng khuôn mặt, phát hiện xe hơi, phân loại sản phẩm, và nhiều ứng dụng khác

- Phân loại: Xác định loại đối tượng hoặc biểu hiện trong ảnh, như phân loại loại động vật, nhận diện khuôn mặt, phân loại vật liệu

- Phát hiện: Xác định vị trí và đặc điểm của các đối tượng trong ảnh, như phát hiện đường đi, nhận dạng biển số xe, phát hiện vật thể trong video

- Gán nhãn: Đánh dấu và xác định các vùng của ảnh tương ứng với các đối tượng hoặc thuộc tính cụ thể, như gán nhãn đồ vật trong ảnh y khoa.

Đặc trưng HOG

HOG là viết tắt của "Histogram of Oriented Gradients" trong lĩnh vực xử lý ảnh và thị giác máy tính HOG là một phương pháp phổ biến được sử dụng để trích xuất đặc trưng từ hình ảnh, thường được áp dụng trong các ứng dụng như nhận dạng đối tượng, phát hiện vật thể và phân loại hình ảnh

Ta nhận thấy đặc trưng của mỗi bức ảnh được biểu diễn thông qua 2 thông số đó là mức độ thay đổi cường độ màu sắc (ma trận gradient magnitude) và hướng thay đổi cường độ màu sắc (ma trận gradient direction) Do đó chúng ta cần tạo ra được một bộ mô tả (feature descriptor) sao cho biến đổi bức ảnh thành một véc tơ mà thể hiện được cả 2 thông tin này Để làm được như vậy, hình ảnh được chia thành một lưới ô vuông mà mỗi một ô có kích thước 8x8 pixels Như vậy chúng ta có tổng cộng 64 ô pixels tương ứng với mỗi ô Trên mỗi một ô trong 64 pixels ta sẽ cần tính ra 2 tham số đó là độ lớn gradient (gradient magnitute) và phương gradient (gradient direction) Như vậy tổng cộng 8x8x2 = 128 giá trị cần tính bao gồm 64 giá trị gradient magnitute và 64 giá trị gradient direction như ma trận hình bên dưới:

Hình 2.19 Hình ảnh vận động viên được chia thành các lưới ô vuông

Mỗi ô vuông có kích thước 8x8 pixels Trên mỗi ô chúng ta thực hiện tính đạo hàm thông qua bộ lọc Sobel để thu được 2 ma trận bên phải là gradient magnitude và gradient direction

Véc tơ histogram sẽ được tạo ra như sau:

* Bước 1: Mapping độ lớn gradient vào các bins tương ứng của phương gradient

Sắp xếp các giá trị phương gradient theo thứ tự từ nhỏ đến lớn và chia chúng vào 9 bins Chỉ số của phương gradient sẽ nằm trong khoảng [0, 180] nên mỗi bins sẽ có độ dài là

Hình 2.20 Mapping độ lớn gradients với các bins Đầu mút là các giá trị chia hết cho độ rộng của một bin (chẳng hạn 0, 20, 40,… là những đầu mút bin) Trong trường hợp độ lớn phương gradients không rơi vào các đầu mút, ta sẽ sử dụng linear interpolation để phân chia độ lớn gradient về 2 bins liền kề mà giá trị phương gradient rơi vào Ví dụ: giá trị phương gradient bằng 𝑥 ghép cặp với độ lớn gradient bằng

𝑦 𝑥 ∈ [𝑥 0 , 𝑥 1 ] tức là phương gradients rơi vào khoảng giữa bin thứ (𝑙 − 1) và bin thứ 𝑙 : Khi đó tại 2 bins và được điền vào giá trị cường độ theo công thức interpolation:

Hình 2.21 Chia độ lớn gradient về 2 bins liền kề

Tính tổng tất cả các độ lớn gradient thuộc cùng 1 bins của véc tơ bins ta thu được biểu đồ Histogram of Gradients như bên dưới:

Hình 2.22 Biểu đồ Histogram of Gradient gồm 9 bins tương ứng với một ô vuông trong lưới ô vuông

* Bước 2: Chuẩn hóa véc tơ histogram theo block 16x16

Chúng ta thấy rằng véc tơ histogram sẽ bị phụ thuộc vào cường độ các pixels của một bức ảnh Với 2 bức ảnh có cùng nội dung nhưng bức ảnh biến thể tối hơn được tạo thành từ ma trận ảnh gốc nhân 1/2 Khi đó giá trị véc tơ histogram của ảnh gốc cũng sẽ gấp đôi véc tơ histogram của ảnh biến thể Chính vì thế cần chuẩn hóa véc tơ histogram để cả 2 bức ảnh có cùng một véc tơ biểu diễn

Chuẩn hóa norm chuẩn bậc 2: 𝑛𝑜𝑟𝑚𝑎𝑙𝑖𝑧𝑒(ℎ) = ℎ

Trong đó h là véc tơ histogram của các gradient

Quá trình chuẩn hóa sẽ thực hiện trên một block kích thước 2x2 trên lưới ô vuông ban đầu (mỗi ô kích thước 8x8 pixel) Như vậy chúng ta sẽ có 4 véc tơ histogram kích thước 1x9, concatenate các véc tơ sẽ thu được véc tơ histogram tổng hợp kích thước là 1x36 và sau đó chuẩn hóa theo norm chuẩn bậc 2 trên véc tơ này

* Bước 3: Tính toán HOG feature véc tơ

Sau khi chuẩn hóa các véc tơ histogram, chúng ta sẽ concatenate các véc tơ 1x36 này thành một véc tơ lớn Đây chính là véc tơ HOG đại diện cho toàn bộ hình ảnh

Ví dụ: Hình ảnh của chúng ta được chia thành lưới ô vuông kích thước 16x8 (mỗi ô 8x8) Qúa trình tính toán HOG sẽ di chuyển 7 lượt theo chiều rộng và 15 lượt theo chiều cao Như vậy sẽ có tổng cộng 7x155 patches, mỗi patch tương ứng với 1 véc tơ histograms 36 chiều Do đó cuối cùng véc tơ HOG sẽ có kích thước là 105x36780 chiều Đây là một véc tơ kích thước tương đối lớn nên có thể mô phỏng được đặc trưng của ảnh khá tốt Đối với mỗi một ô trên lưới ô vuông, chúng ta biểu diễn phân phối HOG bao gồm nhóm

9 véc tơ chung gốc chiều dài bằng độ lớn gradient và góc bằng phương gradient Khi đó chiều của nhóm các véc tơ sẽ tương đối giống với dáng của vận động viên trong ảnh, đặc biệt là tại các vị trí chân và tay Cụ thể hãy xem hình bên dưới:

Bộ phân loại SVM

Support Vector Machines (có tài liệu dịch là Máy véctơ hỗ trợ) là một trong số những thuật toán phổ biến và được sử dụng nhiều nhất trong học máy trước khi mạng nơ ron nhân tạo trở lại với các mô hình deep learning Nó được biết đến rộng rãi ngay từ khi mới được phát triển vào những năm 1990

Mục tiêu của SVM là tìm ra một siêu phẳng trong không gian N chiều (ứng với N đặc trưng) chia dữ liệu thành hai phần tương ứng với lớp của chúng Nói theo ngôn ngữ của đại số tuyển tính, siêu phẳng này phải có lề cực đại và phân chia hai bao lồi và cách đều chúng

59 Siêu phẳng tạo ra một biên giới phân chia 2 lớp của dữ liệu

Hình 2.24 SVM trong không gian hai chiều và ba chiều Để phân chia hai lớp dữ liệu, rõ ràng là có rất nhiều siêu phẳng có thể làm được điều này Mặc dù vậy, mục tiêu của chúng ta là tìm ra siêu phẳng có lề rộng nhất tức là có khoảng cách tới các điểm của hai lớp là lớn nhất Hình dưới đây là một ví dụ trực quan về điều đó

Hình 2.25 Siêu phẳng tối ưu có lề cực đại Đối với môi trường nhiều đặc trưng từ các vector của HOG thì siêu phẳng có hình dạng phức tạp hơn gọi là siêu phẳng phi tuyến Siêu phẳng phi tuyến là một siêu phẳng có khả năng phân chia dữ liệu không phải là đường thẳng mà là các đường cong, dạng hình uốn lượn, hoặc

60 các hình dạng phức tạp khác

Nhận diện khuôn mặt sử dụng HOG và SYM:

Hình 2.26 Sơ đồ nhận diện khuôn mặt sử dụng HOG và SYM

- Trích xuất đặc trưng HOG từ ảnh: Đầu tiên, ảnh chứa khuôn mặt và nền được sử dụng để trích xuất các vector đặc trưng HOG Quá trình trích xuất này sẽ tạo ra các vector đặc trưng chứa thông tin về cấu trúc và hình dạng của các đối tượng trong ảnh, như khuôn mặt và các phần nền xung quanh

- Gắn nhãn cho các vector đặc trưng: Sau khi có được các vector đặc trưng từ ảnh, chúng ta cần gắn nhãn cho các vector này để biết rằng chúng thuộc vào lớp "khuôn mặt" hay

"không phải khuôn mặt" Trong quá trình huấn luyện, các ảnh trong tập dữ liệu huấn luyện đã được gắn nhãn trước là "khuôn mặt" hoặc "không phải khuôn mặt" Điều này có thể được thực hiện bằng cách sử dụng một bộ dữ liệu có sẵn được gắn nhãn đúng hoặc bằng cách gắn nhãn thủ công cho từng ảnh trong tập dữ liệu

- Tạo mô hình SVM: Sau khi có các vector đặc trưng đã được gắn nhãn, chúng ta sử dụng chúng làm dữ liệu đầu vào cho mô hình SVM trong quá trình huấn luyện SVM sẽ học cách phân biệt các vector đặc trưng của khuôn mặt và nền bằng cách tìm ra một siêu phẳng

61 tối ưu trong không gian đặc trưng Siêu phẳng này sẽ phân chia không gian đặc trưng thành hai phần tương ứng với hai lớp "khuôn mặt" và "không phải khuôn mặt"

- Phân loại ảnh mới: Sau khi mô hình SVM đã được huấn luyện, chúng ta có thể sử dụng nó để phân loại các ảnh mới chưa biết trước là khuôn mặt hay không Khi có một ảnh mới, chúng ta trích xuất các vector đặc trưng HOG từ ảnh đó và đưa chúng vào mô hình SVM đã huấn luyện SVM sẽ sử dụng siêu phẳng đã học được để xác định xem ảnh đó có chứa khuôn mặt hay không, dựa trên vị trí của các vector đặc trưng trong không gian đặc trưng.

Thuật toán Adaboost

AdaBoost là một phương pháp học máy mạnh mẽ không tuyến tính, được xây dựng dựa trên ý tưởng boosting mà Freund và Schapire giới thiệu vào năm 1995 Nguyên tắc hoạt động của AdaBoost là kết hợp các bộ phân loại yếu theo cách tuyến tính để tạo ra một bộ phân loại mạnh

Trong mô hình nhận diện đối tượng của Viola và Jones, họ sử dụng AdaBoost để kết hợp các bộ phân loại yếu sử dụng các đặc trưng Haar-like theo mô hình phân tầng (cascade):

Hình 2.27 Mô hình phân tầng Cascade

62 Trong đó, h(k) là các bộ phân loại yếu, được biểu diễn như sau:

X : là cửa sổ cần xét

𝑓 𝑘 : giá trị đặc trưng haar-like

𝑝 𝑘 : hệ số quyết định chiều của phương trình

AdaBoost sẽ kết hợp các bộ phân loại yếu thành bộ phân loại mạnh như sau:

Với at >= 0 là hệ số chuẩn hóa cho bộ phân loại yếu

Hình ảnh minh họa cho việc kết hợp các bộ phân loại yếu thành bộ phân loại mạnh:

Hình 2.28 Kết hợp các bộ phân loại yếu thành bộ phân loại mạnh

Đặc trưng Haar-like

Các đặc trưng Haar-like là một phương pháp quan trọng trong việc nhận diện đối tượng trong xử lý ảnh và thị giác máy tính Đặc trưng Haar-like được sử dụng phổ biến trong việc nhận diện khuôn mặt và các đối tượng khác bằng cách sử dụng các hình dạng hình học cơ bản như hình chữ nhật và hình vuông Gồm có 4 đặc trưng sau:

- Đặc trưng xung quanh tâm

- Đặc trưng theo đường chéo

Giá trị đặc trưng Haar-like là sự chênh lệch giữa tổng vùng pixel trắng và tổng vùng pixel đen Dưới đây là công thức tính giá trị đặc trưng Haar-like f(x) = Tổng vùng đen(các mức xám của pixel) - Tổng vùng trắng(các mức xám của pixel) Ảnh tích phân (integral image) là một biến đổi quan trọng được sử dụng trong xử lý ảnh để tăng tốc độ tính toán cho việc tính toán các đặc trưng Haar-like Với mỗi phần tử của mảng này được tính bằng cách tính tổng của điểm ảnh phía trên (dòng-1) và bên trái (cột-1) của nó

Hình 2.29 Cách tính integral image

Công thức tính imtergral image

𝑝(𝑥, 𝑦) = ∑ 𝑥 , ≤𝑥,𝑦 , ≤𝑦 𝑖(𝑥 , , 𝑦 , ) Sau khi tính được Integral Image, việc tính tổng các giá trị mức xám của một vùng bất kỳ nào đó trên ảnh thực hiện rất đơn giản theo cách sau:

Gọi vùng cần tính pixel là vùng D:

Hình 2.30 Cách tính giá trị pixel vùng cần tính

Hình 2.31 Sơ đồ nhận diện khuôn mặt

Từ ảnh đầu vào, hệ thống tính các đặc trưng nhanh từ nhiều tỉ lệ qua Integral Image Sau đó sẽ tính cụ thể các đặc trưng thông qua các tỉ lệ đã chia và được một lượng lớn các đặc trưng Tiếp theo dùng giải thuật Adaboost để lựa chọn và kết hợp vùng trọng số yếu thành trọng số mạnh và kết hợp với bộ phân loại Cascade of classifier để xác định vùng là khuôn mặt và loại bỏ vùng không phải là khuôn mặt

Phương pháp Facial Landmark

2.9.1 Giới thiệu về Facial Landmark

Facial Landmark là một phương pháp trong lĩnh vực thị giác máy tính và xử lý ảnh, được áp dụng để xác định và gắn nhãn các điểm đặc trưng trên khuôn mặt của cá nhân trong hình ảnh hoặc video Các điểm này thường bao gồm mắt, mũi, miệng, lông mày và cằm, và có nhiều ứng dụng quan trọng như nhận dạng khuôn mặt

Việc xác định Facial Landmark Detection gồm hai bước sau đây:

1 Xác định vị trí của khuôn mặt trong hình ảnh

2 Xác định các cấu trúc trên khuôn mặt Ở bước 1, việc xác định trí khuôn mặt trong hình ảnh được hiện bằng thuật toán Haar cascades Kết quả cuối cùng sẽ là một vùng (thường là hình chữ nhật) được định rõ bởi tọa độ (x, y) bao quanh khuôn mặt trong bức ảnh Sau khi tìm được ví trí khuôn mặt trong hình

66 ảnh, chúng ta sẽ xác định các cấu trúc trên khuôn mặt như mắt, mũi, miệng,…, cằm

Có một loạt các phương pháp phát hiện các điểm đánh dấu trên khuôn mặt, nhưng tất cả đều tập trung chủ yếu vào việc xác định và đánh dấu các khu vực sau trên khuôn mặt: miệng, lông mày phải, lông mày trái, mắt phải, mắt trái, mũi, và hàm Trong thư viện dlib, việc phát hiện các điểm đánh dấu trên khuôn mặt được thực hiện dựa trên nghiên cứu "One Millisecond Face Alignment with an Ensemble of Regression Trees" của Kazemi và Sullivan (2014)

Phương pháp này bắt đầu bằng việc sử dụng dữ liệu huấn luyện có nhãn cho các điểm đánh dấu trên khuôn mặt trên các hình ảnh Các hình ảnh này đã được đánh nhãn bằng cách thủ công, xác định các tọa độ cụ thể (x, y) của các vùng xung quanh mỗi cấu trúc trên khuôn mặt Đặc biệt là xác suất về sự tương quan giữa các cặp điểm ảnh đầu vào Dựa trên dữ liệu huấn luyện này, một tập hợp các cây hồi qui được huấn luyện để ước lượng vị trí của các điểm đánh dấu trên khuôn mặt trực tiếp từ cường độ điểm ảnh (không có quá trình "trích xuất đặc trưng" nào xảy ra) Kết quả là một máy phát hiện điểm đánh dấu trên khuôn mặt có thể được sử dụng để thực hiện phát hiện trong thời gian thực với chất lượng dự đoán cao

2.9.2 Bộ đánh dấu mốc trên khuôn mặt của Dlib

Bộ đánh dấu mốc trên khuôn mặt trong Dlib được sử dụng để ước lượng 68 tọa độ (x, y) tương ứng với tọa độ các facial landmarks trên khuôn mặt Chỉ số của 68 tọa độ có thể được biểu diễn như hình dưới (tuy nhiên ở trong Python nó sẽ được đánh số từ 0 đến 67)

Hình 2.32 Biểu diễn 68 tọa độ trên mặt người từ tập dữ liệu Ibug 300-W

Tính toán tỷ lệ mắt trong xử lý ảnh

Mỗi mắt được đại diện bởi 6 tọa độ (x,y), bắt đầu từ góc trái của mắt (như đang nhìn đối diện) và đánh dấu các tọa độ tuần tự theo chiều kim đồng hồ

Hình 2.33 Đánh dấu tọa độ trên mắt bằng 6 điểm

Có một mối quan hệ giữa chiều rộng và chiều cao của các tọa độ này Dựa trên bài báo của Soukupová và Cech năm 2016, ta có một phương trình thể hiện tỷ số mắt (EAR)

Cũng theo bài báo Real-Time Eye Blink Detection using Facial Landmarks của

Soukupová và Cech năm 2016, ngưỡng mắt lý tưởng để xác định ngủ gật là 0.2 Từ đó việc phát hiện ngủ gật được thực hiện bằng cách lấy tỉ số mắt EAR đem đi so sánh với ngưỡng mắt đã thiết lập, nếu nhỏ hơn ngưỡng mắt thì tức là ngủ gật và ngược lại như thế.

Ngôn ngữ lập trình Python

Python là một ngôn ngữ lập trình mạnh mẽ, thông dịch và có tính đa mục đích, với điểm nổi bật là sự dễ học và linh hoạt Được ra mắt vào những năm 1990, Python đã từng bước trở thành một trong những ngôn ngữ phổ biến nhất trong cộng đồng lập trình toàn cầu Với cú pháp đơn giản và gần gũi với ngôn ngữ tự nhiên, Python là lựa chọn lý tưởng cho cả người mới bắt đầu học lập trình và những lập trình viên có kinh nghiệm Sức mạnh của Python không chỉ dừng lại ở việc viết script đơn giản, mà còn mở ra những khả năng vô tận trong các lĩnh vực như phát triển ứng dụng web, trí tuệ nhân tạo (AI), khoa học dữ liệu, tính toán khoa học, tự động hóa, và nhiều ứng dụng khác

Không chỉ dừng lại ở việc xây dựng các ứng dụng truyền thống, Python còn có thể đáp ứng các yêu cầu cao cấp như xử lý dữ liệu lớn (big data), phân tích dữ liệu, xây dựng hệ thống trí tuệ nhân tạo và học máy Các thư viện như NumPy, pandas, Matplotlib, TensorFlow, và PyTorch là những công cụ mạnh mẽ mà Python cung cấp cho các nhà phát triển và nhà nghiên cứu

Python được sử dụng rộng rãi trong nhiều lĩnh vực và có các ứng dụng đa dạng, từ các ứng dụng cơ bản đến những ứng dụng phức tạp và tiên tiến Dưới đây là một số ứng dụng chính của Python:

- Phát triển web: Python có các framework mạnh mẽ như Django, Flask, và Pyramid, giúp lập trình viên xây dựng các ứng dụng web phức tạp và hiệu quả Django, ví dụ, được sử dụng để xây dựng các trang web phức tạp như Instagram, Dropbox

- Khoa học dữ liệu và phân tích dữ liệu: Python là công cụ ưa thích của các nhà khoa

69 học dữ liệu và nhà phân tích dữ liệu Các thư viện như NumPy, pandas, Matplotlib giúp xử lý dữ liệu, thực hiện phân tích, và hiển thị dữ liệu một cách dễ dàng và mạnh mẽ

- Trí tuệ nhân tạo và học máy: Python có các thư viện như TensorFlow, PyTorch, scikit- learn, Keras giúp phát triển và triển khai các mô hình trí tuệ nhân tạo (AI) và học máy (Machine Learning) một cách hiệu quả và linh hoạt

- Tự động hóa và scripting: Python được sử dụng rộng rãi cho các nhiệm vụ tự động hóa và viết script Nó có thể được sử dụng để tự động hóa các tác vụ hàng ngày, xử lý dữ liệu tự động, tạo các công cụ quản lý hệ thống, và nhiều công việc khác

- Phát triển game: Python không chỉ được sử dụng cho việc phát triển ứng dụng web và khoa học dữ liệu mà còn được sử dụng để phát triển game Pygame là một thư viện phổ biến được sử dụng để tạo game đơn giản và game 2D

- Ứng dụng di động: Mặc dù không phổ biến nhưng Python cũng có thể được sử dụng để phát triển ứng dụng di động Kivy là một framework cho phép lập trình viên sử dụng Python để tạo các ứng dụng di động đa nền tảng

- Phát triển desktop và ứng dụng GUI: Với các thư viện như Tkinter, PyQt, wxPython, Python có thể được sử dụng để phát triển các ứng dụng desktop và ứng dụng giao diện đồ họa (GUI) đa nền tảng Đặc biệt Python là một công cụ mạnh mẽ cho xử lý ảnh và thị giác máy tính, với các thư viện và framework như OpenCV, Pillow, scikit-image và TensorFlow Dưới đây là một số ứng dụng của Python trong lĩnh vực này:

- Xử lý và biến đổi ảnh: Python có các thư viện như OpenCV và Pillow cho phép bạn thực hiện các thao tác xử lý ảnh như cắt, xoay, thay đổi kích thước, chuyển đổi định dạng, chỉnh sửa màu sắc và độ tương phản của ảnh một cách linh hoạt và hiệu quả

- Phát hiện và nhận diện đối tượng: Python có các công cụ như OpenCV, TensorFlow Object Detection API cho phép phát hiện và nhận diện các đối tượng trong ảnh và video Điều này có thể áp dụng trong các ứng dụng như nhận diện khuôn mặt, phát hiện vật thể, nhận diện biển báo giao thông, và nhiều ứng dụng khác

- Xử lý ảnh y tế và khoa học: Trong lĩnh vực y tế và khoa học, Python được sử dụng để xử lý và phân tích các hình ảnh y tế như hình ảnh MRI, CT scans, hình ảnh vi mô, giúp các

70 chuyên gia y tế và nhà nghiên cứu hiểu rõ hơn về bệnh tật và phương pháp điều trị

- Xử lý ảnh số và đồ họa máy tính: Python có thể được sử dụng để xử lý và hiển thị các hình ảnh số và đồ họa máy tính Các thư viện như Matplotlib và Pillow cho phép bạn tạo và hiển thị các biểu đồ, hình ảnh, và đồ họa phức tạp trực quan trong ứng dụng của mình

- Phát triển ứng dụng thị giác máy tính (Computer Vision): Python là một công cụ lý tưởng cho việc phát triển các ứng dụng thị giác máy tính như hệ thống giám sát an ninh, xe tự lái, nhận diện biển số xe, phân loại sản phẩm, và các ứng dụng thông minh khác dựa trên thị giác máy tính

Thư viện OpenCv và Dlib

OpenCV (Open Source Computer Vision Library) là một thư viện mã nguồn mở hàng đầu trong lĩnh vực thị giác máy tính và xử lý ảnh Nó được Intel phát triển và hiện đang được cộng đồng nguồn mở lớn tiếp tục duy trì OpenCV cung cấp nhiều tính năng và công cụ để thao tác và xử lý ảnh và video, từ các thao tác cơ bản đến nhận diện đối tượng và xử lý hình ảnh thời gian thực

Dưới đây là một số điểm mạnh của thư viện OpenCV:

- Đa nền tảng: OpenCV hỗ trợ trên nhiều nền tảng, bao gồm Windows, Linux, macOS và cả các nền tảng nhúng như Android và iOS Điều này cho phép phát triển ứng dụng trên nhiều thiết bị khác nhau

- Các chức năng mạnh mẽ: OpenCV cung cấp nhiều chức năng mạnh mẽ như xử lý ảnh, xử lý video, xử lý dữ liệu camera, nhận diện khuôn mặt, nhận diện đối tượng, tính toán đặc trưng hình ảnh và nhiều công việc khác

- Hiệu suất cao: OpenCV được viết bằng C/C++, và có giao diện với Python (cũng như các ngôn ngữ khác), giúp tối ưu hiệu suất khi thực hiện các thao tác xử lý ảnh và thị giác máy tính

- Hỗ trợ đa dạng: OpenCV có thư viện cho nhiều ngôn ngữ lập trình như C++, Python, Java, và có thể tích hợp với các framework khác như TensorFlow và PyTorch để phát triển các ứng dụng trí tuệ nhân tạo phức tạp

Với những ưu điểm trên, OpenCV đã trở thành công cụ không thể thiếu trong lĩnh vực thị giác máy tính và xử lý ảnh, và được sử dụng rộng rãi trong nhiều ứng dụng từ cá nhân đến công nghiệp và nghiên cứu

Thư viện Dlib được phát triển bởi Davis King, một nhà nghiên cứu và phát triển phần mềm trong lĩnh vực thị giác máy tính và machine learning Dlib không chỉ là một thư viện mà còn là một bộ công cụ toàn diện cho các ứng dụng liên quan đến xử lý ảnh và thị giác máy tính Nó cũng bao gồm một số thư viện con (sub-libraries) được tích hợp để cung cấp các chức năng cụ thể và tối ưu hóa cho các nhiệm vụ nhất định Dưới đây là một số thư viện con của Dlib:

- Dlib Image Processing Library (Dlib-Image): Thư viện này cung cấp các công cụ và chức năng để xử lý ảnh, bao gồm cắt, chuyển đổi định dạng, chỉnh sửa màu sắc, thay đổi kích thước và các thao tác xử lý ảnh khác

- Dlib Machine Learning Library (Dlib-ML): Thư viện này bao gồm các thuật toán và công cụ machine learning như SVM (Support Vector Machines), k-means clustering, linear regression, multi-class classification và các thuật toán khác để huấn luyện và triển khai các mô hình machine learning

- Dlib IO Library (Dlib-IO):Thư viện này cung cấp các công cụ và chức năng để đọc và ghi dữ liệu từ và ra các nguồn dữ liệu khác nhau như tệp tin, thiết bị đầu vào/đầu ra, mạng, Điều này hữu ích cho việc xử lý và quản lý dữ liệu trong các ứng dụng của Dlib

Các thư viện con của Dlib giúp mở rộng tính năng của thư viện chính và cung cấp các công cụ chuyên sâu cho các nhiệm vụ cụ thể trong lĩnh vực thị giác máy tính, xử lý ảnh và machine learning

THIẾT KẾ VÀ TRIỂN KHAI HỆ THỐNG

Thiết kế phần cứng

Hình 3.1 Sơ đồ hệ thống

Hệ thống bao gồm các thành phần chính sau:

- Thiết bị đọc OBD-II (ELM327): Đây là cầu nối giữa hệ thống điện tử của xe và các thiết bị bên ngoài ELM327 sẽ giao tiếp với ECU của xe thông qua giao thức CAN và chuyển đổi dữ liệu thành dạng mà vi điều khiển có thể hiểu được

+ Giao tiếp với ELM327 qua Bluetooth để nhận dữ liệu CAN

+ Xử lý và chuyển đổi dữ liệu CAN thành định dạng phù hợp

+ Giao tiếp với Raspberry Pi qua cổng Serial để truyền dữ liệu CAN

+ Nhận dữ liệu CAN từ ESP32 qua cổng Serial (UART)

+ Giao tiếp với camera USB để nhận dữ liệu hình ảnh

+ Xử lý ảnh từ camera để nhận diện trạng thái ngủ gật của tài xế (sử dụng các thuật toán xử lý ảnh và thị giác máy tính và thư viện opencv)

+ Hiển thị dữ liệu CAN và thông tin cảnh báo (nếu có) lên màn hình

+ Đưa ra cảnh báo qua loa khi phát hiện tài xế ngủ gật

73 + Gửi tin nhắn cảnh bảo ngủ gật về điện thoại thông qua Twillio

- Màn hình hiển thị: Màn hình được sử dụng để hiển thị các thông số CAN và camera một cách trực quan

- Camera USB: Ghi lại hình ảnh tài xế để Raspberry Pi xử lý

- Loa: Phát ra âm thanh cảnh báo khi Raspberry Pi phát hiện tài xế ngủ gật

Kết nối các thành phần phần cứng:

- ELM327 - ESP32: Kết nối qua Bluetooth

- ESP32 - Raspberry Pi: Kết nối qua cổng Serial (UART) Theo hình sau:

Hình 3.2 Thiết kế giao tiếp Raspberry pi 4 và Esp32

- Raspberry Pi - Màn hình 7 inch: Kết nối qua cổng HDMI.

Thiết kế phần mềm

3.2.1.1 Tổng quan về các phần cần xử lý

Thuật toán đọc dữ liệu CAN từ OBD2: Sử dụng C/C++ để viết thư viện giao tiếp với ECU trong mạng CAN và dùng các lệnh AT để thiết lập ELM327

Xử lý và lọc dữ liệu CAN: Giải mã các mã PID, chuyển đổi dữ liệu sang định dạng phù hợp, và lọc bỏ các thông tin không cần thiết

Truyền dữ liệu đến Raspberry Pi: Gửi dữ liệu đã xử lý đến Raspberry Pi qua cổng Serial

3.2.1.2 Sơ đồ thuật toán cần triển khai để viết code

Hình 3.3 Sơ đồ thuật toán của ESP32

- Khởi tạo các thuộc tính của class ELM327

- Gửi các lệnh AT của ELM327 để thiết lập cài đặt tối ưu việc giao tiếp giữa ESP32 và

ELM327 Các lệnh bao gồm:

AT D: dùng để thiết lập tất cả cài đặt của ELM327 về mặc định

AT Z: Đặt lại tất cả các cài đặt và khởi động lại thiết bị

AT E0: Echo Off để ngăn việc khi ELM327 gửi các command đến ECU thì nó không bị lặp lại command đó

AT S0: Loại bỏ khoảng trắng của command phản hồi từ ECU để tăng tốc độ giao tiếp

AT AL: Cho phép nhận phản hồi với số byte không giới hạn

AT ST 02: thiết lập thời gian đợi phản hồi từ ECU là 8ms

AT SP A0: thiết lập protocol là Auto

- Gửi command “0100” để truy vấn PID nào sẽ được hỗ trợ

Hình 3.4 Sơ đồ thuật toán khởi tạo ELM327

* Thuật toán truy vấn giá trị các PID và kiểm tra PID nào được support:

Hình 3.5 Sơ đồ thuật toán truy vấn và nhận các data từ ECU

* Thuật toán truy vấn số VIN và nhận biết hãng xe:

Hình 3.6 Truy vấn số VIN và tên nhà sản xuất

* Thuật toán lấy mã lỗi:

Hình 3.7 Truy vấn mã lỗi

3.2.2 Phần mềm trên Raspberry Pi

- Phần xử lý hiển thị dữ liệu từ OBD-II: dùng pygame để thiết kế giao diện và hiển thị dữ liệu lên màn hình

- Phần xử lý ảnh: dùng thư viện OpenCV để xử lý ảnh bằng các thuật toán

- Phần gửi tin nhắn cảnh báo ngủ gật về điện thoại và thông qua loa: dùng Twillio để gửi tin nhắn về điện thoại và dùng thư viện … để chuyển văn bản cảnh báo thành âm thanh và đưa ra loa

3.2.2.1 Cấu tạo phần cứng Raspberry Pi 4

Raspberry Pi 4 là một máy tính cỡ nhỏ sử dụng hệ điều hành Linux, là một trong những phiên bản được nâng cấp đáng chú ý nhất của dòng máy tính nhỏ gọn Raspberry Pi Nó được phát triển bởi Raspberry Pi Foundation và ra mắt vào tháng 6 năm 2019 Raspberry Pi 4 mang lại nhiều cải tiến vượt trội so với các phiên bản trước đó, đặc biệt là về hiệu suất và khả năng kết nối

Với vi xử lý Broadcom BCM2711, Raspberry Pi 4 có thể hoạt động ở tốc độ cao hơn, mạnh mẽ hơn so với các phiên bản trước Nó cung cấp các phiên bản có RAM từ 2GB, 4GB đến 8GB, giúp người dùng có nhiều lựa chọn tùy theo nhu cầu sử dụng cụ thể

Raspberry Pi 4 cũng có nhiều cổng kết nối hữu ích như cổng HDMI cho việc kết nối với màn hình, cổng Ethernet, cổng USB, cổng USB-C cho nguồn điện và hỗ trợ kết nối không dây Wi-Fi và Bluetooth Điều này làm cho Raspberry Pi 4 trở thành một lựa chọn lý tưởng cho các dự án IoT (Internet of Things), máy chủ nhỏ, trạm đa phương tiện, máy tính cá nhân và nhiều ứng dụng khác

Hình 3.8 Các cổng của Raspberry Pi 4

Hình 3.9 Cấu hình chân của Raspberry Pi 4

Raspberry Pi 4 có thể sử dụng trong hệ thống nhúng bên ngoài để giao tiếp tín hiệu Có tổng cộng 40 chân , trong đó 28 chân là chân GPIO và các chân còn lại là chân nguồn Các chân GPIO không chỉ thực hiện các chức năng I / O đơn giản mà còn hỗ trợ giao thức UART, SPI và I2C

3.2.2.2 Hệ điều hành Raspberry Pi 4

Một số hệ điều hành phổ biến trên Raspberry Pi 4:

- Raspberry Pi OS (trước đây là Raspbian): Đây là phiên bản hệ điều hành chính thức được phát triển bởi Raspberry Pi Foundation dành riêng cho các board Raspberry Pi Raspberry Pi OS là lựa chọn phổ biến nhất vì được tối ưu hóa để hoạt động tốt trên các board Raspberry Pi và có sẵn nhiều ứng dụng và công cụ hỗ trợ

- Ubuntu: Ubuntu là một hệ điều hành Linux phổ biến và mạnh mẽ Có phiên bản Ubuntu chính thức dành cho Raspberry Pi có tên là Ubuntu Server và Ubuntu Desktop Ubuntu Server thích hợp cho các dự án máy chủ và IoT, trong khi Ubuntu Desktop cung cấp một giao diện người dùng đồ hoạ đầy đủ

- Debian: Debian là một hệ điều hành Linux tự do và mã nguồn mở, là cơ sở cho nhiều hệ điều hành khác như Raspberry Pi OS Bạn có thể cài đặt Debian trực tiếp trên Raspberry

Pi 4 để trải nghiệm hệ điều hành này

- Arch Linux ARM: Arch Linux là một bản phân phối Linux đầy đủ tính linh hoạt và tùy chỉnh Phiên bản dành cho Raspberry Pi gọi là Arch Linux ARM, phù hợp cho những người muốn tùy chỉnh cao độ hệ thống của mình

- Fedora: Fedora cung cấp một phiên bản chính thức dành cho Raspberry Pi có tên là Fedora IoT Edition Đây là một phiên bản tối ưu cho các ứng dụng IoT và kỹ thuật điều khiển nhúng

- Kali Linux: Được thiết kế cho bảo mật và kiểm tra xâm nhập, Kali Linux cũng có phiên bản chính thức dành cho Raspberry Pi Nó hữu ích cho những người muốn thực hành và học về an ninh mạng

3.2.2.3 Giới thiệu về USB Camera Cmos

USB Camera Cmos Cho Máy Tính Nhúng Raspberry Pi được sử dụng gắn với cổng USB của Raspberry Pi để truyền hình ảnh về máy Thông số kỹ thuật Camera usb hỗ trợ tất cả các phiên bản của Raspberry Pi, máy tính nhúng

- Camera usb hỗ trợ tất cả các phiên bản của Raspberry Pi, máy tính nhúng

- Ống kính tiêu cự: F6.0MM

- Dây có thể được kéo dài hoặc rút ngắn, dài 65 cm

3.2.3 Cài đặt thư viện cho phần xử lý ảnh

3.2.3.1 Cài đặt thư viện OpenCv cho Raspberry Pi 4

Các bước để cài đặt thư viện OpenCv cho Raspberry Pi 4:

Bước 1 : Mở rộng dung lượng lưu trữ hệ thống

$ sudo raspi-config chọn 6 Advanced options

Hình 3.11 Mở rộng dung lượng hệ thống truy cập vào Advanced Options

85 Sau đó tiến hành chọn A1 Expand Filesystem

Thực hiện reboot, nhập lệnh

Kiểm tra thao tác thực hiện

Hình 3.13 Hiển thị dung lượng hệ thống đã được mở rộng

Bước 2: Cài đặt thư viện cần thiết

Cập nhật và nâng cấp các gói

$ sudo apt-get update && sudo apt-get upgrade

Cài đặt công cụ phát triển Cmake

$ sudo apt-get install build-essential cmake pkg-config

86 Cài đặt một số gói thư viện I/O hình ảnh cho phép chúng ta tải các định dạng tệp hình ảnh khác nhau từ ổ cứng Ví dụ về các định dạng tệp JPEG, PNG, TIFF, …

$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev

Ngoài thư viện I/O hình ảnh, chúng ta cần cài đặt thư viện I/O đọc ghi Video:

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

$ sudo apt-get install libxvidcore-dev libx264-dev

Triển khai thực tế

Giai đoạn triển khai thực tế là bước cuối cùng để kiểm chứng tính khả thi và hiệu quả

89 của hệ thống hiển thị dữ liệu CAN Trong giai đoạn này, chúng ta sẽ tiến hành cài đặt phần mềm, kết nối các thành phần phần cứng, kiểm tra hoạt động của hệ thống trên xe thực tế, và ghi nhận, phân tích kết quả thu được

Trên ESP32: Cài đặt Arduino IDE hoặc PlatformIO, sau đó nạp chương trình điều khiển đã được phát triển lên ESP32 Chương trình này sẽ đảm nhiệm việc giao tiếp với ELM327, xử lý dữ liệu CAN, và truyền dữ liệu đến Raspberry Pi

• Viết và chạy chương trình Python để nhận dữ liệu từ ESP32, xử lý dữ liệu, nhận diện ngủ gật, và hiển thị lên màn hình

• Cài đặt thư viện và code để thực hiện việc gửi tin nhắn cảnh báo về điện thoại

- Twilio: Tạo tài khoản Twilio, lấy số điện thoại Twilio và các thông tin xác thực (Account SID, Auth Token)

Hình 3.15 Trang web Twilio để nhận tin nhắn cảnh báo

- Raspberry Pi: Cài đặt thư viện Twilio cho Python (pip install twilio)

Nhập thư viện: from twilio.rest import Client Khởi tạo Client: client = Client(account_sid, auth_token)

Gửi tin nhắn: message = client.messages.create(body="Nội dung tin nhắn", from_="+Số điện thoại Twilio", to="+Số điện thoại người nhận") account_sid = 'ACc74d98d5878f32d0fef8cfe043600795' auth_token = '6fae6b8f2c2b8ae933c544f80e909c1d' client = Client(account_sid, auth_token) message = client.messages.create( from_='+12025167724', body=message_body, to='+84349590039')

• Twilio nhận yêu cầu gửi tin nhắn từ Raspberry Pi

• Twilio xác thực thông tin và gửi tin nhắn đến số điện thoại người nhận thông qua mạng di động

• Người nhận nhận được tin nhắn trên điện thoại của họ

3.3.2.1 Sơ đồ khối cảnh báo ngủ gật

Hình 3.16 Sơ đồ khối hệ thống cảnh báo cảnh báo ngủ gật

91 Đầu tiên, USB Camera sẽ quay lại video trực tiếp khuôn mặt người lái xe và đưa vào hệ thống phát hiện ngủ gật Hệ thống phát hiện ngủ gật sẽ lấy dữ liệu từ video, lấy theo từng khung hình và xác định khuôn mặt người lái xe Sau khi nhận diện được khuôn mặt, việc kế tiếp là đánh dấu các điểm trên khuôn mặt, trích xuất vùng mắt Xây dựng thuật toán tính toán tỷ lệ mắt dựa trên dữ liệu đã lấy từ vùng mắt và đem so sánh với ngưỡng thiết lập, nếu vượt ngưỡng sẽ chuyển qua hệ thống cảnh báo, cảnh báo bằng giọng nói và gửi tin nhắn về điện thoại Ở bước phát hiện khuôn mặt, hệ thống sẽ sử dụng phân loại Cascade Classifier, quá trình phát hiện diễn ra như sau:

1 Thu thập dữ liệu: Thu thập một tập hợp lớn các hình ảnh có chứa khuôn mặt và không chứa khuôn mặt

2 Gắn nhãn dữ liệu: Hình ảnh chứa khuôn mặt (positive) và hình ảnh không chứa khuôn mặt (negative)

3.Chuẩn bị dữ liệu: Tiền xử lý hình ảnh

- Chuyển đổi các hình ảnh thành dạng grayscale (ảnh xám) để giảm độ phức tạp tính toán

- Định cỡ lại hình ảnh để chúng có kích thước thống nhất

- Sử dụng thuật toán AdaBoost để chọn ra các đặc trưng mạnh từ tập hợp các đặc trưng Haar-like

- Các đặc trưng Haar-like là các mẫu đơn giản được sử dụng để phát hiện các cạnh, đường và các chi tiết khác trong hình ảnh

- Tạo một chuỗi các bộ phân loại yếu (weak classifiers) sắp xếp theo một cấu trúc cascade

- Mỗi tầng của cascade là một bộ phân loại đơn giản, nhưng khi được kết hợp, chúng tạo thành một bộ phân loại mạnh mẽ có thể nhận diện khuôn mặt chính xác

- Áp dụng bộ phân loại đã huấn luyện lên ảnh đầu vào

- Di chuyển cửa sổ phát hiện (detection window) qua từng vị trí và từng kích thước khác nhau của ảnh

- Tại mỗi vị trí và kích thước, tính toán các đặc trưng Haar-like và sử dụng bộ phân loại cascade để quyết định xem có khuôn mặt tại vị trí đó hay không

- Kết hợp các phát hiện: Nếu một khuôn mặt được phát hiện tại nhiều vị trí gần nhau, kết hợp các vị trí đó để tạo thành một phát hiện duy nhất

Hình 3.17 Sơ đồ thuật toán hệ thống cảnh báo ngủ gật

Kiểm tra kết nối: Đảm bảo rằng tất cả các thiết bị đã được kết nối đúng cách và hoạt động bình thường

Kiểm tra khả năng đọc dữ liệu CAN: Sử dụng phần mềm trên Raspberry Pi để đọc và hiển thị các thông số CAN từ ECU của xe Kiểm tra xem dữ liệu có được cập nhật liên tục và chính xác hay không

Kiểm tra khả năng nhận diện ngủ gật: Cho tài xế ngồi trước camera và kiểm tra xem hệ thống có thể phát hiện được trạng thái ngủ gật hay không Nếu xe đứng yên tại chỗ thì hệ thống cảnh báo ngủ gật sẽ không hoạt động, nhưng nếu xe di chuyển thì hệ thống cảnh báo ngủ gật bắt đầu hoạt động

Kiểm tra khả năng cảnh báo: Kiểm tra xem hệ thống có thể phát ra âm thanh cảnh báo khi phát hiện tài xế ngủ gật khi xe di chuyển hay không và ngược lại

3.3.4 Ghi nhận và phân tích kết quả

Ghi lại dữ liệu: Ghi lại các thông số CAN thu được trong quá trình thử nghiệm

Phân tích dữ liệu: Phân tích dữ liệu đã ghi lại để đánh giá hiệu suất của hệ thống, bao gồm độ chính xác, độ ổn định, độ trễ, và khả năng nhận diện ngủ gật Điều chỉnh và cải tiến: Dựa trên kết quả phân tích, điều chỉnh và cải tiến hệ thống để đạt được hiệu suất tốt nhất

KẾT QUẢ VÀ ĐÁNH GIÁ

Kết quả thử nghiệm

Sau khi hoàn thành việc thiết kế và triển khai hệ thống, chúng tôi đã tiến hành thử nghiệm trên nhiều dòng xe khác nhau để đánh giá hiệu suất và độ tin cậy của hệ thống

- Các dữ liệu CAN thu thập được và hiển thị thành công: Hệ thống đã thành công trong việc thu thập và hiển thị một loạt các dữ liệu CAN quan trọng từ ECU của xe, bao gồm tốc độ xe, vòng tua máy, nhiệt độ động cơ, mức nhiên liệu, và nhiều thông số khác Dữ liệu được hiển thị trên màn hình cảm ứng một cách trực quan và dễ hiểu, giúp người dùng dễ dàng theo dõi tình trạng hoạt động của xe

- Đánh giá độ chính xác của dữ liệu hiển thị: Để đánh giá độ chính xác của dữ liệu hiển thị, chúng tôi đã so sánh kết quả thu được từ hệ thống với các công cụ chẩn đoán chuyên dụng Kết quả cho thấy, dữ liệu hiển thị trên hệ thống của chúng tôi có độ chính xác cao, tương đương với các công cụ chuyên dụng

- Đánh giá tốc độ lấy và hiển thị dữ liệu: Hệ thống của chúng tôi có khả năng lấy và hiển thị dữ liệu CAN với tốc độ cao, đáp ứng được yêu cầu của các ứng dụng thời gian thực Thời gian trễ giữa việc thu thập dữ liệu từ ECU và hiển thị trên màn hình là không đáng kể, đảm bảo người dùng luôn có được thông tin cập nhật nhất về tình trạng hoạt động của xe

- Nhận diện được trạng thái ngủ gật của người lái xe trong nhiều điều kiện ánh sáng, kể ban đêm khi trong xe có đèn, đưa ra cảnh báo nhanh chóng và kịp thời tới người lái xe Thời gian trễ giữa nhận diện trạng thái ngủ gật và phát cảnh báo không đáng kể

Các dữ liệu hiển thị trên màn:

Dưới đây là một số thông số Live Data quan trọng và ý nghĩa của chúng:

Hình 4.1 Dữ liệu Live Data hiển thị trên màn hình

• ECT (Engine Coolant Temperature) - Nhiệt độ nước làm mát:

- Chức năng: Giám sát nhiệt độ của dung dịch làm mát động cơ, giúp phát hiện sớm tình trạng quá nhiệt hoặc thiếu nhiệt, từ đó đưa ra cảnh báo và biện pháp xử lý kịp thời

- Ứng dụng: Hiển thị trên màn hình giúp người lái biết được nhiệt độ động cơ có đang hoạt động trong ngưỡng an toàn hay không Nếu nhiệt độ quá cao, người lái có thể dừng xe để làm mát động cơ, tránh gây hư hỏng

• Engine Load - Tải trọng động cơ:

- Chức năng: Đo lường tỷ lệ phần trăm công suất tối đa mà động cơ đang sử dụng, giúp đánh giá mức độ làm việc của động cơ

- Ứng dụng: Hiển thị trên màn hình giúp người lái biết được động cơ đang hoạt động ở mức độ nào, từ đó giúp tài xế điều chỉnh cách lái xe

• Fuel Pressure - Áp suất nhiên liệu:

- Chức năng: Giám sát áp suất nhiên liệu trong hệ thống phun, đảm bảo nhiên liệu được cung cấp đủ và ổn định cho động cơ

- Ứng dụng: Thông tin này giúp phát hiện sớm các vấn đề về bơm nhiên liệu, bộ lọc nhiên liệu, hoặc đường ống dẫn nhiên liệu, từ đó ngăn ngừa tình trạng thiếu nhiên liệu hoặc

• Intake Air Temp - Nhiệt độ khí nạp:

- Chức năng: Đo lường nhiệt độ của không khí đi vào động cơ, giúp ECU điều chỉnh lượng nhiên liệu phun và thời điểm đánh lửa cho phù hợp

- Ứng dụng: Thông tin này có thể được sử dụng để tối ưu hóa hiệu suất động cơ và tiết kiệm nhiên liệu

• Engine Oil Temp - Nhiệt độ dầu động cơ:

- Chức năng: Giám sát nhiệt độ của dầu động cơ, giúp phát hiện sớm tình trạng quá nhiệt của dầu, từ đó bảo vệ động cơ khỏi hư hỏng

- Ứng dụng: Hiển thị trên màn hình giúp người lái biết được nhiệt độ dầu động cơ có đang trong ngưỡng an toàn hay không Nếu nhiệt độ quá cao, người lái cần dừng xe và kiểm tra lại hệ thống làm mát và bôi trơn của động cơ

• Battery Voltage - Điện áp ắc quy:

- Chức năng: Đo lường điện áp của ắc quy, giúp đánh giá tình trạng của ắc quy và hệ thống sạc

- Ứng dụng: Hiển thị trên màn hình giúp người lái biết được điện áp ắc quy có đủ để khởi động động cơ và cung cấp điện cho các thiết bị trên xe hay không Nếu điện áp quá thấp, người lái cần kiểm tra lại ắc quy và hệ thống sạc

Dưới đây là chức năng và công dụng của từng thông số FF Data trong việc lấy dữ liệu từ OBD-II để hiển thị lên màn hình:

Hình 4.2 Dữ liệu Freeze Frame data hiển thị trên màn hình

• RPM (Engine Speed) - Số vòng quay trục khuỷu động cơ:

- Chức năng: Đo lường tốc độ quay của động cơ

- Công dụng: Hiển thị trên màn hình giúp người dùng biết được tốc độ động cơ tại thời điểm xảy ra lỗi, từ đó đánh giá xem lỗi có liên quan đến việc động cơ hoạt động quá nhanh hay quá chậm hay không

• ECT (Engine Coolant Temperature) - Nhiệt độ nước làm mát động cơ:

- Chức năng: Đo lường nhiệt độ của dung dịch làm mát động cơ

- Công dụng: Hiển thị trên màn hình giúp người dùng biết được nhiệt độ động cơ tại thời điểm xảy ra lỗi, từ đó đánh giá xem lỗi có liên quan đến quá nhiệt động cơ hay không

• Mass Air Flow (MAF) - Lưu lượng khí nạp

- Chức năng: Đo lường lượng không khí đi vào động cơ

- Công dụng: Hiển thị trên màn hình giúp người dùng biết được lưu lượng khí nạp tại thời điểm xảy ra lỗi, từ đó đánh giá xem lỗi có liên quan đến hệ thống nạp khí hay không (ví dụ: lọc gió bị bẩn)

• Run time MIL on - Thời gian đèn báo lỗi động cơ bật:

- Chức năng: Đo lường thời gian (tính bằng giây) kể từ khi đèn báo lỗi động cơ bật

- Công dụng: Hiển thị trên màn hình giúp người dùng biết được thời điểm và khoảng thời gian lỗi xảy ra, từ đó có thể liên hệ với các sự kiện khác để xác định nguyên nhân gây lỗi

• Engine Load - Tải trọng động cơ:

- Chức năng: Đo lường tỷ lệ phần trăm công suất tối đa mà động cơ đang sử dụng

Ưu điểm và hạn chế

- Chi phí thấp: Hệ thống của chúng tôi sử dụng các linh kiện phổ biến và dễ tìm kiếm trên thị trường, giúp giảm thiểu chi phí sản xuất

- Dễ sử dụng: Giao diện người dùng được thiết kế trực quan và dễ hiểu, cho phép người dùng dễ dàng thao tác và truy cập các thông tin cần thiết

- Tính linh hoạt: Hệ thống có thể được tùy chỉnh và mở rộng để đáp ứng các nhu cầu khác nhau của người dùng

- Khả năng tích hợp: Hệ thống có thể dễ dàng tích hợp với các hệ thống khác trên xe, chẳng hạn như hệ thống cảnh báo an toàn hoặc hệ thống định vị

- Khả năng tương thích: Hiện tại, hệ thống mới chỉ được thử nghiệm trên một số dòng xe phổ biến Cần phải mở rộng phạm vi thử nghiệm để đảm bảo tính tương thích với nhiều dòng xe khác nhau

- Số lượng dữ liệu CAN hiển thị được: Do hạn chế về kích thước màn hình và khả năng xử lý của Raspberry Pi, hệ thống hiện tại chỉ có thể hiển thị một số lượng dữ liệu CAN nhất định Trong tương lai, chúng tôi sẽ nghiên cứu các giải pháp để tăng số lượng dữ liệu hiển thị được

- Độ ổn định trong môi trường khắc nghiệt: Cần phải kiểm tra và đánh giá thêm về độ ổn định của hệ thống trong các điều kiện khắc nghiệt như nhiệt độ cao, độ ẩm, rung động, và nhiễu điện từ

- Trong điều kiện ánh sáng quá tối, hệ thống sẽ không nhận diện được khuôn mặt người lái xe

Ngày đăng: 26/09/2024, 09:44

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[3] Ralph Birnbaum and Jerry “G” Truglia, Getting to Know OBH II, 2005 Sách, tạp chí
Tiêu đề: G
[6] PGS.TS Nguyễn Quang Hoan, xử lý ảnh, Học viện công nghệ bưu chính viễn thông, 2006 Sách, tạp chí
Tiêu đề: xử lý ảnh
[7] Nguyễn Thanh Hải, giáo trình xử lý ảnh, Nhà xuất bản Đại Học Quốc gia TPHCM, 2013 Sách, tạp chí
Tiêu đề: giáo trình xử lý ảnh
Nhà XB: Nhà xuất bản Đại Học Quốc gia TPHCM
[8] Joseph Howse, Prateek Joshi, Micheal Beyeler, OpenCV: Computer Vision Projects with Python, 2006 Sách, tạp chí
Tiêu đề: OpenCV: Computer Vision Projects with Python
[9] Simon Monk, Programming the Raspberry Pi Getting Started with Python, 2015 Sách, tạp chí
Tiêu đề: Programming the Raspberry Pi Getting Started with Python
[2] ELM327 OBD to RS232 Interpreter Khác
[4] Surface vehicle standard, J1979-DA, SAE International, 2014 Khác
[5] Surface vehicle standard, J1979, SAE International, 2017 Khác
[10] Tereza Soukupova anh Jan Cech, Real-time eye blink detection using Facial Landmarks, 2016 Khác

HÌNH ẢNH LIÊN QUAN

Hình 2.1. Hệ thống mạng CAN trên ô tô - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.1. Hệ thống mạng CAN trên ô tô (Trang 28)
Hình 2.5. Khung dữ liệu tiêu chuẩn của mạng CAN - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.5. Khung dữ liệu tiêu chuẩn của mạng CAN (Trang 41)
Hình 2.7. ECU trên ô tô - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.7. ECU trên ô tô (Trang 49)
Hình 2.11. Cấu trúc mã lỗi OBD-II - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.11. Cấu trúc mã lỗi OBD-II (Trang 55)
Hình 2.13. Thiết bị ELM327 - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.13. Thiết bị ELM327 (Trang 64)
Hình 2.17. Các bước cơ bản của xử lý ảnh - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.17. Các bước cơ bản của xử lý ảnh (Trang 70)
Hình 2.18. Thang mức xám - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.18. Thang mức xám (Trang 72)
Hình 2.19. Hình ảnh vận động viên được chia thành các lưới ô vuông - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.19. Hình ảnh vận động viên được chia thành các lưới ô vuông (Trang 74)
Hình 2.20. Mapping độ lớn gradients với các bins - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.20. Mapping độ lớn gradients với các bins (Trang 75)
Hình 2.23. Biểu diễn nhóm véc tơ histogram trên các lưới ô vuông của hình ảnh gốc  2.6 - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.23. Biểu diễn nhóm véc tơ histogram trên các lưới ô vuông của hình ảnh gốc 2.6 (Trang 78)
Hình 2.27. Mô hình phân tầng Cascade - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.27. Mô hình phân tầng Cascade (Trang 81)
Hình 2.31. Sơ đồ nhận diện khuôn mặt - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.31. Sơ đồ nhận diện khuôn mặt (Trang 85)
Hình 2.32. Biểu diễn 68 tọa độ trên mặt người từ tập dữ liệu Ibug 300-W - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 2.32. Biểu diễn 68 tọa độ trên mặt người từ tập dữ liệu Ibug 300-W (Trang 87)
Hình 3.3. Sơ đồ thuật toán của ESP32 - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 3.3. Sơ đồ thuật toán của ESP32 (Trang 94)
Hình 3.8. Các cổng của Raspberry Pi 4 - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 3.8. Các cổng của Raspberry Pi 4 (Trang 101)
Hình 3.9. Cấu hình chân của Raspberry Pi 4 - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 3.9. Cấu hình chân của Raspberry Pi 4 (Trang 102)
Hình 3.17. Sơ đồ thuật toán hệ thống cảnh báo ngủ gật - nghiên cứu chế tạo module hỗ trợ lái xe thông qua ghi nhận tình trạng xe và trạng thái người lái
Hình 3.17. Sơ đồ thuật toán hệ thống cảnh báo ngủ gật (Trang 113)