tiểu luận môn đồ án cơ sở 1 đề tài nhận diện biển báo giao thông

38 3 0
Tài liệu đã được kiểm tra trùng lặp
tiểu luận môn đồ án cơ sở 1 đề tài nhận diện biển báo giao thông

Đ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

Trang 1

KHOA: KỸ THUẬT& KHOA HỌC MÁY TÍNH

TIỂU LUẬN

MÔN ĐỒ ÁN CƠ SỞ 1

ĐỀ TÀI:

NHẬN DIỆN BIỂN BÁO GIAO THÔNG

SINH VIÊN: NGUYỄN HIẾU KHA – 31012202530

Trang 2

BẢNG PHÂN CÔNG NHIỆM VỤ

STT

công việc được

-Viết báo cáo-Thuyết trình

-Viết báo cáo-Thuyết trình

100%

Trang 3

3.Mục Tiêu Nghiên Cứu 6

4.Đối Tượng và Phạm Vi Nghiên Cứu 6

5.Phương Pháp Nghiên Cứu 6

PHẦN NỘI DUNG 7

CHƯƠNG 1: GIỚI THIỆU TỔNG QUAN 7

1.1 Tầm quan trọng của biển báo giao thông 7

1.2 Thách thức và hạn chế của biển báo giao thông 7

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 8

2.1 Học sâu - Deep Learning 8

2.2 Mạng nơ-ron tích chập - Convolutional Neural Network 9

2.3 Densenet 9

2.4 Mạng dư - Residual Networks (ResNet) 12

2.5 Keras 15

2.6 Các thư viện được sử dụng 15

CHƯƠNG 3: CHƯƠNG TRÌNH VÀ GIẢI THÍCH 20

Trang 4

DANH MỤC HÌNH ẢNH

Hình 1 Hình ảnh về mạng lưới Deep Learning Nguồn: thedatascientist.com 7 Hình 2 Cấu trúc DenseNet và Resnet Nguồn: paperswithcode.com 9

Hình 3 Một mạng lưới gồm 5 DenseBlock được liên kết với nhau với số lớp k = 4 Mỗi lớp đều lấy kết quả từ lớp ở Block phía trước Nguồn: paperswithcode.com 10

Hình 4 DenseBlock và các layer 10

Hình 5 Đồ thị về tỷ lệ lỗi khi huấn luyện và thử nghiệm Nguồn: geeksforgeek.org 11 Hình 6 Mô tả về công thức được sử dụng trong ResNet với hàm kích hoạt relu Nguồn: geeksforgeeks.org 12

Hình 7 Ví dụ về ImageNet Bên trái: cái Mô hình VGG-19 (19,6 tỷ FLOP) làm tài liệu tham khảo.Ở giữa: một mạng đơn giản Với 34 lớp tham số (3,6 tỷ FLOP) Bên phải: mạng dư có 34 lớp tham số (3,6 tỷ FLOP) Nguồn: arxiv.org [7] 13

Hình 8 Sự ngắn gọn trong việc sử dụng API Keras để làm việc Nguồn: keras.io 15 Hình 9 Phân chia dữ liệu 17

Hình 10 Xây dựng mô hình CNN 17 Hình 11 Hình ảnh minh họa sự mất mát 18

Hình 12 Hình ảnh minh họa kết quả đạt được 18

Hình 13 Tập dữ liệu được sử dụng để xây dựng mô hình CNN 21 Hình 14 Khai báo thư viện Keras.23

Hình 15 Tạo model Keras 23

Hình 16 Compile model Keras 24 Hình 17 Training model Keras 24 Hình 18 Lưu model Keras.24

Trang 5

Hình 22 Tạo hàm xử lý ảnh 26 Hình 23 Tiến hành xử lý ảnh 27 Hình 24 Chạy file chương trình 28 Hình 25 Cửa sổ sau khi mở file 29

Hình 26 Chọn biển báo từ máy tính 30

Hình 27 Chọn 1 ảnh bất kì trong folder 26 31

Hình 28 Sau khi nhấn Open để tài ảnh lên phần mềm nhận diện 32 Hình 29 Bấm nút nhận diện và xem kết quả 33

Hình 30 Ví dụ về biển báo giao thông ‘Giới hạn tốc độ’ 34 Hình 31 Ví dụ về biển báo giao thông 'Cấm xe'.35

