Thiết kế hệ thống điện và điều khiển

Một phần của tài liệu ĐỒ ÁN Nghiên cứu, thiết kế hệ thống nhận dạng chữ viết tay ứng dụng xử lý ảnh và trí tuệ nhân tạo (Trang 76)

3.2.1.Sơ đồ khối

Nhóm tiền hành thiết kế sơ đồ khối hệ thống để xác định các thành phần trong hệ thống nhận diện

Hình 3.1: : Sơ đồ khối tổng quan

73

Hình 3.3: Khối hiển thị HMI

74

3.2.2.Hệ thống điều khiển

Bảng 3.2: Bảng lựa chọn linh kiện (1)

Tên Số lượng Hình ảnh Loại sử dụng Module raspberry 1 Raspberry pi3 B+ Màn hình hiển thị 1 LCD tích hợp I2C Arduino 1 Arduino Uno R3

75

Bảng 3.3: Bảng lựa chọn linh kiện (2)

Tên Số lượng Hình ảnh Loại sử dụng Camera 1 : Module camera raspberry LED 1 LED RGB Cảm biến 1 Cảm biến Quang Màn hình hiển thị 1 Màn hình HMI raspberry

76

3.2.3.Bản vẽ chi tiết

Hình 3.5: Bản vẽ cơ khí tổng quát

Được xây dựng dựa trên hệ thống quét mã sản phẩm với cấu tạo gồm 5 phần chính: - Hộp HMI để hiển thị và xử lý ảnh

- Hộp quét mã chứa camera và cảm biến, LED - Hộp chứa mẫu quét

77

3.2.4.Sơ đồ nối dây

Hình 3.6: Sơ đồ nối dây của hệ thống

3.2.5.Lưu đồ thuật toán

78

Giải thích thuật toán: Sau khi đưa mẫu quét vào trong hộp quét các led sẽ bật và

liên tục điều chỉnh độ sáng dựa vào cảm biến quang sao cho ảnh chụp trong hộp là rõ nhất rồi tiếp theo là đến quá trình xử lý ảnh và phân loại ảnh cuối cùng hiển thị kết qủa ra HMI

3.3. Xây dựng chương trình điều khiển

Chương trình điều khiển được viết bằng ngôn ngữ Python trên ứng dụng Pycharm.

3.3.1.Tập dữ liệu Mnist[9]

Tập dữ liệu MNIST là một bộ dữ liệu nổi tiếng về các chữ số viết tay thường được sử dụng để đào tạo các hệ thống xử lý ảnh cho học máy.

Bảng 3.4: Tập dữ liệu trong Mnist

Nó phổ biến vì hai lý do:

- Người mới bắt đầu sử dụng nó vì nó dễ dàng

79 Bộ dữ liệu bao gồm 70.000 hình ảnh của các chữ số viết tay với sự phân chia như sau:

- 60.000 hình ảnh đào tạo (training) - 10.000 hình ảnh thử nghiệm (testing)

Dữ liệu ảnh trong tập dữ liệu tất cả có kích thước là 28x28x1

3.3.2.Mạng CNN

Khác với các Neural Network thông thường, các lớp ẩn chỉ là các lớp liên kết hoàn toàn (Fully Connected Layer) thì trong Convolutional Neural Network còn định nghĩa thêm các lớp tích chập (Convolutional Layer) và các lớp gộp (Pooling Layer).

Đầu vào và các thư viện: Đầu tiên ta cần import tất cả các thư viện cần thiết cho

mạng hoạt động

import numpy as np import keras

from keras.datasets import mnist from keras.utils import np_utils

from keras.models import Sequential

from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout,AveragePooling2D

from keras.callbacks import ModelCheckpoint

Tiếp theo ta cần chia tập dữ liệu thành các tập train, test, validate. Bộ dữ liệu được cung cấp trong tensorflow đã chia sẵn nên chúng ta chỉ cần lấy các tập tương ứng đó. Trong chương trình này ta sẽ sử dụng dữ liệu trong tập dữ liệu Mnist.

