TRƯỜ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
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
THÁI NGUYÊN -2022
TRƯỜNG ĐHKTCN
CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM
KHOA ĐIỆN TỬ
Độc lập - Tự do - Hạnh phúc
TIỂU LUẬN
MÔ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)
NHẬ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)
MỤC LỤC
I.
GIỚI THIỆU ĐỀ TÀI...............................................................................................6
1.
Mơ tả u cầu bài tốn:......................................................................................6
2.
Dữ liệu sử dụng để huấn luyện mơ hình:..........................................................6
3.
Thuật tốn sử dụng:...........................................................................................7
II.
1.
III.
1.
IV.
1.
PHÂN TÍCH VÀ TIỀN XỬ LÝ DỮ LIỆU...........................................................8
Đọc dữ liệu từ thư mục GTSRB:.......................................................................8
THUẬT TỐN.....................................................................................................10
Thuật tốn CNN:..............................................................................................10
CÀI ĐẶT VÀ KIỂM THỬ..................................................................................12
Các module chương trình: Huấn luyện (train), thẩm định (validation) và
kiểm thử (test).............................................................................................................12
2.
V.
Cài đặt giao diện chương trình (Winform) :...................................................14
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
LỜ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 tồ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 tồ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.
I.
GIỚI THIỆU ĐỀ TÀI
1. Mơ tả u cầu bài tố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:
- 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ông
của Đức, gồm 42 loại biển báo khác nhau.
/>
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 :
-
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.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cv2
import tensorflow as tf
from PIL import Image
import os
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from keras.models import Sequential, load_model
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout
data = []
labels = []
classes = 43
cur_path = os.getcwd()
#Retrieving the images and their labels
for i in range(classes):
path = os.path.join(cur_path,'train',str(i))
images = os.listdir(path)
for
a 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(i)
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.
III. THUẬT TỐN
1. Thuật tố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))
-
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.
IV. 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.
-
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(0)
plt.plot(history.history['accuracy'], label='training accuracy')
plt.plot(history.history['val_accuracy'], label='val accuracy')
plt.title('Accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend()
plt.show()
plt.figure(1)
plt.plot(history.history['loss'], label='training loss')
plt.plot(history.history['val_loss'], label='val loss')
plt.title('Loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend()
plt.show()
-
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ự đố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
y_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 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
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from PIL import Image
import os
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)',
5: 'Speed limit (80km/h)',
6: 'End of speed limit (80km/h)',
7: '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',
12: 'Priority road',
13: 'Yield',
14: 'Stop',
15: 'No vehicles',
16: 'Vehicles over 3.5 metric tons prohibited',
17: 'No entry',
18: 'General caution',
19: 'Dangerous curve to the left',
20: 'Dangerous curve to the right',
21: 'Double curve',
22: 'Bumpy road',
23: 'Slippery road',
24: 'Road narrows on the right',
25: 'Road work',
26: 'Traffic signals',
27: 'Pedestrians',
28: 'Children crossing',
29: 'Bicycles crossing',
30: 'Beware of ice/snow',
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',
38: 'Keep right',
39: 'Keep left',
40: 'Roundabout mandatory',
41: 'End of no passing',
42: 'End of no passing by vehicles over 3.5 metric tons'}
#initialise GUI
top = Tk()
top.geometry('800x600')
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):
global label_packed
image = Image.open(file_path)
image = image.resize((30, 30))
image = np.expand_dims(image, axis=0)
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=5)
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:
pass
upload=Button(top, text="TẢI ẢNH LÊN", command=upload_image,
padx=10,pady=5)
upload.configure(background='#364156', foreground='white',font=('arial',
10, ))
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
ảnh và một nút để gọi hàm classify(). Hàm classify() chuyển đổi hình ảnh
thành kích thước (1, 30, 30, 3). Sau đó, chúng ta dự đốn các lớp,
model.predict_classes(image) trả về cho chúng ta một số trong khoảng (042) đại diện cho lớp mà nó thuộc về.
-
Output:
V. KẾT LUẬN
1. Kết quả đạt được:
-
Với project này em đã học được cách xây dựng một mơ hình nhận diện biển
báo giao thơng với độ chính xác là 95%.
2. Hướng phát triển:
-
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.
TÀI LIỆU THAM KHẢO
/>
/>