android, coding,

ML Kit: Open Mouth Detection

Hangga Aji Sayekti Hangga Aji Sayekti Follow Oct 14, 2021 · 1 min read
ML Kit: Open Mouth Detection
Share this

Open mouth detection atau deteksi mulut terbuka adalah salah satu contoh pengembangan dari face detection. Dan biasanya menjadi bagian dari liveness detection.
Alhamdulillah kali ini masih diberi kesempatan untuk ekperimen seputar ML on Mobile Device. Salah satu yang menjadi objek ekperimen saya saat ini adalah Google ML Kit.

Open Mouth Detection di Google ML kit

Jika anda meng-enable-kan option FaceDetectorOptions.CONTOUR_MODE_ALL, maka anda dapat mengakses semua titik kontur wajah yang terdeteksi.

Gambar dibawah ini menunjukkan semua titik kontur wajah yang dihasilkan oleh Google ML Kit – Face Detection.

Kemudian kumpulan titik-titik yang jumlahnya ada 9 titik pada UPPER_LIP_BOTTOM dan bisa kita tampung dalam List seperti ini.

List upperLipBottomContour = face.getContour(FaceContour.UPPER_LIP_BOTTOM).getPoints();

Begitu juga dengan LOWER_LIP_TOP.

List lowerLipTopContour = face.getContour(FaceContour.LOWER_LIP_TOP).getPoints();
Menghitung Lebar Mulut

Salah satu cara termudah menghitung lebar mulut adalah menghitung jarak antara UPPER_LIP_BOTTOM (bibir atas bagian bawah) dan LOWER_LIP_TOP (bibir bawah bagian atas).

Hitung menggunakan formula/rumus jarak 2 titik.

d = √[(x2 − x1)2 + (y2 − y1)2]

Jika UPPER_LIP_BOTTOM dan LOWER_LIP_TOP memiliki 9 titik, maka kita asumsikan titik tengahnya ada di indek ke 4, sehingga, koordinat (x, y) yg diambil adalah index ke 4.

float x1 = upperLipBottomContour.get(4).x;
float y1 = upperLipBottomContour.get(4).y;

float x2 = lowerLipTopContour.get(4).x;
float y2 = lowerLipTopContour.get(4).y;

Lalu tinggal implementasikan rumusnya.

Double d = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));

Agar bisa di-reusable, bisa dibuat method seperti ini

private boolean isMouthOpen(Face face) {
	double d;
    List upperLipBottomContour = face.getContour(FaceContour.UPPER_LIP_BOTTOM).getPoints();
    List lowerLipTopContour = face.getContour(FaceContour.LOWER_LIP_TOP).getPoints();
        
    float x1 = upperLipBottomContour.get(4).x;
    float y1 = upperLipBottomContour.get(4).y;
        
    float x2 = lowerLipTopContour.get(4).x;
    float y2 = lowerLipTopContour.get(4).y;
    d = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
    return d > 30.0;
}

Berikut contoh hasilnya pada real time face detection.

Selamat mencoba.

Referensi:
https://developers.google.com/ml-kit/vision/face-detection
https://www.cuemath.com/geometry/distance-between-two-points/

Hangga Aji Sayekti
Written by Hangga Aji Sayekti
A passionate Software Engineer from Indonesia with experience since 2008. Bachelor's degree in Mathematics and loves Science and Computers.