Mockup: Vẽ khung chữ viết tay
6.4.1 Vẽ khung chứa chữ viết tay
Giao diện sẽ gồm 3 phần, từ trái qua phải:
• Phần hiển thị PDF, bên dưới là phần zoom lên từ hình gốc để hiển thị rõ hơn.
• Phần lưu các nhãn đã nhập và tọa độ các khung.
Hình 6.4: Mockup: Vẽ khung chữ viết tay
6.4.2 Nhận diện chữ viết tay
• Phần hiển thị PDF, lấy một file PDF đầu tiên trong thư mục đã chọn để hiển thị lên.
• Phần lựa chọn thư mục chứa các file PDF, chọn file JSON, lựa chọn thư mục output và tiến hành nhận diện chữ viết tay.
Hình 6.5: Nhận diện chữ viết tay
7.1.1 Trong giai đoạn đề cương
• Tìm hiểu cơ bản về Machine Learning, các kĩ thuật Image Processing, CNNs, RNNs, các kĩ thuật Attention, Beam search,
• Tìm hiểu về mô hình dịch máy mã nguồn mở OpenNMT
• Huấn luyện được mô hình chữ tiếng Việt không dấu
7.1.2 Trong giai đoạn luận văn
• Huấn luyện được một mô hình có thể nhận diện chữ viết tay tiếng Việt có dấu
• Viết được một phần mềm demo hỗ trợ việc trích xuất và nhận diện chữ viết tay tiếng Việt từ các file pdf
7.2 Giới hạn và định hướng tương lai
Giới hạn của mô hình là về dữ liệu huấn luyện Do dữ liệu chữ viết tay tiếng Việt hiện có là không nhiều, em phải sử dụng đến một số phương pháp biến đổi ảnh và sinh thêm dữ liệu nhằm mục đích huấn luyện Do đó, mô hình có thể bị overfit trên một dạng chữ hoặc một kiểu chữ nhất định.
Trong tương lai, em có thể phát triển luận văn theo các mục tiêu sau:
• Thu thập nhiều dữ liệu chữ viết tay hơn, qua đó huấn luyện để cho mô hình có thể nhận diện nhiều kiểu chữ hơn.
• Phần mềm có khả năng tự nhận diện chữ viêt tay có trong một văn bản.
Giới thiệu đề tài
Các tiến bộ công nghệ đã thúc đẩy quá trình số hóa dữ liệu và lưu trữ đám mây, cho phép truy cập và tìm kiếm dữ liệu nhanh chóng Thẻ căn cước công dân có gắn chip là một ví dụ về nỗ lực của Việt Nam trong việc tăng tốc nhận dạng và truy cập dữ liệu Xung quanh thế giới, thông tin số hóa cũng là công cụ thúc đẩy sự phát triển và hiệu quả trong nhiều lĩnh vực khác nhau.
Tuy nhiên, trên phạm vi nước ta, văn bản viết tay vẫn được sử dụng nhiều Các loại văn bản viết tay có thể kể đến là: hóa đơn, biểu mẫu, đơn viết tay, Văn bản viết tay tại nước ta vẫn phổ biến do hạn chế về công nghệ ở một số vùng, đồng thời do nhiều người vẫn chưa có đủ kiến thức về công nghệ để sử dụng Các văn bản viết tay dạng biểu mẫu hiện tại sẽ có thể được trích xuất nội dung để số hóa và đưa lên lưu trữ đám mây Tuy nhiên, hiện không có cách nào để tự động hóa việc này, mà phải dùng sức người nhập lại từng thông tin lên máy tính.
Do đó, em xin đề xuât một hệ thống có thể nhận diện chữ viết tay tiếng Việt Đề tài sẽ chú trọng vào huấn luyện một mô hình học máy để nhận diện chữ viết tay tiếng Việt Đồng thời, xây dựng một luồng xử lý các văn bản viết tay theo mẫu để có thể tự động nhận diện và tiền xử lý văn bản viết tay có mẫu, sau đó nhận diện được các chữ viết tay tiếng Việt trên đó.
Mục tiêu và phạm vi đề tài
Mục tiêu của đề tài là có thể trích xuất chữ viết tay từ các văn bản tài liệu thực tế Cụ thể, đề tài sẽ tập trung vào các điểm sau:
• Huấn luyện một mô hình nhận diện chữ viết tay tiếng Việt, dựa trên các kỹ thuật học sâu.
• Xây dựng luồng để xử lý các văn bản chứa chữ viết tay trên thực tế.
Dựa trên mục đích chính của đề tài, phạm vi giới hạn của đề tài sẽ được khoanh vùng như sau:
• Các chữ viết tay trên rõ ràng, không quá xấu hoặc quá nhiễu.
• Các văn bản đưa vào hoặc là một form văn bản cố định, hoặc là ảnh scan của một câu tiếngViệt được viết thành hàng ngang.
• Về form văn bản cố định, sẽ có luồng tiền xử lý văn bản trước khi đưa qua mô hình nhận diện chữ tiếng Việt.
Đóng góp của đề tài
Về lý thuyết
Về mặt lý thuyết, luận văn đã tìm hiểu về:
• Tìm hiểu về các lý thuyết về machine learning dùng cho việc xử lý ảnh và xử lý ngôn ngữ tự nhiên.
• Tìm hiểu về các mô hình nhận diện chữ viết tay hiện tại Một số mô hình có thể kể đến là VGG16 và Transformer.
• Tìm hiểu về các mô hình dịch máy như OpenNMT.
• Tìm hiểu về một số mô hình ngôn ngữ tiếng Việt.
Qua đó, luận văn đề xuất được một số phương pháp nhận diện chữ viết tay tiếng Việt phù hợp:
• Sử dụng mô hình dịch máy để dịch ra các chữ cái không dấu, sau đó sẽ sử dụng mô hình sửa lỗi chính tả để thêm dấu cho câu.
• Sử dụng mô hình dịch máy để dịch ra các chữ cái có dấu.
Về thực tế
Về thực tế, luận văn đã đạt được những điều sau:
• Huấn luyện được một mô hình nhận diện chữ viết tay tiếng Việt có dấu.
• Mô hình được huấn luyện có thể nhận diện chữ viết tay với thời gian cho phép (10s/ảnh).
• Mô hình được huấn luyện có độ chính xác tốt trên những chữ không quá xấu Độ chính xác đạt được khi test đạt 90%.
Song song với mô hình, luận văn cũng viết được một phần mềm demo với khả năng:
• Cho phép người dùng đánh dấu các khung có chứa chữ viết tay tiếng Việt.
• Có khả năng tách nhiều văn bản pdf để lấy các phần đã đánh dấu chứa chữ viết tay tiếng Việt.
• Nhận diện được chữ viết tay tiếng Việt trên một hoặc nhiều văn bản pdf.
Tổng quan về mạng neuron
Mạng neuron
Mạng neuron nhân tạo được lấy cảm hứng và xây dựng nên từ mạng neuron sinh học, vì vậy một mạng neuron nhân tạo cũng bao gồm nhiều neuron đơn lẻ, được gọi là perceptron Tuy nhiên, để có thể nắm được cách thức hoạt động của một perceptron, trước hết chúng ta cần phải hiểu được một neuron hoạt động như thế nào.
Cấu tạo của một neuron được minh họa bằng hình 2.1 Một neuron sẽ nhận các tín hiệu điện (mức độ mạnh yếu khác nhau) có chứa thông tin từ các khớp thần kinh (synapse) của một hay nhiều neuron khác thông qua cácđuôi gai(dendrit) Các giá trị tín hiệu đầu vào sẽ được tích tụ tại trong thân neuron (cell body) Tại đây, neuron sẽ tiến hành thực hiện một quá trình tính toán bao gồm hai bước.
• Bước 1, neuron sẽ thực hiệnphép cộng (summation) để lấy tổng giá trị các tín hiệu điện.
• Bước 2, neuron sẽ so sánh tổng tìm được ở Bước 1 với mộtngưỡng cụ thể (threshold).
Khi vượt ngưỡng, nơ-ron sẽ phát ra tín hiệu điện truyền qua trục sợi (axon) tới các khớp thần kinh Lúc này, quá trình nơ-ron được kích hoạt (activation) được diễn ra.
Hình 2.1: Hình ảnh minh họa cấu tạo của một neuron sinh học.
Perceptron
Một neuron nhân tạo (perceptron) được cấu tạo bao gồm các thành phần như hình 2.2:
Hình 2.2: Hình ảnh minh họa cấu tạo của một perceptron.
• Các giá trịx 1 , x 2 , , x n là các tín hiệu đầu vào;
• Các giá trịw1, w2, , wnlà các trọng số của các nhánh tương ứng truyền giá trịx1, x2, , xn. Giá trịw0 được gọi là giá trị bias, có thể nhận một giá trị bất kỳ khác 0 Bộ trọng số này là cách để perceptron mô tả độ mạnh yếu của tín hiệu điện trong neuron sinh học;
• Giá trịađược tính làw0cộng với tổng trọng số của tập tín hiệu đầu vào (tương ứng với bước summation) Giá trị a này sẽ được dùng để tính toán hàm kích hoạtft(a);
• Kết quả của hàmft(a)sẽ được so sánh vớimột ngưỡng (threshsold)nhằm xác định perceptron có được kích hoạt hay không Thông thường, giá trị ngưỡng này sẽ được chọn là 0 để tiện trong việc tính toán Ngoài ra, người ta thường dùng cặp số (1,0) và (1,-1) để đại diện cho trạng thái kích hoạt/không kích hoạt của perceptron;
Một điểm lưu ý là perceptron hoạt động dựa trên các phép tính toán số học Vì vậy, các tín hiệu đầu vào cũng như các trọng số đều cần được biểu diễn dưới dạng các chữ số.
Mạng neuron đa tầng
Có thể thấy rằng, một perceptron đã có thể được coi là một mạng neuron, tính toán kết quả dựa trên tín hiệu đầu vào và kết đầu đầu ra là perceptron đó có được kích hoạt hay không Trong thực tế, với chỉ một perceptron thì đã có thể giải quyết được bài toán phân loại tuyến tính Tuy nhiên, đối với các bài toán phức tạp hơn hoặc yêu cầu phân loại phi tuyến (ví dụ như dùng mạng neuron để mô phỏng phép XOR) thì một perceptron không thể đáp ứng được. Để giải quyết vấn đề trên, chúng ta sử dụng nhiều perceptron được sắp xếp thành các tầng khác nhau Các perceptron ở tầng sau đều nối tới tầng trước (fully-connected) Một mạng neuron như vậy được gọi là mạng neuron đa tầng [Tiệ17].
Một mạng neuron đa tầng điển hình thường bao gồm:
1 Tầng dữ kiện (input layer): Là tầng đầu tiên của mạng,thể hiện các dữ kiện đầu vào;
2 Tầng kết quả (output layer): Là tầng nằm ở vị trí cuối cùng, thể hiện kết quả đầu ra của mạng;
3 Tầng ẩn (hidden layer): Là tầng nằm ở giữa, chịu trách nhiệm trong việc tính toán;
Lưu ý rằng, một mạng neuron đa tầng chỉ có một tầng dữ kiện và một tầng kết quả Tuy nhiên có thể có một hoặc nhiều tầng ẩn nằm ở giữa, ví dụ như một mạng neuron với hai tầng dưới đây (hình 2.3):
Hình 2.3: Hình ảnh mạng neuron đa tầng với 2 tầng ẩn.
Mạng neuron tích chập
Tổng quan
Mạng neuron tích chập (Convolutional Neural Network) là một mạng neuron thường xuyên được sử dụng để nhận dạng và phân loại ảnh Về cơ bản, mạng neuron này cũng giống các mạng neural network khác, nhưng có một vài cải tiến là Convolutional và Pooling
Convolutional Layer - Tầng tích chập
Tầng tích chập là cốt lõi của mạng neuron tích chập Tầng này giống với những mạng khác là hidden layer, nhưng khác ở chỗ tầng tích chập là một tập các feature map (ma trận đặc tính) - là một bản scan của input nhưng đã được trích xuất ra các đặc tính cụ thể Để có thể trích xuất được các đặc tính đấy, tầng tích chập sử dụng kernel (nhân) để quét ma trận input, từ trái qua phải và từ trên xuống dưới Tại mỗi ô quét được, mạng sẽ nhân tương ứng từng giá trị của input và từng giá trị của kernel và lấy tổng, đưa qua activation function như ReLU, sigmoid, Kết quả sẽ là một số cụ thể, và tập hợp các số này trên các lần quét sẽ được một feature map Hình 2.4 minh họa một bước để trích xuất feature map.
Hình 2.4: Cách thức lấy feature map bằng kernel
Stride và Padding
Hai phương pháp stride và padding này thường được sử dụng để giảm hoặc thay đổi kích cỡ của feature map sau bước convolution.
Stride là khoảng cách giữa hai kernel khi quét Đối với stride = 1, kernel sẽ quét 2 ô cạnh nhau trên input Nhưng với stride = 2, kernel sẽ quét ô số 1 và 3, bỏ qua ô số 2, và tương tự nếu stride
= 3, kernel sẽ quét ô số 1 và 4, bỏ qua ô 2 và 3.
Padding, hay zero-padding, là việc bọc thêm một ô 0 xung quanh input, sau đó mới áp dụng quét. Padding = 1 thì sẽ thêm 1 ô 0, padding = 2 sẽ thêm 2 ô và tương tự.
Hình 2.5: Ví dụ lấy feature map với padding = 1
Pooling
Pooling hoạt động gần giống với convolutional, sử dụng một cửa sổ trượt để quét qua feature map, chọn ra một giá trị nằm trong cửa sổ trượt Một số cách pooling thường thấy là max pooling (hình 2.6) hoặc average pooling (hình 2.7) Mục đích của pooling là để giảm tham số (hyperparameter), qua đó giảm thời gian tính toán, tránh bị overfitting.
Hình 2.6: Max pooling với filter = 2x2 và stride = 2
Hình 2.7: Average pooling với filter = 2x2 và stride = 2
Mạng neuron hồi quy
Tổng quan
Mạng neuron hồi quy (Recurrent Neural Network) [Ami] là một nhánh mạng neuron Đối với các mạng neuron thông thường, đầu vào và đầu ra của chúng là hoàn toàn độc lập với nhau Cấu trúc này sẽ không phù hợp với một số bài toán, đặc biệt là khi xử lý dữ liệu dạng chuỗi.
Mạng neuron hồi quy là một mạng neuron chứa một vòng lặp, cho phép đầu ra của neuron trước trở thành đầu vào của neuron sau Có thể coi một mạng neural hồi quy là một chuỗi những mạng con giống hệt nhau, mỗi mạng sẽ truyền thông tin nó vừa xử lý cho mạng phía sau nó Đầu vào là một chuỗi có liên hệ về thông tin với nhau và thông tin của chúng sẽ được giữ lại để xử lý sự kiện tiếp theo trong mạng neural hồi quy Vì tính chất này, mạng neural hồi quy phù hợp cho những bài toán với dữ liệu đầu vào dưới dạng chuỗi với các sự kiện trong chuỗi có mối liên hệ với nhau.
Hình 2.8: Cấu trúc của mạng neuron hồi quy
Các kiểu hoạt động của mạng neuron hồi quy
Mạng neuron hồi quy có các kiểu hoạt động riêng biệt, phù hợp với các bài toán khác nhau Hình2.9 thể hiện các kiểu hoạt động chính Đầu vào có màu đỏ, đầu ra là màu xanh biển và thông tin trao đổi trong các mạng con có màu xanh lá:
Từ trái sang phải [Fen]:
• one-to-one: Đầu vào và đầu ra có kích thước cố định Phù hợp với bài toán nhận diện ảnh (Image Classification)
• one-to-many: Đầu vào cố định và đầu ra là một chuỗi các vector Sử dụng cho bài toán tạo tiêu đề cho ảnh (Image Captioning)
• many-to-one: Đầu vào là chuỗi vector và đầu ra cố định Bài toán được ứng dụng nhiều là phân loại ngữ nghĩa (Sentiment Classification)
• many-to-many: Đầu vào và đầu ra đều dạng chuỗi Bài toán dịch máy (Neural Translation)
• many-to-many: Đầu vào và đầu ra đều dạng chuỗi, và có độ dài bằng nhau Bài toán phân loại và gắn nhãn video (Video Classification)
Mạng bộ nhớ dài-ngắn - LSTM
Kiến trúc RNN có một nhược điểm: Nếu kích thước chuỗi vector đầu vào x là rất lớn thì việc tính toán vector trạng thái ẩn h sẽ phải đi qua nhiều lớp tính toán Trong quá trình backpropagate để cập nhật các tham số weights, vì việc đạo hàm phải đi qua nhiều lớp tính toán của vector h nên các giá trị cập nhật(gradient) cũng sẽ lớn dần lên, việc cập nhật các weights không theo ý muốn và khiến mạng không ổn định Nói cách khác, RNN sẽ chỉ học được các thông tin ở gần và bỏ qua các thông tin ở xa Vì vậy, các biến thể nâng cấp của mạng neuron hồi quy đã ra đời để khắc phục vấn đề này Một trong số đó là LSTM - Long Short Term Memory [Ola15].
LSTM được thiết kế để tránh được vấn đề phụ thuộc xa (long-term dependency) Việc nhớ thông tin trong suốt thời gian dài là đặc tính mặc định của chúng, chứ ta không cần phải huấn luyện nó để có thể nhớ được Tức là ngay nội tại của nó đã có thể ghi nhớ được mà không cần bất kì can thiệp nào.
LSTM cũng mang đặc tính của RNN, là dạng module lặp đi lặp lại Tuy nhiên, đối với RNN thì các module này rất đơn giản, thường là một tầng tanh (hình 2.10) Trong khi đó, các module của LSTM là 4 tầng ẳn và tương tác với nhau rất đặc biệt (hình 2.11).
Hình 2.10: Bên trong một module RNN
Hình 2.11: Bên trong một module LSTM Ý tưởng cốt lõi của LSTM là trạng thái tế bào (cell state) Nó chạy xuyên suốt các module và chỉ tương tác tuyến tính đôi chút, vì vậy các thông tin được truyền đi thông suốt và không sợ bị thay đổi LSTM còn có khả năng thêm vào hoặc quên đi các thông tin ở trạng thái tế bào, được điều chỉnh bởi các cổng (gate) Mỗi LSTM có 3 cổng như vậy để điều chỉnh trạng thái tế bào, gồm:
• Bước 1: quyết định thông tin cần bỏ từ trạng thái tế bào
Hình 2.12: Cổng quyết định thông tin cần bỏ
• Bước 2: quyết định thông tin mới đi vào trạng thái tế bào
Hình 2.13: Cổng quyết định thông tin được thêm
• Bước 3: quyết định đầu ra
Hình 2.14: Cổng quyết định đầu ra
Sequence to Sequence
Mô hình Sequence to Sequence (seq2seq) [SVL14], hay còn được gọi là mô hình Encoder-Decoder, là một trong những ứng dụng của RNN được trình bày ở trên Trong mô hình này, cả input và output đều là những sequences (dữ liệu dạng chuỗi, ví dụ như đoạn văn bản, đoạn âm thanh), do đó rất phù hợp với các bài toán như Machine Translation, Auto Speech Recognition, Optical Character Recognition, Các bài toán này đều xử lí trên dữ liệu dạng chuỗi, do đó không thể dùng các kiến trúc Deep Neural Networks (DNN) thông thường như MLP.
Mô hình Sequence to Sequece (được viết gọn thành seq-to-seq hoặc seq2seq), bao gồm 2 thành phần chính là Encoder và Decoder Encoder có nhiệm vụ biến đổi input thành các biểu diễn trung gian (thường gọi là các context vector) Decoder có nhiệm vụ biến đổi các context vector thành các ouput của bài toán Thông thường cả Encoder và Decoder đều là các lớp RNN (hoặc LSTM) chồng lên nhau.
Hình 2.15: Kiến trúc mô hình Sequence-to-sequence
Mục đích của mô hình này là tính xấp xỉ xác suất: p(y 1 , , y m |x 1 , , x n ) với(x1, , xn)là chuỗi input và (y1, , ym)là chuỗi output của bài toán Có thể thấy độ dài của input và output có thể khác nhau, tức làm6=n Để tính được xác suất này, đầu tiên, mô hình sẽ dùng Encoder để tính ra vectorvcủa chuỗi input,vcó số chiều cố định và có thể xem như là vector biểu diễn của toàn bộ chuỗi input và cũng chính là hidden state cuối cùng của Encoder Sau đó mô hình sẽ dùngvđể khởi tạo giá trị hidden state ở Decoder và lần lượt tính xác suất của y 1 , , y m : p(y1, , ym|x1, , xn) m
Attention
Trong mô hình seq2seq dùng cho các bài toán dịch máy (NMT - Neural Machine Translation), bộ encoder sẽ nhận đầu vào là một câu ở ngôn ngữ gốc, và đầu ra của encoder gọi là một context vector Decoder sẽ dùng vector đó, cùng với các hidden state và các từ trước đó để predict từ tiếp theo qua mỗi timestep Việc encode cả một câu dài vào một vector không thực sự tốt, kể cả khi đã sử dụng LSTM để khắc phục các hiện tượng như Vanishing Gradient.
Attention is a mechanism that enables models to focus on important aspects of the input (words in the source and target sentences) Instead of using only the context vector, it considers all outputs of individual cells at each timestep and combines them with the hidden state of each cell to generate an attention vector This attention vector is then used as input to the decoder.
Hình 2.16 là minh họa của một attention model cho việc dịch máy:
Beam search
Trong một mô hình seq2seq, tại bước decode, vector đầu ra của RNN/LSTM sẽ được đưa qua một hàm Softmax để tìm kiếm token có xác suất lớn nhất Token này sau đó sẽ được sử dụng làm input cho token tiếp theo Tuy nhiên, xác suất này không phải luôn luôn đúng.
Thuật toán Beam search [MVC21] được đưa ra để giải quyết vấn đề này Beam search có một tham số là beam width, tại mỗi bước dự đoán, ta sẽ chọn ra beam width số kết quả có xác suất cao nhất. Sau đó, lần lượt đưa các từ vào timestep tiếp theo và tiếp tục chọn ra các từ tiếp theo Có thể thêm threshold vào để loại đi các lựa chọn có xác suất thấp để dừng việc xét nhánh từ đó.
Tiếp tục tính toán các bộ xác suất như vậy cho tới EOS, lúc này sẽ có một cây xác suất như hình 2.17:
Hình 2.17: Kết quả khi sử dụng beam search trong seq2seqViệc sử dụng beam search có khả năng tăng độ chính xác, tuy nhiên việc lưu xác suất của một chuỗi dài có thể làm tăng thời gian traning và tốn tài nguyên.
Các công trình liên quan
Sinh chữ viết tay bằng RNN
Bài báo của Alex Graves [Gra13] vận dụng cấu trúc RNN và LSTM để tạo ra các chữ viết tay Mô hình RNN được dùng để tiên đoán nét chữ có cấu trúc như hình 3.1 giúp phát triển cấu trúc nét chữ.
Hình 3.1: Mô hình dự đoán trong bài báo của Alex Graves
Bài báo sử dụng tập dữ liệu IAM-OnDB, một tập dữ liệu chữ viết tay tiếng Anh được ghi lại theo thứ tự từng nét chữ được viết ra theo trình tự thời gian Bài báo đi theo hai bước để sinh được một chữ viết tay hoàn chỉnh:
• Dự đoán nét chữ dựa vào các nét chữ trước đó
• Tổng hợp các kí tự
Bước đầu tiên, là sử dụng mô hình dự đoán và tiên đoán vị trí đặt bút kế tiếp, khi đã biết các nét chữ trước đó Đầu tiên, cho các nét chữ đi qua mô hình dự đoán nét chữ Sau đó, đưa kết quả qua một tầng phân phối độ dày, sẽ thu được các vị trí có khả năng là vị trí kế tiếp của nét chữ nhất. Kết quả được thể hiện như hình 3.2
Hình 3.2: Kết quả của mô hình dự đoán nét chữ, sau khi đưa qua tầng phân phối độ dày
Bước thứ hai đó là tổng hợp kí tự Ở bước đầu tiên, mô hình chỉ tập trung vào việc tìm nét kế tiếp, và không có đảm bảo rằng nó sẽ sinh ra đúng các kí tự cần thiết Việc này sẽ được bảo đảm tại bước hai, tại đây, mô hình sẽ ràng buộc các kí tự được viết ra, để có kết quả là một đoạn chữ viết tay hoàn chỉnh.
Mô hình CRNN
Giới thiệu
Mô hình CRNN được đề xuất bới tác giả Quoc Pham [Pha] để nhận diện chữ tiếng Việt trên tập dữ liệu là địa chỉ tiếng Việt của Cinnamon Mô hình đã đạt giải nhất trong phase 1 của cuộc thi nhận diện chữ viết tay cũng do Cinnamon tổ chức.
Mô hình
Cấu trúc của mô hình được thể hiện ở hình 3.3.
Hình 3.3: Mô hình CRNN của Quoc Pham
Tác giả sử dụng một mô hình CNN phổ biến là VGG16 để lấy features, với 4 tầng pooling kích thước 2x2, đồng thời bỏ hết tầng fully connected cuối cùng Do đó output ở đây là một tập các feature map, mỗi pixel tương ứng vùng 16x16 trên input.
Tác giả stack thêm một lớp attention ở giữa VGG và LSTM để có kết quả nhận dạng tốt hơn Kết quả là các vector context và sẽ được đưa vào LSTM Tại LSTM, mỗi timestep sẽ dự đoán từ tại thời điểm đó.
Hàm tính lỗi được sử dụng ở đây là Connectionist Temporal Classification Lost Lý do là vì chỉ có nhãn của cả một địa chỉ chứ không có nhãn tại một thời điểm nhất định.
Cụ thể, CTC loss sẽ được tính bằng tổng tất cả các alignment, với alignment ở đây được phát sinh bằng cách thêm blank token và lặp lại kí tự trong ground truth.
Hình 3.5: Connectionist Temporal Classification loss
3.3 Tự động thêm dấu tiếng Việt
Giới thiệu
Đây là mô hình tự động thêm dấu tiếng Việt vào câu [AIv] Mô hình này đã tham gia vào cuộc thi của AIviVN về tự động thêm dấu tiếng Việt và đạt giải nhất.
Mô hình
3.3.2.1 Character-level BiLSTM seq2seq
Mô hình character-level seq2seq có decoder 2 chiều (hình 3.6):
• Embedding layer and encoder: BiLSTM 2 lớp, hidden size là 300.
• Decoder: trái qua phải, phải qua trái, gộp bằng concat LSTM output states.
• Teacher forcing: dùng cho các kí tự không phải a, e, i, o, u, y, d.
• Masked softmax: Mask một số giá trị của lớp linear cuối cùng.
Hình 3.6: Character-level seq2seq
Một n-gram language model truyền thống được sử dụng để rank candidate trong beam search (hình 3.7):
• Sử dụng thư viện language model là kenlm.
• Để tránh lặp vô hạn, sử dụng exhaustive search sau một số lượng bước nhất định.
Image-to-markup Generation
Giới thiệu
Mô hình Image-to-markup [Den+17] được xây dựng với mục tiêu là để chuyển các công thức toán học về dạng LaTEX Mô hình được xây dựng trên nền mô hình dịch máy OpenNMT OpenNMT là công trình mã nguồn mở dùng cho việc dịch máy và các mô hình học máy dạng chuỗi OpenNMT được bắt đầu phát triển vào năm 2016 bởi nhóm Harvard NLP và công ty SYSTRAN., hiện đang được duy trì bởi SYSTRAN và Ubiqus.
Mô hình
Để chiết xuất đặc điểm hiệu quả, mô hình sử dụng lưới CNN để phân tích đầu vào từ trái sang phải Bằng cách trích xuất đặc điểm với CNN và sắp xếp chúng thành lưới, mỗi hàng của lưới sẽ được mã hóa bằng bộ mã hóa RNN Quá trình này làm cho các đặc điểm được chuẩn hóa dễ dàng được giải mã bằng một mạng RNN chú ý.
Hình 3.8: Mô hình Image-to-markup generation
Chuẩn bị tập dữ liệu
Tập dữ liệu địa chỉ
Tập dữ liệu đầu tiên được sử dụng để huấn luyện là tập chữ viết tay các địa chỉ tiếng Việt của Cinnamon [Cin] Tập dữ liệu này gồm khoảng 2000 ảnh, với mỗi ảnh là là một địa chỉ được viết tay trên một dòng duy nhất.
Hình 4.1 là một ví dụ của tập địa chỉ này:
Hình 4.1: Hình minh họa dữ liệu địa chỉ gốc
Cấu trúc của tập nhãn là câu tiếng Việt tương ứng với mỗi ảnh, được chứa trong một file json Tập ảnh chữ viết tay địa chỉ sau đó sẽ được đưa qua tiền xử lý để có thể đưa vào huấn luyện mô hình.
Sử dụng thư viện openCV của Python, em đã chuyển ảnh về dạng nền trắng chữ đen Việc này được thực hiện bằng cách đọc ảnh dưới dạng ma trận, chuyển về từ ảnh màu về dạng grayscale, và sau đó áp dụng ngưỡng để đưa về nền trắng chữ đen hoàn toàn.
Hình 4.2 là ảnh chữ viết tay sau khi đã qua tiền xử lý:
Hình 4.2: Hình minh họa dữ liệu địa chỉ sau khi đưa qua bước tiền xử lý
Tập dữ liệu sinh thêm bằng phương pháp biến đổi ảnh
Tổng cộng tập dữ liệu địa chỉ trên được khoảng 2000 ảnh, con số này thực tế là không đủ để huấn luyện một mô hình Vì thế, em sẽ dùng một số phương pháp chỉnh sửa ảnh để tăng số lượng dữ liệu lên dựa trên bộ dữ liệu địa chỉ sẵn có.
Phương pháp thứ nhất, đó là sử dụng elastic transform [Kag] Phương pháp này chia bức ảnh ra làm nhiều phần nhỏ, và sau đó biến đổi trên từng phần để tạo ra kết quả là bức ảnh bị méo đi (hình 4.3).
Hình 4.3: Ví dụ sử dụng elastic transform để làm méo bức ảnh
Phương pháp thứ hai là random erase, tức là ngẫu nhiên xóa đi một vài phần của bức ảnh Số lượng và kích thước vùng bị xóa phải phù hợp để không làm mất đi các nét chữ quan trọng trên ảnh.Hình 4.4 là ví dụ kết quả cuối cùng sau khi áp dụng hai phương pháp biến đổi ảnh:
Do thuật toán biến đổi và xóa dựa trên biến ngẫu nhiên nên việc chạy nhiều lần giúp mang lại nhiều kết quả khác nhau, cung cấp nhiều dữ liệu hơn để huấn luyện mô hình.
Tập dữ liệu sinh thêm bằng RNN
Mô hình sinh thêm bằng RNN này được huấn luyện trên tập dữ liệu chữ viết tay tiếng Việt từ một cuộc thi nhận diện chữ viết tay tiếng Việt là ICFHR2018 [ICF] Tập dữ liệu này là gồm 1146 đoạn văn bản tiếng Việt, với 7296 dòng, hơn 480000 nét chữ, 380000 kí tự được viết bởi 200 người Việt Nam Sử dụng các bước giống như bài báo của Alex Graves, mô hình này được huấn luyện trên tập dữ liệu tiếng Việt để sinh ra các chữ tiếng Việt hoàn chỉnh Hình 4.5 là kết quả của mô hình này:
Hình 4.5: Kết quả của mô hình sinh chữ viết tay RNN
Mô hình sử dụng
OpenNMT
OpenNMT là một công cụ mã nguồn mở được sử dụng rộng rãi trong lĩnh vực dịch máy và mô hình học máy dạng chuỗi Được khởi xướng bởi Nhóm Ngôn ngữ tự nhiên Harvard và SYSTRAN năm 2016, OpenNMT hiện đang được duy trì bởi SYSTRAN và Ubiqus.
OpenNMT cho phép tùy chỉnh mô hình và điều chỉnh tham số đào tạo dễ dàng, tạo điều kiện thuận lợi cho việc tích hợp các mô hình đã đào tạo vào các ứng dụng thực tế.
Trong luận văn này, em sẽ sử dụng mô hình image-to-text ở bản legacy, do phiên bản mới hơn đã loại bỏ image-to-text Mô hình này được xây dựng với mục đích đầu tiên là sinh ra code LaTEX cho các công thức toán học từ hình ảnh ([Den+17]).
Chi tiết mô hình
Mô hình nhận diện chữ viết tay được sử dụng có cấu trúc như hình 4.6.
Tằng ImageEncoder sẽ là các tầng convolutional xen kẽ với max pooling, tuy nhiên sẽ không đưa qua tầng fully-connected cuối cùng như trong các mạng CNN khác để giữ được tính vị trí của các feature Thay vào đó, các feature maps sẽ được đưa qua một mạng LSTM encoder để lưu giữ được tính vị trí của các feature trong bộ encoder-decoder Tầng này gọi là row encoder, vì nó sẽ chạy qua từng row trên feature map Sau đó, bộ decoder sẽ sinh ra các token (chữ cái) dựa trên chính kết quả thu được từ row encoder Bộ decoder này được huấn luyện như một mô hình ngôn ngữ,cho ra xác suất của token hiện tại dựa trên các token trước đó Để decoder có độ chính xác cao,decoder cần biết vị trí của feature trên input đầu vào, do đó, thêm một tầng Attention để giữ vị trí của token đang generate trên ảnh Tầng generator cuối cùng sẽ tập hợp các token có xác suất cao nhất làm kết quả, sử dụng Beam search để tăng độ chính xác cho đầu ra.
Hình 4.6: Mô hình nhận diện chữ viết tay
Hướng tiếp cận
Phương pháp 1
Phương pháp nhận dạng chữ viết tay thành văn bản tiếng Việt bao gồm hai bước chính Đầu tiên, hệ thống sẽ nhận dạng chữ viết tay thành văn bản không dấu Sau đó, một mô hình sửa lỗi chính tả và thêm dấu câu tự động sẽ được sử dụng để tạo ra văn bản tiếng Việt đầy đủ và chính xác.
Mục đích chính của việc sử dụng nhãn không dấu là để giảm tải cho mô hình nhận diện, giúp huấn luyện được mô hình nhanh hơn.
Thông số huấn luyện của phương pháp:
Phương pháp 2
Hướng tiếp cận này sẽ trực tiếp huấn luyện ra mô hình nhận diện chữ viết tay có dấu Hướng tiếp cận này sẽ giảm tải được mô hình tự động thêm dấu tiếng Việt.
Sau khi thực nghiệm, mô hình này tuy có thời gian huấn luyện lâu, nhưng độ chính xác ra khá tốt, do đó sẽ không cần thiết sử dụng phương pháp 1 nữa.
Thông số huấn luyện của phương pháp:
Môi trường huấn luyện
Mô hình sẽ được huấn luyện trên Google Colab, với các thông số phần cứng như sau:
• CPU: Intel(R) Xeon(R) CPU @ 2.00GHz
Dữ liệu
Dữ liệu hình ảnh dùng để huấn luyện và thử nghiệm là tập dữ liệu chung gồm 1823 ảnh gốc từ Cinnamon, 9115 ảnh biến đổi và 1823 ảnh RNN, tổng cộng 12761 ảnh Tập dữ liệu sau đó được chia ngẫu nhiên thành tập huấn luyện và tập thử nghiệm.
Nhãn huấn luyện
Nhãn của mỗi ảnh được tiền xử lý từ chuỗi địa chỉ gốc của mỗi ảnh Do việc huấn luyện sẽ theo từng token, vì vậy cần tách chuỗi ra các token nhỏ, mà ở đây sẽ là mỗi chữ cái Đầu tiên, thay thế mỗi khoảng trắng trong chuỗi bằng một dấu "_", sau đó tách mỗi kí tự ra bằng một khoảng trắng
" " Đối với phương pháp huấn luyện ra chữ tiếng Việt không dấu, thay đổi tất cả các kí tự có dấu về dạng không dấu (vd: ă -> a, đ -> d, ).
Hình 4.7: Nhãn được sử dụng trong huấn luyện
Chương 5 Đánh giá mô hình
Đánh giá
Tập dữ liệu
Dữ liệu được sử dụng để đánh giá gồm 672 ảnh không có trong dữ liệu dùng để huấn luyện.
Mô hình được sử dụng để đánh giá là mô hình đã được huấn luyện 300k steps.
Cách thức đo lường
Để kiểm tra kết quả, em sẽ sử dụng edit distance để đánh giá Edit distance là phương pháp định lượng hai chuỗi khác nhau như thế nào bằng cách đếm số lượng hoạt động tối thiểu cần thiết để chuyển chuỗi này thành chuỗi khác (hình 5.1) Điểm edit distance càng cao, mô hình cho kết quả càng chính xác.
Hình 5.1: Ví dụ về edit distance
Môi trường đánh giá
Phần cứng được sử dụng khi đánh giá như sau:
• CPU: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz (12 CPUs), 2.6GHz
Do khi đánh giá sử dụng máy tính cá nhân, không có cài đặt GPU, tốc độ sẽ bị chậm đi nhiều so với sử dụng trên máy có GPU.
Kết quả
Minh họa kết quả
Minh hoa một số kết quả:
Hình 5.2: Minh họa kết quả
Chi tiết số liệu
Thông số huấn luyện như bảng 5.1:
Phương pháp Số step huấn luyện Thời gian Accuracy
Bảng 5.1: Thông số huấn luyện
Thời gian chạy của mỗi model trên tập test gồm 672 ảnh như bảng 5.2:
Phương pháp Thời gian chạy Thời gian mỗi batch (30 ảnh) Thời gian mỗi ảnh
Không dấu 46 phút 2 phút 4 giây
Có dấu 53 phút 2.3 phút 4.6 giây
Phân bố điểm edit distance của tập test:
Hình 5.3: Kết quả tổng hợp
Nhận xét
Với mỗi phương pháp huấn luyện:
• Về phương pháp huấn luyện với nhãn tiếng Việt không dấu, mô hình hội tụ được từ sớm (46k steps), không tốn nhiều thời gian để huấn luyện Tuy nhiên kết quả sinh ra dễ bị overfit, và ngoài ra cần thêm một mô hình sửa lỗi chính tả để có thể có được một câu tiếng Việt hoàn chỉnh.
• Về phương pháp huấn luyện với nhãn tiếng Việt có dấu, mô hình khó hội tụ hơn rất nhiều. Lúc huấn luyện cần setup cho learning rate lúc đầu cao và decay thấp để giúp mô hình hội tụ được Ngoài ra, huấn luyện sẽ tốn tài nguyên và thời gian hơn Tuy nhiên, kết quả của mô hình cho ra rất tốt, có thể nhận diện được các chữ viết tay tiếng Việt với độ chính xác tốt.
Tổng quan lại, mô hình huấn luyện có thể nhận diện được chữ viết tay tiếng Việt tốt, có thể nhận diện trực tiếp mà không cần thêm các mô hình sửa lỗi Đồng thời, mô hình này có thể tiếp tục được huấn luyện nếu có thêm dữ liệu, giúp cho mô hình nhận diện được tốt hơn trên các nét chữ khác.
Windows Presentation Foundation
Windows Presentation Framework (WPF) là một framework giúp xây dựng UI trên nền desktop. WPF được ra đời sau Winform và có sự cải tiến đáng kể WPF tăng cường khả năng lập trình giao diện bằng cách cung cấp các API cho phép tận dụng những lợi thế về đa phương tiện hiện đại. WPF được xây dựng với ba mục tiêu cơ bản:
• Cung cấp nền tảng thống nhất để xây dựng giao diện người dùng.
• Giúp người lập trình và người thiết kế giao diện làm việc cùng nhau một cách dễ dàng.
• Cung cấp một công nghệ chung để xây dựng giao diện người dùng trên cả Windows và trình duyệt Web.
Tổng quan ứng dụng
Ứng dụng được thiết kế trên nền WPF, với backend là Python Ứng dụng sẽ là giao diện người dùng để giúp người dùng xử lý các văn bản có chứa chữ viết tay tiếng Việt dưới định dạng pdf. Ứng dụng được thiết kế để thực hiện được 2 công việc chính như sau:
• Tạo ra một file JSON chứa các khung để tách chữ viết tay
• Nhận diện chữ viết tay theo mẫu trên nhiều file pdf
Mô tả ứng dụng
Deployment diagram
Activity diagram
6.3.2.1 Vẽ khung chứa chữ viết tay
Hình 6.2: Activity diagram: Vẽ khung chứa chữ viết tay
6.3.2.2 Nhận diện chữ viết tay
Hình 6.3: Activity diagram: Nhận diện chữ viết tay
Mockup
Vẽ khung chứa chữ viết tay
Giao diện sẽ gồm 3 phần, từ trái qua phải:
• Phần hiển thị PDF, bên dưới là phần zoom lên từ hình gốc để hiển thị rõ hơn.
• Phần lưu các nhãn đã nhập và tọa độ các khung.
Hình 6.4: Mockup: Vẽ khung chữ viết tay
Nhận diện chữ viết tay
• Phần hiển thị PDF, lấy một file PDF đầu tiên trong thư mục đã chọn để hiển thị lên.
• Phần lựa chọn thư mục chứa các file PDF, chọn file JSON, lựa chọn thư mục output và tiến hành nhận diện chữ viết tay.
Hình 6.5: Nhận diện chữ viết tay
Tổng quan luận văn
Trong giai đoạn đề cương
• Tìm hiểu cơ bản về Machine Learning, các kĩ thuật Image Processing, CNNs, RNNs, các kĩ thuật Attention, Beam search,
• Tìm hiểu về mô hình dịch máy mã nguồn mở OpenNMT
• Huấn luyện được mô hình chữ tiếng Việt không dấu
Trong giai đoạn luận văn
• Huấn luyện được một mô hình có thể nhận diện chữ viết tay tiếng Việt có dấu
• Viết được một phần mềm demo hỗ trợ việc trích xuất và nhận diện chữ viết tay tiếng Việt từ các file pdf
Giới hạn và định hướng tương lai
Giới hạn
Giới hạn của mô hình là về dữ liệu huấn luyện Do dữ liệu chữ viết tay tiếng Việt hiện có là không nhiều, em phải sử dụng đến một số phương pháp biến đổi ảnh và sinh thêm dữ liệu nhằm mục đích huấn luyện Do đó, mô hình có thể bị overfit trên một dạng chữ hoặc một kiểu chữ nhất định.
Định hướng tương lai
Trong tương lai, em có thể phát triển luận văn theo các mục tiêu sau:
• Thu thập nhiều dữ liệu chữ viết tay hơn, qua đó huấn luyện để cho mô hình có thể nhận diện nhiều kiểu chữ hơn.
• Phần mềm có khả năng tự nhận diện chữ viêt tay có trong một văn bản.