Cải tiến thuật toán training cho ảnh màu và thiết kế bộ CNN mới

Một phần của tài liệu Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành đồ án tốt nghiệp ngành công nghệ kỹ thuật ô tô (Trang 76 - 81)

Thuật toán training cũ chỉ train được các hình ảnh trắng đen, điều này làm khả năng tiếp cận các hình ảnh màu hoặc ảnh thực tế bị gặp khó khăn, vì vậy việc phát triển một thuật toán traning mới và kiểm soát tốt quá trình train bằng cách tạo các biểu đồ tương ứng, đồng thời tạo dựng kiến trúc CNN mới tốt hơn

Tạo kiến trúc CNN mới

Để tạo kiến trúc CNN mới tốt hơn kiến trúc CNN cũ ta cần tạo dựng CNN cũ và phân tích rõ thành phần cấu tạo bên trong kiến trúc CNN cũ.

model = Sequential()

model.add(Conv2D(8, kernel_size=(7, 7), # 8 chanel . 7*7 kích thước c ửa sổ để quét các object, tùy vào kích thước object để chọn kích thước cửa sổ

activation='relu', # bỏ giá trị âm

strides=(2, 2), # độ trượt input_shape= (400,200,3), # kích thước ảnh 60*200*3(RGB) padding='valid',)) model.add(Conv2D(16, kernel_size=(5, 5), activation='relu', strides=(2, 2), padding='valid',)) model.add(Conv2D(32, kernel_size=(5, 5), activation='relu', strides=(2, 2), padding='valid',)) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', strides=(1, 1), padding='valid',)) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', strides=(1, 1), padding='valid',))

model.add(Dense(number_class, activation='softmax'))

model.summary()

- Phân tích: số lượng tích chập

Lần tích chập đầu tiên là tích chập với filter lớn số lượng filter nhỏ mục đích là để lấy đặc điểm ảnh 1 cách cục bộ và giảm thiểu thời gian traning vì lượng ảnh cần training quá lớn 4000 đến 6000 ảnh cho một cung đường

Các lần tích chập lần sau thì số lượng filter và kích thước filter được giảm dần, từ ma trận được tích chập bởi các lần tích chập trước.

69 Hàm kích hoạt là relu và dùng solfmax để chuyển đổi ma trận thành các vecto xác suất.

Bảng 3.3. Phân tích số lượng tích chập

Số lần Số lượng ma trận

filter Kích thước filter Kích thước ma trận tổng hợp

1 8 7x7 2x2

2 16 5x5 2x2

3 32 5x5 2x2

4 64 3x3 1x1

5 64 3x3 1x1

Tạo dựng kiến trúc CNN mới: model = Sequential()

model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_s

hape=X_train.shape[1:]))

model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu')) model.add(MaxPool2D(pool_size=(2, 2)))

model.add(Dropout(rate=0.25))

model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu')) model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu')) model.add(MaxPool2D(pool_size=(2, 2)))

model.add(Dropout(rate=0.25)) model.add(Flatten())

model.add(Dense(256, activation='relu')) model.add(Dropout(rate=0.5))

model.add(Dense(43, activation='softmax'))

Điều khác biệt khi tạo dựng kiến trúc mới là sử dụng bộ filter nhỏ hơn so với bộ filter của kiến trúc CNN cũ đồng thời gia tăng số lượng filter lên gấp 4 lần. điều này giúp việc máy học được các đặc tính của ảnh một cách rõ ràng và chi tiết hơn đồng thời giảm số lần dùng ma trận tổng hợp nhằm giảm sự chuyển dịch giá trị đặc tính của ma trận.

70 Để kiểm soát và quan sát quá trình train, thì cách đơn giản và hiệu quả là chèn biểu đồ các giá trị accuracy và loss và thuật toán kiểm soát giá trị bằng biểu đồ được thiết kế như sau:

data = np.array(data) labels = np.array(labels)

print(data.shape, labels.shape)

#Splitting training and testing dataset

71 X_train, X_test, y_train, y_test = train_test_split(data, labels, test_siz e=0.2, random_state=42)

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) #Converting the labels into one hot encoding

y_train = to_categorical(y_train, 43) y_test = to_categorical(y_test, 43)

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=[

'accuracy']) epochs = 15

history = model.fit(X_train, y_train, batch_size=32, epochs=epochs, valida

tion_data=(X_test, y_test))

model.save("D:\\kethuc\\filetrain\\my_model.h5") #plotting graphs for accuracy

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()

Ở biểu đồ cho thấy độ chính xác của thuật toán là 98% giá trị bị mất là 5% một kết quả rất cao so với một số lần thực nghiệm khác chỉ có mức ở 90% tuy nhiên để đảm bảo giá trị này là giá trị thực bằng cách dùng một mô hình test được thiết lập sẵn, thuật toán khá đơn giản để kiểm tra.

#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=[]

72

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))

Sau khi kiểm tra trên mô hình test thì ta tiến hành sử dụng file train thực nghiệm để kiểm tra độ chính xác và hiệu quả ở môi trường tự nhiên.

73

CHƯƠNG 4: THỰC NGHIỆM VÀ ĐÁNH GIÁ

Một phần của tài liệu Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành đồ án tốt nghiệp ngành công nghệ kỹ thuật ô tô (Trang 76 - 81)

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

(132 trang)