Phát hiện và nhận dạng đối tượng với đặc trưng Haar-Like

Một phần của tài liệu nghiên cứu thư viện opencv ứng dụng nhận dạng khuôn mặt người (Trang 38)

3.2.1 Huấn luyện dữ liệu

Các bước để tiến hành huấn luyện [7]:

Bước 1. Thu thập ảnh huấn luyện Positive (ảnh có đối tượng) và Negative

(ảnh không có đối tượng);

Bước 2. Ghi nhận và đánh dấu vị trí của đối tượng trên ảnh (Positive images) – (có thể sử dụng ObjectMaker.exe hay ImageClipper Tools, trong bài luận văn này sử dụng tool Positive Builder);

Bước 3. Tạo một tập tin Vector (*.vec) dựa trên những điểm đã đánh dấu trong ảnh để sử dụng tập tin createsamples.exe;

Bước 4. Huấn luyện phân lớp với việc sử dụng tập tin haartraing.exe (đều chỉnh thông số sao cho phù hợp với số lượng ảnh Positives và Negatives);

Bước 5. Sử dụng tập tin *.xml để thực hiện phân lớp và nhận dạng với hàm DetectHaarCascade(….);

Mục đích của việc huấn luyện là tập tin XML để thực hiện nhận dạng – đây là tập tin quyết định việc nhận dạng như thế nào. Chi tiết các bước thực hiện trong đề tài như sau:

Bước 1: Thu thập ảnh

Để xác định đối tượng trên ảnh và để huấn luyện bằng các đặc trưng Haar-Like đòi hỏi bước đầu tiên là cần phải thu thập đầy đủ số lượng ảnh cần thiết. Ở đây đề tài sẽ lựa chọn huấn luyện với 1500 ảnh Positives và 4500 ảnh Negatives để thực hiện việc huấn luyện.

Trang 30

Hình 3.2: Thư mục chứa ảnh và các tập tin liên quan

Ở đây có tập tin negatives.txt và positives.txt sẽ thực hiện việc ghi vết lại vị trí của đối tượng một cách cụ thể ở bước tiếp theo. Và một tập tin Positives.vec để tiến hành sử dụng hàm createsample.exe trong quá trình huấn luyện.

Đây là đường dẫn tải các tool cần thiết để huấn luyện, trong đó có ObjectMaker.exe và tool để ghép các tầng lại để tạo ra tập tin xml

https://www.cs.auckland.ac.nz/~m.rezaei/Tutorials/Haar-Training.zip

Nhưng ở đây sẽ sử dụng tool Positive Builder để thực nghiệm đề tài, được giới thiệu ở trang:

http://www.prodigyproductionsllc.com/articles/programming/how-to-train- opencv-haar-classifiers/

- Quá trình thu thập sẽ được thực hiện như sau:

Trang 31

Thư mục positives: sẽ thực hiện lưu trữ các tập tin ảnh có chứa đối tượng cần nhận dạng trong ảnh

Hình 3.4: Ảnh chứa đối tượng – Positives

Thư mục Negatives: sẽ thực hiện lưu trữ các tập tin ảnh không có chứa đối tượng cần nhận dạng trên từng ảnh

Hình 3.5: Ảnh không có đối tượng – Negatives

Bước 2: Thực hiện ghi nhận và đánh dấu vị trí của đối tượng

Để thực hiện được việc nhận dạng trên đối tượng cần lưu lại ví trí của đối tượng trên ảnh, chúng ta chỉ quan tâm tập tin Positives về vị trí của đối tượng.

Trang 32

Trong đó:

- Chỉ xác định với một đối tượng trên ảnh nên tất cả thông số đều là một và kế tiếp là dãy số về tọa độ của đối tượng được xác định trong ảnh;

- Đối với những ảnh không có đối tượng cũng được lưu lại trong Negative nhằm thực hiện phân biệt hai nhóm ảnh.

Trang 33 (adsbygoogle = window.adsbygoogle || []).push({});

Bước 3: Tạo một Vector ảnh Positives

Hình 3.8: Gói thư viện tạo vectơ với Positives

Chúng ta sẽ sử dụng tập tin sample_creation.bat để thực hiện việc tạo tập tin Vector. Tập tin gồm có cú pháp như sau:

