Hệ thống nhận dạng chữ viết tay tiếng việt in hoa trực tuyến

87 879 0
Hệ thống nhận dạng chữ viết tay tiếng việt in hoa trực tuyến

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - NGUYỄN HOÀNG HẢI HỆ THỐNG NHẬN DẠNG CHỮ VIẾT TAY TIẾNG VIỆT IN HOA TRỰC TUYẾN LUẬN VĂN THẠC SĨ KHOA HỌC Kỹ thuật điện tử viễn thông Hà Nội - 2012 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - NGUYỄN HOÀNG HẢI HỆ THỐNG NHẬN DẠNG CHỮ VIẾT TAY TIẾNG VIỆT IN HOA TRỰC TUYẾN Chuyên ngành: Kỹ thuật điện tử viễn thông LUẬN VĂN THẠC SĨ KHOA HỌC Kỹ thuật điện tử viễn thông NGƯỜI HƯỚNG DẪN KHOA HỌC: TS PHẠM NGỌC NAM Hà Nội - 2012 LỜI CAM ĐOAN Học viên xin cam đoan công trình nghiên cứu độc lập Luận văn hoàn thành học viên hướng dẫn TS.Phạm Ngọc Nam Các tài liệu tham khảo, công thức, sử dụng luận văn ghi nguồn gốc cụ thể, rõ ràng Hà Nội, ngày tháng 03 năm 2012 Học viên cao học Nguyễn Hoàng Hải                               1    MỤC LỤC LỜI CAM ĐOAN .1  MỤC LỤC 2  DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT 5  DANH MỤC CÁC HÌNH VẼ 7  LỜI MỞ ĐẦU .8  CHƯƠNG 1: TỔNG QUAN VỀ NHẬN DẠNG CHỮ VIẾT 9  1.1 Lịch sử cần thiết ngành khoa học nhận dạng 9  1.2 Phân loại nhận dạng chữ viết 11  1.3 Mô hình tổng quan hệ thống nhận dạng chữ viết 12  1.4 Tóm tắt thông tin 13  CHƯƠNG 2: NHẬN DẠNG CHỮ VIẾT ONLINE 14  2.1 Các đặc điểm nhận dạng chữ viết online 14  2.1.1 Thu thập liệu đầu vào 14  2.1.2 Các thuộc tính chữ viết tay 15  2.1.3 Một số vấn đề nhận dạng 15  2.3 Tiền xử lý .16  2.3.1 Lọc liệu .16  2.3.2 Lấy mẫu 16  2.4 Chiết xuất thuộc tính 17  2.4.1 Cây nhị phân 17  2.4.2 Chuỗi mã 18  2.4.3 Trình tự thời gian zone 18  2.4.4 Mã hóa nét vẽ 18  2.4.5 chức thuộc tính 19  2.5 Nhận dạng 19  2.5.1 Bắt khúc quanh 21  2.5.2 Mạng Neural 21  2.5.3 Mô hình Markov ẩn 22  2    2.6 Hậu Xử lý .23  2.7 Tóm tắt thông tin 23  CHƯƠNG 3: GIỚI THIỆU MÔ HÌNH MARKOV 23  3.1 Giới thiệu 24  3.2 Khái niệm mô hình 26  3.3 Ba vấn đề HMM 36  3.4 Giải ba vấn đề HMM 38  3.3.1 Thuật toán tiến – thuật toán lùi: 38  3.2.2 Thuật toán Viterbi .41  3.3.2 Ước lượng lại với thuật toán Baum-Welch .43  3.5 Ứng dụng HMM nhận dạng chữ viết tay 45  3.6 Giới hạn mô hình Markov ẩn 46  3.7 Mô hình Markov cực đại hóa Entropy (MEMM) 47  3.7.1 Tổng quan mô hình Markov cực đại hóa Entropy (MEMM) .47  3.7.2 Vấn đề “label bias” 49  3.8 Tóm tắt thông tin 51  CHƯƠNG 4: ỨNG DỤNG HMM VÀO HỆ THỐNG NHẬN DẠNG 52  4.1 Sơ đồ khối hệ thống 52  4.2 Thu thập liệu đầu vào xử lý liệu 53  4.3 Tiền xử lý 55  4.3.1 Lấy mẫu điểm 55  4.3.2 Loại bỏ liệu dư thừa .56  4.4 Lấy thông tin từ ký tự quan sát .57  4.4.1 Lấy số nét vẽ 57  4.4.2 Mã hóa ký tự quan sát 58  4.5 Phân loại liệu .60  4.5.1 Lựa chọn mô hình thông số 61  4.6 Mô Hình Training 63  4.7 Postprocessor 66  3    4.8 Kết thực nghiệm .68  4.9 Tóm tắt thông tin 71  KẾT LUẬN .72  TÀI LIỆU THAM KHẢO .74  PHỤ LỤC : CODE C# THỰC HIỆN HỆ THỐNG .75  4    DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT   HMM Hidden Markov Model Stroke Nét vẽ ký tự NNA Neural network approach ChainCode Chuỗi từ mã mô tả quỹ đạo viết OHWR Online Hand writing Regconition Input Device Thiết bị đầu vào Feather Trích lọc thuộc tính extractor Preprocessor Khỗi tiền xử lý Postprocessor Hậu xử lý Character Ký tự nhận dạng OCR Optical character recognition MEMM Maximum Entropy Markov Model IBM International Business Machines Corporation FORTRAN Formula Translator/Translation LCD liquid crystal display ANN Artificial neural network 5    TDNN Time delay neural network picturebox Một đối tượng sử dụng lập trình Visual studio Tablet Thiết bị cầm tay cảm ứng Raw data Lọc liệu Point distance Đánh giá khoảng cách điểm Segmentation Phân đoạn liệu                                   6      DANH MỤC CÁC HÌNH VẼ Hình 1-1 Mô hình chung hệ thống nhận dạng chữ viết 13  Hình 2- Hai cách viết khác chữ in H 15  Hình 2- Đường bao chữ a .17  Hình 2- Cây định 18  Hình 2- Trình tự viết phân vùng đề nhận dạng chữ C 18  Hình 2- Minh họa mã hóa theo nét vẽ 19  Hình 2- Mô hình mạng Neuron 21  Hình 3- Một chuỗi Markov với trạng thái với chuyển trạng thái .27  Hình 3- ba mô hình Markov tương ứng với việc tung 1,2,3 đồng xu 32  Hình 3- Mô hình N- trạng thái minh họa các model HMM rời rạc .33  Hình 3- Mô hình thuật toán tiến 39  Hình 3- Mô tả thuật toán lùi .40  Hình 3- Thuật toán Viterbi 42  Hình 3- So khớp sử dụng thuật toán tiến lùi 43  Hình 3- Mô hình ứng dụng HMM nhận dạng chữ viết tay .46  Hình 3- Đồ thị có hướng mô tả mô hình MEMM .48  Hình 3- Vấn đề “label bias” 49  Hình 4- Sơ đồ khối hệ thống nhận dạng chữ viết 53  Hình 4- Nhập liệu đối tượng PictureBox .54  Hình 4- Các bước tiền xử lý .55  Hình 4- Ký tự “C” lấy mẫu với hai giá trị d khác .56  Hình 4- minh họa điểm liệu xấu .57  Hình 4- Tám hướng chuỗi mã .58  Hình 4- Mã ký tự C 58  Hình 4- Bảng mã từ quan hệ (∆ x, ∆ y) 59  Hình 4- Hai mức độ phân loại 61  Hình 4- 10 Mô hình bốn trạng thái dịch chuyển .62  Hình 4- 11 Thuật Toán HMMS Training 66  Hình 4- 12 Sơ đồ khối Postprocessor 68  Hình 4- 13 Bảng kết test với state=8 70        7      LỜI MỞ ĐẦU Bài toán nhận dạng chữ viết đời từ thập niên 50 kỷ trước, nhận nhiều quan tâm nhà nghiên cứu khoa học giới Đặc biệt năm gần với phát triển mạnh mẽ thiết bị cảm ứng, đặt thách thức khoa học nhận dạng Trên giới, hầu hết thiết bị điện tử cảm ứng đời kèm với phần mềm nhận dạng chữ viết tay, hàng loạt nhà sản xuất lớn Microsoft, Apple, tích hợp module nhận dạng chữ viết vào hệ thống họ để thu hút người dùng, điều cho thấy cần thiết khoa học nhận dạng chữ viết đời sống người Ở Việt Nam, Các nhà khoa học không đứng xu hướng phát triển đó, có số phần mềm nhận dạng chữ viết đời phần mềm nhận dạng chữ viết tiếng việt ABBYY, phần mềm nhận dạng chữ in OCR (Optical character recognition)….Các nghiên cứu nhằm tối ưu kỹ thuật nhận dạng chữ viết tiếng việt Tuy nhiên lĩnh vực nhận dạng chữ viết tay, chia thành hai hướng : nhận dạng chữ viết online nhận dạng chữ viết offline Hiện nhà khoa học Việt Nam chủ yếu tập trung nghiên cứu nhận dạng chữ viết offline- nhận dạng hình vẽ hay viết tay, nghiên cứu nhận dạng chữ viết online- nhận dạng theo hướng người viết ứng dụng nhiều thiết bị cảm ứng- nghiên cứu Trong luận văn tác giả tập trung nghiên cứu theo hướng nhận dạng chữ viết online, mục tiêu đồ án đưa cách tiếp cận việc nhận dạng chữ viết online dựa mô hình Markov Cấu trúc luận án chia làm phần: Chương I giới thiệu lịch sử cần thiết khoa học nhận dạng, Chương II giới thiệu tổng quan hệ thống nhận dạng chữ viết, Chương III lý thuyết giải thuật Markov, Chương IV ứng dụng giải thuật Markov việc nhận dạng chữ viết online, Phần cuối kết luận hướng phát triển luận văn 8    4.9 Tóm tắt thông tin Trong chương này, việc thực HMM dựa dòng hệ thống nhận dạng văn giới thiệu chi tiết Hệ thống bao gồm khối chức bao gồm máy tính bảng số hóa thiết bị đầu vào, tiền xử lý, chiết tính năng, phân loại postprocessor Tiền xử lý thực hiển xử lý khoảng cách điểm bình thường, liệu xấu loại bỏ phân đoạn cách sử dụng phương pháp tiếp cận phân khúc bên Các tính chiết xuất số lượng nét vẽ tính mã chuỗi cho HMMs Phân loại mức độ giúp cải thiện tỉ lệ nhận dạng, làm cho hệ thống linh hoạt Cuối cùng, postprocessor, cách sử dụng chi nhánh ràng buộc tìm kiếm với từ điển tra cứu, đóng vai trò quan trọng việc cải thiện tỉ lệ nhận dạng toàn hệ thống Để đơn giản hóa nhiệm vụ nhận dạng có tỉ lệ nhận dạng cao 71    KẾT LUẬN Với phát triển mạnh mẽ thiết bị cảm ứng nay, nhận dạng chữ viết online lĩnh vực hấp dẫn để nghiên cứu Tuy nhiên Việt Nam nhận dạng chữ viết chủ yếu nghiên cứu theo hướng nhận dạng chữ viết in, nhận dạng chữ viết offline văn ảnh viết sẵn, Trong nhận dạng chữ viết online có ưu điểm việc nhận định trình tự viết, nhận dạng trực tiếp chữ viết người dùng viết,… lại gặp nhiều khó khăn tốc độ xử lý liệu, tốc độ viết Luận án tập trung nghiên cứu nhận dạng chữ viết online, giới thiệu mô hình nhận dạng, tìm hiều mô hình Markov ứng dụng mô hình Markov lĩnh vực nhận dạng chữ viết tay online Từ nghiên cứu trên, Ta rút số kết luận sau: •Tiền xử lý hậu xử lý thiếu hệ thống nhận dạng chữ viết bước giúp cải thiện hiệu suất nâng cao tính xác toàn hệ thống •Trích lọc chữ viết tay đóng vai trò quan trọng việc công nhận tính xác Bằng cách lấy thuộc tính quỹ đạo viết mô hình hóa thành chuỗi mã kết hợp với số nét viêt cải thiện đáng kể tính xác hệ thống, giúp hệ thống nhận dạng nhiều phong cách viết • Rõ ràng phương pháp tiếp cận HMMs phương pháp mạnh mẽ để nhận dạng chữ viết tay online Bằng cách sử dụng dịch chuyển từ trái sang phải trạng thái HMMs rời rạc tương ứng với mô hình ký tự ta đạt độ xác cao nhận dạng chữ viết Hướng phát triển luận văn Với nội dung trình bày đồ án, Chúng ta thấy đươc ý nghĩa việc nhận dạng chữ viết online nhiên thực tế nhận dạng chữ viết hoàn hảo có nhiều ứng dụng kết hợp việc nhận dạng chữ viết thành nhận dạng từ Đây hướng phát triển luận văn Cùng với hương 72    phát triển tác giả tiếp tục nghiên cứu nhằm nâng cao tỷ lệ nhận dạng Từ kết thử nghiệm, nhìn thấy tỉ lệ nhận dạng ký tự C, O, D, P thấp giống ký tự cách viết Tỉ lệ nhận dạng ký tự cải thiện cách sử dụng tính liên quan đến điểm bắt đầu điểm kết thúc văn Các hệ thống luận án chưa linh hoạt hạn chế số lượng phong cách viết cần phát triển hệ thống thích ứng với nhiều phong cách viết Mở rộng cho phép người viết viết ký tự chữ thường Nhiều mô vậy, cần phải sử dụng để mô hình 33 ký tự chữ thường Sau hệ thống nhận từ bao gồm ký tự chữ hoa chữ thường Giải việc người thuận tay trái hay tay phải viết Tất vấn đề tác giả nghiên cứu tiếp tục phát triển Qua tác giả gửi lời cảm ơn chân thành đến TS.Phạm Ngọc Nam giúp đỡ hoàn thành luận văn Tôi xin chân thành cảm ơn anh César Roberto de Souza trường São Carlos (Brazil) cho phép sử dụng lại số hàm thư viện tính toán xác xuất luận văn                           73    TÀI LIỆU THAM KHẢO TS.Phạm Ngọc Nam, Online handwritting regconition,Thessis text, 2000 Lawrence R Rabiner, A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition, Proceeding of the IEEE, Vol.77, No.2, Feb 1989 Kristie Seymore, Andrew McCallum, and Roni Rosenfeld Learning Hidden Markov Model Structure for Information Extraction AAAI 99 Workshop on Machine Learning for Information Extraction, 1999 Http://vi.wikipedia.org/wiki/Mô_hình_markov_ẩn truy cập cuối ngày 16/03/2012 http://crsouza.blogspot.com/2010/03/hidden-markov-sequence-classifiers-inc.html truy cập cuối ngày 20/02/2012 Michael A, Arbib (Ed.) The Handbook of Brain Theory and Neural Networks, Prentice-Hall, 1995 Lawrence Rabiner and Biing-Hwang Juang, Fundamentals of Speech Recognition, Prentice-Hall, 1993 Editors Jacob Benesty, M Mohan Sondhi and Yiteng Huang, Handbook of Speech Processing, Springer-Verlag Berlin, 2008 J.J Hull Incorporation of markov model of language syntax in a text recognition algorithm In Proc Symp Document Analysis and Information retrieval, 1992 10 Haykin,  Neural Networks: A Comprehensive Foundation, Prentice Hall, 1999  11 Lawrence,  Jeanette  Introduction  to  Neural  Networks,  California  Scientific  Software Press. 1994.            74    PHỤ LỤC 1: CODE C# THỰC HIỆN HỆ THỐNG // Hàm trích xuất liệu add vào thành tập điểm public void AddSample(Point p, int pressure) { int mindis = 10; double dis; pointlist[NoSamples] = p; //Pressure[NoSamples] = pressure; NoSamples++; //point distance normalization if (NoSamples > 2) { dis = Math.Sqrt(GetYDerivative(NoSamples - 2) * GetYDerivative(NoSamples - 2) + GetXDerivative(NoSamples - 2) * GetXDerivative(NoSamples - 2)); if (dis < mindis) NoSamples ; } } // Hàm tính khoảng cách hai điểm lân cận DeltaX, DeltaY public long GetYDerivative(int sample) { if (sample < (NoSamples - 1)) { return (pointlist[sample + 1].Y - pointlist[sample].Y); } else { 75    return (-1); } } public long GetXDerivative(int sample) { if (sample < (NoSamples - 1)) { return (pointlist[sample + 1].X - pointlist[sample].X); } else { return (-1); } } //hai hàm lấy tọa độ X,Y từ pointlist public long GetX(int sample) { if (sample < NoSamples) { return (pointlist[sample].X); } else { return (-1); } } public long GetY(int sample) { 76    if (sample < NoSamples) { return (pointlist[sample].Y); } else { return (-1); } } // hàm tạo từ mã mô tả quỹ đạo viết public string createChan(int ns) { string s = ""; for (int i = 0; i < ns; i++) { if (GetXDerivative(i) > 0.0) { if (GetYDerivative(i) > 0.0) { if (GetXDerivative(i) > GetYDerivative(i)) { s = s + "1-"; } else { s = s + "0-"; } } else 77    { if (GetXDerivative(i) > -GetYDerivative(i)) { s = s + "2-"; } else { s = s + "3-"; } } } else { if (GetYDerivative(i) > 0.0) { if (-GetXDerivative(i) > GetYDerivative(i)) { s = s + "6-"; } else { s = s + "7-"; } } else { if (-GetXDerivative(i) > -GetYDerivative(i)) { s = s + "5-"; 78    } else { s = s + "4-"; } } } } return s; } // Hàm tách chuỗi chancode thành ma trận private int[] decode(String sequence) { string[] elements = sequence.Split('-'); int[] integers = new int[elements.Length]; for (int j = 0; j < elements.Length-1; j++) integers[j] = int.Parse(elements[j]); return integers; } // hàm add thêm điểm public void AddSample(Point p, int pressure) { int mindis = 10; double dis; 79    pointlist[NoSamples] = p; //Pressure[NoSamples] = pressure; NoSamples++; //point distance normalization if (NoSamples > 2) { dis = Math.Sqrt(GetYDerivative(NoSamples - 2) * GetYDerivative(NoSamples - 2) + GetXDerivative(NoSamples - 2) * GetXDerivative(NoSamples - 2)); if (dis < mindis) NoSamples ; } } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { timer1.Enabled = false; timer1.Interval = WritingTimeOut; timer1.Enabled = true; Graphics g = pictureBox1.CreateGraphics(); g.DrawEllipse(new Pen(Color.Brown), e.X, e.Y, 5, 5); Point p = new Point(e.X, e.Y); AddSample(p, 1); } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 80    { if (NoSamples == 0) { Point p = new Point(e.X, e.Y); AddSample(p, 1); } } private StringBuilder OCR = new StringBuilder(); private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { timer1.Interval = WritingTimeOut; timer1.Enabled = true; string chan = createChan(NoSamples); strokes++; Point p = new Point(e.X, e.Y); AddSample(p, 1); } public void train() { int rows = R.Count; int[][] sequences = new int[rows][]; int[] labels = new int[rows]; for (int i = 0; i < rows; i++) { HWOCRCharRecognition r = (HWOCRCharRecognition)R[i]; string label = r.RecognizeAs; for (int j = 0; j < hmmc.Models.Length; j++) { if (hmmc.Models[j].Tag.Equals(label)) 81    { labels[i] = j; break; } } sequences[i] = decode(r.chancode); } int iterations = 100; double limit = 0; for (int i = 0; i < 10; i++) { hmmc.Learn(sequences, labels, iterations, limit); } } private void btnCreate_Click(object sender, EventArgs e) { if (PCRFPath == null) { MessageBox.Show("Please input HMM file"); return; } LoadCharRecognitionTable(); ArrayList A = getclassbystroke(strokes, R); string c = ""; for (int i = 0; i < A.Count; i++) { HWOCRCharRecognition r = (HWOCRCharRecognition)A[i]; c += r.RecognizeAs; } 82    int a = A.Count; List s = new List(); for (int i = 0; i < a; i++) { HWOCRCharRecognition r = (HWOCRCharRecognition)A[i]; s.Add(r.RecognizeAs); } List sd = s.Distinct().ToList(); string[] categories = new string[sd.Count]; int[] states = new int[sd.Count]; for (int i = 0; i < sd.Count; i++) { categories[i] = sd[i]; states[i] = 2; } string chuoi = ""; for (int i = 0; i < categories.Length; i++) { chuoi += categories[i]; } //MessageBox.Show(chuoi); hmmc = new MarkovSequenceClassifier(sd.Count, 8, states, categories); train(); double likelihood; string sequencec = createChan(NoSamples); MessageBox.Show("Chuoi ma hoa: "+sequencec); int label = hmmc.Compute(decode(sequencec), out likelihood); string assignedLabel = hmmc.Models[label].Tag as string; regco = assignedLabel + " "; 83    txtCR.Text =regco; clean(); } // Viet Ham doc tu file text private void LoadCharRecognitionTable() { R.Clear(); FileStream fs = new FileStream(PCRFPath, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(fs,Encoding.Default); while (sr.Peek() > 0) { string Temp = sr.ReadLine(); string[] Temps = Temp.Split('#'); HWOCRCharRecognition CR = new HWOCRCharRecognition(Temps[0].ToString(), Int32.Parse(Temps[1]), Temps[2].ToString()); R.Add(CR); } sr.Close(); fs.Close(); } public ArrayList getclassbystroke(int strokes,ArrayList RC) { ArrayList A = new ArrayList(); for (int i = 0; i < RC.Count; i++) { HWOCRCharRecognition r = (HWOCRCharRecognition)R[i]; 84    if (r.strokes == strokes) { A.Add(r); } } return A; } // Hàm save chuỗi chancode private void button42_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { PCRFPath = openFileDialog1.FileName; FileStream fs = new FileStream(PCRFPath, FileMode.Append); StreamWriter sw = new StreamWriter(fs,Encoding.Default); string s = chancode_save + "#" + strokes_save.ToString() + "#" + textBox1.Text; sw.WriteLine(s); sw.Flush(); sw.Close(); fs.Close(); } MessageBox.Show("input to text file successed"); this.Close(); } 85    ... lại nhận dạng chữ viết tay trực tuyến nhận dạng dựa quỹ đạo người viết hệ thống lấy số nét vẽ, hướng viết … Phong cách viết hệ thống nhận dạng Trong hệ thống nhận dạng phong cách viết, hệ thống. .. Phân loại nhận dạng chữ viết Nhận dạng chữ viết bao gồm hai kiểu nhận dạng chữ in nhận dạng chữ viết tay Cho đến toán nhận dạng chữ in giải trọn vẹn với đời nhiều hệ thống nhận dạng đạt tới độ... ưu kỹ thuật nhận dạng chữ viết tiếng việt Tuy nhiên lĩnh vực nhận dạng chữ viết tay, chia thành hai hướng : nhận dạng chữ viết online nhận dạng chữ viết offline Hiện nhà khoa học Việt Nam chủ

Ngày đăng: 22/07/2017, 22:39

Từ khóa liên quan

Mục lục

  • Trang bìa

  • LỜI CAM ĐOAN

  • MỤC LỤC

  • DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT

  • DANH MỤC CÁC HÌNH VẼ

  • LỜI MỞ ĐẦU

  • CHƯƠNG 1 : TỔNG QUAN VỀ NHẬN DẠNG CHỮ VIẾT

  • CHƯƠNG 2: NHẬN DẠNG CHỮ VIẾT ONLINE

  • CHƯƠNG 3: GIỚI THIỆU MÔ HÌNH MARKOV

  • CHƯƠNG 4: ỨNG DỤNG HMM VÀO HỆ THỐNG NHẬN DẠNG

  • KẾT LUẬN

  • TÀI LIỆU THAM KHẢO

  • PHỤ LỤC 1: CODE C# THỰC HIỆN HỆ THỐNG

Tài liệu cùng người dùng

Tài liệu liên quan