80 (X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.astype(np.float32)/ 255 X_test = X_test.astype(np.float32)/ 255

Tiếp ta cần xây dựng lớp nhập cho mô hình. Một mẫu dữ liệu trong tập MNIST được biểu diễn dưới một vector 784 chiều ứng với một ảnh có kích thước 28×28. Như vậy lớp nhập sẽ cần có kích thước tương ứng với 784 chiều của bộ dữ liệu MNIST. Tuy nhiên, mô hình tích chập xử lý trên dữ liệu ảnh 2 chiều, vì vậy ta cần chuyển kích thước đầu vào thành một ảnh có kích thước 28×28 với 1 kênh màu (ảnh đen trắng).

#dinh dang lai hinh anh ve 28 28 1

X_train = X_train.reshape(X_train.shape[0],28,28,1) X_test = X_test.reshape(X_test.shape[0],28,28,1) Tạo ra một hot-vecto để tìm kiếm kết quả

y_train = keras.utils.np_utils.to_categorical(y_train) y_test = keras.utils.np_utils.to_categorical(y_test) print('x_train shape:', X_train.shape)

print(X_train.shape[0], 'train samples') print(X_test.shape[0], 'test samples')

Tiếp là lớp Convolution với hàm kích hoạt relu như đã đề cập ở trên bao gồm nhiều bộ filter dùng để rút trích đặc trưng dữ liệu. Các giá trị filter được khởi tạo ngẫu nhiên và sẽ được cập nhật trong quá trình học.

Hàm Conv2d trong tensorflow tính tích chập các giá trị filter với ảnh đầu vào được truyền vào tham số input. Sau mỗi lần tích chập, filter sẽ được dịch chuyển dựa trên giá trị của strides để đi qua vùng ảnh với và tiếp tục tính tích chập. Ở đây mô hình gồm 64 filter có kích thước 3×3 tích chập với ảnh đầu vào có kích thước 28x28x1. Kết quả trả ra

81 của lớp này có kích thước 28x28x64 là kết quả ảnh đã tích chập với 64 filter. Việc tính tích chập là một hàm tuyến tính. Kết quả tích chập sẽ được đưa vào hàm kích hoạt phi tuyến ReLU.

Sau khi qua lớp Convolution, dữ liệu sẽ đi qua lớp pooling. model = Sequential()

model.add(Conv2D(32, kernel_size=(3, 3), strides=1, padding='same',activation='relu', input_shape=(28,28,1))) model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3), strides=1, padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2)))

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

Cái ta muốn thấy ở các mạng là khả năng nhận diện accuracy, ta sẽ thể hiện chúng ra dùng hàm compile.

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

Train model với khoảng 100 lần

checkpointer = ModelCheckpoint(filepath='LeNet_model.h5', verbose=1,save_best_only=True)

hist=model.fit(X_train, y_train, batch_size=32, epochs=100, verbose=1, validation_data=(X_test, y_test),callbacks=[checkpointer])

82 Load model và thể hiện kết quả test accuracy

model_s=keras.models.load_model('CNN_model.h5') score = model_s.evaluate(X_test, y_test, verbose=0) print('\n', 'Test accuracy:', score[1])

83

Hình 3.9: Train model mạng CNN

Sau khi thực hiện Train model với 100 lần thì thấy được thời mỗi lần train khoảng 36s, tỷ lệ nhận dạng khi train là 99,56%

3.3.3.Mạng LeNet

Cách xây dựng chương trình cho mạng LeNet tương tự như của CNN chỉ khác là ta sẽ thay đổi cấu trúc mạng với các lớp khác nhau. Convolutional layer cơ bản là giống với CNN chỉ khác là sử dụng số lượng Convolutional layer khác đi. Pooling layer một lớp lấy mẫu con (Poopling) được thêm vào sau mỗi lớp tích chập.

Lưu ý rằng LeNet đã sử dụng tính năng AVG Pooling, tính giá trị trung bình của các đầu vào, thay vì lớp MAX Pooling sử dụng trong CNN. Fully connected layer LeNet sử dụng hàm tanh cho các lớp ẩn vì các chức năng đối xứng được cho là mang lại sự hội tụ nhanh hơn so với các chức năng của hàm softmax

model = Sequential()

# C1 Convolutional Layer

model.add(Conv2D(filters = 6, kernel_size = 5, strides = 1, activation = 'tanh', input_shape = (28,28,1), padding = 'same'))

84 model.add(AveragePooling2D(pool_size = 2, strides = 2, padding = 'valid'))

# C3 Convolutional Layer

model.add(Conv2D(filters = 16, kernel_size = 5, strides = 1,activation = 'tanh', padding = 'valid'))

# S4 Pooling Layer

model.add(AveragePooling2D(pool_size = 2, strides = 2, padding = 'valid'))

# C5 Convolutional Layer

model.add(Conv2D(filters = 120, kernel_size = 5, strides = 1,activation = 'tanh', padding = 'valid'))