createsamples.exe -info positives.txt -vec vector.vec -num 1500 -w 24 -h 24

Trong đó:

-info positive.txt: đường dẫn đến tập tin positives.txt như trên;

-vec data/vector.vec: đường dẫn để xuất ra tập tin vector;

-num 1500: số lượng ảnh Positives là 1500;

-w 24: chiều rộng của đối tượng được scale;

-h 24: chiều cao của đối tượng scale.

Tập tin batch sẽ thực hiện nhiệm vụ tải tập tin chứa vị trí của đối tượng trong ảnh

(positives.txt) và một gói đối tượng ảnh thông qua một tập tin Vector. Sau khi tập tin Batch được thực thi chúng ta sẽ có một tập tin vector.vec (*.vec) trong cùng thư mục như hình trên (positives.vec).

Để có thể chạy được tập tin batch này, đòi hỏi phải có các gói thư viện đi kèm để thực thi được hàm createsample.exe – bao gồm các thư viện cần như: cv.dll, cv097.dll, highgui.dll, highgui097.dll, libguide40.dll và cxcore097.dll.

Bước 4: Huấn luyện phân lớp với việc sử dụng tập tin haartraining.exe

haartraining.exe -data cascades -vec vector.vec -bg negative.txt -npos 1500 -nneg 4500 -nstages 20 -mem 1100 -mode ALL -w 24 -h 24 –nonsysm

Trong đó:

Trang 34

- vec vector.vec: đường dẫn trỏ đến vị trí của tập tin Vector.vec;

- bg negative.txt: đường dẫn cho những tập tin nền (không chứa đối tượng); - npos 1500: Số lượng bức ảnh mà có đối tượng trong ảnh (positive images); - nneg 4500: Số lượng bức ảnh mà không có đối tượng trong ảnh (negative images

– phải >= npos);

- nstages 20: Số lượng giai đoạn dự kiến phân định để huấn luyện;

- mem 1100: Số lượng bộ nhớ được cấp phát để thực hiện (tính bằng MB); - mode ALL : sử dụng tất cả chế độ - bao gồm đặc trưng mở rộng;

- w 24 -h 24: Kích thước để Test hay Sample;

- nonsym: sử dụng thuộc tính này khi đối tượng nhận dạng không nằm trong chiều ngang đối xứng.

Bước 5: Tạo tập tin XML

Sau khi huấn luyện thành công Haar-training thông qua các bước trên và nằm trong thư mục ../training/cascades/. Chúng ta sẽ có một danh sách các tập tin được đánh số từ 0 đến n-1 (n là số lượng giai đoạn (stages) đã định nghĩa trong Haartraining.bat).

Thực hiện sao chép danh sách các tập tin từ 0 đến n-2 vào ../cascade2xml/data/. Chúng ta sẽ thực hiện kết hợp tất cả các tập tin đó lại để thực hiện tạo ra tập tin XML – tập tin để nhận dạng đối tượng và là tập tin cuối cùng cần đạt được sau khi huấn luyện.

haarconv.exe haarcascade NhanDangNguoi.xml 24 24

NhanDangNguoi.xml là tập tin xuất ra từ thư mục data với việc sử dụng hàm haarconv.exe kết hợp với hai thông số w và h. Để chạy lệnh trên ta sẽ mở tập tin batch convert.bat.

Với tập tin XML sau khi huấn luyện đã có thể sử dụng để thực hiện nhận dạng đối tượng. (adsbygoogle = window.adsbygoogle || []).push({});

Hình 3.9: Cấu trúc phân tầng tập tin Xml

Stage

Tree Node feature

Trang 35 3.2.2 Hệ thống nhận dạng đối tượng Đối tượng Người Xử lý nhận dạng đối tượng OpenCv + Emgu Kết quả thực thi ứng dụng Lưu trữ hình ảnh, video vào ổ đĩa và gửi SMS Trong đó:

(1): Thực hiện tác vụ rút trích đặc trưng, khoanh vùng nhận dạng đối tượng.

(2): Thực hiện việc lưu ảnh vùng đối tượng được xác định.

(3): Thực hiện lưu video khi đối tượng được nhận dạng.

(4): Kết nối điện thoại và gửi tin nhắn báo cáo cho người dùng.

(5): Bật tín hiệu báo động sau khi gửi tin nhắn.

