1 Công thức (3-1.a) && Công thức (3-2.a)
2 Công thức (3-1.b) && Công thức (3-2.a)
3 Công thức (3-1.c) && Công thức (3-2.a)
4 Công thức (3-1.a) && Công thức (3-2.b)
6 Công thức (3-1.c) && Công thức (3-2.b)
7 Công thức (3-1.a) && Công thức (3-2.c)
8 Công thức (3-1.b) && Công thức (3-2.c)
9 Công thức (3-1.c) && Công thức (3-2.c)
0 Các trường hợp còn lại
Trong đề tài này chỉ dùng sáu kiểu giao nhau: 1,2,3,7,8,9 để xác định kiểu ô nhập.
3.2.3. Phương pháp trích xuất cấu trúc vùng nhập
Trích xuất cấu trúc vùng nhập là việc nhóm các đường thẳng ngang và dọc thành các cấu trúc ô nhập như: chữ nhật, “răng cưa”, đường thẳng,...Ý tưởng chính của phương pháp được mô tả như sau:
• Các đường thẳng ngang được sắp xếp tăng dần của theo tọa độ Y, từ trên xuống dưới, và các đường thẳng dọc được sắp xếp tiếp tăng dần theo tọa độ X, từ trái sang phải.
• Tạo một ma trận chứa giá trị giao nhau giữa các đường thẳng (gọi tắt là ma trận giao điểm). Số dòng và cột của ma trận là số đường thẳng ngang và dọc tương ứng. Mỗi dòng là một đường thẳng ngang, mỗi cột là một đường thẳng dọc. Giá trị mỗi phân tử (nút) trong ma trận thuộc các kiểu giao nhau như hình III.3, nếu hai đường thẳng không giao nhau thì giá trị là không (zero). • Duyệt các phần tử trong ma trận theo một thứ tự nhất định sẽ trích xuất ra
loại ô nhập.
Với mười bốn đường thẳng dọc và bốn đường thẳng ngang như hình III.5, ta có ma trận giao điểm như sau:
Lưu ý:
• Mỗi đường thẳng chỉ thuộc một và chỉ một cấu trúc ô nhập. Nên các đường thẳng đã được đánh dấu thuộc một cấu trúc thì không xét nữa. • Thứ tự trích xuất các loại ô nhập là: (1) dạng vuông (chữ nhất), (2)
dạng “răng cưa”, (3) dạng đường thẳng.
3.2.3.1. Dạng chữ nhật
Với đặc điểm có cấu trúc đóng, được giới hạn bởi hai đường thẳng ngang và ít nhất hai đường thẳng dọc giao nhau. Nên để xác định loại ô nhập này thì từng cặp đường thẳng ngang song song (hai dòng) giao nhau đồng thời với ít nhất với hai đường thẳng dọc sẽ được xét. Thứ tự duyệt ma trận giao điểm là từ trên xuống dưới và từ trái qua phải.
Hình 3.6: Ma trận chứa giá trị giao nhau của các đường thẳng
Giải thuật trích cấu trúc chữ nhật:
Đầu vào: Danh sách các đường thẳng ngang/dọc và ma trận giao điểm
(HLList, VLList, R).
Đầu ra: Danh sách các ô nhập dạng chữ nhật (cellList). Giải thuật:
rectList = rỗng; // danh sách chứa các hình chữ nhật liền nhau.
cellList = rỗng;
for(i = 0; i < HLList.length()-1; i++){ // duyệt từng dòng ma trận
j = top_left(i,R); // tìm cột chứa nút bắt đầu của ô dạng chữ nhật (Rij = 1)
if(j != 0){ // nếu xuất hiện
rectList.clear();// xóa rỗng danh sách hình chữ nhật
k = bottom_left(j,R); //tìm dòng trong cột j có chứa nút giá trị khác không (Rkj = 7).
if(k != 0) {// nếu có
// tạo danh sách các hình chữ nhật kề nhau
rectList = createRectList(i, j, HLList, VLList);
// bổ sung danh sách các hình chữ nhật vào danh sách ô nhập.
cellList.add(rectList);
// đánh dấu đã xét các đường thẳng tạo nên cấu trúc
markSelectedHL(i,k,HLList); } } } return cellList; 3.2.3.2. Dạng răng cưa
Đây là cấu trúc mở, không giới hạn phía trên và chỉ có một đường thẳng ngang dưới đáy nên chỉ cần xét mỗi lần một đường thẳng ngang (một dòng) trong
ma trận giao điểm. Thứ tự duyệt ma trận giao điểm là từ trên xuống dưới và từ trái qua phải.
Với quy ước là sau khi tất cả ô nhập dạng chữ nhật đã được trích và xem các ô nhập này như một dạng đặc biệt của ô nhập dạng chữ nhật (thiếu một cạnh phía trên), giải thuật trích cấu trúc “răng cưa” như sau:
Đầu vào: Danh sách các đường thẳng ngang/dọc và ma trận giao điểm
(HLList, VLList, R).
Đầu ra: Danh sách các ô nhập dạng “răng cưa” (cellList).
Giải thuật:
rectList = rỗng; // danh sách chứa các hình chữ nhật liền nhau.
cellList = rỗng;
for(i = 0; i < HLList.length(); i++){ // duyệt từng dòng ma trận
// Bỏ qua các đường thẳng ngang đã là thành phần cấu trúc khác
if(checkSelectedHL(i,R) == true) continue;
j = left(i,R); // tìm cột chứa nút bắt đầu của ô dạng “răng cưa” (Rij = 7)
if(j != 0){ // nếu xuất hiện
rectList.clear();// xóa rỗng danh sách hình chữ nhật
// tạo danh sách các hình chữ nhật kề nhau
rectList = createRectList(i, j, HLList, VLList);
// bổ sung danh sách các hình chữ nhật vào danh sách ô nhập.
cellList.add(rectList);
// đánh dấu đã xét các đường thẳng đã tạo nên cấu trúc markSelectedHL(i,k,HLList); } } return cellList; 3.2.3.3. Dạng đường thẳng
Trong ảnh biểu mẫu có nhiều đường thẳng không là thành phần một loại ô nhập nào, như các đường thẳng phân cách nội dung chẳng hạn. Việc xác định một đường thẳng ngang có phải là cấu trúc vùng nhập dạng đường thẳng hay không cần có thông tin về nhãn. Nếu xuất hiện nhãn gần nhất - nhãn nằm bên trên, trái/phải so với đường thẳng và ở giữa nhãn và đường thẳng không có cấu trúc khác – thì xem đường thẳng là một cấu trúc vùng nhập. Thứ tự duyệt các phần tử trong ma trận giao điểm tương tự như mục 3.2.3.2.
3.2.3.4. Một số phương pháp nâng cao hiệu quả giải thuật trích xuất cấu trúc
Thường giải thuật trích xuất đường thẳng không chính xác hoàn toàn, việc này làm giảm hiệu quả giải thuật trích xuất cấu trúc vùng nhập. Chúng tôi đề xuất một số phương pháp nội suy dựa trên ma trận giao điểm và vị trí của của các đường thẳng nhằm khắc phục một số lỗi trích xuất cấu trúc do lỗi trích xuất đường thẳng thiếu chính xác gây ra.
Trường hợp 1:
Đây là lỗi do các đường thẳng dọc, xuất hiện ở giữa cấu trúc ô nhập (hình 3.9), để khắc phục lỗi này thì trong quá trình duyệt có thể chỉ cần gặp loại hoặc giao
điểm số 2 hoặc số 8 là ta đã xác định ngay được một ô nhập. Nên nếu mất một trong hai loại giao điểm 2 hoặc 8 thì vẫn có thể trích xuất đúng cấu trúc.
Trường hợp 2:
Đây là lỗi gây ra bởi đường thẳng dọc và ngang, xuất hiện ở cuối cấu trúc ô nhập. Để khắc phục ta phải tiến hoặc lùi một ô nhập để tìm giao điểm phù hợp tạo nên một ô nhập, cách làm thể hiện ở hình 3.10.
Trường hợp 3:
Đây là lỗi gây ra bởi đường thẳng dọc và ngang, xuất hiện ở đầu cấu trúc ô nhập. Để khắc phục ta phải tiến hoặc lùi một ô nhập để tìm giao điểm phù hợp tạo nên một ô nhập, cách làm thể hiện ở hình 3.11.
3.3. Trích xuất nhãn với Tesseract và VietOCR
Hiện nay có nhiều phần mềm hỗ trợ nhận dạng ký tự in [23]. Hầu hết là tiếng nước ngoài và là sản phẩm thương mại hóa, mã nguồn đóng. Ở Việt Nam cũng có một phần mềm nhận dạng ký tự khá nổi tiếng là VnDOCR [22].
Hình 3.10: Lỗi đường thẳng ngang và dọc ở cuối cấu trúc.
Với mục đích cần một công cụ nhận dạng ký tự in có thể tích hợp vào việc phân tích biểu mẫu, có mã nguồn mở, độ chính xác cao, hỗ trợ tiếng Việt, miễn phí càng tốt; nên phần mềm VietOCR [24] dựa trên Tesseract ([20],[21],[25]) là sự lựa chọn phù hợp cho đề tài này.
3.3.1. Tesseract
Tesseract là một công cụ nhận dạng ký tự in (tesseract ocr engine) mã nguồn mở miễn phí. Đầu tiên, nó được phát triển bởi công ty HP (Hewlett Packard) vào những năm từ 1984 đến 1994, với mục đích thương mại, tích hợp với dòng sản phẩm máy in của công ty. Sau mười năm mà không có sự phát triển nào đáng kể, công ty HP đã phát hành Tesseract như một công cụ mã nguồn mở vào năm 2005. Hiện nay, nó được phát triển tiếp tục bởi Google theo giấy phép Apache (Apache Licence). Phiên bản mới nhất là Tesseract 2.04.
Tesseract nằm trong tốp ba công cụ nhận dạng ký tự in có độ chính xác tốt nhất theo kiểm tra của đại học Nevada năm 1995 (the 1995 UNLV Accuracy test) [26].
Tesseract chỉ nhận dạng ký tự ở mức thô (raw OCR), tức nó không hỗ trợ chức năng phân tích bố cục tài liệu (document layout analysis), không định dạng kết quả xuất (no output formatting) và không có có giao diện tương tác (GUI). Nói cách khác nó chỉ là một công cụ “nền” (backend) cho các phần mềm khác.
Định dạng ảnh duy nhất mà nó có thể xử lí là .TIFF, văn bản (text) trong tập tin ảnh nằm trong một cột (single column). Tesseract nhận dạng tốt các ngôn ngữ: Anh, Pháp, Đức, Ý, Bồ Đào Nha, Brazil và Hà Lan. Nó có thể được huấn luyện để nhận dạng các ngôn ngữ khác, như tiếng Việt chẳng hạn.
Tesseract có thể được dịch và chạy trên các hệ điều hành như Linux, Windows, và Mac OS X. Mã nguồn chủ yếu được viết bằng ngôn ngữ C/C++.
Trong đề tài này Tesseract được dùng để nhận dạng từ khóa trong ảnh biểu mẫu và tọa độ tương ứng của nó. Vì mã nguồn của Tesseract không hỗ trợ sẵn yêu cầu này nên chúng ta phải sửa chữa. Vấn đề biên dịch, chỉnh sửa mã nguồn phục vụ cho demo của đề tài và chạy, xem thêm ở Phụ lục.
3.3.2. VietOCR
VietOCR là một phần mềm nhận dạng ký tự tiếng Việt dựa trên nền Tesseract (GUI frontend for Tesseract OCR engine). Hiện có hai phiên bản viết trên nền .NET và Java. Cả hai phiên bản đều có giao diện tương tự và có cùng khả năng nhận diện ký tự từ các loại dạng ảnh phổ thông (tiff, bmp, png, jpeg) và cả tập tin dạng pdf. Đây cũng là một phần mềm mã nguồn mở miễn phí phát triển bởi nhóm vietunicode( [24]). Phiên bản mới nhất hiện nay là VietOCR 1.5.
Kết quả nhận dạng ký tự phụ thuộc rất nhiều vào hình dáng của ký tự. Nên tỷ lệ nhận dạng phụ thuộc nhiều vào loại phông chữ. VietOCR nhận dạng tốt đối với phông Times New Roman, Arial, Verdana, và Courier New và các phông có hình dáng (font glyphs) tương tự. Hiện nay một số phông cũ như VNI và ABC cũng đã được bổ sung.
Hình ảnh muốn được OCR cần quét ở độ phân giải từ 200 dpi (dot per inch) trở lên tới 400 DPI, ảnh trắng đen hoặc mức xám (grayscale). Quét ảnh với độ phân giải cao hơn nữa chưa hẳn sẽ tăng sự chính xác của kết quả nhận dạng. Hiện tại, mức chính xác có thể lên trên 97% cho tiếng Việt (ảnh chuẩn), và phiên bản tới của Tesseract có thể nâng cao độ nhận dạng hơn nữa. Dầu vậy, độ chính xác thực thụ vẫn còn tùy thuộc rất lớn vào phẩm chất của ảnh quét.
Chương trình demo có sử dụng mã nguồn (Java) của phần mềm VietOCR. Cách cài đặt và sử dụng xem thêm ở Phụ lục.
Thứ tự nhận dạng từ trên xuống dưới và từ trái qua phải.
3.3.3. Trích nhãn (Label Extraction)
Trích nhãn là việc biến dữ liệu nhãn dưới dạng ảnh thành nhãn dưới dạng văn bản. Để trích nhãn, đầu tiên cần OCR dữ liệu văn bản trong biểu mẫu, kết quả quá trình này là các từ (word) rời rạc cùng với tọa độ tương ứng, trong khi nhãn cần trích là một chuỗi ký tự liên tục. Nên các từ rời rạc phải được ghép lại với nhau.
Trước khi trình bày chi tiết phương pháp trích nhãn, chúng tôi có một số nhận xét về tính chất của nhãn như sau:
• Nhãn là một chuỗi ký tự liên tục (khoảng cách giữa các từ trong cùng một nhãn là tương đương nhau).
• Khoảng cách giữa hai nhãn luôn luôn lớn hơn nhiều lần khoảng cách giữa hai từ trong cùng một nhãn.
• Các ký tự của nhãn cùng nằm trên một dòng.
• Nhãn có thể nằm ở ba vị trí so với vùng nhập: bên trái, bên phải và bên trên.
• Nhãn gồm 2 phần: văn bản biểu diễn nội dung của nhãn và tọa độ hình chữ nhật nhỏ nhất bao quanh nhãn.
Có hai bước chính để trích nhãn:
1. Dùng VietOCR nhận dạng tất cả ký tự trên ảnh biểu mẫu. 2. Ghép các từ sau khi nhận dạng thành nhãn.
Giải thuật ghép các từ rời rạc thành nhãn:
Đầu vào: tesseract_result - danh sách các từ đã được nhận dạng và tọa độ tương ứng.
Đầu ra: label_list -danh sách các nhãn (từ khóa).
Giải thuật:
label_list = new Vector();// danh sách các nhãn là một vectơ
label_text = new Vector();// các từ trong nhãn được lưu trong một vectơ
label_text.addElement(tesseract_result[0].text); // từ đầu tiên của nhãn
for ( k = 1; k < tesseract_result.len(); k++){
// Nếu hai từ cùng dòng và có khoảng cách nhỏ hơn ngưỡng thì ghép cùng nhãn
if(distance(label_text[count], tesseract_result[k]) < threshold){ label_text. addElement(tesseract_result[k].text);
} else {
// Thêm một 1 nhãn mới vào danh sách bằng cách tạo một đối tượng
//nhãn gồm 2 thuộc tính text và hình chữ nhật bao quanh text
label_list.add(new Label(label_text, new LabelRec(label_text)));
label_text.clear(); // xóa text nhãn vừa được tạo
// xét nhãn kế tiếp label_text. addElement(tesseract_result[k].text); } } return label_list; 3.4. Thực nghiệm
Mục tiêu của phần thực nghiệm trong chương này là kiểm chứng hiệu quả của giải thuật trích xuất cấu trúc vùng nhập và giới thiệu một số hình ảnh thể hiện kết quả nhận dạng ký tự in với VietOCR trên nền Tesseract.
Dữ liệu dùng trong thực nghiệm là danh sách đường thẳng đã trích xuất từ chương II.
Với kết quả trích xuất đường thẳng chính xác, kết quả trích xuất ô nhập càng cao. Nếu kết quả trích đường thẳng đúng 100% thì sẽ trích đúng 100% cấu trúc ô nhập. Sau đây là một số hình ảnh kết quả:
Hình 3.12: Kết quả trích xuất cấu trúc vùng nhập.
Tesseract – VietOCR: Với đầu vào là một ảnh biểu mẫu, kết quả nhận dạng sẽ là các từ (word) và tọa độ tương ứng của nó.
Nhận dạng ký tự trên một phần của biểu mẫu.
57
Chương 4: MÔ HÌNH HÓA VÀ NHẬN DẠNG BIỂU MẪU
Mục tiêu chính của chương IV là trình bày về phương pháp mô hình hóa và nhận dạng biểu mẫu dựa vào từ khóa.
Phần mô hình biểu mẫu sẽ trình bày về nội dung, cấu trúc và lưu trữ mô hình dựa vào thông tin về nhãn và cấu trúc ô nhập.
Tiếp theo là trình bày về phương pháp nhận dạng biểu mẫu dùng từ khóa. Việc đo độ tương đồng từ khóa dùng khoảng cách Levenshtein.
Cuối cùng là phần thực nghiệm nhằm kiểm chứng kết quả mô hình hóa thông qua một công cụ bán tự động và kết quả nhận dạng.
4.1. Mô hình hóa biểu mẫu
Việc xây dựng một cấu trúc dữ liệu mô tả các thông tin đặc trưng của một loại biểu mẫu được gọi là mô hình hóa biểu mẫu. Việc chọn thông tin làm thông tin đặc trưng phụ thuộc vào từng ứng dụng xử lí biểu mẫu. Trong đề tài này thông tin về nhãn và cấu trúc ô nhập được chọn làm thông tin đặc trưng.
Để mô hình hóa đối tượng cần có: nội dung, cấu trúc và cách lưu trữ.
4.1.1. Nội dung
Thông tin mô tả (description) một biểu mẫu gồm: thông tin chung và thông tin vùng nhập (nhãn và cấu trúc ô nhập). Các thông tin này đều được biểu diễn dưới dạng văn bản. Trong mô hình biểu mẫu không chứa các đối tượng ảnh mà là chỉ chứa mô tả nó. Nội dung mô tả là các đặc trưng hình học. Ví dụ để mô tả đường thẳng ta chỉ cần lưu tọa độ hai điểm đầu và cuối.
4.1.1.1. Thông tin chung
Là các thông tin mà mỗi mô hình biểu mẫu đều có: mã số, kích thước, độ phân giải. Mã số được đặt không trùng nhau, kích thước và độ phân giải xác định dựa vào ảnh biểu mẫu.
4.1.1.2. Thông tin về nhãn
Nhãn thuộc kiểu dữ liệu chuỗi ký tự (String), có tính chất như đã nêu ở mục III.3.3. Nó có vai trò chính là làm từ khóa trong mô hình biểu mẫu, được trích xuất từ ảnh biểu mẫu.
Thông tin về nhãn không hai phần: phần văn bản biểu diễn nội dung của nhãn và tọa độ của phần văn bản này trong ảnh biểu mẫu (tức tọa độ hình chữ nhật nhỏ nhất bao quanh nhãn).
4.1.1.3. Thông tin về cấu trúc ô nhập
Tọa độ các ô nhập trong vùng điền thông tin của biểu mẫu đóng vai trò quan trong trong việc trích xuất dữ liệu điền vào của người dùng. Mỗi vùng điền thông