Tính toán thiết kế hệ thống điều khiển

Một phần của tài liệu HD4 nguyễn đức minh nghiên cứu, thiết kế mô hình hệ thống nhận dạng và cảnh báo người đeo khẩu trang (Trang 40)

Trong phạm vi nghiên cứu của môn học, nhóm nghiên cứu sẽ tiến hành phát hiện người không đeo khẩu trang dựa trên MobileNetV2 hệ thống sẽ đưa ra cảnh báo trực tiếp bằng loa nhắc nhở người đeo khẩu trang đúng quy định.

Phát hiện đối tượng là để trả lời cho câu hỏi “Đối tượng cần tìm có trong ảnh hay trong video không?” và “Nếu có thì nằm ở vị trí nào?”. Trong bài toán phát hiện người đeo khẩu trang cần trả lời câu hỏi người trong ảnh/video có đeo khẩu trang hay không? Bài toán phân loại này gồm hai bước là xây dựng mô hình và vận hành mô hình. Cho sẵn một tập dữ liệu các khuôn mặt được dán nhãn là không đeo khẩu trang hay có đeo khẩu trang gọi tắt là lớp không khẩu trang và lớp có khẩu trang. Cần một phương

31

pháp huấn luyện để xây dựng một mô hình phân lớp từ tập dữ liệu mẫu đó, sau đó dùng mô hình này dự đoán lớp của những khuôn mặt mới chưa biết nhãn.

Cấu trúc chương trình:

Hình 3-18 Cấu trúc chương trình

B1: Thu thập dữ liệu: Sử dụng mã nguồn mở OpenCv để phát hiện, lưu trữ 500 bức ảnh của người đeo khẩu trang, 500 bức ảnh người không đeo khẩu trang và 500 bức ảnh người đeo khẩu trang sai cách.

B2: Sử dụng nguồn dữ liệu đã thu thập được để huấn luyện mô hình dựa mạng nơron MobileNetV2.

B3: Phát hiện người đeo khẩu trang hay không. Bước này sẽ tiến hành so sánh dữ liệu được trích xuất từ camera (sau khi đã được xử lý dữ liệu đầu vào) với dữ liệu đã được huấn luyện để trích xuất kết quả và cảnh báo bằng giọng nói.

Do khối lượng dữ liệu cần thiết để thu thập và huấn luyện rất lớn và là một quá trình dài tốn nhiều thời gian và đây là một nguồn dữ liệu mở có sẵn ở trên internet. Vì vậy, trong phạm vi nghiên cứu đồ án môn học này nhóm sinh viên tập trung vào phần train model và phát hiện người đeo khẩu trang.

Các vấn đề cần xử Lý: Điều kiện 1:

- Phát hiện khuôn mặt và thu thập dữ liệu đầu vào Điều kiện 2:

- Có đeo khẩu trang hay không? Điều kiện 3:

32

Hình 3-19 Khuôn mặt được kiểm tra

3.3.2Xây dựng chương trình

3.3.2.1 Thu thập dữ liệu

Để thu thập dữ liệu, thay vì lấy nguồn dữ liệu có sẵn trên mạng, nhóm nghiên cứu đã thực hiện thu thập bằng chương trình được viết trên ngôn ngữ python, sử dụng thư viện mã nguồn mở OpenCV để phát hiện khuôn mặt người. Hình 3-19 thể hiện thuật toán thu thập dữ liệu.

33 Lưu đồ thuật toán:

Hình 3-20 Lưu đồ thuật toán thu thập dữ liệu

Dữ liệu sau khi được thu thập dưới dạng file ảnh . jpg sẽ được lưu trữ ở 2 file riêng biệt : 1 file chứa 500 bức ảnh mô tả khuôn mặt đeo khẩu trang và file còn lại chứa 500 bức ảnh mô tả khuôn mặt không đeo khẩu trang. Mỗi file dữ liệu trên sẽ được chia làm 2 phần chính nhờ hàm split trong python, bao gồm:

- Tập dữ liệu phục vụ quá trình thử nghiệm cuối cùng – Testing set (chiếm 20%) - Tập dữ liệu phục vụ quá trình train model (chiếm 80%), trong quá trình thu thập dữ liệu, điều kiện ánh sáng phải được đảm bảo để không làm ảnh hưởng đén chất lượng tạo mô hình sau này.

34

Hình 3-21 Tập dữ liệu người đeo khẩu trang

35 3.3.2.2 Thuật toán huấn luyện mô hình:

Lưu đồ thuật toán:

Hình 3-23 Lưu đồ thuật toán huấn luyện mô hình

Mô hình huấn luyện được xây dựng dựa trên mô hình mạng Nơ-ron tích chập CNN với thuật toán như trên hình3- 22.

a, Import các thư viện cần thiết

Nhập các thư viện cần thiết như OpenCV, Keras Numpy (để xử lí dữ liệu), Os (để quản lí file), Tensorflow, Pyqt5 …

b, Tạo đường dẫn tới thư mục dữ liệu và xác định các thông số Các đối số dòng lệnh của model bao gồm:

--dataset: đường dẫn đến tập dữ liệu đầu vào của các khuôn mặt đeo khẩu trang và không đeo khẩu trang.

36

--plot: Đường dẫn đến biểu đồ thể hiện lịch sử huấn luyện model qua đó đánh giá được sự chính xác của model có hoạt động tốt hay không. Việc này sẽ được làm đơn giản bởi thư viện matplotlib.

--model: Đường dẫn đến mô hình phân loại khẩu trang được tuần tự hóa kết quả. • Xác định tham số học sâu

Ban đầu chúng ta cần train 500 bức ảnh trong 20 lần nhưng do số lượng lớn mỗi lần train chỉ được 32 bức ảnh trong số 500 bức ảnh đã thu thập (epochs=20, bs=32)

c, Tiền xử lí dữ liệu

Những công việc này được xử lí đơn giản bới các hàm trong thư viện Cv2 hay numpy trên ngôn ngữ python.

Bước đầu bắt đầu vòng lặp vô hạn các khung hình trong video. Sau đó tiến hành bước tiền xử lý bằng cách thay đổi kích thước nó để có chiều rộng là 224pixel và chuyển sang màu xám với câu lệnh trong OpenCV.

Trong xử lý ảnh, việc chuyển đổi ảnh màu sang ảnh xám là công việc vô cùng phổ biến. Ảnh màu thực chất chỉ là tập hợp của những ma trận số có cùng kích thước. Khi muốn xử lý thông tin trên ảnh, sẽ dễ dàng hơn nếu ta chỉ xử lý dữ liệu trên một ma trận số thay vì nhiều ma trận số. Việc biến đổi ảnh màu về ảnh số (Grayscale converting) xuất hiện vì mục đích trên - biến đổi thông tin ảnh về một ma trận số hai chiều duy nhất.

37

Hình 3-24 Cấu tạo ảnh RGB

Thông thường hình ảnh được lưu trữ dưới dạng RGB (Red-Green-Blue). Điều này có nghĩa có ba ma trận xám tương ứng cho màu Red, Green, Blue. Công việc phải làm là tìm cách tổng hợp ba ma trận này về thành một ma trận duy nhất. Một trong số các công thức phổ biến để thực hiện việc đó là:

Y = 0.2126R + 0.7152G + 0.0722B Trong đó: Y: ma trận xám cần tìm R: ma trận xám đỏ của ảnh G: ma trận xám lục của ảnh B: ma trận xám lam của ảnh Sử dụng lệnh cvtColor:

Lệnh cvtColor (source, dest, mode) cho phép chuyển đổi ảnh màu source sang ảnh xám và lưu vào dest với độ chuyển đổi màu là mode. CV_BGR2GRAY là chế độ cho phép chuyển từ ảnh màu lưu ở format BGR sang ảnh xám.

Những công việc này được thực hiện đơn giản bởi các hàm chức năng có trong các thư viện đã import ở phía trên.

38