Hình 32 Ví dụ về biển báo giao thông ' Dừng ' 36

PHẦN MỞ ĐẦU

Trang 6

1.Lý Do Chọn Đề Tài

Trong thời đại công nghệ hiện đại, sự phát triển của trí tuệ nhân tạo và máy học đã mở ra những cánh cửa mới cho việc giải quyết các vấn đề phức tạp trong đời sống hàng ngày Trong lĩnh vực giao thông, việc nhận diện biển báo đóng một vai trò quan trọng trong việc nâng cao an toàn giao thông và giảm thiểu tai nạn Để đáp ứng nhu cầu này, việc áp dụng các thuật toán học sâu, như mạng nơ-ron tích chập (CNN), đã thu hút sự quan tâm lớn từ cộng đồng nghiên cứu và công nghệ.

Tại Việt Nam, tình trạng an toàn giao thông đường bộ vẫn còn diễn biến phức tạp, số người tử vong vì tài nạn giao thông vẫn còn mức cao do tình trạng không tuân thủ luật giao thông và quan trọng nhất vẫn là vì ý thức của người điều khiển giao thông còn kém Biển báo giao thông được nhận diện tự động sẽ giúp người tham gia giao thông rất nhiều nhằm đưa ra những cảnh báo kịp thời, chính xát để giảm ùn tắc và an toàn hơn.

Việc ứng dụng công nghệ thông tin để giải quyết các vấn đề trong lĩnh vực giao thông đang là một chủ đề nóng ở nước ta hiện nay Vấn đề phát triển giao thông thông minh để giảm thiểu ùn tắc, tai nạn và tiết kiệm nguồn lực cũng được thảo luận trong nhiều hội thảo, diễn đàn như diễn đàn cấp cao Công nghệ Thông tin – Truyền thông Việt Nam (Vietnam ICT Summit), 2015 Phát hiện và nhận dạng biển báo giao thông là một công cụ hỗ trợ trong hệ thống giao thông thông minh Các hệ thống như vậy đang được phát triển và ứng dụng trong ngành công nghiệp tự động hóa, thông minh ở một số quốc gia phát triển trên thế giới Ở Việt Nam, cũng có một số nghiên cứu về lĩnh vực này

2.Lịch Sử Nghiên Cứu Vấn Đề

Lịch sử nghiên cứu về nhận diện biển báo giao thông đã trải qua những bước đột phá đáng kể từ những phương pháp truyền thống đến các phương pháp dựa trên trí tuệ nhân tạo và học máy Các nghiên cứu trước đây đã giúp cải thiện hiệu suất nhận diện và giảm thiểu sai số, tuy nhiên vẫn còn nhiều thách thức cần được vượt qua, đặc biệt là trong việc nhận diện các biển báo có điều kiện ánh sáng và thời tiết khác nhau.

3.Mục Tiêu Nghiên Cứu

Mục tiêu của nghiên cứu này là áp dụng và tối ưu hóa thuật toán CNN để nhận diện biển báo giao thông với độ chính xác cao và đáng tin cậy, kể cả trong điều kiện ánh sáng và thời tiết biến đổi.

Trang 7

Đối tượng của nghiên cứu là các biển báo giao thông thông thường được sử dụng trên các tuyến đường phổ biến Phạm vi của nghiên cứu sẽ tập trung vào việc nhận diện và phân loại các loại biển báo này trong các điều kiện khác nhau, từ ban ngày đến ban đêm, từ điều kiện ánh sáng tốt đến điều kiện ánh sáng yếu.

5.Phương Pháp Nghiên Cứu

Nghiên cứu sẽ sử dụng các phương pháp và kỹ thuật của máy học, đặc biệt là mạng nơ-ron tích chập (CNN), để xây dựng một hệ thống nhận diện biển báo giao thông Các bước tiếp theo bao gồm tiền xử lý dữ liệu, xây dựng mô hình CNN, huấn luyện mô hình và đánh giá hiệu suất của hệ thống.

Thông qua việc thực hiện nghiên cứu này, hy vọng rằng sẽ đóng góp vào việc cải thiện hiệu suất và độ tin cậy của hệ thống nhận diện biển báo giao thông, từ đó nâng cao an toàn và hiệu quả của giao thông đường bộ.

