Input: Ảnh đầu vào
1. Phát sinh shape khởi tạo bằng cách định vị khuôn mặt qua phương pháp phát hiện khuôn mặt
2. Repeat:
3. For: với mỗi điểm landmark của shape khởi tạo
a. For: Với mỗi điểm ảnh nằm trên whisker đi qua điểm landmark
i. Tạo profile của điểm đó bằng cách lấy mẫu vùng ảnh xung quanh nó
ii. Đánh giá profile mới tạo so với tập huấn luyện
b. Chọn ra profile tốt nhất.
4. Chọn điểm landmark tương ứng với profile tốt nhất làm điểm
Output : tọa độ của các điểm kiểm thử và shape kiểm thử
(2.8)
Chi tiết về việc tìm shape khởi tạo sẽ được trình bày ở phần sau.
b. Shape model:
Nhiệm vụ của shape model là biến shape kiểm thử được sinh ra từ profile model thành khuôn mặt (face shape) chính thức. Trước đó, ta cần phải align tất cả các shape trong tập huấn luyện.Việc align là cần thiết vì ảnh huấn luyện rất đa dạng gây khó khăn cho việc tính shape trung bình. Sau khi align xong, ta tính được shape trung bình từ tập shape đã align. Khi đó, một shape bất kì có thể được định nghĩa bằng cơng thức sau [19][20]:
= + Φ
Trong đó:
là shape được sinh ra
̅ là shape trung bình được tính từ các shape huấn luyện đã được align:
= ∑ % (2.10)
% &
Φ là ma trận vector riêng (matrix of eigenvectors) của ma trận hiệp phương sai
(convariance matrix) tính từ tập huấn luyện
= ∑ ( − )( − ) (2.11)
Từ ma trận hiệp phương sai, ta tính được các trị riêng (eigenvalues) của nó. Sắp xếp các trị riêng giảm dần, với mỗi trị riêng, ta tính được các vector riêng. Tập hợp các vector riêng, ta có được ma trận vector riêng.
Lưu ý rằng, ta khơng sử dụng hết các trị riêng tìm được. Sau khi sắp xếp giảm dần, ta sẽ thấy có một số trị riêng cao hơn hẳn các giá trị cịn lại. Ta chỉ sử dụng các vector riêng tính từ các trị riêng này. Để lựa chọn được các trị riêng như vậy, ta thỏa mãn bất đẳng thức sau:
(2.11)
(2.12) Trong đó:
λi: Trị riêng thứ i
fv: tỉ lệ thay đổi mong muốn (thường chọn là 0.98)
Với cơng thức (2.9), ta có thể suy ra được rất nhiều shape khác nhau bằng cách thay đổi giá trị tham số vector b. Vậy, để có được khn mặt chính thức từ shape kiểm thử, ta tiến hành đi tìm b.
Gọi x là shape kiểm thử, Ta tìm b sao cho khoảng cách sau là nhỏ nhất
Cơng thức trên có nghĩa rằng, shape được sinh ra từ b phải có khoảng cách so với shape kiểm thử là nhỏ nhất. Phép align T là cần thiết vì x có thể ở bất cứ đâu trong ảnh và ta phải tiến hành đưa shape mới tìm được về đúng vị trí của khn mặt trên ảnh.
Để tìm b, ta làm các bước sau [20]: - Gọi Y là shape kiểm thử. - Khởi tạo vector tham số b = 0.
- Phát sinh shape theo công thức = + Φ với b vừa khởi tạo
- Tìm các tham số của phép align (s, Φ, tx, ty) T để x align vào shape kiểm thử. Tuy nhiên, ta không thực hiện phép align này.
- Thế các tham số vừa tìm được vào phép align ngược lên shape kiểm thử Y: (2.14) Phép align ngược lên một shape là phép biến hình sao cho:
ℎ+ = (ℎ+) (2.15)
Ta chỉ cần đảo các tham số và thế vào công thức phép biển đổi tương tự để thực hiện phép align này (1/s, -Φ, -tx, -ty)
- Thực hiện phép tỉ lệ:
=( ).
Lưu ý, phép nhân ( . ) là tích vơ hướng giữa 2 vector. - Cập nhật lại tham số b:
(2.16) - Đặt b trong một ngưỡng nhất định.
Sau khi tính b ta tiến hành đưa nó về một ngưỡng nhất định để chắc rằng, shape được sinh ra là gần với shape kiểm thử x nhất. Trong quá trình thực hiện, các phần
tử trong b được đặt trong ngưỡng từ [−3 , 3 ] [19][20].
Hình 2.13 Bên trái: shape kiểm thử
CHƯƠNG 3:
KINH NGHIỆM THỰC HIỆN TRONG Q TRÌNH TRIỂN KHAI PHƯƠNG PHÁP
Chương này sẽ trình bày cách thức triển khai 2 thuật tốn. Đồng thời truyền đạt lại những kinh nghiệm và khó khăn gặp phải trong quá trình cài đặt và thực hiện phương pháp MoCap này.
3.1 Quá Trình Thực Hiện Viola-Jones:3.1.1 Huấn luyện: 3.1.1 Huấn luyện:
a. Tạo bộ huấn luyện:
Như đã trình bày ở trên, ta sẽ làm việc với các đặc trưng Haar-Like của tập ảnh huấn luyện. Để lấy các đặc trưng Haar-Like cũng như kết xuất file chứa thông tin của q trình huấn luyện, ta down bộ cơng cụ tại trang blog:
http://nayakamitarup.blogspot.com
Đây là trang blog chia sẻ kinh nghiệm của một kĩ sư làm việc trong lĩnh vực xử lí ảnh [4].
Giải nén ta được như sau:
Hình 3.1
Chuẩn bị một bộ ảnh để huấn luyện gồm 2 loại ảnh: Negative Image (ảnh không chứa khuôn mặt người - ảnh nền) và Positve Image (Ảnh chứa khuôn mặt người). Negative cần khoảng 3000 ảnh, Positive cần 1000-2000 ảnh.
Hình 3.2 Positive Image
Hình 3.3 Negative Image
Bỏ tất cả các ảnh positive trong thư mục /temp/positive/rawdata.
Chạy file objectmarker.exe trong /temp/positive/. Bắt đầu tiến hành đánh dấu khuôn mặt trong các ảnh huấn luyện. Ấn space để kết thúc đánh dấu. Ấn Enter để qua ảnh tiếp theo. Tất cả thông tin về vùng đánh dấu sẽ được lưu trong info.txt
Hình 3.4 Thơng tin về vùng ảnh được bắt
Hình 3.5 File info.txt
Bỏ tất cả ảnh Negative vào thư mục temp\negative chạy file create_list.bat. Công đoạn này sẽ liệt kê tất cả các ảnh negative có trong thư mục. Kết quả sẽ được kết xuất ra file info.txt như sau:
Tạo file mô tả .vec cho tập huấn luyện:
D:\TaiLieu\ThucTap\Tool\Make Training\temp\createsamples.exe -info positive/info.txt -vec data/vector.vec -num 527 -w 24 -h 24
Với:
-info là file mô tả các vùng khuôn mặt đã được đánh dấu trước đó ở ảnh positive -vec tên của file vec được tạo thành
-num là số ảnh positive
-w -h lần lượt là chiều rộng và dài của vùng mẫu output Bắt đầu huấn luyện:
D:\TaiLieu\ThucTap\Tool\Make Training\temp\haartraining.exe -data
data/cascade -vec data/vector.vec -bg negative/infofile.txt -npos 527 - nneg 1142 -nstages 30 -mem 1000 -mode ALL -w 24 -h 24 –nonsym
Với:
-data nơi kết xuất file huấn luyện -vec file mô tả các ảnh positive -bg là file mô tả các ảnh negative -npos là số ảnh positive
-nneg là số ảnh negative
-nstage số bộ phân lớp mạnh được tạo thành. Số càng lớn, nhận diện càng chính xác nhưng việc kết xuất file huấn luyện sẽ mất thời gian hơn
-num dung lượng bộ nhớ dùng cho việc huấn luyện, tính theo MB
-mode các chế độ lựa chọn cho đặc trưng HaarLike dùng cho việc huấn luyện. Có 3 chế độ là BASIC|CORE|ALL. Trong đó, BASIC chỉ sử dụng các đặc trưng là hình chữ nhật đứng và ALL là sử dụng tất cả các đặc trưng HaarLike mà OpenCV hỗ trợ bao gồm cả các hình chữ nhật nghiêng 45 độ.
-w –h độ rộng và dài của các vùng ảnh chứa đối tượng. Tham số này phải giống như tham số ở trong file vec.
Hình 3.6 Quá trình huấn luyện ảnh
Xuất hiện file AdaBoostCARTHaarClassifier.txt và vector.vec. Thế toàn bộ file trong haar\cascade2xml\data bằng các file trong haar\temp\data\cascade. Copy 2 file AdaBoostCARTHaarClassifier.txt và vector.vec vào thư mục haar\cascade2xml. Chạy file convert.bat để kết xuất ra file output.xml [2][4][5][6] [8].
Như vậy, kết thúc quá trình huấn luyện, ta được bộ phân lớp AdaBoost được ghi dưới dạng file XML. Sau đây, ta sẽ tìm hiểu về cấu trúc tổ chức dữ liệu cũng như cách thức truy xuất thông tin trong file huấn luyện XML của OpenCV.
Dưới đây là một đoạn của bộ phân lớp: <opencv_storage> <haarcascade_frontaleye type_id="opencv-haar- classifier"> <size> 20 20</size> <stages> <_> <!-- stage 0 --> <trees> <_> <!-- tree 0 --> <_> <!-- root node --> <feature> <rects> <_> 0 8 20 12 -1.</_> <_> 0 14 20 6 2.</_></rects> <tilted>0</tilted></feature> <threshold>0.1296395957469940</threshold> <left_val>-0.7730420827865601</left_val> <right_val>0.6835014820098877</right_val></_></_> <_> <!-- tree 1 --> <_> <!-- root node --> <feature> <rects> <_> 9 1 4 15 -1.</_> <_> 9 6 4 5 3.</_></rects> <tilted>0</tilted></feature> <threshold>- 0.0463268086314201</threshold> <left_val>0.5735275149345398</left_val> <right_val>- 0.4909768998622894</right_val></_></_> <_> <!-- tree 2 --> <_> <!-- root node --> <feature> <rects> <_> 6 10 9 2 -1.</_>
<_> 9 10 3 2 3.</_></rects> <tilted>0</tilted></feature> <threshold>-0.0161730907857418</threshold> <left_val>0.6025434136390686</left_val> <right_val>- 0.3161070942878723</right_val></_></_> <_> <!-- tree 3 -->
File XML chứa đặc trưng Haarlike của hàng nghìn ảnh huấn luyện dùng để tìm ra khn mặt của ảnh đầu vào.
Các đặc trưng Haar-like được sử dụng trong OpenCV:
Hình 3.7 Các đặc trưng Haar-Like được sử dụng
File XML gồm các thẻ: - Titled:
Bằng 0 nếu sử dụng đặc trưng là hình chữ nhật đứng. Bằng 1 nếu sử dụng đặc trưng là hình chữ nhật nghiêng 45. - Threshold:
Ngưỡng cho phép. - Left_val:
Nếu ảnh đầu vào có đặc trưng Haar-like <= ngưỡng thì lấy giá trị này - Right_val:
Nếu ảnh đầu vào có đặc trưng Haar-like > ngưỡng thì lấy giá trị này - Feature: Mô tả đặc trưng Haarlike
Để truy xuất file XML và phục vụ cho việc boosting, OpenCV xây dựng các cấu trúc như sau:
#define CV_HAAR_FEATURE_MAX 3
/* một đặc trưng HaarLike gồm 2-3 hình chữ nhật với 1 trọng số weight*/
typedef struct CvHaarFeature
{
int tilted; /* 0 đặc trưng là hình chữ nhật đứng, 1 đặc trưng
là hình chữ nhật nghiêng 45 độ */
/* If rect[2].weight !=0, thì đặc trưng này chứa 3 hình chữ nhật, ngược lại thì chứa 2 */
struct { CvRect r; float weight; } rect[CV_HAAR_FEATURE_MAX]; } CvHaarFeature;
/* cấu trúc cây phân lớp trả về giá trị phản hồi dựa trên đặc trưng HaarLike của vùng ảnh đang xét*/
typedef struct CvHaarClassifier
{
int count; /* số lượng nodes của cây */ /* left[i] – lá trái của cây
right[i] – lá phải của cây
threshold[i] – Ngưỡng rẽ nhánh. Nếu đặc trưng HaarLike của vùng ảnh đang xét <= threshold thì thì lá trái được chọn. Ngược lại là lá phải
alpha[i] – giá trị trả về của lá */
CvHaarFeature* haar_feature; float* threshold; int* left; int* right; float* alpha; } CvHaarClassifier;
/* a boosted battery of classifiers(=stage classifier): the stage classifier returns 1
if the sum of the classifiers responses
is greater than \texttt{threshold} and 0 otherwise */ typedef struct CvHaarStageClassifier
{
int count; /* số lượng các bộ phân lớp trong stage */ float
threshold; /* threshold for the boosted classifier */ CvHaarClassifier* classifier; /* array of classifiers */
/* these fields are used for organizing trees of stage classifiers,
rather than just stright cascades */
int next; int child; int parent;
}
CvHaarStageClassifier;
typedef struct CvHidHaarClassifierCascade
CvHidHaarClassifierCascade;
/* Cấu trúc một cascade chứa các stage */
typedef struct CvHaarClassifierCascade
{
int flags; /* chữ kí */
int count; /* số lượng stage */
CvSize orig_window_size; /* kích cỡ của các đối tượng được
huấn luyện */
CvSize real_window_size; /* kích cỡ thực của đối tượng đang
xét */
double scale; /* tỉ lệ của đối tượng */ CvHaarStageClassifier*
stage_classifier; /* mảng các stage */
CvHidHaarClassifierCascade* hid_cascade; /* cascade ẩn được
tạo thành bởi hàm cvSetImagesForHaarClassifierCascade */
}
Các hàm phục vụ cho boosting trong OpenCV:
CvHaarClassifierCascade* cvLoadHaarClassifierCascade(const char*directory, CvSize orig_window_size)
- directory: đường dẫn tới file huấn luyện
- orig_window_size: kích thước ban đầu của các đối tượng được huấn luyện Hàm này có tác dụng load file huấn luyện
int cvRunHaarClassifierCascade (CvHaarClassifierCascade*cascade, CvPoint pt, int
start_stage=0)
- pascase: Cascade được dùng
- pt: tọa độ góc trên bên trái của vùng ảnh đang xét - start_stage: Vùng ảnh bắt đầu được xét từ stage này
Hàm có tác dụng đưa vùng ảnh đang xét qua các bộ phân lớp. Nếu vùng ảnh qua được tất cả các bộ phân lớp thì trả về giá trị dương, ngược lại thì trả về 0 hoặc giá trị âm
Void cvReleaseHaarClassifierCascade (CvHaarClassifierCascade**cascade) - Cascade: Cascade đang được sử dụng
Hàm này có tác dụng giải phóng cascade đang dùng [7][3].
Các hàm, trên đều được sử dụng trong hàm detect_and_draw sẽ được trình bày ở
phần sau.
3.1.2 Sử dụng Viola-Jones trong OpenCV:
Sau khi hoàn thành việc huấn luyện, ta sẽ sử dụng file huấn luyện cho việc phát hiện khuôn mặt. OpenCV đã hỗ trợ đầy đủ các câu lệnh trong việc truy xuất bộ phân lớp XML và kết xuất kết quả ra ảnh nên việc thực hiện khá đơn giản. Ở phần này, ta sẽ xây dựng hàm phục vụ cho việc phát hiện khuôn mặt dựa trên các câu lệnh của OpenCV và bộ phân lớp vừa huấn luyện.
Xây dựng hàm: void detect_and_draw( IplImage* img ) với img là ảnh đầu vào. Hàm này được viết như sau:
CvSeq *faces = cvHaarDetectObjects( img, cascade, storage, 1.1, 3, 1 / *CV_HAAR_DO_CANNY_PRUNNING*/, cvSize( 40, 40 ) );
Khai báo khuôn mặt của người được xác định trên ảnh . Khuôn mặt được xác định bằng hàm:
IntPtr cvHaarDetectObjects(IntPtr image, IntPtr cascade,
IntPtr storage, double scaleFactor, int
int flags,
MCvSize minSize)
Trong đó:
img: Ảnh đầu vào. cascade: Bộ huấn luyện. storage: Bộ đệm.
scaleFactor: Hệ số tỉ lệ của cửa sổ kết quả.
minNeighbors: Số lượng hình chữ nhật kết quả nhỏ nhất của một nhóm. Nhóm
nào có số lượng hình chữ nhật nhỏ hơn tham số này sẽ bị loại bỏ.
minSize: Kích cỡ nhỏ nhất của hình chữ nhật qt qua ảnh để lấy các đặc trưng
Haarlike.
Hàm này hoạt động như sau: Scan tồn bộ ảnh bằng một vùng có kích thước cố định. Xét xem vùng đó có chứa khn mặt hay khơng bằng cách đưa qua máy phân lớp AdaBoost theo hàm cvRunHaarClassifierCascade. Trong đó, hàm cvRunHaarClassifierCascade sẽ kiểm tra xem vùng ảnh đó có đi qua hết các bộ phân lớp yếu hay không? Bộ phân lớp sẽ dựa trên tập huấn luyện XML để quyết định. Để đảm bảo phát hiện được tất cả các khn mặt với kích thước khác nhau, hàm sẽ qt ảnh trên nhiều độ phân giải. Kết quả xuất ra là tất cả các vùng ảnh đã qua được tất cả các bộ phân lớp yếu. Các vùng ảnh này được chồng lên nhau trên ảnh kết quả. Trong các vùng đó, sẽ có những vùng sai hoặc bị lệch đơi chút. Hàm sẽ tự động phân nhóm các vùng đó và cho ra kết quả cuối cùng là vùng trung bình của nhóm đó [3].
Tìm tất cả các gương mặt trong ảnh và xác định vị trí của khn mặt
/* với mỗi khn mặt tìm được, vẽ một hình chữ nhật */ for(
i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) { CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );
cvRectangle( img,
cvPoint( r->x, r->y ),
cvPoint( r->x + r->width, r->y + r->height ), CV_RGB( 255, 0, 0 ), 1, 8, 0 );
}
/* hiển thị */
cvShowImage( "pic", img ); Trong hàm main:
CvHaarClassifierCascade *cascade; CvMemStorage *storage;
//Dẫn đường dẫn tới bộ huấn luyện có sẵn trong OpenCV
const char* cascade_name =
"D:/Soft/Programmer/Run/Library/OpenCV/opencv/data/haarcascades/haarcascade_fro ntalface_alt2.xml";
/*dung lượng bộ nhớ đệm cho việc detect */
storage = cvCreateMemStorage( 0 );
IplImage *img = cvLoadImage("D:\\Code\\OpenCV\\HaarLike Pic\\Resource\\2.jpg"); detect_and_draw(img);
cvWaitKey();
cvReleaseImage(&img); cvDestroyWindow("result");
Hình 3.8 Result window
3.2 Quá Trình Thực Hiện ASM:
3.2.1 Vài điều cần chuẩn bị trước khi huấn luyện:
a. Chuẩn bị dữ liệu khuôn mặt:
Dữ liệu khuôn mặt phục vụ cho phương pháp bao gồm 2 phần: dữ liệu hình ảnh và dữ liệu tọa độ các điểm landmark của khn mặt. Có thể sử dụng các database được làm sẵn hoặc tự tạo cho mình một database riêng. Với database được làm sẵn, có 3 database phổ biến sau:
- AR face database [19][27]:
Là bộ dữ liệu hình ảnh về khn mặt người do Fgnet (một nhóm làm việc ở Châu Âu) phát triển. Bộ dữ liệu gồm 4000 ảnh màu, độ phân giải 768x576. Ảnh chụp là ảnh chính diện khn mặt của 126 người dưới nhiều sắc thái biêu cảm khác nhau, độ sáng thay đổi với phông nền cố định. Dữ liệu tọa độ là 22 điểm landmark được đánh bằng tay trên tất cả các ảnh và ghi ra file riêng.
Bộ dữ liệu này là miễn phí. Tuy nhiên, cần có sự đồng ý của tác giả để sử dụng được bộ huấn luyện này.
Hình 3.9 AR landmark [19]
- XM2VTS database [19][27]:
Là bộ dữ liệu khá lớn phục vụ cho nhiều mục đích khác nhau. Ngồi bộ dữ liệu hình