Hình 3-25 Chuyển ảnh RGB sang ảnh xám

d, Xây dựng các lớp cho mô hình

Các lớp được xây dựng dựa trên mô hình mạng nơ-ron tích chập CNN (mạng nơ- ron tích chập được thiết kế đặc biệt để xử lí dữ liệu đầu vào). Kiến trúc của mạng CNN gồm 3 phần chính:

Phần 1: Một lớp phức hợp trích xuất đặc tính từ ảnh ban đầu.

Phần 2: Một lớp tổng hợp để giảm kích thước của nơron đi và tập trung vào các phần tử quan trọng nhất

Phần 3: Một lớp kết nối đầy đủ làm phẳng các đối tượng được xác định trong các lớp trước đó thành một vecto và dự đoán ảnh có thể thuộc về một nhãn nào đó.

e, Biên dịch mô hình:

Thực hiện các thuật toán tối ưu và biên dịch chương trình. Xuất ra các biểu đồ và tỉ lệ thành công hay thất bại của model thể hiện sự chính xác của model.

39

Bảng 3-2 Đánh giá huấn luyện mô hình

Lần train Thời gian(s)

Loss Accuracy Val_loss Val_accurracy

1 49 0.8343 0.6261 0.3932 0.805 2 50 0.4339 0.7987 0.2218 0.93 3 53 0.2503 0.9007 0.1433 0.945 4 52 0.1726 0.949 0.114 0.955 5 52 0.1405 0.9582 0.0907 0.97 6 59 0.1336 0.949 0.077 0.98 7 57 0.0957 0.9752 0.0974 0.98 8 48 0.0802 0.9752 0.0674 0.098 9 49 0.0718 0.948 0.0548 0.9850 10 46 0.0846 0.9673 0.0481 0.98 11 43 0.0728 0.9778 0.0428 0.985 12 48 0.0507 0.9817 0.0399 0.995 13 60 0.0423 0.9869 0.0372 0.99 14 74 0.055 0.9843 0.0373 0.99 15 77 0.042 0.9883 0.0333 0.995 16 71 0.0406 0.9869 0.0307 0.995 17 57 0.0383 0.9895 0.0331 0.99 18 57 0.0407 0.9869 0.0268 0.995 19 55 0.0324 0.99 0.029 0.9922 20 42 0.0322 0.99 0.0297 0.992

Tiến hành huấn luyện với tốc độ học 0.0001, sai 20 lần lặp với số lượng mẫu (Batch_size) sử dụng cho mỗi lần cập nhật trọng số là 32 ta thu được kết quả nhưng bảng trên. Nhìn vào bảng trên ta có thể thấy sau 20 lần lặp, mô hình đạt được độ chính

40

xác khoảng 99% trên bộ thử nghiệm (bộ kiểm tra). Đây là một giá trị tương đối cao mặc dù còn phát sinh một số lỗi nhất định nhưng có thể tạm chấp nhận được.

3.3.2.3 Thuật toán phát hiện người đeo khẩu trang trong thời gian thực: Sơ đồ thuật toán:

41

Hình 3-26 Sơ đồ phát hiện người không đeo khẩu trang trên video/ webcam

42

Tương tự như hai bước thu thập dữ liệu và huấn luyện mô hình. Nhập các thư viện cần thiết như OpenCV, Keras, Numpy (để xử lí dữ liệu), Os (để quản lí file), Tensorflow, Pyqt5 …

b, Truy xuất vào model nhận diện khuôn mặt.

Áp dụng OpenCV DNN(là một thuật toán của open CV để phục vụ cho việc nhận diệ khuôn mặt) để nhận diện khuôn mặt trong hình ảnh đầu vào

faceNet.setInput(blob)

detections = faceNet.forward()

c, Trích xuất ảnh từ camera và tiền xử lí

Trích xuất ảnh từ camera sau đó ta cũng thực hiện các bước tiền xử lý với ảnh đầu vào như bước train model. Bước này giúp ảnh có đúng kích thước và màu sắc để phục vụ cho các bước xử lý tiếp theo.