PHẦN NỘI DUNG

Trang 8

CHƯƠNG 1: GIỚI THIỆU TỔNG QUAN1.1.Tầm quan trọng của biển báo giao thông

Biển báo giao thông trên biển không chỉ là những dấu hiệu tĩnh đơn giản, mà còn đóng vai trò không thể phủ nhận trong việc đảm bảo an toàn và trật tự trên mặt biển Với vai trò như là các hướng dẫn và cảnh báo, chúng đóng góp đáng kể vào việc điều hướng các phương tiện và tàu thuyền trên biển một cách an toàn và hiệu quả.

Một trong những yếu tố quan trọng nhất mà biển báo giao thông mang lại là sự an toàn Bằng cách cung cấp thông tin về các vùng nguy hiểm, điều kiện thời tiết và các điểm cảnh báo khác, chúng giúp tàu thuyền và phương tiện biển tránh xa các tình huống nguy hiểm và giảm thiểu nguy cơ xảy ra tai nạn Đồng thời, chúng cũng giúp hạn chế và giải quyết các tình huống khẩn cấp trên biển một cách nhanh chóng và hiệu quả, từ đó bảo vệ tính mạng và tài sản của những người tham gia giao thông biển.

Ngoài ra, biển báo giao thông còn đóng vai trò quan trọng như là phương tiện truyền thông và liên lạc giữa các phương tiện và cơ quan quản lý biển Chúng tạo ra một hệ thống liên lạc hiệu quả, giúp thông tin về tình hình trên biển được truyền tải một cách nhanh chóng và chính xác Điều này không chỉ giúp tăng cường khả năng đối phó với các tình huống khẩn cấp mà còn đảm bảo rằng các hoạt động giao thông biển được thực hiện một cách hợp lý và an toàn.

1.2.Thách thức và hạn chế của biển báo giao thông

Một trong những thách thức lớn nhất là sự đa dạng và phức tạp của các loại biển báo giao thông Từ biển báo hướng đi đến biển báo cảnh báo và hạn chế tốc độ, mỗi loại biển báo đều có một mục đích và quy định riêng Sự phức tạp này làm tăng độ khó trong việc thiết kế, triển khai và duy trì hệ thống biển báo.

Thêm vào đó, khả năng hiểu biết và tuân thủ của người tham gia giao thông cũng là một thách thức đáng kể Người lái xe hoặc người điều khiển tàu thuyền không luôn tuân thủ các biển báo giao thông do nhiều lý do khác nhau như sơ suất, thiếu hiểu biết hoặc hành vi bất cẩn.

Điều kiện môi trường cũng có ảnh hưởng đến hiệu quả của các biển báo giao thông Thời tiết xấu, ánh sáng yếu, sương mù hay tình trạng đường trơn trượt có thể làm giảm khả năng nhận diện và hiệu quả của các biển báo, gây ra nguy cơ tai nạn và gây khó khăn cho việc duy trì an toàn giao thông.

Trang 9

Cuối cùng, việc cung cấp nguồn lực tài chính đủ để duy trì hệ thống biển báo trong thời gian dài có thể là một thách thức đối với các cơ quan quản lý giao thông Việc phải đối mặt với những hạn chế này yêu cầu sự quản lý thông minh và kế hoạch đầu tư hợp lý từ phía các nhà quản lý giao thông.

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT2.1 Học sâu - Deep Learning

Deep learning là một tập hợp con của học máy sử dụng mạng lưới thần kinh nhiều lớp, được gọi là mạng lưới thần kinh sâu, để mô phỏng khả năng ra quyết định phức tạp của bộ não con người [1] Một số dạng deep learning hỗ trợ hầu hết trí tuệ nhân tạo (AI) trong cuộc sống của chúng ta ngày nay.

Deep learning thúc đẩy nhiều ứng dụng và dịch vụ cải thiện tự động hóa, thực hiện các nhiệm vụ phân tích và vật lý mà không cần sự can thiệp của con người Nó nằm đằng sau các sản phẩm và dịch vụ hàng ngày [1]

Hình 1 Hình ảnh về mạng lưới Deep Learning Nguồn: thedatascientist.com.

2.2 Mạng nơ-ron tích chập - Convolutional Neural Network

