Nhận dạng chữ viết tay tiếng việt

Giới thiệu

Nhận dạng chữ viết tay là một trong trong những bài bác tân oán hết sức thú vui, với nguồn vào là 1 trong những hình họa chứa chữ với Áp sạc ra là chữ đựng trong hình ảnh đó. Bài tân oán này tương đối cạnh tranh so với chữ viết tay, cùng cùng với viết bộ dữ liệu VN kha khá hãn hữu gồm. Lần này, mình đang chia vẫn phía tiếp cận mà lại team tôi đã thực hiện trong cuộc thi do Cinnamon tổ chức triển khai, nhờ các phương pháp sử lý phải chăng cơ mà team bản thân đã đoạt đượt top một trong những phase 1 của cuộc thi này. Nhưng nhưng cuộc thì này tổ chức cũng dài hơi, làm đều thí sinc hơi chán nản. (tầm 2 tháng cùng với phần tranh tài + bootcamp). Sơ qua về một ít ứng dụng của OCR. Mình thấy có 2 vận dụng hơi nổi tiếng là Google Translate, cùng với GotIt của Hùng Trần.

Bạn đang xem: Nhận dạng chữ viết tay tiếng việt

Dữ liệu

Dữ liệu của bài bác toán này là chỉ có text-line không có scene text đề xuất vụ việc dễ dàng rộng các so với vấn đề buộc phải detect được chữ bên trên ảnh có background như kế bên thực tiễn.

*

Chuẩn bị dữ liệu

Đối cùng với văn uống bạn dạng scan thì việc tiền cách xử lý nhỏng remove noise,background là cực kỳ quan trọng và tác động tương đối nphát âm đến độ đúng đắn của bài toán thù. Để remove sầu noise và background thì các chúng ta cũng có thể sử dụng kmean nhằm cluster tấm hình ra 2 màu sắc chủ yếu white cùng đen rồi tiếp đến binary ảnh dựa vào kết quả cluster. Trong quá trình xử lý các chúng ta có thể sử dụng tool này nhé


*

Mô hình

Dữ liệu đã chuẩn bị ngừng thì tới phần mã sản phẩm. Môt giữa những mô hình được hay sử dụng là CRNN, tuy nhiên mô hình bản thân thực hiện chế tạo phép tắc attention được cho phép Mã Sản Phẩm chọn lựa vùng ảnh mong ước nhằm phát sinh ra text. Cơ chế attention được sử dụng rất nhiều vào machine translation. Mình sẽ có được một bài về nguyên lý này,mặc dù các chúng ta có thể tham khảo trên đây.


*

Đối tài liệu là hình ảnh thì họ vẫn sử dụng quy mô CNN nhằm extract feature. Tại phía trên, mình cần sử dụng VGG16 nhé. Trong Mã Sản Phẩm hình này, chúng ta buộc phải lưu ý số tầng pooling, mình chỉ sử dụng 4 tầng pooling của VGG16, từng tầng pooling sẽ sở hữu được kích thước 2x2,bên cạnh đó vứt hết toàn bộ những tầng fully connected sau cuối, do đó output của VGG16 là một tập những feature maps, từng px bên trên feature khớp ứng vùng 16x16 bên trên bức ảnh đầu vào.


*

Việc lựa chọn size với số tầng pooling này rất là đặc trưng vày nó ảnh hưởng cho số px mà từng timestep thấy được được.Nếu chúng ta chọn kính thước tầng pooling form size quá rộng sẽ dần dần tới sự việc một step đã bao hàm nhiểũ chữ vào ảnh do đó mô hình sẽ không nhấn dạng được.


base_Model = applications.VGG16(weights="imagenet", include_top=False)
Với ảnh nguồn vào có kích cỡ 1280x60 thì output của vgg16 là (nmaps, w, h) = …, từng dòng tương xứng cùng với chiều w thì khớp ứng với một timstep mang lại tầng LSTM.

Visual attention

Với quy mô CRNN, kết quả của vgg được truyền thẳng vào mô hình LSTM, tuy vậy, với thực nghiệp của bản thân mình lúc stack thêm một tờ attention trọng điểm tầng vgg với LSTM đã cho tác dụng nhận dạng tốt hơn. Attention được cho phép Model của họ được dễ chịu và thoải mái gạn lọc phối hợp thông báo giữa các timestep khác nhau nhằm tổng hòa hợp lại cùng áp dụng đặc trưng tổng vừa lòng này có tác dụng đầu vào để thừa nhận dạng chữ cái. Cụ thể vector context được tổng thích hợp tại mỗi timestep nlỗi sau:


Thứ nhất ta nên tính e với e chính là output của Aligment Model, một dạng feedforward nets cùng với input đầu vào là trạng thái của networks hiện tại


Sau đó ta tính attention score trên từng timestep bằng hàm softmax vì chúng ta mong ước tổng attention score bởi 1


Cuối cùng, context vector là weighted average của tâm lý ẩn với attention score.


def attention_rnn(inputs): # inputs.shape = (batch_size, time_steps, input_dim) input_dyên = int(inputs.shape<2>) timestep = int(inputs.shape<1>) a = Permute((2, 1))(inputs) a = Dense(timestep, activation="softmax")(a) // Alignment Model + Softmax a = Lambda(lambdomain authority x: K.mean(x, axis=1), name="dim_reduction")(a) a = RepeatVector(input_dim)(a) a_probs = Permute((2, 1), name="attention_vec")(a) output_attention_mul = multiply(, name="attention_mul") // Weighted Average return output_attention_mul

LSTM

Với những vector context được tính trên tầng Attention được áp dụng là đầu vào mang đến quy mô LSTM. Tại từng timestep, họ dự đoán từ bỏ tại thời đặc điểm này. Các timestep thường xuyên có thể dữ đoán thù cùng một từ bỏ.


