Tác giả áp dụng phƣơng pháp phân cụm phân cụm phân cấp để gom các khuôn mặt tƣơng tự nhau về các cụm khuôn mặt riêng biệt. Từ đó xác định khuôn mặt chung nhất trong tập ảnh. Thuật toán đƣợc mô tả dƣới hình 3.9:
Input: D- Ma trận đặc trƣng cỡ NxN Ouput: F - Khuôn mặt chung nhất For n 1 to N do
For i 1 to N do C[n][i] SIM(Dn,i); I[n] 1;
For k 1 to N – 1 do
<i , m> argAve{<i , m>: i ≠ m ˄ I[i] =1˄I[m] =1 } C[i][m] A.APPEND(<i , m>)
For j 1 to N do
C[i][j] SIM(i,m,j);C[j][i] SIM(i,m,j); I[m] 0;
id MaxFaces(A); FGetFaces(id);
Return F;
Trong thuật toán trên, đầu tiên chúng ta tính ma trận khoảng cách C cỡ NxN.
Sau đó thực hiện N - 1 bƣớc để sáp nhập các cụm hiện tại có độ tƣơng tự nhỏ hơn một ngƣỡng cho trƣớc. Trong mỗi lần lặp, ta thu đƣợc hai cụm tƣơng tụ đƣợc sáp nhập và các hàng và cột của cụm i đã sáp nhập trong C đƣợc cập nhật. Các cụm đƣợc lƣu trữ
nhƣ một danh sách của việc sáp nhập trong A. Mảng I cho ta biết đƣợc trạng thái của cụm có thể đƣợc sáp nhập. Hàm SIM(i, j, m) tính độ tƣơng tự của cụm j và cụm mới sau khi sáp nhập cụm i với cụm m, ở đây tác giả dùng độ đo Centroid-linkage. Sau
khi có các cụm A khuôn mặt riêng biệt ta xác định chỉ số của cụm có số lƣợng khuôn mặt lớn nhất thông qua hàm MaxFaces(). Khuôn mặt F là khuôn mặt chung nhất trong tập ảnh đƣợc lấy trong cụm có số lƣợng khuôn mặt lớn nhất bằng hàm GetFaces()