Convolutional Neural Network (CNN hoặc ConvNet) còn được gọi là mạng nơ-ron tích chập [2] Đây được xem là một trong những mô hình của Deep Learning – tập hợp các thuật toán để có mô hình dữ liệu trừu tượng hóa ở mức cao bằng cách sử dụng nhiều lớp xử lý có cấu trúc phức tạp hơn [2] Hiểu đơn giản, CNN là một dạng của mạng nơ-ron sâu, được áp dụng phổ biến nhất để phân tích hình ảnh một cách trực quan hơn Hiện tại,

Trang 10

chưa có định nghĩa nào về thuật toán CNN chính xác nhất [2] Mạng CNN được thiết kế với mục đích xử lý dữ liệu thông qua nhiều lớp (layers) Ngoài ra, CNN có thể giúp tạo ra được hệ thống thông minh, phản ứng với độ chính xác tương đối cao [2]

Kunihiko Fukushima và Yann LeCun đã đề xuất mạng lưới thần kinh tích chập vào những năm 1980 và 1989, đồng thời áp dụng phương pháp lan truyền ngược để huấn luyện mạng lưới thần kinh trong việc nhận dạng mã Zip viết tay [2] Trong suốt những năm 1990, Yann LeCun và nhóm nghiên cứu của ông tiếp tục phát triển nghiên cứu, đạt đỉnh cao với kiến trúc "LeNet-5", được sử dụng cho việc nhận dạng tài liệu [2] Từ đó, nhiều kiến trúc CNN biến thể đã được phát triển, kèm theo sự xuất hiện của các bộ dữ liệu mới như MNIST và CIFAR-10, cũng như các cuộc thi như Thử thách nhận dạng hình ảnh quy mô lớn ImageNet (ILSVRC) Một số kiến trúc nổi tiếng bao gồm:

 AlexNet

 VGGNet2.2 Mạng nơ-ron tích chập - Convolutional Neural Network  GoogLeNet

 ResNet

 LeNet-5 – được biết đến như 1 kiến trúc CNN cổ điển

Convolutional Neural Network (CNN hoặc ConvNet) còn được gọi là mạng nơ-ron tích chập [2] Đây được xem là một trong những mô hình của Deep Learning – tập hợp các thuật toán để có mô hình dữ liệu trừu tượng hóa ở mức cao bằng cách sử dụng nhiều lớp xử lý có cấu trúc phức tạp hơn [2] Hiểu đơn giản, CNN là một dạng của mạng nơ-ron sâu, được áp dụng phổ biến nhất để phân tích hình ảnh một cách trực quan hơn Hiện tại, chưa có định nghĩa nào về thuật toán CNN chính xác nhất Mạng CNN được thiết kế với mục đích xử lý dữ liệu thông qua nhiều lớp (layers) [2] Ngoài ra, CNN có thể giúp tạo ra được hệ thống thông minh, phản ứng với độ chính xác tương đối cao [2]

2.3 Densenet

Densenet là mạng tích chập(CNN) được kết nối dày đặc Nó rất giống với ResNet nhưng có một số khác biệt cơ bản [3] ResNet sử dụng một phương pháp bổ sung có nghĩa là lấy đầu ra trước đó làm đầu vào cho lớp trong tương lai và trong DenseNet lấy tất cả đầu ra trước đó làm đầu vào cho lớp trong tương lai như trong hình trên Có thể nói, DenseNet là một dạng ứng dụng của mạng nơ-ron tích chập (CNN), trong đó các lớp sau được lấy từ các lớp trước để tính toán [3] Điều này tạo ra một mạng nơ-ron có cấu trúc kết nối chặt chẽ, giúp tăng cường khả năng học và hiệu suất của mô hình [3]

Trang 11

Hình 2 Cấu trúc DenseNet và Resnet Nguồn: paperswithcode.com.

DenseBlock là một mô-đun được sử dụng trong các mạng thần kinh tích chập(CNN), kết nối trực tiếp tất cả các lớp (với kích thước bản đồ đặc trưng phù hợp) với nhau Kể từ đó, lớp thứ lth có l đầu vào(inputs) và nó sẽ được chuyển cho L – l lớp tiếp theo (L: tổng số lớp, l: lớp hiện lại) Và từ đó nó sẽ tạo nên sự liên kết dày đặc trong mạng lưới [4]

