CHƯƠNG 2. NHẬN DẠNG TỪ DỰA TRÊN MÔ HÌNH ĐA MẠNG KẾT HỢP VỚI THỐNG KÊ NGỮ CẢNH
2.4. Quá trình nhận dạng từ
2.4.4. Thuật toán nhận dạng từ
Với phương pháp nhận dạng và cấu trúc dữ liệu đã thể hiện ở trên, thuật toán nhận dạng từ được mô tả một cách chi tiết hơn như sau:
INPUT: ảnh của từ cần nhận dạng:WordIMG
OUTPUT: Danh sách các từ ứng cử viên có khả năng lựa chọn (các từ nhận dạng được từ các cách phân đoạn khác nhau);
PROCESS:
Bước 1: Khởi tạo:
- Khởi tạo cây lưu trữ pParent, CurrentNote = nút gốc (root) chứa kí tự .
- Khởi tạo phần ảnh đầu vào hiện tại: CurrentImage = WordIMG.
- Khởi Tạo mạng nơron và các tham số cần thiết của mạng.
- Nạp từ điển từ vựng.
Bước 2: Nếu kích thước phần ảnh đầu vào CurrentImage = 0, thì thực hiện bước 8,
ngược lại, xác định tất cả các vị trí cắt có thể có trên ảnh đầu vào (CurrentImage) theo thuật toán đã mô tả ở trên và thực hiện tiếp bước 3.
Bước 3: Xét lần lượt từng vị trí cắt đã tìm được, tại mỗi vị trí thực hiện các thao tác sau đây:
- Nhận dạng phần ảnh tương ứng bởi mạng nơron bốn lớp ở trên. Nếu kết quả nhận dạng là sai (kết quả trả về của mạng là NULL) thì bỏ qua vị trí cắt này và chuyển sang vị trí cắt tiếp theo, ngược lại thực hiện tiếp các thao tác sau.
- Kiểm tra xem các kí tự vừa nhận dạng được có hợp lý hay không (dựa trên xác suất xuất hiện của kí tự này ngay sau kí tự vừa nhận dạng được ở bước liền trước đó). Nếu tất cả các kí tự vừa nhận dạng được đều không hợp lệ thì bỏ qua vị trí cắt này và chuyển sang vị trí cắt tiếp theo, ngược lại tạo ra một nút mới:
newNode = new CNode;
newNode->pos = CurrentPos;
newNode->ch = Mảng các kí tự vừa nhận dạng được;
newNode->parent = CurrentNode;
và chèn vào danh sách các nút con của nút cha hiện tại, sau đó thực hiện tiếp bước 3.
Bước 4: Kiểm tra xem danh sách các nút con hiện của nút cha hiện thời có rỗng không. Nếu rỗng (chứng tỏ vị trí cắt trước đó đã bị sai) thì tiến hành loại bỏ nút cha hiện thời này ra khỏi cây và chuyển sang bước 4. Ngược lại chuyển sang bước 5;
Bước 5: Nếu danh sách em liền kề của nút cha hiện tại NULL thì chuyển sang nút em liền kề này: CurrentNote = Em liền kề và thực hiện tiếp bước 7;
Bước 6: Chuyển sang nút con cả: CurrentNote = Con đầu tiên trong danh sách và thực hiện tiếp bước 7;
Bước 7: Thực hiện các thao tác sau:
- Xác định vị trí cắt hiện tại: Pos = CurrentNote->pos;
- Tính phần ảnh đầu vào hiện thời: CurrentImage = CutAt(Pos)
- Lặp lại các bước 2, 3, 4 đối với phần ảnh đầu vào vừa xác định (CurrentImage) và nút cha hiện thời (CurrentNote) cho đến khi phần ảnh đầu vào có kích thước = 0.
Bước 8: Lấy danh sách các từ ứng cử viên: Duyệt cây theo chiều sâu, tiến hành ghép các kí tự theo từng nhánh của cây lưu trữ, mỗi nhánh trên cây sẽ cho ta một từ ứng cử viên. Trường hợp có nhiều hơn một kí tự được lưu ở một nút, ta sẽ coi mỗi kí tự đó là của một nút con và tiến hành ghép như bình thường.
Bước 9: Dựa trên từ điển từ vựng, ta sẽ xác định được xác suất xuất hiện của tất cả các từ ứng cử viên có trong danh sách đã có.
Bước 10: Chọn từ có xác suất xuất hiện cao nhất trong số tất cả các ứng cử viên và trả về kết quả.
Thuật toán 2-4: Thuật toán nhận dạng từ
Trong đó thủ tục nhận dạng từ WordRecognition(.) được cài đặt đệ qui như sau:
WordRecognition(CNode *pParent, CNode *node, IMAGE wordIMG){
if (stop) return;
//Lưu nút hiện tại (node) vào danh sách các nút con của nút cha //(pParent) trên cây cấu trúc
InsertNode(pParent, node);
if (sizeof(wordIMG) <= 0) return;
//Tìm kiếm tất cả các vị trí cắt có thể trên ảnh
wordIMG, Kết //quả lưu vào danh sách ListPos Find_All_Alternative_Cut_Pos(wordIMG, ListPos)
//Xét tất cả các vị trí cắt đã lưu trong ListPos một cách đệ //quy. Vị trí hiện tại là CurrentPos
For each alternative cut pos . ListPos{
//Cắt từ đầu ảnh đến vị trí CurrentPos charIMG = CutAtPos(CurentPos);
//Tính phần ảnh còn lại restIMG = wordIMG – charIMG
//Gọi chức năng nhận dạng kí tự với ảnh đầu vào là charIMG.
//Kí tự nhận dạng được lưu vào mạng CharArray, số ký tự nhận //dạng được = count
if (CharRecognition(charIMG, charArray, count)==TRUE){
// Kiểm tra sự hợp lý của ký tự nhận dạng được if (CheckValidChar(charArray)==FALSE){
//Remove nhánh cây tương ứng Remove_this_brand_of_the_tree();
stop=TRUE;
}
newNode = new CNode;
newNode->ch = charArray;
newNode->parent = node;
//Thực hiện một cách đệ quy với phần ảnh còn lại WordRecognition(node, newNode, restIMG)
}else stop = TRUE;
}//end for
}//end function
Thuật toán 2-5: Thủ tục nhận dạng từ (WordRecognition)
Để thấy được quá trình hoạt động của mô hình nhận dạng một cách cụ thể hơn, chúng ta sẽ xem xét ví dụ trên hình 2.6. Với đầu vào là ảnh của từ “river”
Ở bước đầu tiên, thuật toán sẽ xác định được 8 vị trí cắt (được đánh số từ 18), tiến hành nhận dạng tại vị trí cắt đầu tiên sẽ thu được chữ i. Lúc này nút con đầu tiên sẽ được tạo ra và chèn vào danh sách nút con của nút cha hiện tại (nút gốc), tiếp tục nhận dạng vị trí cắt thứ 2 thu được chữ r, nút con tiếp theo sẽ được tạo ra và chèn vào danh sách đã có, tiếp tục nhận dạng các vị trí tiếp theo nhưng không còn vị trí nào hợp lệ nữa (đầu ra của mạng sai) do đó sẽ không có nút con nào được tạo nữa, lúc này tầng thứ nhất của cây đã được phát triển xong.
?
? ?
? ?
? r i
8 7 6 5 4 3 2 1
i r
Cây kết quả
Hình 2.6: Kết quả của toán nhận dạng ở lần thực hiện đầu tiên
Do danh sách các nút con của nút cha hiện tại NULL nên nút cha hiện tại sẽ được gán bằng nút con đầu tiên và lặp lại các thao tác trên với phần ảnh còn lại. Ở lần duyệt này, thuật toán xác định được 7 vị trí cắt, trong đó tại vị trí cắt đầu tiên kết quả trả về của mạng là 2 kí tự là „i‟ và „z‟ (trường hợp nhập nhằng), lúc này cả 2 kí tự sẽ được lưu vào nút con đầu tiên, kết quả nhận dạng tại vị trí thứ 2,3 là u, w. Như vậy một danh sách gồm 3 nút con đã được tạo ra và chèn vào cây. Thực hiện tiếp
thuật toán trên với các bước tương tự như vậy, cuối cùng ta sẽ thu được một cây kết quả thể hiện trên (Hình 2.7).
r
u
i e
i
iv
w
r i
i | z |z
e
i r i
e
r i i
i v
e i r i u
iv e
i r i
i v
e i r i
w i
e i r i u
i e
i
iv
w
e r
i r i
e i r i
i v
e i r i
Hình 2.7: Cây kết quả cuối cùng đƣợc tạo ra bởi thuật toán nhận dạng
Lúc này tiến hành duyệt cây theo chiều sâu và ghép các kí tự theo từng nhánh của cây ta sẽ thu được danh sách ứng cử viên sau:
iiiiieii iziiieii iiiiier iziiier iiiveii iziveii iiiver iziver iiuieii izuieii iiuier izuier iiwer izwer iuiieii iuiier iuveii iuver iwieii iwier riiieii riiier riveii river riuieii iuier riwer
Đến đây, dựa trên từ điển từ vựng, chương trình sẽ xác định được xác suất xuất hiện của các ứng cử viên. Ở đây, xác suất xuất hiện của từ “river” cho xác suất xuất hiện cao nhất vì vậy từ này sẽ được chọn.