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
Mô hình gặp giới hạn do dữ liệu huấn luyện hạn chế, đặc biệt là với số lượng chữ viết tay tiếng Việt không đủ Để cải thiện, cần áp dụng các phương pháp biến đổi ảnh và sinh dữ liệu bổ sung cho quá trình huấn luyện Tuy nhiên, điều này có thể dẫn đến hiện tượng overfitting, khiến mô hình chỉ hoạt động tốt trên một kiểu chữ hoặc dạng 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
Hiện nay, công nghệ phát triển mạnh mẽ đã thúc đẩy quá trình số hóa dữ liệu và lưu trữ trên đám mây, giúp tăng tốc độ truy cập và tìm kiếm thông tin Chẳng hạn, Việt Nam đã triển khai thẻ căn cước công dân gắn chip để nhận diện và truy cập dữ liệu một cách nhanh chóng và tiện lợi Nhiều quốc gia trên thế giới cũng đang áp dụng thông tin số hóa nhằm nâng cao hiệu quả công việc và phát triển kinh tế.
Mặc dù công nghệ ngày càng phát triển, văn bản viết tay vẫn được sử dụng phổ biến tại Việt Nam, bao gồm hóa đơn, biểu mẫu và đơn viết tay Nguyên nhân chính là do hạn chế về công nghệ ở một số khu vực và nhiều người chưa có đủ kiến thức công nghệ Hiện nay, nội dung từ các văn bản viết tay dạng biểu mẫu có thể được trích xuất để số hóa và lưu trữ trên đám mây, nhưng việc tự động hóa quá trình này vẫn chưa khả thi, buộc người dùng phải nhập liệu thủ công.
Đề xuất của em là xây dựng một hệ thống nhận diện chữ viết tay tiếng Việt, tập trung vào việc huấn luyện mô hình học máy Hệ thống này sẽ bao gồm một quy trình xử lý văn bản viết tay theo mẫu, cho phép tự động nhận diện và tiền xử lý các văn bản viết tay, từ đó giúp nhận diện chính xác các chữ viết tay tiếng Việt.
Mục tiêu và phạm vi đề tài
Mục tiêu của đề tài là trích xuất chữ viết tay từ các tài liệu thực tế, với trọng tâm vào việc phát triển các phương pháp hiệu quả để nhận diện và xử lý chữ viết tay trong các văn bản.
• 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 để chuyển đổi các chữ cái không dấu thành văn bản có dấu, sau đó áp dụng mô hình sửa lỗi chính tả nhằm hoàn thiện câu văn.
• 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 phát triển dựa trên cấu trúc của mạng neuron sinh học, bao gồm nhiều neuron đơn lẻ gọi là perceptron Để hiểu cách hoạt động của perceptron, trước tiên chúng ta cần nắm rõ cơ chế hoạt động của một neuron.
Cấu tạo của một neuron, như minh họa trong hình 2.1, cho thấy rằng neuron nhận tín hiệu điện từ các khớp thần kinh của những neuron khác thông qua các đuôi gai Các tín hiệu này có mức độ mạnh yếu khác nhau và được tích tụ trong thân neuron Tại đây, neuron thực hiện một quá trình tính toán gồm hai bước để xử lý thông tin.
• 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 neuron vượt qua ngưỡng nhất định, nó sẽ phát ra tín hiệu điện Tín hiệu này được truyền qua sợi trục (axon) đến các khớp thần kinh, và lúc này neuron được coi là đang trong trạng thái kích hoạt (activation).
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 , x2, , xn là các tín hiệu đầu vào;
Các trọng số w1, w2, , wn đại diện cho độ mạnh yếu của tín hiệu điện trong các nhánh tương ứng truyền giá trị x1, x2, , xn Giá trị w0, được gọi là bias, có thể nhận bất kỳ giá trị nào khác 0 Bộ trọng số này giúp perceptron mô tả hoạt động của neuron sinh học một cách chính xác.
Giá trị đầu vào được tính bằng 0 cộ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ị này, ký hiệu là a, sẽ được sử dụng để tính toán hàm kích hoạt f(t) tại a.
Kết quả của hàm ft(a) sẽ được so sánh với ngưỡng (threshold) để xác định xem perceptron có được kích hoạt hay không Thông thường, ngưỡng này được chọn là 0 để thuận tiện cho việc tính toán Ngoài ra, trạng thái kích hoạt và không kích hoạt của perceptron thường được biểu diễn bằng cặp số (1,0) và (1,-1).
Perceptron hoạt động dựa trên các phép toán số học, do đó, cả tín hiệu đầu vào và trọng số cần được biểu diễn dưới dạng số.
Mạng neuron đa tầng
Perceptron có thể được xem như một mạng neuron, hoạt động dựa trên tín hiệu đầu vào để xác định xem nó có được kích hoạt hay không Mặc dù một perceptron có thể giải quyết các bài toán phân loại tuyến tính, nhưng đố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 như mô phỏng phép XOR, nó không đủ khả năng Để khắc phục điều này, chúng ta sử dụng nhiều perceptron được tổ chức thành các tầng khác nhau, với các perceptron ở tầng sau kết nối đầy đủ với tầng trước Mạng neuron như vậy được gọi là mạng neuron đa tầng.
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;
Một mạng neuron đa tầng bao gồm một tầng đầu vào và một tầng đầu ra, nhưng có thể có một hoặc nhiều tầng ẩn ở giữa Ví dụ, một mạng neuron có thể có hai tầng ẩn như được minh họa trong 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 - CNN) là một loại mạng neuron phổ biến trong việc nhận dạng và phân loại hình ảnh Mặc dù tương tự như các mạng neural network khác, CNN có những cải tiến nổi bật với các lớp Convolutional và Pooling, giúp nâng cao hiệu suất xử lý hình ảnh.
Convolutional Layer - Tầng tích chập
Tầng tích chập là thành phần chính của mạng neuron tích chập, hoạt động như một hidden layer nhưng đặc biệt hơn với việc tạo ra các feature map, là bản scan của input với các đặc tính được trích xuất Để thực hiện điều này, tầng tích chập sử dụng kernel để 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, mạng nhân các giá trị của input với giá trị tương ứng của kernel, sau đó tính tổng và đưa qua activation function như ReLU hoặc sigmoid Kết quả là một số cụ thể, và khi tổng hợp các số này từ các lần quét, ta thu được một feature map Hình 2.4 minh họa quy trình 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 qua dữ liệu Khi stride bằng 1, kernel sẽ quét từng ô liền kề trên input Ngược lại, với stride bằng 2, kernel sẽ quét ô đầu tiên và ô thứ ba, bỏ qua ô thứ hai, và quy tắc này tiếp tục áp dụng cho các giá trị stride khác.
= 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 là một kỹ thuật tương tự như convolutional, sử dụng cửa sổ trượt để quét qua feature map và chọn giá trị trong cửa sổ đó Các phương pháp pooling phổ biến bao gồm max pooling và average pooling Mục tiêu của pooling là giảm số lượng tham số (hyperparameter), từ đó giảm thời gian tính toán và ngăn ngừa hiện tượng 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 - RNN) là một loại mạng neuron đặc biệt, khác với các mạng neuron thông thường ở chỗ đầu vào và đầu ra không hoàn toàn độc lập Cấu trúc này rất phù hợp cho các bài toán xử lý dữ liệu dạng chuỗi, giúp cải thiện hiệu suất trong nhiều ứng dụng khác nhau.
Mạng neuron hồi quy là một loại mạng neuron có vòng lặp, cho phép đầu ra của neuron trước trở thành đầu vào của neuron sau, tạo thành một chuỗi các mạng con giống nhau Mỗi mạng con truyền thông tin đã xử lý cho mạng phía sau, với đầu vào là một chuỗi thông tin có liên hệ Tính chất này giúp mạng neuron hồi quy phù hợp cho các bài toán với dữ liệu đầu vào dạng chuỗi, nơi các sự kiện trong chuỗi có mối liên hệ chặt chẽ 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ó nhiều kiểu hoạt động khác nhau, mỗi kiểu phù hợp với các bài toán cụ thể Hình 2.9 minh họa các kiểu hoạt động chính, trong đó đầu vào được biểu thị bằng màu đỏ, đầu ra là màu xanh biển, và thông tin trao đổi giữa các mạng con được thể hiện bằng màu xanh lá.
Hình 2.9: Các kiểu hoạt động của mạng neuron hồi quy
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 gặp phải một nhược điểm lớn khi kích thước chuỗi vector đầu vào x quá lớn, dẫn đến việc tính toán vector trạng thái ẩn h phải đi qua nhiều lớp, gây khó khăn trong quá trình backpropagation để cập nhật các tham số weights Điều này làm cho các giá trị cập nhật (gradient) ngày càng lớn, khiến việc điều chỉnh weights không hiệu quả và làm mạng trở nên không ổn định Kết quả là, RNN chỉ có khả năng học các thông tin gần gũi và bỏ qua thông tin xa Để khắc phục vấn đề này, các biến thể nâng cấp của mạng neuron hồi quy đã được phát triển, trong đó LSTM - Long Short Term Memory là một trong những giải pháp nổi bật.
LSTM được phát triển nhằm giải quyết vấn đề phụ thuộc xa, cho phép ghi nhớ thông tin trong thời gian dài mà không cần huấn luyện thêm Đặc điểm này là tính năng mặc định của LSTM, giúp nó tự động lưu trữ thông tin mà không cần sự can thiệp từ bên ngoài.
LSTM là một loại mạng nơ-ron hồi tiếp (RNN) nhưng sở hữu cấu trúc phức tạp hơn với bốn tầng tương tác đặc biệt, khác biệt so với các module đơn giản của RNN chỉ có một tầng tanh.
Hình 2.10: Bên trong một module RNN
Mô-đun LSTM hoạt động dựa trên trạng thái tế bào (cell state) là yếu tố cốt lõi, cho phép thông tin được truyền đi một cách liên tục mà không bị thay đổi Trạng thái tế bào này chỉ tương tác tuyến tính một cách hạn chế, giúp duy trì tính ổn định của dữ liệu LSTM cũng có khả năng thêm vào hoặc loại bỏ thông tin trong trạng thái tế bào thông qua ba cổng (gate) điều chỉnh, giúp tối ưu hóa quá trình học và ghi nhớ thông tin.
• 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), hay còn gọi là mô hình Encoder-Decoder, là một ứng dụng quan trọng của RNN, cho phép xử lý cả input và output dưới dạng chuỗi Mô hình này rất phù hợp cho các bài toán như Dịch máy, Nhận diện giọng nói tự động và Nhận diện ký tự quang học, vì chúng đều làm việc với dữ liệu dạng chuỗi Do đó, việc áp dụng các kiến trúc Deep Neural Networks (DNN) thông thường như MLP là không khả thi.
Mô hình Sequence to Sequence (seq2seq) bao gồm hai thành phần chính: Encoder và Decoder Encoder chuyển đổi input thành các biểu diễn trung gian, gọi là context vector, trong khi Decoder biến đổi các context vector thành output của bài toán Thông thường, cả Encoder và Decoder đều được xây dựng từ 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ô hình này nhằm tính xấp xỉ xác suất p(y₁, , yₘ|x₁, , xₙ), trong đó (x₁, , xₙ) là chuỗi input và (y₁, , yₘ) là chuỗi output Độ dài của input và output có thể khác nhau, tức là m ≠ n Để tính xác suất này, mô hình sử dụng Encoder để tạo ra vector v của chuỗi input, với số chiều cố định, đóng vai trò là biểu diễn của toàn bộ chuỗi input và cũng là hidden state cuối cùng của Encoder Tiếp theo, vector v sẽ được dùng để khởi tạo giá trị hidden state ở Decoder, từ đó tính xác suất của y₁, , yₘ: p(y₁, , yₘ|x₁, , xₙ) = ∏ₜ=₁ p(yₜ|v, y₁, , yₜ₋₁).
Attention
Trong mô hình seq2seq cho dịch máy (NMT), bộ encoder tiếp nhận câu gốc và tạo ra một context vector Decoder sử dụng vector này cùng với các hidden state và từ trước đó để dự đoán từ tiếp theo tại mỗi timestep Tuy nhiên, việc mã hóa một câu dài thành một vector duy nhất vẫn gặp khó khăn, ngay cả khi áp dụng LSTM để giảm thiểu hiện tượng Vanishing Gradient.
An effective mechanism that allows models to focus on important segments between source and target words is Attention [Cha+21] Instead of relying solely on a context vector, this approach utilizes all outputs from each cell at every timestep, combined with the hidden state of each cell to generate an attention vector This attention vector serves as the input for the decoder.
Hình 2.16 là minh họa của một attention model cho việc dịch máy:
Hình 2.16: Minh họa sử dụng Attention để lấy độ tương quan trong câu được dịch máy
Beam search
Trong mô hình seq2seq, trong bước giải mã (decode), vector đầu ra từ RNN/LSTM được đưa qua hàm Softmax để xác định token có xác suất cao nhất Token này sẽ được sử dụng làm đầu vào cho token tiếp theo, tuy nhiên, xác suất này không phải lúc nào cũng chính xác.
Thuật toán Beam search [MVC21] được thiết kế để giải quyết vấn đề lựa chọn từ trong các mô hình dự đoán Thuật toán này sử dụng một tham số gọi là beam width, cho phép chọn ra số lượng kết quả có xác suất cao nhất tại mỗi bước dự đoán Sau đó, các từ được đưa vào timestep tiếp theo và tiếp tục lựa chọn từ tiếp theo Để tối ưu hóa quá trình, có thể thêm ngưỡng (threshold) nhằm loại bỏ những lựa chọn có xác suất thấp, giúp dừng việc xét nhánh không cần thiế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:
Việc áp dụng beam search trong mô hình seq2seq giúp nâng cao độ chính xác của kết quả Tuy nhiên, việc lưu trữ xác suất cho các chuỗi dài có thể dẫn đến việc tăng thời gian huấn luyện và tiêu tốn nhiều 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] trình bày việc sử dụng cấu trúc RNN và LSTM để tạo ra chữ viết tay Mô hình RNN được áp dụng để dự đoán các nét chữ theo cấu trúc như hình 3.1.
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 bộ dữ liệu chữ viết tay tiếng Anh được ghi lại theo thứ tự từng nét chữ theo thời gian Quy trình tạo ra chữ viết tay hoàn chỉnh được thực hiện qua hai bước.
• 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 trong quy trình là sử dụng mô hình dự đoán để xác định vị trí đặt bút kế tiếp dựa trên các nét chữ đã biết Các nét chữ sẽ được đưa qua mô hình dự đoán nét chữ, sau đó kết quả sẽ được xử lý qua một tầng phân phối độ dày Qua đó, chúng ta sẽ thu được các vị trí có khả năng cao nhất cho nét chữ tiếp theo Kết quả của quá trình này được thể hiện trong 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 trong quá trình tạo chữ viết tay là tổng hợp các ký tự Trong bước đầu tiên, mô hình chỉ tập trung vào việc xác định nét vẽ tiếp theo mà không đảm bảo tính chính xác của các ký tự được tạo ra Tuy nhiên, ở bước này, mô hình sẽ ràng buộc các ký tự đã viết, nhằm tạo ra một đoạn chữ viết tay hoàn chỉnh và chính xác.
Mô hình CRNN
Giới thiệu
Mô hình CRNN, do tác giả Quoc Pham đề xuất, đã được áp dụng để nhận diện chữ tiếng Việt trên tập dữ liệu địa chỉ tiếng Việt của Cinnamon Mô hình này đã xuất sắc giành giải nhất trong phase 1 của cuộc thi nhận diện chữ viết tay 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ả áp dụng mô hình CNN VGG16 để trích xuất đặc trưng, sử dụng 4 tầng pooling có kích thước 2x2 và loại bỏ tầng fully connected cuối cùng Kết quả thu được là một tập hợp các feature map, trong đó mỗi pixel tương ứng với vùng 16x16 trên đầu vào.
Tác giả đã thêm một lớp attention giữa VGG và LSTM nhằm cải thiện hiệu suất nhận dạng Kết quả thu được là các vector context, được sử dụng làm đầu vào cho LSTM Tại mỗi timestep của LSTM, mô hình sẽ dự đoán từ tương ứng tại thời điểm đó.
Hàm tính lỗi được sử dụng trong bài viết này là Connectionist Temporal Classification Loss, vì chỉ có nhãn cho toàn bộ địa chỉ mà không có nhãn tại từng timestep cụ thể.
CTC loss được xác định bằng tổng tất cả các alignment, trong đó alignment được tạo ra thông qua việc thêm token trống và lặp lại ký tự từ ground truth.
Hình 3.5: Connectionist Temporal Classification loss
Tự động thêm dấu tiếng Việt
Giới thiệu
Mô hình AIv là giải pháp tự động thêm dấu tiếng Việt vào câu, đã xuất sắc giành giải nhất trong cuộc thi AIviVN về công nghệ này.
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 thiết kế nhằm chuyển đổi các công thức toán học sang định dạng LaTEX Mô hình này được phát triển dựa trên nền tảng OpenNMT, một công cụ mã nguồn mở cho dịch máy và các mô hình học máy dạng chuỗi OpenNMT được khởi xướng 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
Mô hình này sử dụng lưới CNN thay vì CNN thông thường để tách feature từ trái qua phải Đầu tiên, nó trích xuất đặc trưng bằng CNN và sắp xếp chúng thành dạng grid Mỗi dòng của grid sẽ được đưa vào encoder RNN, sau đó các feature đã được mã hóa sẽ được chuyển qua một mạng RNN khác với cơ chế Attention.
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, bao gồm khoảng 2000 ảnh Mỗi ảnh trong tập dữ liệu này thể hiện 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
Tập nhãn bao gồm các câu tiếng Việt tương ứng với từng bức ảnh, được lưu trữ trong một file JSON Sau đó, những bức ảnh chữ viết tay sẽ được tiền xử lý để chuẩn bị cho quá trình huấn luyện mô hình.
Sử dụng thư viện openCV trong Python, tôi đã chuyển đổi ảnh sang định dạng nền trắng chữ đen Quá trình này bao gồm việc đọc ảnh dưới dạng ma trận, chuyển đổi từ ảnh màu sang grayscale, và sau đó áp dụng ngưỡng để tạo ra nền trắng với 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ập dữ liệu địa chỉ hiện có chỉ khoảng 2000 ảnh, con số này không đủ cho việc huấn luyện một mô hình hiệu quả Do đó, tôi sẽ áp dụng một số phương pháp chỉnh sửa ảnh để tăng cường số lượng dữ liệu dựa trên bộ dữ liệu hiện có.
Phương pháp đầu tiên để biến đổi hình ảnh là sử dụng elastic transform [Kag] Phương pháp này chia bức ảnh thành nhiều phần nhỏ và thực hiện biến đổi trên từng phần, tạo ra hiệu ứng méo mó cho bức ảnh (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 random erase là kỹ thuật xóa ngẫu nhiên một số phần của bức ảnh, cần lưu ý rằng số lượng và kích thước vùng bị xóa phải được lựa chọn cẩn thận để không làm mất đi các chi tiết quan trọng trên ảnh Hình 4.4 minh họa kết quả cuối cùng sau khi áp dụng hai phương pháp biến đổi ảnh.
Hình 4.4: Kết quả cuối cùng sau khi áp dụng các phương pháp biến đổi ảnh
Thuật toán biến đổi và xóa sử dụng biến ngẫu nhiên, cho phép chạy nhiều lần để tạo ra các kết quả khác nhau Điều này giúp tăng cường dữ liệu, từ đó cải thiện quá trình 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 được huấn luyện trên tập dữ liệu chữ viết tay tiếng Việt từ cuộc thi ICFHR2018, bao gồm 1146 đoạn văn bản với 7296 dòng và hơn 480000 nét chữ, được viết bởi 200 người Việt Nam Dựa trên phương pháp của Alex Graves, mô hình này tạo ra các chữ tiếng Việt hoàn chỉnh từ dữ liệu đã được huấn luyện Hình 4.5 minh họa kết quả của mô hình.
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 dự án mã nguồn mở chuyên về dịch máy và các mô hình học máy chuỗi, được khởi xướng vào năm 2016 bởi nhóm Harvard NLP và công ty SYSTRAN Hiện tại, dự án này đang được duy trì và phát triển bởi SYSTRAN và Ubiqus.
OpenNMT cung cấp khả năng tùy chỉnh mô hình và điều chỉnh tham số huấn luyện một cách dễ dàng Các mô hình đã được huấn luyện có khả năng tích hợp hiệu quả vào các ứng dụng thực tế.
Trong luận văn này, tôi sẽ áp dụng mô hình image-to-text phiên bản legacy, vì phiên bản mới đã không còn hỗ trợ tính năng này Mô hình được thiết kế nhằm mục đích chính là chuyển đổi hình ảnh thành mã LaTeX cho các công thức toán học ([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 bao gồm các tầng convolutional kết hợp với max pooling, nhưng không có tầng fully-connected cuối cùng như trong các mạng CNN truyền thống, nhằm duy trì tính vị trí của các đặc trưng Thay vào đó, các feature maps được đưa qua một mạng LSTM encoder, gọi là row encoder, để lưu giữ thông tin vị trí của các đặc trưng trong bộ encoder-decoder Bộ decoder sau đó sinh ra các token (chữ cái) dựa trên kết quả từ row encoder và được huấn luyện như một mô hình ngôn ngữ, cho phép xác định xác suất của token hiện tại dựa trên các token trước đó Để tăng độ chính xác, decoder cần biết vị trí của các đặc trưng trong đầu vào, vì vậy một tầng Attention được thêm vào để theo dõi vị trí của token đang được tạo ra trên hình ảnh Cuối cùng, tầng generator 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 để cải thiện độ chính xác của đầ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 này tập trung vào việc nhận diện chữ viết tay để tạo ra kết quả không dấu ban đầu Sau đó, một mô hình sửa lỗi chính tả sẽ được sử dụng để tự động thêm dấu câu, nhằm đạt được câu tiếng Việt hoàn chỉnh và đầy đủ.
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 đào tạo mô hình nhận diện chữ viết tay có dấu, giúp giảm tải cho mô hình tự động thêm dấu tiếng Việt.
Mặc dù mô hình này yêu cầu thời gian huấn luyện lâu, nhưng độ chính xác của nó đạt kết quả tốt, vì vậy phương pháp 1 sẽ không còn cần thiết 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
Cả hai phương pháp đều sử dụng chung một tập dữ liệu hình ảnh gồm 12,761 ảnh, bao gồm 1,823 ảnh gốc từ tập dữ liệu Cinnamon, 9,115 ảnh biến đổi và 1,823 ảnh sinh ra từ mô hình RNN Tập dữ liệu này được chia ngẫu nhiên thành hai phần: 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 tạo ra từ chuỗi địa chỉ gốc thông qua quá trình tiền xử lý Để huấn luyện hiệu quả theo từng token, chuỗi cần được tách thành các ký tự riêng lẻ Đầu tiên, khoảng trắng trong chuỗi sẽ được thay thế bằng dấu "_" và sau đó, mỗi ký tự sẽ được tách 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
Để đánh giá kết quả, tôi sẽ áp dụng phương pháp edit distance, một công cụ định lượng để so sánh sự khác biệt giữa hai chuỗi Edit distance đo lường số lượng thao tác tối thiểu cần thiết để chuyển đổi một chuỗi thành chuỗi khác Điểm edit distance càng cao cho thấy mô hình đạt được 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
Khi đánh giá hiệu suất của máy tính cá nhân, việc không có cài đặt GPU sẽ làm giảm tốc độ hoạt động đáng kể so với máy tính được trang bị 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:
Phương pháp huấn luyện với nhãn tiếng Việt không dấu cho thấy mô hình hội tụ nhanh chóng sau 46.000 bước, tiết kiệm thời gian huấn luyện Tuy nhiên, kết quả thu được thường dễ bị overfit, do đó cần bổ sung một mô hình sửa lỗi chính tả để tạo ra câu tiếng Việt hoàn chỉnh.
Phương pháp huấn luyện mô hình với nhãn tiếng Việt có dấu gặp nhiều thách thức trong việc hội tụ Để đạt được hiệu quả tốt, cần thiết lập learning rate ban đầu cao và mức decay thấp, giúp mô hình dễ dàng hội tụ hơn Mặc dù quá trình huấn luyện tiêu tốn nhiều tài nguyên và thời gian, nhưng kết quả cuối cùng rất ấn tượng, với khả năng nhận diện chữ viết tay tiếng Việt đạt độ chính xác cao.
Mô hình huấn luyện hiện tại có khả năng nhận diện chữ viết tay tiếng Việt một cách hiệu quả mà không cần đến các mô hình sửa lỗi bổ sung Hơn nữa, mô hình này có thể được cải thiện thêm thông qua việc bổ sung dữ liệu, từ đó nâng cao khả năng nhận diện trên nhiều kiểu chữ khác nhau.
Windows Presentation Foundation
Windows Presentation Framework (WPF) là một framework phát triển giao diện người dùng cho desktop, ra đời sau Winform với nhiều cải tiến nổi bật WPF nâng cao khả năng lập trình giao diện thông qua việc cung cấp các API, cho phép khai thác tối đa các tính năng đa phương tiện hiện đại WPF được xây dựng dựa trên 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 phát triển trên nền tảng WPF với backend sử dụng Python, nhằm cung cấp giao diện người dùng cho việc xử lý văn bản chứa chữ viết tay tiếng Việt dưới định dạng PDF Ứng dụng thực hiện hai chức năng chính để phục vụ nhu cầu của người dùng.
• 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
Mô hình gặp giới hạn do thiếu dữ liệu huấn luyện cho chữ viết tay tiếng Việt Để khắc phục, cần áp dụng các phương pháp biến đổi ảnh và sinh thêm dữ liệu nhằm cải thiện quá trình huấn luyện Tuy nhiên, điều này có thể dẫn đến tình trạng overfit, khiến mô hình chỉ hoạt động tốt trên một kiểu chữ hoặc dạng 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.