How to Make Face Clustering Using Python

Make folders of images based on faces like google photos

Hervind Philipe
Data Folks Indonesia
4 min readAug 5, 2019

--

Jika Kita menyimpan foto di google drive dan membuka nya dengan google photos pasti familiar dengan fitur ini

Face Grouping Google Photos

Google dapat mengelompokan wajah orang bahkan binatang peliharaan! Setelah di klik salah satu wajah nya akan muncul foto-foto yang ada wajah tursebut.

Kita akan melakukan hal yang sama menggunakan python!

Secara garis besar, langkah-langkah nya adalah:

1. Download gambar-gambar yang ingin di kelompokan

2. Mengekstrak wajah dari gambar menjadi vector embedding

3. Melakukan clustering DBSCAN (Density-based spatial clustering of applications with noise)

4. Memberi nama cluster yang terbentuk

Full codes dapat di akses di github saya

1. Download Gambar-gambar yang Ingin di Kelompokan

Pengumpulan data dapat dilakukan dengan mendownload gambar dari google images. Kali ini gambar yang akan di kelompokan bertema debat capres-cawapres 2019 dengan keyword:
· debat 2019
· Jokowi
· Ma Ruf Amin
· Prabowo Subianto
· Sandiaga Uno

Cara download gambar nya kita lakukan menggunakan package google-image-download di python dengan script seperti berikut:

Selain menggunakan gambar yang di download, kalian juga bisa menggunakan gambar yang ada di gallery foto.

Kemudian seluruh gambar yang telah di download, di pindahkan ke folder images

2. Mengesktrak wajah dari gambar menjadi vector embedding

Untuk mendeteksi wajah dari gambar, kita menggunakan model Resnet SSD (residual network singles shot detection) yang diperuntukan hanya untuk wajah [link]

Tujuan akhir dari ini adalah melakukan clustering wajah wajah yang ada, namun bukan menggunakan gambar wajah nya, melainkan menggunakan vector embedding yang diekstrak dari gambar wajah tersebut.

Berikut script nya:

Parameter confidence digunakan untuk menyaring hasil face detection dari model SSD, semakin kecil nilai confidence semakin banyak wajah yang akan di proses untuk dilakukan embedding, dapat juga gambar yang bukan wajah ikut di proses.

Model SSD dan model Facenet yang sudah di train dapat di download melalui link SSD dan link Facenet.

Model SSD yang kita gunakan di train dengan framework caffe dan computer vision dapat digunakan untuk load model tersebut yang kemudian di namakan variable net. Sedangkan model Facenet telah di convert dari tensorflow menjadi Keras (link) jadi di load menggunakan package keras yang kemudian dinamakan variable facenet.

Setiap gambar yang akan dimasukan ke net harus dijadikan blob dulu menggunakan opencv dengan fungsi cv2.dnn.blobFromImage dan diatur kembali ukuran images nya sesuai dengan input model SSD tersebut.

Dari setiap wajah yang terdeteksi dan melebihi threshold confidence yang di tetapkan akan dicrop dan diekstrak vector embedding nya berdasarkan model FaceNet.

Hasil dari embeddings tersebut akan disimpan untuk digunakan di script clustering.

3. Melakukan Clustering DBSCAN

Di script untuk melakukan clustering, kita load kembali dictionary embedding yang telah dilakukan di script sebelumnya.

Embedding tersebut dimasukan kedalam algoritma clustering DBSCAN yang sudah disediakan oleh sklearn.

Konsep DBSCAN secara high level sangat intuitif.

Misalkan kita mau melakukan clustering dari titik-titik yang berada di ruang dua dimensi.

Titik yang masih berada dalam jarak yang kita tentukan (hyperparameter: eps=0.68) akan menjadi cluster yang sama. Misalkan jarak yang kita tentukan sebesar jari-jari lingkaran, titik A akan membuat titik sekitar nya menjadi cluster yang sama dengan titik A. Titik B dan C juga berada dalam cluster yang sama dengan titik A karna dari titik A kita dapat membuat lompatan ke titik B ataupun C dengan jarak lompatan tidak lebih dari jari-jari (jarak) yang di tentukan.

Titik N tidak berada di cluster yang sama dengan titik A karna letak titik N terlalu jauh. Andaikan terdapat satu titik yang menghubungkan titik A dan titik N, titik N akan menjadi satu cluster dengan titik A,B dan C.

Detail algoritma nya dapat diakses paper asli nya

Hasil dari clustering menggunakan gambar yang dikumpulkan adalah 5 cluster / wajah orang berbeda, padahal kita hanya sengaja mendownload 4 wajah orang (capres dan cawapres pemilu 2019)

4 Memberi Nama Cluster yang Terbentuk

Ini bagian yang paling mudah di case face clustering tapi bisa saja bagian yang paling sulit di kasus clustering lainnya.

Script di atas melakukan copy gambar dari folder utama ke folder sesuai cluster yang terbentuk.

Setelah itu kita visualisasikan 9 gambar di setiap cluster untuk mengetahui cluster ini mengandung wajah siapa.

Cluster 0 sampai 4 adalah cluster dari muka Bapak Ma’ruf Amin, Sandiaga Uno, Prabowo, Jowoki dan Bu Megawati

Ternyata diperoleh wajah Bu Megawati karena ada di foto yang kita download dengan keyword Jokowi dan Prabowo walaupun hanya ada 7 foto yang terdapat wajah Bu Megawati.

Dengan script python di artikel ini kalian sudah bisa melakukan yang face clustering seperti google photos, namun untuk clustering muka binatang peliharaan masih belum bisa, tapi patut di coba~

Terima kasih kepada Ziyad & Stezar sebagai teman diskusi selama ini!

Semoga artikel ini bermanfaat!

--

--