model.add(Flatten())

# FC6 Fully Connected Layer

model.add(Dense(units = 84, activation = 'tanh'))

# FC7 Output layer with softmax activation

model.add(Dense(units = 10, activation = 'softmax')) model.summary()

85

Hình 3.10: Tóm tắt model mạng LeNet

86 Kết quả sau khi train: Thiết lập train với 100 lần thì cho thấy tỷ lệ nhận dạng khoảng 98,74%

3.3.4.Mạng AlexNet

Mạng Alexnet là một mạng được xây dựng dựa trên cơ sở mạng CNN bao bao gồm 8 lớp convolution, trong đó bao gồm: 5 convolutional layer, 2 fully connected layer và 1 fully connected layer output. Bên cạnh đó, thay vì sử dụng activation function (hàm kích hoạt) là ReLU, thì trong mạng AlexNet sử dụng hàm Sigmoid. Cách xây dựng chương trình cũng tương tự CNN chỉ thay đổi cấu trúc mạng

Cần thêm một vài thư viện

from keras.models import Sequential from keras.regularizers import l2

from keras.layers import Conv2D, AveragePooling2D, Flatten, Dense, Activation,MaxPool2D, BatchNormalization, Dropout

model = Sequential() Cấu trúc mạng AlexNet

# 1st layer (CONV + pool + batchnorm)

model.add(Conv2D(filters= 96, kernel_size= (11,11), strides=(4,4), padding='valid', input_shape=(227,227,3)))

model.add(Activation('relu'))

model.add(MaxPool2D(pool_size=(3,3),strides=(2,2))) model.add(BatchNormalization())

# 2nd layer (CONV + pool + batchnorm)

model.add(Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), padding='same', kernel_regularizer=l2(0.0005)))

87 model.add(MaxPool2D(pool_size=(3,3),strides=(2,2),padding='valid'))

model.add(BatchNormalization()) # layer 3 (CONV + batchnorm)

model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=l2(0.0005)))

model.add(Activation('relu')) model.add(BatchNormalization()) # layer 4 (CONV + batchnorm)

model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=l2(0.0005)))

model.add(Activation('relu')) model.add(BatchNormalization()) # layer 5 (CONV + batchnorm)

model.add(Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=l2(0.0005)))

model.add(Activation('relu')) model.add(BatchNormalization())

model.add(MaxPool2D(pool_size=(3,3),strides=(2,2),padding='valid')) model.add(Flatten())

# layer 6 (Dense layer + dropout)

model.add(Dense(units = 4096, activation = 'relu')) model.add(Dropout(0.5))

# layer 7 (Dense layers)

model.add(Dense(units = 4096, activation = 'relu')) model.add(Dropout(0.5)) # layer 8 (softmax output layer) model.add(Dense(units = 1000, activation = 'softmax'))

88 model.summary()

Hình 3.12: Tóm tắt model mạng AlexNet (1)

89

Hình 3.14:Train model mạng AlexNet

Kết quả: Do mạng Alex có thời gian train khá lâu với 285s một lần nên nhóm giới hạn lần train ít hơn so với CNN và Alex, tỷ lệ nhận dạng đạt 99,30%

3.3.5.Thuật toán sắp xếp ký tự

Phương pháp sắp xếp thứ tự nhận diện kí tự: Sau khi tìm được đường biên của kí tự trong với hàm cv2.findContour(), nhóm sử dụng hàm cv2.boundingRect(). Lúc này thu được ma trận Rects gồm 4 cột và n hàng (n số trên hình). Các giá trị này tạo nên một hình chữ nhật bao quanh kí tự với thứ tự (x, y, w, h).

90 Các cột này tương ứng với tọa đọ x_min, y_min của kí tự, chiều cao và chiều rộng của kí tự.

Hình 3.16: Ý nghĩa của các phần tử trên 1 hàng của ma trận Rects

Bài toán đặt ra lúc này nhóm cần sắp xếp thứ tự của mỗi hàng tương ứng với các kí tự theo chiều từ trên xuống dưới và từ trái qua phải của các kí tự trên hình. Để giải quyết bài toán trên nhóm sắp xếp thứ tự các kí tự theo chiều từ trên xuống dưới bằng cách sắp xếp y_min của mỗi kí tự với điều kiện 𝑦𝑖>𝑦𝑖+1và 𝑦𝑖-𝑦𝑖+1>ℎ𝑖 lúc này thứ tự của kí tự i và i+1 trong ma trân Rects sẽ được đổi lại vị trí cho nhau.

