NHẬN DIỆN KÍ tự BẰNG SVM (có code) ......................................................... NHẬN DIỆN KÍ tự BẰNG SVM (có code) ......................................................... NHẬN DIỆN KÍ tự BẰNG SVM (có code) ......................................................... NHẬN DIỆN KÍ tự BẰNG SVM (có code) ......................................................... NHẬN DIỆN KÍ tự BẰNG SVM (có code) .........................................................
ĐỒ ÁN NHẬN DIỆN KÍ TỰ BẰNG SVM MỤC LỤC DANH MỤC CÁC HÌNH VẼ HÌNH 2.2.1 SVM TRONG KHƠNG GIAN 3D HÌNH 2.2.2 PHÂN LỚP SVM TRONG KHÔNG GIAN 2D HÌNH 2.3.1 BIỂU DIỄN VỚI BÌA KERNELS HÌNH 2.3.2.1 BIỂU DIỄN BIÊN ĐỘ, GÓC TRONG HISTOGRAM OF GRADIENTS .8 HÌNH 2.3.2.2 BIỂU DIỄN BIÊN ĐỢ, GÓC TRONG HISTOGRAM OF GRADIENTS HÌNH 3.1 CODE QUÁ TRÌNH TRAINNING 11 HÌNH 3.1.1 CODE QUÁ TRÌNH TRAINNING 12 HÌNH 3.1.2 CHẠY QUÁ TRÌNH TRAINNING TẠO RA HOG SVM 12 HÌNH 3.1.3 CODE TESTTING .13 HÌNH 3.1.4 TẠO KÝ TỰ TESTTING VÀ DỰ ĐỐN 13 HÌNH 3.1.5 KẾT QUẢ SAU QUÁ TRÌNG TRAINING VÀ TESTTING 14 DANH MỤC CÁC BẢNG BIỂU BẢNG 2.3.2 MÔ TẢ THỨ TỰ CÁC BIN .13 BẢNG 4.1 CÁC GIÁ TRỊ SAU KHI ĐƯỢC TRAINNING VÀ TESTTING………………………15 DANH MỤC CÁC TỪ VIẾT TẮT SVM HOG CV Support Vector Machine Histogram of Oriented Gradients Computer Vision ĐỒ ÁN Trang 5/22 CHƯƠNG GIỚI THIỆU ĐỀ TÀI NHẬN DIỆN KÍ TỰ BẰNG SVM Giới thiệu đề tài: - Để máy tính dễ dàng thực hiện các thuật toán, người lập trình sử dụng thư viện OpenCV tối ưu hóa code Người lập trình sẽ tạo chuỗi hình ảnh các tập tin được huấn luyện (training) bao gồm tất cả các kí tự để làm sở dự liệu gốc Dựa vào các thuật toán phân tích hình ảnh phân lớp, máy tính sẽ học được các hình ảnh số đấy tương ứng với các kí tự thật tế Khi đã tạo được các kí tự thật làm sơ gốc, người lập trình sẽ đưa các hình ảnh kí tự testing vào và những kí tự này hoàn toàn khác với những kí tự được tranning ban đầu hoặc dùng phần mềm vẽ Draw để tạo kí tự Testting Từ đó, máy tính sẽ dựa vào thuật toán, so sánh, và tự nhận diện, xác thực kí tự qua biểu đồ định hướng HOG và thuật toán phân lớp SVM So sánh với kết quả ban đầu và đưa kết luận Các cơng trình liên quan: - Đề tài nhận diện bảng số xe - Đề tài nhận diện khuôn mặt người - Đề tài vật thể bằng màu sắc, nhận dạng vân tay Yêu cầu đề tài: - Nhận dạng các ký tự bằng giải thuật SVM Hướng giải quyết: - Tìm hiểu lý thuyết về SVM, HOG, các tập tin training, testing, tìm hiểu giải thuật và code - Lập trình phần mềm Microsoft Visual C++ kết hợp thư viện OpenCV bằng ngôn ngữ C++, Python… - Kiểm tra và đánh giá kết quả NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 6/22 CHƯƠNG NỢI DUNG CỦA ĐỀ TÀI 2.1 TÌM HIỂU VỀ THƯ VIỆN OPENCV - OpenCV là một những thư viện hàng đầu được dùng để hỗ trợ máy tính xử lý hình ảnh, phân tích hình ảnh, được kèm với Microsoft Visual - Studio Chức thông dụng của OpenCV: Xuất, nhập, hiển thị hình ảnh, phát hiện các vật thể, tính toán các giá trị của hình ảnh, phục hồi hình ảnh - … 2.2 TÌM HIỂU VỀ TḤT TỐN SVM SVM viết tắt (Support Vector Machine): được dùng để phân tích hình - ảnh, phân lớp dữ liệu SVM sử dụng thuật toán nhị phân, xây dựng thành những mô hình mặt - phẳng khác nhau, phân loại dữ liệu thành hai lớp riêng biệt SVM sẽ tìm mặt phẳng tối ưu nhất cắt lớp riêng biệt, cho khoảng cách từ hai lớp này đến mặt phẳng song song với nhau, khoảng cách giữa - các điểm/lớp đến mặt phẳng phải xa nhất có thể Trong hình 2.2, mặt phẳng H3 được chọn là mặt phẳng tối ưu nhất, chia Hình 2.2.1 SVM không gian 3D [1] cắt các chấm thành lớp riêng biệt Và khoảng cách giữa các nốt NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 7/22 - đen, trắng cách cự ly xa, rất đảm đảo so với H1 và H2 SVM có quá trình: Quá trình Trainning và quá trình Testting Hình 2.2.2 Phân lớp SVM không gian 2D[2] + Quá trình tranning là quá trình đưa dữ diệu đầu vào là các tập thư mục hình ảnh vào, để huấn luyện cho máy tính + Quá trình testting là quá trình đưa bất kì hình ảnh mới nhất và không trùng với hình ảnh đã được huấn luyện Mục đích là để máy tính kiểm tra, có nhận dạng được dữ liệu đó sau đã được h́n lụn hay khơng 2.3 TÌM HIỂU VỀ THUẬT TOÁN HOG NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 8/22 - HOG (Histogram of Oriented Gradients): là một bộ mô tả đặt trưng (feature desciptor) biểu diễn hình ảnh hoặc một phần hình ảnh đã được đơn giản hóa bằng cách trích những thông tin hữu ích và lọc những thông tin không liên quan và dùng để xác định các đối tượng, xữ lý hình ảnh - Chức và ứng dụng của việc sử dụng HOG: + Làm giãn chiều dài vector đặt trưng + Lưu các giá trị đặt trưng bao gồm biên độ, và góc pha + Tối ưu và thay đổi độ xung Norm + + + Các bước tính toán giá trị của HOG: Bước 1: Tính các giá trị Gradient Images Bước 2: Tính giá trị của HOG 8x8 cells Bước 3: Quét khối và tính giá trị 16x16 đưa block về chuẩn hóa 2.3.1 TÍNH CÁC GIÁ TRỊ GRADIENT IMAGES - Thuật toán HOG feature descritor sẽ chuyển đổi đặc tính gốc của một ảnh có kích thước cố định sang vector đặt trưng có kích thước cố định Ví dụ: Ta sử dụng hình ảnh có kích thước: 64x128 Thông thường để tạo feature descriptor ta phải có: 64x128x (channels) = 24 576 Vì vậy để tối ưu HOG feature descritor sẽ chuyển đổi sang vector đặt trưng - tưng ứng có kích thước 3780 Để tính toán HOG descriptor, đầu tiên cần tính chiều ngang, chiều dọc gradient x , gradient y Bằng cách sử dụng bìa Kernels -1 -1 1 Hình 2.3.1 Biểu diễn với bìa Kernels - Sử dụng Gradient ảnh của gx và gy để tính tính Biên Độ và Góc Pha bằng công thức: g= NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 9/22 - Thông thường nằm khoảng đến 180 , HOG biểu diễn này tương ứng đến 160 tương ứng với bin 2.3.2 TÍNH GIÁ TRỊ CỦA HOG TRONG 8X8 CELLS: - Lý chọn 8x8 vì ảnh 8x8 cells ta có: 8x8x3 = 192 giá trị pixel vừa đủ diễn hình ảnh mà mắt người nhìn thấy được dưới dạng hình ảnh - nhỏ thu gọn Mỗi pixel có giá trị Gradient nên ta có 8x8x2 = 128 numbers 128 numbers được biểu diễn thành 9-bin histogram Mỗi bin tương ứng Hình 2.3.2.1 Biêu diên biên đô, goc Histogram of Gradients[3] - với các góc: 0, 20, 40, 60… 160 Dựa vào giá trị biên độ và góc ta sẽ đóng góp vào các bin tương ứng có giá trị từ -160 - Ví dụ : Xét giá trị tại điểm màu xanh Khi có Góc = 80 (Gradient Direction) và Biên độ (Gradient Magnitude) = Biên độ =2 sẽ đóng góp NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 10/22 vào pin thứ tương ứng góc Góc = 80 Xét tại điểm màu đỏ ta có: Góc = 10, Biên độ = 4, thì sẽ đóng góp bin (bin 0,1) vào giữa 0-20 - Trường hợp góc vượt khoảng (160-180) thì sẽ đóng góp vào bin và bin Trường hợp: Góc 165, biên độ 85 thì Bin được đóng góp 63.75, Bin 0: đóng góp: 21.25 Hình 2.3.2.2 Biêu diên biên đô, goc Histogram of Gradients[3] BIN NUMBERS BIN BIN BIN BIN BIN BIN BIN NHẬN DIỆN KÝ TỰ BẰNG BIN SVM BIN Degrees 20 40 60 80 100 120 140 160 ĐỒ ÁN Trang 11/22 Bảng 2.3.2 Mô tả thứ tự BIN 2.3.3 QUÉT KHỐI VÀ TÍNH GIÁ TRỊ 16X16 BLOCK - Từ việc hình thành 8x8 cells để có vector 9x1 phần tử, mỗi phần tử được chia theo biên độ của vector, thay vì vậy ta xây dựng chuẩn hóa thành khối block 16x16 tương ứng với 36x1 thành phần vector Bằng cách trượt khối 16x16 qua lần lượt từng 8x8 cells nối vào (50% chồng lên khối trước) Từ đó sẽ tính được độ dài vector cuối cùng của - vector Xét ảnh đầu vào có kích thước 64x128 pixels Ta có lần trượt ngang khối 16x16 block và 15 lần trượt theo chiều dọc Mỗi khối block 16x16 có 36x1 vector Độ dài vector cuối cùng được tính: 15x7x36 = 3780 chiều vector CHƯƠNG KẾT QUẢ MÔ PHỎNG TRÊN PHẦN MỀM MICROSOFT VISUAL C+ 3.1 - Mô phỏng trình trainning, testting: Tập dữ liệu được huấn luyện ghi và lưu vào file resullt.txt NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 12/22 - Sử dụng ký là các số từ đến huấn luyện làm data gốc Hình 3.1 Code quá trình Trainning - Máy tính chạy đến thư mục chứa các hình ảnh được huấn luyện từ đó chạy tìm HOG, tính toán các giá trị HOG - Lưu lại giá trị HOG sau được trainning NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 13/22 Hình 3.1.1 Code trình Trainning - Run dữ liệu được tranining để tạo file HOG_SVM_DATA Hình 3.1.2 Chạy quá trình Trainning tạo HOG SVM NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 14/22 Hình 3.1.3 Code testting 3.2 KẾT QUẢ MÔ PHỎNG - Kết quả dự đoán được tạo sau quá trình trainning và testting: Hình 3.1.4 Tạo ký tự testting và dự đoán NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 15/22 NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 16/22 Hình 3.1.5 Kết sau trìng training testting CHƯƠNG ĐÁNH GIÁ KẾT QUẢ 4.1 NHẬN XÉT, ĐÁNH GIÁ: KẾT QUA TỶ LỆ CHÍNH XÁC THÀNH CÔNG 10 9/10 90% 17 16/17 94,11% 20 19/20 95% 11 8/11 72,7% 22 22/22 100% 18 17/18 94,44% 13 10/13 76,9% 11 9/11 81,11% 16 15/16 93,75% 14 12/14 85,71% Bảng 4.1 Các giá trị sau được trainning testting TEST SÔ - SÔ LẦN Nhận xét: Nhìn vào kết quả đánh giá ta có thể thấy rằng NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 17/22 + Tỷ lệ nhận dạng thành công chính xác các ký tự rơi vào các ký tự số 0,1,2,4,5,8 90% + Tý lệ nhận dạng số 3,6,7 khả chính xác 70%-85% + So sánh với thực tế tỉ lệ này chấp nhận được - Ưu điểm: Việc sử dụng thư viện OpenCV hỗ trợ tối đa các thuật toán giúp máy tính xử lý nhanh - Đánh giá: Thực hiện mô phỏng sát với đề tài và thực tế đưa Kết quả tương đối chính xác 4.2 HƯỚNG PHÁT TRIỂN ĐỀ TÀI: - Sử dụng Camera để chụp ảnh, đưa ảnh qua xử lý ảnh xám, sử dụng SVM và nhận dạng ký tự - Mở rộng nhận dạng thêm các ký tự từ A đến Z NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 18/22 TÀI LIỆU THAM KHẢO [1] Https://ongxuanhong.wordpress.com/2015/09/19/support-vector-machine-svmhoi-gi-dap-nay/ [2] Https://www.learnopencv.com/image-recognition-and-object-detection-part1/ [3] Https://www.learnopencv.com/histogram-of-oriented-gradients/ Https://opencv.org Https://en.wikipedia.org Https://www.google.com.vn Https://www.stdio.vn NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 19/22 PHỤ LỤC CODE LẬP TRÌNH #include #include #include #include #include using namespace std; using namespace cv; #include "mousedraw.h" // chen duong dan mousedraw.h // Dinh nghia vi tri cua file resulttxt #define resulttxt "C:/Users/CHUC/Documents/visual studio 2013/Projects/DA/DA/tools/result.txt" void buildImg() // Buil hinh anh { BoxExtractor box; // tao khung box Mat res = box.MouseDraw("draw", Mat(400, 400, CV_8UC3, Scalar(0, 0, 0)), Scalar(255, 255, 255), 18); //Ten Tieu de draw, kich thuoc box 400x400 imwrite("C:/Users/CHUC/Documents/visual studio 2013/Projects/DA/DA/test.jpg", res); // ghi tu anh goc o duong dan o C va tao anh moi test.jpg } void testTrain() //trainning hinh anh { vector img_path; //nhap ten bien tap tin vector img_catg; //nhap ten bien tap tin int nLine = 0; // nhap ten bien , so dong string buf; ifstream svm_data(resulttxt);//du lieu mau duoc dao tao (svm trainning) se duoc ghi tap tin resulttxt unsigned long n; while (svm_data)// cac tap tin mau duoc dao tao duoc doc theo thu tu lan luot { if (getline(svm_data, buf)) { NHẬN DIỆN KÝ TỰ BẰNG SVM ĐỒ ÁN Trang 20/22 nLine++; // tang gia tri so dong : len don vi if (nLine % == 0) { img_catg.push_back(atoi(buf.c_str()));// chuoi so nguyen atoi (0,1,2,3,4,5,6,7,8,9) data } else { img_path.push_back(buf); //duong dan anh } } } svm_data.close(); // dong tep CvMat *data_mat, *res_mat; int nImgNum = nLine / 2; //nImgNum la so luong mau hinh anh, nua la so dong (nLine), nua la nhan data_mat = cvCreateMat(nImgNum, 324, CV_32FC1); cvSetZero(data_mat); res_mat = cvCreateMat(nImgNum, 1, CV_32FC1); cvSetZero(res_mat); IplImage* src; IplImage* trainImg = cvCreateImage(cvSize(28, 28), 8, 3);//kich thuoc mac dinh hinh anh 28x28,nen dinh nghia HOG la 324 for (string::size_type i = 0; i != img_path.size(); i++) { src = cvLoadImage(img_path[i].c_str(), 1); if (src == NULL) { cout