Haar-Like features Cascade of Boosted Classifier Cấu trúc phân tầng Adaboost Kích hoạt chụp ảnh Kích hoạt

lưu video Kích hoạt gửi SMS (1)

(2) (3) (4)

Kích hoạt tín hiệu báo động

Trang 36

3.3 Thực nghiệm hệ thống 3.3.1 Huấn luyện dữ liệu 3.3.1 Huấn luyện dữ liệu

- Ở giao diện chương trình ấn phím Q để chuyển đến frame ảnh kế tiếp thu được từ webcam.

- Thu thập ảnh Positive, dùng chuột đánh dấu đối tượng trên picturebox sau đó ấn phím P để lưu.

Hình 3.10: Đánh dấu vị trí đối tượng

- Phím R dùng để đánh dấu lại vị trí đối tượng khi đánh dấu sai. - Đối với ảnh Negative, dùng phím N để lưu.

Trang 37

- Ở giao diện tool huấn luyện ấn phím V để tiến hành tạo file Vectơ:

Hình 3.12: Tạo file vectơ

- Sau đó ấn phím ESC để thoát cửa sổ tạo vectơ và ấn phím T để bắt đầu huấn luyện. Thời gian huấn luyện rất lâu, còn tuỳ thuộc vào số lượng ảnh đem đi huấn luyện :

Trang 38

Kết quả:

Hình 3.14: Các Stage (tầng) được tạo ra

- Cuối cùng ta dùng file convert để ghép các stage lại thành file xml

Trang 39

3.3.2 Thực nghiệm nhận dạng đối tượng với Emgu CV:

- Thông tin máy tính và ứng dụng cài đặt trong nghiên cứu: (adsbygoogle = window.adsbygoogle || []).push({});

Loại Tên và kích thước sử dụng Ghi chú

Hiệu máy tính Laptop Dell Inspiron 14R (N4110);

Bộ xử lý (CPU) Intel(R) Core(TM) i5-2430M CPU @2.40Ghz, 2.40GHz; Bộ nhớ (RAM) 4.00 GB;

Hệ điều hành Windows 8.1 Pro (64 bit);

Webcam Dell Webcam 1.3 MP;

Tốc độ Webcam 20 frame/s;

Ngôn ngữ LT C#, EmguCV version 2.4.10.1940 - Khai báo chương trình:

Image<Bgr, Byte> currentFrame; // Khai báo một frame hiện hành Capture NhanDang; // Khai báo cho camera

HaarCascade face; // Khai báo nhận dạng

Image<Gray, byte> result; // Khai báo kết quả ảnh mức xám Image<Gray, byte> gray = null; // Khai báo ảnh mức xám

int d = 1, SL = 1; // biến d dùng để lưu hình đối tương, SL là biến số lượng

WMPLib.WindowsMediaPlayer wplayer;// Khai báo cho việc phát tập tin báo động GsmCommMain comm;// Khai báo biến để kết nối điện thoại

VideoWriter VW; // Khai báo biến lưu video - Khai báo trong form:

comm = new GsmCommMain(5, 115200); // kết nối máy tính với điện thoại với 5 là cổng kết nối, 115200 là thông số thiết bị

wplayer = new WMPLib.WindowsMediaPlayer();// Khởi tạo biến phát báo động face = new HaarCascade("NhanDangNguoi.xml");// tải tập tin xml Cascade

Trang 40 - Nút nhận dạng