d, Tiến hành phát hiện khuôn mặt từ ảnh đầu vào đã được tiền xử lí.

Chức năng này phát hiện xem có khuôn mặt nào có trong khung hình hay không qua đó gửi về vị trí và danh sách về bộ xử lí.

Để thực hiện công việc quyết định là phát hiện khẩu trang thì nhóm xây dựng một hàm “def detect_and_predict_mask(frame, faceNet, maskNet):”

Trong hàm này sẽ có 3 thông số tương đương với 3 công việc nhỏ hơn Frame: Nhận luồng ảnh từ video lấy từ webcam

FaceNet: Mô hình được sử dụng để phát hiện vị trí khuôn mặt trong ảnh. maskNet: Mô hình phân loại khẩu trang của nhóm nghiên cứu

43

Hình 3-27 Rất nhiều khuôn mặt giả được phát hiện

Sau khi dự đoán được rất nhiều khuôn mặt nhưng còn xuất hiện nhiều khuôn mặt giả nên những khuôn mặt này sẽ đi vào 1 vòng lặp để tìm ra khuôn mặt thật chính xác phục vụ cho quá trình nhận diện có đeo khẩu trang hay không ở bước kế tiếp.

Bên trong vòng lặp này nhóm đã lọc ra những phát hiện yếu và trích xuất được ra khuôn mặt chuẩn bao gồm tọa độ của khuôn mặt.

Tiếp theo tiến hành xử lí ảnh vùng khuôn mặt đó, chuyển ảnh về cùng kích thước với ảnh được train trong model bằng hàm “resize”, chuyển ảnh từ dạng BRG sang RGB

44

Hình 3-28 Khuôn mặt thật được phát hiện

e, Phát hiện người không đeo khẩu trang

Sau khi đã có dữ liệu khuôn mặt thì công việc tiếp theo đã sẵn sàng là chạy những khuôn mặt đó trong file model nhận diện khẩu trang để nhận diện xem người đó có đang đeo khâu trang hay không.

Những đối số dòng lệnh trong khối lệnh trên bao gồm:

--face: Đường dẫn đến khuôn mặt vừa được xác định và lưu trong bộ nhớ tạm --model: Đường dẫn đến trình phân loại khẩu trang được đào tạo của nhóm nghiên cứu

--confidence: Ngưỡng xác xuất tối thiểu để lọc các trường hợp.

Kết quả phát hiện nhận diện người đeo khẩu trang trên thời gian thực.

TH1: Đeo khẩu trang => Giá trị thu được từ camera so sánh lớn hơn giá trị ngưỡng đã chọn là 0.8. Kết luận đeo khẩu trang (Mask).

45

TH2: Không đeo khẩu trang vùng miệng và mũi sẽ hở ra hoặc đeo sai quy cách => Giá trị thu được từ camera so sánh nhỏ hơn giá trị ngưỡng đã chọn là 0.8. Kết luận không đeo khẩu trang(No mask).

Hình 3-30 Kết quả dự đoán trường hợp đeo khẩu trang

3.3.3Giao diện phần mềm phát hiện người không đeo khẩu trang

Sử dụng phần mềm Qt Designer để thiết kế giao diện phần mềm phát hiện người không đeo khẩu trang.

Giao diện phần mềm nhận diện:

Hình 3-31 Giao diện phần mềm khi bắt đầu khởi động

Giao diện của phần mềm phát hiện được thiết kế đơn giản, dễ hiểu để người dùng có thể tiếp cận 1 cách nhanh nhất.

Khối nút bấm điều khiển

Để bắt đầu công việc, người dùng chỉ cần ấn nút Start để khởi động Webcam và bắt đầu phát hiện

46

3.3.4Các bước để kết nối giữa Python và Arduino

+ B1: Môi trường máy tính

Về phía máy tính, chúng ta sẽ sử dụng một module Python có tên là PySerial. PySerial cho phép sử dụng các kết nối nối tiếp với Python.