for i in range (0, lenth - 1): for j in range (i + 1, lenth):

if (rects[i][0] > rects[j][0]) and abs(rects[i][1]-rects[j][1]) <(rects[i][3]/10): # Hoán đổi vị trí

tmp = rects[i]

rects[i] = rects[j] rects[j] = tmp

Sau khi các kí tự đã được sắp xếp theo hàng, nhóm tiếp tục sắp xếp các kí tự trong hàng từ trái qua phải với điều kiện: 𝑥𝑖>𝑥𝑖+1 thì hàng I và i+1 của ma trận Rects sẽ dduocj hoán đổi với nhau.

91 for i in range (0, lenth - 1):

for j in range (i + 1, lenth):

if (rects[i][1] > rects[j][1]) and (rects[i][1]-rects[j][1])>rects[i][3]: # Hoán đổi vị trí

tmp = rects[i] rects[i] = rects[j] rects[j] = tmp

Sau khi thực hiện hai lần sắp xếp lại thứ tự của các hàng trong ma trân ta thu được kết quả.

92

3.4. Thiết kế giao diện bằng PyQt5

3.4.1.Thiết kế hệ thống qua phần mềm QT Designer

Hình 3.18: Giao diện phần mềm QT designer

Qt là một Framework đa nền tảng và là bộ công cụ hỗ trợ tạo giao diện người dùng và đồ hoạ cổ điển. Qt hỗ trợ thiết kế các ứng dụng trên đa nên tảng và nhiều ngôn ngữ khác nhau.

Ban đầu Qt được phát hành như một sản phẩm thương mại và được dùng để viết KDE. Nhưng sau đó Qt đã được bổ xung giấy phép LGPL cho phép các nhà lập trình có thể sử dụng tự do để phát triển các phần mềm nguồn mở hay kể cả các chương trình thương mại.

Bản quyền của Qt được chuyển qua hình thức thu phí hỗ trợ. Qt cho phép các nhà phát triển phần mềm sử dụng như một thư viện mã nguồn mở để viết các chương trình thương mại, nếu có sự sửa đổi trong bộ mã nguồn chính củavf Qt thì nhà phát triển chỉ

93 phải cung cấp mã nguồn đã sửa đồi chứ không yêu cầu phải cung cấp toàn bộ mã nguồn hay mua giấy phép thương mại như trước kia.

Ứng dụng Qt

Qt được sử dụng để phát triển ứng dụng trên hầu hết các hệ điều hành dành cho máy tính và các nền tảng di động hoặc nhúng. Chương trình GUI được tạo bằng Qt có phong cách thiết kế tự nhiên. Qt hỗ trợ đa dạng công cụ để lập trình như:

• Module Gui: Dùng để tạo ra các cửa sổ.

• Module OpenGL: Qt có thể tạo ra các của sổ chứa yếu tố 3D được quản lý bằng OpenGL.

• Module mạng: Cung cấp các công cụ để thao tác với hệ thống mạng có thể dùng để tạo các ứng dụng như trình trình duyệt, nhắn tin…

• Module scrip: Qt cho phép quản lý các ngôn ngữ kịch bản như Javascrip trong trường hợp bạn muốn sử dụng chúng để thêm vào các tính năng cho ứng dụng.

Qt cũng hỗ trợ các trình biên dịch khác nhau, bao gồm trình biên dịch GCC C++ và bộ Visual Studio và có hỗ trợ quốc tế hoá rộng rãi. Qt cũng cung cấp Qt Quick, bao gồm một ngôn ngữ kịch bản lệnh được gọi là QML cho phép sử dụng Javascript để tạo các kịch bản cho ứng dụng.

94

3.4.2.Giao diện hệ thống

Hình 3.19: Giao diện chính của mô hình

Khung hiển thị chính

Sử dụng đối tượng Qlabel thuộc thư viện PyQt. Video được capture từ camera, ảnh từ trong thư viện hoặc bảng vẽ trực tiếp trên PyQt hiện thị lên khung hiển thị chính. Sau khi mạch được xử lý, ảnh kết quả sẽ được hiện thị trên khung hiển thị.

95

Bảng nút điều khiển

Kế thừa lớp PushButtom của thư viện PyQt. Bao gồm các nút điều kiển hệ thống như chụp ảnh, chèn ảnh, mở bảng vẽ, mở camera, đọc ảnh và chuyển xám ảnh, và các chức năng khác