private void button1_Click(object sender, EventArgs e) {

NhanDang = new Capture(); NhanDang.QueryFrame();

Application.Idle += new EventHandler(FrameNhanDang); // gọi chức năng nhận dạng button1.Enabled = false; } - Chức năng bật báo động void baodong() { wplayer.URL = @"C:\Users\Phuc\Downloads\Music\baodong.mp3"; wplayer.controls.play(); }

- Chức năng lưu video bool flag = false;

private void button2_Click(object sender, EventArgs e) // nút lưu { GhiVideo(); flag = true; }

void GhiVideo() {

string url = "C:\\Video\\";

int height = 400; int width = 650; saveFileDialog1.Filter = "AVI|*.avi";

if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {

Trang 41

VW = new VideoWriter(url, CvInvoke.CV_FOURCC('M', 'P', '4', '2'), (Convert.ToInt32(trackBar1.Value)), width, height, true); // định dạng lưu, trackBar1 điều chỉnh tốc độ của video được lưu

} }

- Chức năng kết nối với điện thoại qua dây cáp void OpenConnect()

{ comm.Open(); } (adsbygoogle = window.adsbygoogle || []).push({});

private void btnSMS_Click(object sender, EventArgs e)

{ OpenConnect(); MessageBox.Show("Kết nối thành công"); } - Nút chụp đối tượng

bool flagChup = false; int solan = 1;

private void btnChup_Click(object sender, EventArgs e) { if (solan == 1)

{

flagChup = true; solan = 2;

MessageBox.Show("Bắt đầu chụp ảnh","Chụp ảnh" ); } else if (solan == 2)

{

flagChup = false; solan = 1;

MessageBox.Show("Dừng chụp ảnh", "Dừng"); }

}

- Nội dung chính của chương trình

void FrameNhanDang(object sender, EventArgs e) {

label3.Text = "0"; // số đối tượng tìm thấy

Trang 42

gray = currentFrame.Convert<Gray, Byte>(); //chuyển ảnh về mức xám //dò tìm đối tượng trên ảnh mức xám

MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(face,1.2, 10,Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,new Size(24, 24));

foreach (MCvAvgComp f in facesDetected[0]) // f là kết quả nhận dạng {

SL++; // tăng biến số lượng

label4.Text = SL.ToString(); // label số frame nhận dạng được // Khoanh vùng đối tượng bằng hình chữ nhật rect

result = currentFrame.Copy(f.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);

currentFrame.Draw(rec, new Bgr(Color.Red), 2);//vẽ khung nhận dạng màu đỏ if (SL == 20) { // Nếu số frame nhận dạng được lớn hơn 20 thì gửi tin nhắn string TinNhan = "Co ke trom, Thoi gian - " + DateTime.Now.ToLongTimeString() + "-" + DateTime.Now.ToLongDateString(); GuiTinNhan(TinNhan,"01692002***"); baodong();// bật báo động }

if(SL==150) SL = 21; // để tránh việc quay về 20 lại gửi tin nhắn if (flagChup == true)

{ result1.ToBitmap().Save("f:\\hinh\\" + d + ".jpg"); d++; } //Đếm số lương mặt người hiển thị trên khung hình

label3.Text = facesDetected[0].Length.ToString(); }

imageBoxFrameNhanDang.Image = currentFrame; // khai báo ghi video if (flag == true)

{

VW.WriteFrame(currentFrame); }

Trang 43 - Khởi động chương trình:

Hình 3.16: Giao diện chương trình (adsbygoogle = window.adsbygoogle || []).push({});

1.

Tác vụ: Khi người dùng click vào nút này, hệ thống sẽ kích hoạt mở webcam và bắt đầu nhận dạng. Đầu tiên, ảnh thu được từ Webcam sẽ được chuyển về ảnh xám, hệ thống sẽ dò tìm đặc trưng của khuôn mặt trên ảnh xám và khoanh vùng đối tượng nếu phát hiện được. Số lượng đối tượng tìm thấy sẽ hiển thị ở góc trái bên dưới và số frame nhận dạng được sẽ được đếm tăng dần ở góc bên còn lại.

Công cụ sử dụng: Ba thư viện của gói thư viện Emgu – nền tảng C# của gói thư viện nguồn mở OpenCV là: Emgu.CV.dll, Emgu.Util.dll, Emgu.CV.UI.dll để sử dụng các thuật toán cho việc nhận dạng đối tượng.

Hình 3.17: Nhận dạng đối tượng 1 2 3 4 5 6 7

Trang 44

2.

Tác vụ: Khi người dùng click vào nút 2, hệ thống sẽ bắt đầu lưu ảnh đối tượng vào thư mục qui định sẵn.

Công cụ sử dụng: Dựa trên các thuật toán của gói thư viện Emgu.

Trang 45

3.

Tác vụ: Người dùng phải kéo thanh trackbar để điều chỉnh số frame ảnh trước khi tiến hành lưu video (đây là yếu tố quyết định tốc độ video thu lại).

Hình 3.19: Thanh trackbar

4.

Tác vụ: Sau khi chọn nút số 4, hệ thống sẽ hiện cửa sổ lựa chọn chỗ lưu và tên video cho người dùng tự chọn. Sau khi chọn Save thì video bắt đầu được lưu.

Công cụ sử dụng: Dựa trên các thuật toán của gói thư viện Emgu.

5.

Tác vụ: Nút số 5 được sử dụng khi người dùng muốn dừng lưu video, sau khi click hệ thống sẽ hiện cửa sổ thông báo video đã lưu thành công.

Công cụ sử dụng: Dựa trên các thuật toán của gói thư viện Emgu.

Hình 3.20: Lưu thành công video

6.

Tác vụ: Nút số 6 thực hiện bật kết nối với điện thoại (điện thoại được kết nối cáp với máy tính).

Công cụ sử dụng: Sử dụng thư viện GSMComm để thực hiện kết nối và gửi tin nhắn từ một chiếc điện thoại dùng làm server.

Trang 46

Hình 3.21: Kết nối và gửi tin nhắn

7.

Tác vụ: Nút số 7 thực hiện chức năng bật tín hiệu báo động với tập tin âm thanh (mp3) có sẵn.

Công cụ sử dụng: Sử dụng thư viện Interop.WMPLib.dll để thực hiện phát tập tin báo động

Trang 47

KẾT LUẬN VÀ ĐỀ NGHỊ

1. KẾT LUẬN (adsbygoogle = window.adsbygoogle || []).push({});

Qua quá trình nghiên cứu, tìm hiểu và thực hiện đề tài, tôi đã hoàn thành các mục tiêu đặt ra với các kết quả cụ thể như sau:

 Tìm hiểu quá trình hình thành, cấu trúc, nội dung và các hàm của gói thư viện mã nguồn mở OpenCV. Nghiên cứu, triển khai ứng dụng với gói thư viện Emgu trên nền tảng OpenCV.

 Tìm hiểu bài toán nhận dạng khuôn mặt người dựa trên các đặc trưng được trích xuất trên mặt phẳng ảnh từ những công trình nghiên cứu.

 Nghiên cứu cách rút trích đặc trưng để nhận dạng khuôn mặt. Áp dụng đặc trưng Haar-Like kết hợp thuật toán Adaboost và bộ phân tầng Cascades of Boosted Classifiers để thực hiện phát hiện và nhận dạng đối tượng. Dựa trên bài toán của Viola –Jones để thực hiện phân tích và nhận dạng mặt người theo thời gian thực với việc đáp ứng tốt về mặt thời gian nhận dạng nhằm triển khai hiệu quả cho bài toán chống trộm (ưu điểm về mặt thời gian – tốc độ xử lý) bởi các đặc trưng Haar- Like được tính nhanh nhờ tích phân ảnh, thuật toán Adaboost giúp chọn ra các đặc trưng và phân loại hiệu quả bằng cách xây dựng bộ phân loại mạnh dựa trên những bộ phân loại yếu kết hợp mô hình Cascades of Boosted Classifiers giúp loại bỏ các mẫu đơn giản và rút ngắn thời gian xử lý.

 Thu thập ảnh (6000 ảnh – với 1500 có đối tượng và 4500 ảnh không đối tượng), huấn luyện đối tượng nhằm xuất ra tập tin xml phục vụ cho việc nhận dạng đối tượng.

 Xây dựng hệ thống nhận dạng đối tượng trên thời gian thực dựa trên phương án đã đề xuất. Kết quả của hệ thống gồm: Rút trích đặc trưng, phát hiện, nhận dạng đối tượng; khoanh vùng đối tượng; lưu lại hình ảnh và video khi đối tượng bị phát hiện trên mặt phẳng ảnh; gửi tin nhắn SMS thông báo và bật tín hiệu báo động.

2. ĐỀ NGHỊ

Một số đề xuất dựa theo ý tưởng và kết quả đạt được từ để tài theo hai hướng nghiên cứu và ứng dụng thực tế.

 Hướng nghiên cứu:

- Hệ thống tập trung nghiên cứu gói thực hiện OpenCV. Do vậy, số lượng ảnh thu thập vẫn còn hạn chế dẫn đến kết quả nhận dạng ở bước phát hiện đối

Một phần của tài liệu nghiên cứu thư viện opencv ứng dụng nhận dạng khuôn mặt người (Trang 38)