Trang 12

Hình 3 Một mạng lưới gồm 5 DenseBlock được liên kết với nhau với số lớp k = 4 Mỗilớp đều lấy kết quả từ lớp ở Block phía trước Nguồn: paperswithcode.com.

Hình 4 DenseBlock và các layer.

Trang 13

2.4 Mạng dư - Residual Networks (ResNet)

Sau kiến trúc đầu tiên dựa trên CNN (AlexNet) chiến thắng cuộc thi ImageNet 2012, mọi kiến trúc chiến thắng tiếp theo sử dụng nhiều lớp hơn trong một mạng nơ-ron sâu để giảm tỷ lệ lỗi [5] Điều này hoạt động cho ít lớp hơn, nhưng khi chúng ta tăng số lớp, có một vấn đề phổ biến trong học sâu gọi là đạo hàm biến mất/bùng nổ (vanishing) [5] Điều này làm cho đạo hàm trở thành 0 hoặc quá lớn Do đó, khi chúng ta tăng số lớp, tỷ lệ lỗi khi huấn luyện và kiểm tra cũng tăng [5]

Vanishing là vấn đề xảy ra khi huấn luyện các mạng nơ ron nhiều lớp [5] Khi huấn luyện, giá trị đạo hàm là thông tin phản hồi của quá trình lan truyền ngược [5] Giá trị này trở nên vô cùng nhỏ tại các lớp nơ ron đầu tiên khiến cho việc cập nhật trọng số mạng không thể xảy ra [6]

Hình 5 Đồ thị về tỷ lệ lỗi khi huấn luyện và thử nghiệm Nguồn: geeksforgeek.org.

Mạng Residual: Để giải quyết vấn đề về đạo hàm biến mất, kiến trúc này giới thiệu khái niệm gọi là Residual Blocks Trong mạng này, chúng ta sử dụng một kỹ thuật gọi là kết nối trực tiếp Kết nối trực tiếp kết nối các hoạt động của một lớp đến các lớp tiếp theo bằng cách bỏ qua một số lớp ở giữa [5] Điều này tạo thành một khối residual ResNets được tạo thành bằng cách xếp các khối residual này cùng nhau [5] Phương pháp đằng sau mạng này là thay vì các lớp học ánh xạ cơ bản, chúng ta cho phép mạng phù hợp với ánh xạ residual [5] Đó là H(x), ánh xạ ban đầu, để mạng phù hợp với công thức : [5]

F(x) = H(x) – x

Trang 14

Hình 6 Mô tả về công thức được sử dụng trong ResNet với hàm kích hoạt relu Nguồn:geeksforgeeks.org.

Trang 15

Hình 7 Ví dụ về ImageNet Bên trái: cái Mô hình VGG-19 (19,6 tỷ FLOP) làm tài liệutham khảo.Ở giữa: một mạng đơn giản Với 34 lớp tham số (3,6 tỷ FLOP) Bên phải:

mạng dư có 34 lớp tham số (3,6 tỷ FLOP) Nguồn: arxiv.org [7].

Trang 16

2.5 Keras

Keras là API cấp cao của nền tảng TensorFlow [8] Nó cung cấp một giao diện dễ tiếp cận, hiệu quả cao để giải quyết các vấn đề về máy học (ML), tập trung vào học sâu hiện đại Keras bao gồm mọi bước trong quy trình học máy, từ xử lý dữ liệu đến điều chỉnh siêu tham số cho đến triển khai[8] Nó được phát triển với trọng tâm là cho phép thử nghiệm nhanh [8]

Với Keras, ta có toàn quyền truy cập vào khả năng mở rộng và khả năng đa nền tảng của TensorFlow Có thể chạy Keras trên TPU Pod hoặc các cụm GPU lớn vàcũng có thể xuất các mô hình Keras để chạy trong trình duyệt hoặc trên thiết bị di động [8]

Keras được thiết kế để đơn giản hóa công bằng cách đạt được các mục tiêu sau: [8] o Cung cấp giao diện đơn giản, nhất quán.

o Tối thiểu hóa số lượng hành động cần thiết cho các trường hợp sử dụng thông thường.

o Cung cấp các thông báo lỗi rõ ràng, hữu ích.