Hình 3.21: Bảng nút điều khiển chức năng

Khung hiển thị kết quả

Sử dụng đối tượng Qlabel thuộc thư viện PyQt. Hiển thị tham chiếu nhận diện.

Hình 3.22: Khung hiển thị kết quả chính

96

Các nút điều khiển cố định

Bao gồm các nút sử dụng chung cho các chúc năng

Hình 3.24: Các nút chức năng cố định

- Nút Đọc ảnh: khi kích hoạt vào nút bấm trên giao diện sẽ khởi động chức năng đọc các kí tự trên hỉnh ảnh đã được Insert vào hoặc hình ảnh đã đưuọ chụp từ Camera.

- Nút Lưu ảnh: khi kích hoạt nút bấm trên giao diện sẽ lưu lại hình ảnh đã chỉnh sửa theo các chức năng đã được cài đặt trên giao diện.

- Nút Clear: khi kích hoạt nút bấm giao diện sẽ làm mới 3 màn hình screen1, screen2, screen 3.

Hình 3.25: Nút hiển thị mạng nào đang hiện hữu

97

CHƯƠNG 4.KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 4.1. Kết quả đạt được

Với dự định ban đầu là sử dụng thuật toán kết nối bối cảnh hình dạng để nhận dạng chữ số viết tay. Trong quá trình thực nghiệm thì thuật toán hoạt động khá tốt với lại chữ viết tay nhưng đối với số viết tay thì lại không hiệu qủa vì thế chúng em đã sử dụng các mạng nhân tạo kết hợp với xử lý ảnh để nhận dạng chữ số viết tay

Các mạng nhân tạo hỗ trợ rất nhiều trong việc nhận dạng từ cấu trúc mạng đến các thưu viện. Với mục tiêu sử dụng nhiều mạng nhận tạo và so sánh độ hiệu quả của các mạng với nhau. Dưới đây là kết quả thu được:

4.1.1.Kết quả sau khi hiệu chỉnh camera

Xoay ảnh: xoay ảnh theo các góc khác nhau

Hình 4.1: Xoay ảnh một góc 90 độ

Làm mờ ảnh: Bằng ba phương pháp khác nhau Averaging, Gausian Blurring, Median

Blurring. Mục đích thử nghiệm trên nhiều phương pháp khác nhau là để so sánh các phương pháp với nhau và lựa chọn ra phương pháp tối ưu nhất.

98

Hình 4.1: Ảnh sau khi làm mờ bằng phương pháp Averaging

99

Hình 4.3: Ảnh sau khi được làm mờ bằng phương pháp Median

Nhận xét: Sau khi thực nghiệm cả ba phương pháp tại cùng một ngưỡng làm mờ giống nhau thì phương pháp Averaging cho ra kết quả làm ảnh mờ đi theo hướng kéo dãn ảnh, còn phương pháp Median Blurring và Gaussian Bluring cho ra kết quả ảnh vẫn còn rõ ràng.

4.1.2. Biến dổi hình thái

Các phương pháp biến đổi hình thái là một phần trong quá trình xử lý ảnh giúp cho ảnh trở nên rõ ràng và tổng quan hơn.Một số phương pháp biến đổi hình thái đã đạt được:

100

Hình 4.4: Biến đổi hình thái theo phương pháp Erosion

Hình 4.5: Phương pháp giãn nở ảnh chữ

Có thể thấy phương pháp này giúp nhóm thu gọn ảnh lại nhưng vẫn giữ được đặc trưng cơ bản của ảnh. Áp dụng cho các ảnh kích thước quá lớn.

101

Hình 4.6: Biến đổi hình thái theo phương pháp Dilation

Phương pháp này làm đầy đặn ảnh giúp cho ảnh chi tiết hơn mà vẫn giữ được đặc trưng cơ bản của ảnh, áp dụng cho các ảnh mờ hay ảnh có các chi tiết nhỏ.

102 Làm mất các chi tiết thừa đi chỉ giữ lại phần quan trọng.

Hình 4.8: Biến đổi hình thái theo phương pháp Closing

103 Làm đầy các phần trong của ảnh.

Hình 4.10: Biến đổi hình thái theo phương pháp Gradient

Một phần của tài liệu ĐỒ ÁN Nghiên cứu, thiết kế hệ thống nhận dạng chữ viết tay ứng dụng xử lý ảnh và trí tuệ nhân tạo (Trang 76)

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

(140 trang)