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àngngà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
Trang 1TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP THÁI NGUYÊN
KHOA ĐIỆN TỬ
BỘ MÔN: TIN HỌC CÔNG NGHIỆP
TIỂU LUẬN
MÔN HỌC
TRÍ TUỆ NHÂN TẠO
LỚP: K54KMT.01
THÁI NGUYÊN -2022
Trang 2TRƯỜNG ĐHKTCN CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM
TIỂU LUẬNMÔN HỌC: TRÍ TUỆ NHÂN TẠO
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ểngiao 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, đilạ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àngngà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 haynhiề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ắtkhe 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ạngtheo 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ênchú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ắtthườ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ý đượcviệc này
2 Dữ liệu sử dụng để huấn luyện mô hình:
- Bộ dữ liệu sử dụng của bài: dữ liệu gồm các biển báo đã được đánh nhãn
và lưu các thông tin trong file csv Đây là bộ dữ liệu biển báo giao thôngcủ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áctá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ớpkhác nhau được đánh số thứ tự từ 0 đến 42 sử dụng module OS ta sẽ lặp lạitrê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 sklearn model_selection import train_test_split
from keras utils import to_categorical
from keras models import Sequential, load_model
Trang 9from keras layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout
data = []
labels = []
classes = 43
cur_path = os getcwd ()
#Retrieving the images and their labels
for in range ( classes ):
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 listsdata và labels
Chúng ta cần chuyển các lists thành các numpy array để làm đầuvà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ốithể 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ácnhã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ốtnhấ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ằngcách sử dụng model.fit () Chúng ta hãy thử với batch size là 32 và 64 nhậnthấ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ấtmá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' )
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 tacầ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 ảnhthà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 trongcùng thư mục của project
- CODE:
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk , Image
import keras
# load the trained model to classify sign
from keras models import load_model
from sklearn model_selection import train_test_split
model = load_model ( 'E:/AI/VanMy/traffic_classifier_VM.h5' )
#dictionary to label all traffic signs class.
classes = { 0 : 'Speed limit (20km/h)' ,
1 : 'Speed limit (30km/h)' ,
2 : 'Speed limit (50km/h)' ,
3 : 'Speed limit (60km/h)' ,
4 : 'Speed limit (70km/h)' ,
Trang 1610 : '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 )
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' )
heading pack ()
top mainloop ()
- Trong đoạn code này, trước tiên ta phải import mô hình đã được training từtrước là "traffic_classifier.h5" Và sau đó, xây dựng GUI để upload hình
Trang 18ảnh và một nút để gọi hàm classify() Hàm classify() chuyển đổi hình ảnhthành kích thước (1, 30, 30, 3) Sau đó, chúng ta dự đoán các lớp,model.predict_classes(image) trả về cho chúng ta một số trong khoảng (0-42) đại diện cho lớp mà nó thuộc về.
- 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
Trang 22TÀI LIỆU THAM KHẢO
german-traffic-sign
https://www.kaggle.com/datasets/meowmeowmeowmeowmeow/gtsrb-https://tek4.vn/nhan-dien-bien-bao-giao-thong-bang-cnn-keras