Nhận dạng biển báo là một công nghệ được ứng dụng rộng rãi trong đời sống hàng ngày của con người như các hệ thống giám sát, quản lý vào ra, tìm kiếm tên biển báo,… có rất nhiều phương p
Trang 1TIỂU LUẬN
MÔN HỌC
TRÍ TUỆ NHÂN TẠO
SINH VIÊN: NGUYỄN VĂN MỸ
LỚP: K54KMT.01
GIÁO VIÊN HƯỚNG DẪN: NGUYỄN TUẤN LINH
Trang 2TIỂU LUẬN
BỘ MÔN : TIN HỌC CÔNG NGHIỆP
Sinh viên: NGUYỄN VĂN MỸ
Lớp: K54KMT.01……… Ngành: Kỹ thuật máy tính Giáo viên hướng dẫn: NGUYỄN TUẤN LINH
Ngày giao đề: 01/05/2022……… Ngày hoàn thành: 13/06/2022 Tên đề tài: Nhận diện biển báo giao thông
GIÁO VIÊN HƯỚNG DẪN
(Ký và ghi rõ họ tên)
Trang 3NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
Thái Nguyên, ngày , tháng…, năm…
GIÁO VIÊN HƯỚNG DẪN
(Ký và ghi rõ họ tên)
Trang 4MỤC LỤC
I GIỚI THIỆU ĐỀ TÀI 6
1 Mô tả yêu cầu bài toán: 6
2 Dữ liệu sử dụng để huấn luyện mô hình: 6
3 Thuật toán sử dụng: 7
II PHÂN TÍCH VÀ TIỀN XỬ LÝ DỮ LIỆU 8
1 Đọc dữ liệu từ thư mục GTSRB: 8
III THUẬT TOÁN 10
1 Thuật toán CNN: 10
IV CÀI ĐẶT VÀ KIỂM THỬ 12
1 Các module chương trình: Huấn luyện (train), thẩm định (validation) và kiểm thử (test) 12
2 Cài đặt giao diện chương trình (Winform) : 14
V KẾT LUẬN 20
1. Kết quả đạt được: 20
2. Hướng phát triển: 20
TÀI LIỆU THAM KHẢO 21
Trang 5LỜI NÓI ĐẦU
Hệ thống biển báo giao thông giữ một vị trí khá quan trọng trong việc điều khiển giao thông Cùng với CSGT và đèn tín hiệu giao thông, hệ thống biển báo giao thông đã tạo nên tính trật tự,an toàn, giúp các phương tiện tham gia giao thông được lưu thông, đi lại tránh ùn tắc và hạn chế tai nạn.
Nhận dạng biển báo là một công nghệ được ứng dụng rộng rãi trong đời sống hàng ngày của con người như các hệ thống giám sát, quản lý vào ra, tìm kiếm tên biển báo,…
có rất nhiều phương pháp nhận dạng biển báo để nâng cao hiệu suất tuy nhiên dù ít hay nhiều phương pháp này đang vấp phải những thử thách về độ sáng, hướng nghiên cứu,
kích thước ảnh, hay ảnh hưởng của tham số môi trường.
Cùng với sự phát triển của xã hội, vấn đề an ninh, bảo mật đang được yêu cầu khắt khe tại mọi quốc gia trên thế giới Các hệ thống nhận dạng con người, đồ vật,… được ra đời và phát triển với độ tin cậy ngày càng cao Với cách tiếp cận đối tượng nhận dạng theo phương pháp này, chúng ta có thể thu thập được nhiều thông tin từ đối tượng hơn
mà không cần tác động nhiều đến đối tượng cũng vẫn đảm bảo tính chính xác, an toàn, thuận tiện.
Do vậy em đã quyết định lựa chọn đề tài “ Nhận diện biển báo giao thông “.
Em xin chân thành cảm ơn thầy Nguyễn Tuấn Linh đã giúp đỡ, hướng dẫn em
hoàn thành đề tài này
Trang 6I GIỚI THIỆU ĐỀ TÀI
1 Mô tả yêu cầu bài toán:
- Đầu vào là 1 ảnh chụp được từ biển báo giao thông và đầu ra là tên tương ứng của biển báo.
- Số lượng biển báo giao thông là cố định và đây là bài toán phân biệt nên chúng ta sẽ coi đây là bài toán phân loại ảnh, với số lớp cần phân loại chính
là số lượng loại biển báo giao thông cần xác định.
- Hình ảnh các biển báo rất khác nhau và có thể dễ dàng phân biệt bằng mắt thường nên dữ liệu phân lớp khá đơn giản và ít sự nhập nhằng.
- Chúng ta sẽ cần một mô hình deep learning đơn giản là có thể xử lý được việc này.
2 Dữ liệu sử dụng để huấn luyện mô hình:
và lưu các thông tin trong file csv Đây là bộ dữ liệu biển báo giao thông của Đức, gồm 42 loại biển báo khác nhau.
traffic-sign
Trang 7https://www.kaggle.com/datasets/meowmeowmeowmeowmeow/gtsrb-german-3 Thuật toán sử dụng:
- Lựa chọn thuật toán “Mạng nơron tích chập - Convolutional Neural
Network – CNN”.
- Giới thiệu sơ bộ về CNN:
Một họ các mạng nơ-ron ưu việt được thiết kế chính xác cho mục đích trên Các kiến trúc dựa trên CNN hiện nay xuất hiện trong mọi ngóc ngách của lĩnh vực thị giác máy tính, và đã trở thành kiến trúc chủ đạo mà hiếm ai ngày nay phát triển các ứng dụng thương mại hay tham gia một cuộc thi nào đó liên quan tới nhận dạng ảnh, phát hiện đối tượng, hay phân vùng theo ngữ cảnh mà không xây nền móng dựa trên phương pháp này.
Ràng buộc Perceptron Đa tầng :
Trang 8- Cách chọn tham số cho CNN:
Số các convolution layer: càng nhiều các convolution layer thì performance càng được cải thiện Sau khoảng 3 hoặc 4 layer, các tác động được giảm một cách đáng kể
Filter size: thường filter theo size 5×5 hoặc 3×3
Pooling size: thường là 2×2 hoặc 4×4 cho ảnh đầu vào lớn
Cách cuối cùng là thực hiện nhiều lần việc train test để chọn ra được param tốt nhất.
II PHÂN TÍCH VÀ TIỀN XỬ LÝ DỮ LIỆU
1 Đọc dữ liệu từ thư mục GTSRB:
- 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.
from keras utils import to_categorical
Trang 9from keras layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout
data = []
labels = []
classes = 43
cur_path = os getcwd ()
#Retrieving the images and their labels
path = os path join ( cur_path , 'train' , str ( )) images = os listdir ( path )
for in images : try :
image = Image open ( path + ' \\ ' + a
image = image resize (( 30 , 30 )) image = np array ( image ) #sim = Image.fromarray(image)
data append ( image ) labels append ( ) except :
print ( "Error loading image" )
#Converting lists into numpy arrays
data = np array ( data )
labels = np array ( labels )
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.
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 30x30 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.
Trang 10III THUẬT TOÁN
1 Thuật toán 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:
2 Conv2D layer (filter=32, kernel_size=(5,5), activation=”relu”)
MaxPool2D layer ( pool_size=(2,2))
Dropout layer (rate=0.25)
2 Conv2D layer (filter=64, kernel_size=(3,3), activation=”relu”)
MaxPool2D layer ( pool_size=(2,2))
Trang 11 Dropout layer (rate=0.25)
Flatten layer to squeeze the layers into 1 dimension
Dense Fully connected layer (256 nodes, activation=”relu”)
Dropout layer (rate=0.5)
Dense layer (43 nodes, activation=”softmax”)
- Model này cần chú ý:
Model có input size là 64x64x3, nghĩa là các ảnh đầu vào đều phải resize về 64×64.
Model có output = 43 – là số class biển báo ta có.
Model có sử dụng Dropout để tránh Overfit
- Kiến trúc mạng CNN:
Lớp ngõ vào: lưu dữ liệu ảnh đầu vào.
Lớp tích chập : thực hiện tích chập từ lớp trước với số lượng các
bộ lọc tạo ra các ngõ ra.
Lớp gộp : tác dụng làm giảm số lượng phần tử trong feature app.
Lớp kết nối đầy đủ : lớp cuối cùng trong mạng CNN và nó có kiến trúc giống như mạng nơ ron truyền thống.
Trang 12IV CÀI ĐẶT VÀ KIỂM THỬ
1 Các module chương trình: Huấn luyện (train), thẩm định (validation) và kiểm thử (test).
- 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.
Trang 13- 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.
#vẽ đồ thị về độ chính xác
plt figure ( )
plt plot ( history history[ 'accuracy' ], label = 'training accuracy' )
plt plot ( history history[ 'val_accuracy' ], label = 'val accuracy' )
plt plot ( history history[ 'loss' ], label = 'training loss' )
plt plot ( history history[ 'val_loss' ], label = 'val loss' )
plt title ( 'Loss' )
Trang 14- Kiểm tra mô hình với test set:
Tập dữ liệu của chúng ta có chứa 1 thư mục test và 1 file test.csv Chúng ta cần phải trích xuất hình ảnh và nhãn tương ứng bằng cách sử dụng pandas Sau đó, để dự đoán mô hình, chúng ta phải thay đổi kích thước hình ảnh thành 30 × 30 pixel và tạo một mảng numpy chứa tất cả dữ liệu hình ảnh.
Sử dụng precision_score của sklearn.metrics để dự đoán các nhãn của bộ test Có thể thấy ta đã đạt được độ chính xác là 95% trong mô hình này.
#testing accuracy on test dataset
from sklearn.metrics import accuracy_score
Trang 15y_test = pd.read_csv('Test.csv') labels = y_test["ClassId"].values imgs = y_test["Path"].values data = []
for img in imgs:
image = Image open (img) image = image.resize((30,30)) data.append(np.array(image)) X_test = np.array(data)
pred = model.predict_classes(X_test)
#Accuracy with the test data
from sklearn.metrics import accuracy_score
print (accuracy_score(labels, pred))
2 Cài đặt giao diện chương trình (Winform) :
- Xây dựng giao diện người dùng bằng Tkinter Tkinter là một bộ công cụ GUI trong thư viện python tiêu chuẩn Tạo một tệp mới là gui.py trong cùng thư mục của project.
- CODE:
from PIL import ImageTk , Image
import keras
# load the trained model to classify sign
model = load_model ( 'E:/AI/VanMy/traffic_classifier_VM.h5' )
#dictionary to label all traffic signs class.
Trang 167 : 'Speed limit (100km/h)' ,
8 : 'Speed limit (120km/h)' ,
9 : 'No passing' ,
10 : 'No passing for vehicles over 3.5 metric tons' ,
11 : 'Right-of-way at the next intersection' ,
19 : 'Dangerous curve to the left' ,
20 : 'Dangerous curve to the right' ,
31 : 'Wild animals crossing' ,
32 : 'End of all speed and passing limits' ,
33 : 'Turn right ahead' ,
34 : 'Turn left ahead' ,
35 : 'Ahead only' ,
36 : 'Go straight or right' ,
37 : 'Go straight or left' ,
top title ( 'Nhận diện biển báo giao thông' )
top configure ( background = '#CCCCFF' )
label = Label ( top , background = '#CCCCFF' , font =( 'arial' , 15 , 'bold' ))
sign_image = Label ( top )
def classify ( file_path ):
Trang 17global label_packed image = Image open ( file_path ) image = image resize (( 30 , 30 )) image = np expand_dims ( image , axis = ) image = np array ( image )
pred = model predict( image )[ 0
pred = np argmax ( pred ) sign = classes [ pred ] print ( sign )
label configure ( foreground = '#011638' , text = sign )
def show_classify_button ( file_path ):
classify_b = Button ( top , text = "NHẬN DIỆN" , command = lambda :
classify ( file_path ), padx = 10 , pady = ) classify_b configure ( background = '#364156' ,
foreground = 'white' , font =( 'arial' , 10 , 'bold' )) classify_b place ( relx = 0.79 , rely = 0.46 )
def upload_image ():
try : file_path = filedialog askopenfilename () uploaded = Image open ( file_path )
uploaded thumbnail ((( top winfo_width ()/ 2.25 ), ( top winfo_height ()/ 2.25 )))
im = ImageTk PhotoImage ( uploaded ) sign_image configure ( image = im ) sign_image image = im
label configure ( text = '' ) show_classify_button ( file_path ) except :
upload pack ( side = BOTTOM , pady = 50 )
sign_image pack ( side = BOTTOM , expand = True )
label pack ( side = BOTTOM , expand = True )
heading = Label ( top , text = "NHẬN DIỆN BIỂN BÁO GIAO THÔNG" , pady = 20 ,
font =( 'arial' , 20 , 'bold' ))
heading configure ( background = '#CCCCFF' , foreground = '#364156' )
Trang 18model.predict_classes(image) trả về cho chúng ta một số trong khoảng 42) đại diện cho lớp mà nó thuộc về.
(0 Output:
Trang 21- Cải thiện độ chính xác cao hơn.
- Nhận diện được thêm các biển báo khác trong nước cũng như nước ngoài.
- Cải thiện giao diện chỉn chu hơn.