o Tuân thủ nguyên tắc tiết lộ dần về độ phức tạp: Bắt đầu dễ dàng và bạn có thể hoàn thành các luồng công việc nâng cao bằng cách học từng bước o Hỗ trợ viết mã ngắn gọn, dễ đọc.

Hình 8 Sự ngắn gọn trong việc sử dụng API Keras để làm việc Nguồn: keras.io.

2.6.Các thư viện được sử dụng

Trang 17

from keras.layers import MaxPooling2D

-Flatten là quá trình chuyển đổi tất cả các mảng 2D kết quả thành một vectơ tuyến tính dài liên tục.

from keras.layers import Flatten

-Dense được sử dụng để thực hiện kết nối đầy đủ của mạng nơ-ron, bước thứ tư của CNN.

from keras.layers import Dense

-Tkinter là giao diện Python cho bộ công cụ Tk GUI

-Để tạo hộp thoại tệp (trình chọn tệp), bạn có thể sử dụng filedialog from tkinter import filedialog

- Tk là để tạo ra một cửa sổ nhỏ trên màn hình import tkinter as tk

- Thư viện PIL cho phép người dùng thực hiện một số tác vụ liên quan đến xử lý hình ảnh.

- Mudule os cho phép chúng ta thao tác với tệp và thư mục.

- Tensorfow là thư viện mã nguồn mở dùng cho tính toán số học sử dụng đồ thị luồng dữ liệu.

- OpenCV là một thư viện mã nguồn mở hàng đầu cho thị giác máy tính (computer vision), xử lý ảnh và máy học, và các tính năng tăng tốc GPU trong hoạt động thời gian thực.

- Pandas sử dụng một cấu trúc dữ liệu riêng là Dataframe Pandas cung cấp rất nhiều

chức năng xử lý và làm việc trên cấu trúc dữ liệu này

Ứng Dụng Vào Bài Toán

Bước 1: Khám phá tập dữ liệu

Thư mục train có chưa 43 thư mục con mỗi thư mục đại diện cho một lớp khác nhau được đánh số thứ tự từ 0 đến 42 sử dụng module OS ta sẽ lặp lại trên tất cả các lớp để kết nối các hình ảnh với nhãn tương ứng của chúng.

Thư viện PIL được sử dụng để chuyển hình ảnh thành một mảng.

Sau đó ta sẽ lưu tất cả các hình ảnh và nhãn của chúng vào lists data và labels.

Trang 18

Chúng ta cần chuyển các lists thành các numpy array để làm đầu vào cho model.

Kích thước của dữ liệu là (39209, 30, 30, 3), có nghĩa là có 39209 hình ảnh, mỗi ảnh có kích thước 30×30 pixel, số 3 ở cuối thể hiện dữ liệu là hình ảnh màu (giá trị RGB) Sử dụng phương thức train_test_split () của sklearn để phân chia bộ dữ liệu thành train set và test set.

Sử dụng phương thức to_categorical của keras.utils để xử lý các nhãn của y_train và y_test bằng one-hot encoding.

Hình 9 Phân chia dữ liệu.

Bước 2: Xây dựng mô hình CNN.

Để phân loại các hình ảnh thành các danh mục tương ứng, chúng ta sẽ xây dựng mô hình CNN (Convolutional Neural Network) CNN là mô hình tốt nhất cho mục đích phân loại hình ảnh.

Kiến trúc mô hình CNN của chúng ta như sau:

Trang 19

Hình 10 Xây dựng mô hình CNN.

Bước 3: Training và xác thực mô hình.

Sau khi xây dựng kiến trúc mô hình, chúng ta sẽ huấn luyện mô hình bằng cách sử dụng model.fit () Chúng ta hãy thử với batch size là 32 và 64 nhận thấy mô hình hoạt động tốt hơn với batch size là 64 và sau 15 epochs độ chính xác đã được ổn định.

Mô hình của chúng ta đã đạt đến độ chính xác ~ 95% trên tập training set Sử dụng matplotlib để vẽ biểu đồ tương quan giữa độ chính xác và sự mất mát.

Hình 11 Hình ảnh minh họa sự mất mát.

Ngày đăng: 01/05/2024, 08:28

Tài liệu cùng người dùng

Tài liệu liên quan