*

Connectionist Temporal Classification loss

Với tài liệu đào tạo và giảng dạy, chúng ta gồm nhãn là 1 đoạn text tương xứng cùng với chữ trong tấm hình kia. Chúng ta không có nhãn rõ ràng trên từng thời điểm trường đoản cú xuất hiện là gì khớp ứng cùng với timestep trong quy mô LSTM, do đó họ quan yếu cần sử dụng cross entropy loss để tính độ lỗi mà lại phải cần sử dụng CTC loss trong bài toán thù bài bác.

Xem thêm: Khóa Học Pha Chế Barista Cafe {Cơ Bản ⇒ Chuyên Nghiệp}, Lớp Học Pha Chế Barista Skills

Encoding ground truth

CTC loss giải quyết và xử lý vấn đề này Theo phong cách vô cùng xuất sắc, cụ thể họ đã demo tất cả những alignment của ground truth cùng tính score của tổng toàn bộ alignment. Alignment của ground truth được phát sinh bằng phương pháp thêm blank token (-) với tái diễn bất kể kí tự làm sao vào ground truth.

lấy một ví dụ ta bao gồm ground truth là: sun với gồm mô hình LSTM của họ dự tân oán 4 timesteps. Thì phần đông alignment đúng của ground truth là:

sun -> -sun, s-un, su-n, sun- sun -> suun, ssun, sunn

Đới với rất nhiều từ có 2 kí từ bỏ liên tục giống như nhau, chúng ta vẫn thêm blank token để tại giữa để tạo nên một alignment đúng. lấy một ví dụ cùng với kí tự too. Các alignment đúng có thể là:

too -> -to-o, tto-o

Nhưng ko thể là tooo.

Decoding text

Mô hình của bọn họ đang học tập để predict gần như alignment bên trên, kế tiếp chúng ta bắt buộc decode để đưa ra chuỗi dự đoán cuối cùng bằng phương pháp gộp các kí trường đoản cú tái diễn liên tiếp nhau thành một kí trường đoản cú và tiếp đến xóa hết toàn bộ blank token.lấy một ví dụ cùng với alignment tto-o thì sau khoản thời gian decode chúng ta sẽ sở hữu được too bằng cách gộp 2 kí từ ‘t’ lại cùng nhau và xóa ‘-‘.

Tính CTC loss

Với mỗi grouth truth bọn họ có khá nhiều alignment, bất kì alignment như thế nào được dự đân oán hầu như là 1 trong những dự đoán thù đúng. Do kia, hàm loss ta yêu cầu tối ưu chính là tổng của tất cả những alignment.


*

Với trường đoản cú sun, ta gồm tổng 7 alignments đúng sinh sống bên trên. Do kia theo mã sản phẩm, tỷ lệ tự sun xuất hiện là


p("sun") = p("-sun") + p("s-un") + p("su-n") + p("sun-") + p("ssun") + p("suun") + p("sunn") = 0.2186

Hàm loss của họ đang là 1 trong những - p(‘sun’)

Word Beam Search

Chúng ta hoàn toàn có thể sàng lọc câu được tạo nên bằng best path, hoặc có thể bởi word beam search. Đối cùng với best path, trên mỗi thời khắc họ sàng lọc trường đoản cú gồm xác suất lớn nhất. Tuy nhiên đối với bí quyết này,câu được tạo nên rất có thể không hẳn là câu gồm xác suất cao nhất. Ttuyệt vào kia,bạn có thể thực hiện beam search để giữ tại N câu gồm Tỷ Lệ to theo theo best path rồi sau cuối câu được lựa chọn đang là câu tất cả sác xuất cao nhất trong N câu kia.

Đối với bài xích tân oán OCR, từng timestep đang tạo ra một kí từ bỏ cho nên vì vậy trường đoản cú được tạo ra rất có thể không phía bên trong tự điển. Đối trường ngôi trường đúng theo này, bạn có thể thực hiện một số trong những pmùi hương phạt post process để giải pháp xử lý câu được phát sinh. Đơn giản, chúng ta áp dụng edit distance nhằm so sánh khoảng cách 2 trường đoản cú, cùng sửa chữa thay thế trường đoản cú không phía trong tự điển bằng từ bỏ tất cả edit distance phải chăng tốt nhất. Hay phức tạp hơn, chúng ta cũng có thể sử dụng language mã sản phẩm nhằm sửa lỗi câu được phát sinh.Đối với python/tensorflow, những chúng ta cũng có thể sử dụng thư viện sau để tạo nên câu từ bỏ model

OCR Data Augmentation

Trong cuộc thi này, tập tài liệu mà lại BTC hỗ trợ chỉ bao gồm 2000 mẫu mã, do đó để đào tạo model bọn họ nên thực hiện một số trong những cách thức nhằm tăng dữ liệu.

Xoay hay di chuyển một ít bức ảnh. Sử dụng elastic transkhung Random erasor 1 phần của bức ảnh.

Xem thêm: 2020 Honda Airblade Now In Vietnam, From Rm7, Brand New Vietnam Honda Air Blade 125 Scooter


Kết quả

Mình train 5 folds ,mỗi fold mất khoảng tầm 8 tiếng để chạy. Sau Lúc chay khoảng 70-80 epochs thì WER khoảng 0.1x. Theo mình thấy thì công dụng tương đối chính xác. Có vẻ bộ dataset tương đối dễ :))


Download dataset

Bộ datamix này là của Cinnamon. Mình không Chịu trách nát nhiệm lúc các bạn thực hiện sai mục đích.


Chuyên mục: Blogs