+B2: Kết nối ban đầu

Để bắt đầu kết nối với Arduino từ Python, trước tiên chúng ta phải tìm ra cổng COM mà Arduino đang bật. Nhiệm vụ này được thực hiện đơn giản bởi môi trường lập trình Ardunio.

Chỉ cần nhìn vào góc dưới bên phải của Arduino IDE ta sẽ thấy một số văn bản có chứa sốc Cổng COM. Chúng ta sẽ sử dụng điều này để bắt đầu kết nối nối tiếp Python.

Đoạn code trên sẽ tạo ra một đối tượng nối tiếp mới gọi là “arduino” trên COM3 với tốc độ baud rate “9600” và thời gian chờ là 1s. Điều cực kỳ quan trọng là bạn phải giữ tốc độ baud rate đã chọn, vì nó phải khớp chính xác với tốc độ baud rate ở phía Arduino.

+B3: Truyền thông từ Arduino sang Python

Giao tiếp giữa Ardunio và Python có phần dễ dàng hơn so với cách khác. Đầu tiên, chúng ta sẽ muốn một chút mã sẽ khởi tạo kết nối nối tiếp của Ardunio và gửi một thông điệp. Chúng ta có thể làm điều này với chức năng Serial.write() của Arduino.

Mã này sẽ viết một "s = Arduino_Serial.readline()!" dòng đến kết nối nối tiếp mỗi giây một lần. Bây giờ chúng ta sẽ xây dựng một tập lệnh Python có khả năng nhận các thông báo này và thực hiện với chúng theo ý muốn. Đầu tiên, chúng ta phải bắt đầu kết nối như chúng ta đã làm trên trang trước và sau đó chúng ta sẽ tạo một vòng lặp lấy thông tin hiện tại từ luồng và in nó ra bàn điều khiển.

47

Lưu ý rằng trong trường hợp này, readline () đang chặn, vì vậy nó sẽ đợi cho đến khi một dòng mới được chuyển hoàn toàn qua bộ đệm nối tiếp.

+B4: Truyền thông từ Python sang Arduino

Bước này khó hơn một chút, vì nó yêu cầu chúng ta phân tích dữ liệu về phía Arduino. Để giúp tăng tốc mọi thứ, tôi đã tiếp tục và viết một vòng lặp đơn giản lấy dữ liệu hiện tại từ bộ đệm nối tiếp và tạo một chuỗi kết thúc null (chuỗi C), sau đó nó quay trở lại kết nối nối tiếp. Bạn có thể sử dụng kỹ thuật này để viết một trình phân tích cú pháp thực tế bằng cách chỉ định tiền tố và hậu tố gói của riêng bạn và quét bộ đệm nối tiếp cho các bộ đệm đó, tạo các chuỗi tương ứng.

Bây giờ chúng ta có thể viết một tập lệnh đơn giản gửi dữ liệu từ Python đến Arduino và sau đó làm những gì mà chương trình lập trình cho Arduino sẽ làm.

Ở đây nhóm dùng Arduino làm vi điều khiển để nhận tín hiệu truyền nối tiếp từ python sang và điều khiển cơ cấu chấp hành là loa và đèn thông qua chân tín hiệu số.

48

CHƯƠNG 4 KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN 4.1 Kết quả đạt được

4.1.1Kết quả đạt được

Trong quá trình nghiên cứu và phát triển sản phẩm, nhóm nghiên cứu đã gặp nhiều khó khăn nhưng với sự đam mê tìm tòi, học hỏi và với sự hướng dẫn tận tình của Ths. Nguyễn Đức Minh. Nhóm nghiên cứu đã đạt được một số kết quả như sau:

- Tìm hiểu được cơ sở, ý nghĩa của bài toán xử lý ảnh, các ứng dụng của xử lý

Một phần của tài liệu HD4 nguyễn đức minh nghiên cứu, thiết kế mô hình hệ thống nhận dạng và cảnh báo người đeo khẩu trang (Trang 40)

Tải bản đầy đủ (PDF)

(77 trang)