Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android
Code

Pengantar Face Detection di Android

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Sandi Muamar (you can also view the original English article)

Diperkenalkan dengan perpustakaan Vision dalam Google Play Service 8.1, Face Detection membuatnya mudah bagi Anda sebagai seorang developer untuk menganalisis video atau gambar untuk mencari wajah-wajah manusia. Setelah Anda memiliki list dari wajah-wajah yang terdeteksi pada gambar, Anda dapat mengumpulkan informasi tentang setiap wajah, orientasi, kemungkinan tersenyum, apakah seseorang memiliki mata mereka terbuka atau tertutup dan spesifik Landmark di wajah mereka.

Informasi ini dapat berguna untuk beberapa aplikasi, seperti sebuah aplikasi kamera yang secara otomatis mengambil gambar ketika semua orang dalam frame tersenyum dengan mata mereka terbuka, atau untuk menambah gambar dengan efek konyol, seperti tanduk unicorn. Hal ini penting untuk dicatat bahwa Face Detection itu bukan facial recognition. Sementara informasi dapat dikumpulkan tentang wajah, informasi tersebut tidak digunakan oleh Perpustakaan vision untuk menentukan jika dua wajah datang dari orang yang sama.

Tutorial ini akan menggunakan gambar yang masih menjalankan Face Detection API dan mengumpulkan informasi tentang orang-orang dalam foto, sementara juga menggambarkan informasi tersebut dengan overlaid graphic. Semua kode untuk tutorial ini dapat ditemukan pada GitHub.

Example of a silly effect adding a unicorn horn to a face

1. proyek Setup

Untuk menambahkan Perpustakaan Vision untuk proyek Anda, Anda perlu untuk mengimpor Play Services 8.1 atau lebih besar ke proyek Anda. Tutorial ini akan mengimpor hanya Play Service Vision perpustakaan. Buka file build.gradle proyek Anda dan menambahkan baris berikut kompilasi ke node dependencies.

Setelah Anda telah menyertakan Play Service ke dalam proyek Anda, Anda dapat menutup proyek Anda build.gradle file dan membuka AndroidManifest.xml. Anda perlu menambahkan meta-data item mendefinisikan depedensi wajah di bawah simpul applicaton node dari manifest. Hal ini memungkinkan Perpustakaan Vision tahu bahwa Anda berencana untuk mendeteksi wajah dalam aplikasi Anda.

Setelah Anda selesai mengatur AndroidManifest.xml, Anda dapat silahkan tutup. Selanjutnya, Anda perlu membuat sebuah class baru yang bernama FaceOverlayView.java. Kelas ini extend View dan berisi logika untuk mendeteksi wajah dalam proyek, menampilkan bitmap yang dianalisis dan menggambar di atas gambar untuk mengilustrasikan poin.

Untuk sekarang, mulailah dengan menambahkan variabel anggota di bagian atas kelas dan mendefinisikan konstruktor. Objek Bitmap akan digunakan untuk menyimpan bitmap yang akan dianalisa dan objek SparseArray Face yang akan menyimpan setiap wajah yang ditemukan di bitmap.

Selanjutnya, tambahkan metode baru dalam FaceOverlayView disebut setBitmap(Bitmap bitmap). Untuk saat ini hanya akan menghemat bitmap dikirim, namun kemudian Anda akan menggunakan metode ini untuk menganalisa gambar.

Selanjutnya, Anda perlu bitmap. Saya telah menyertakan satu di contoh proyek GitHub, namun Anda dapat menggunakan gambar apapun yang Anda ingin untuk bermain dengan Face detection dan melihat apa yang bekerja dan apa yang tidak. Ketika Anda memilih sebuah gambar, menempatkannya ke direktori res/raw. Tutorial ini akan menganggap bahwa gambar yang disebut face.jpg.

Setelah Anda telah menempatkan gambar Anda ke dalam direktori res/raw, membuka res/layout/activity_main.xml. Tata letak ini berisi referensi ke FaceOverlayView agar ditampilkan di MainActivity.

Dengan tata letak yang didefinisikan, buka MainActivity dan mendirikan FaceOverlayView dari onCreate(). Anda melakukan ini dengan mendapatkan referensi ke View, membaca file gambar face.jpg dari direktori raw sebagai aliran masukan, dan mengubah yang menjadi bitmap. Setelah Anda memiliki bitmap, Anda dapat memanggil setBitmap pada FaceOverlayView untuk mengirim gambar untuk custom view.

2. mendeteksi wajah

Sekarang bahwa proyek Anda diatur, saatnya untuk memulai mendeteksi wajah. Dalam setBitmap (Bitmap bitmap) Anda perlu untuk membuat FaceDetector. Ini dapat dilakukan dengan menggunakan FaceDetector.Builder, memungkinkan Anda untuk menentukan beberapa parameter yang mempengaruhi seberapa cepat wajah akan dideteksi dan data apa yang lain FaceDetector akan menghasilkan.

Pengaturan yang Anda pilih bergantung pada apa yang Anda coba lakukan dalam aplikasi Anda. Jika mencari landmark, kemudian wajah akan dideteksi lebih lambat. Seperti dengan kebanyakan hal dalam pemrograman, semuanya memiliki dengan trade-off. Untuk mempelajari lebih lanjut tentang pilihan yang tersedia untuk FaceDetector.Builder, Anda dapat menemukan dokumentasi resmi website pengembang Android.

Anda juga perlu memeriksa untuk melihat apakah FaceDetector operasional. Ketika pengguna menggunakan Deteksi wajah untuk pertama kalinya di perangkat mereka, Plahy Service perlu pergi keluar dan mendapatkan satu set kecil asli perpustakaan untuk memproses permintaan aplikasi Anda. Sementara ini akan hampir selalu dilakukan sebelum aplikasi Anda telah selesai meluncurkan, penting untuk menangani kontingensi yang ini telah gagal.

Jika FaceDetector operasional, maka Anda dapat mengkonversi bitmap Anda menjadi sebuah objek Frame dan menyebarkannya ke detektor untuk mengumpulkan data tentang wajah dalam gambar. Ketika Anda selesai, Anda akan perlu untuk melepaskan detektor untuk mencegah memory leak. Ketika Anda selesai mendeteksi wajah, panggil invalidate() untuk memicu redrawing view.

Sekarang bahwa Anda telah mendeteksi wajah dalam gambar Anda, saatnya untuk menggunakannya. Untuk contoh ini, Anda hanya akan menarik kotak hijau di setiap wajah. Karena invalidate() dipanggil setelah wajah terdeteksi, Anda dapat menambahkan semua logika yang diperlukan ke dalam onDraw(Canvas canvas). Metode ini memastikan bahwa bitmap wajah ditetapkan, maka menarik bitmap ke kanvas dan kemudian menarik kotak di setiap wajah.

Karena perangkat yang berbeda memiliki ukuran layar yang berbeda, Anda akan juga terus melacak jumlah bitmap skala ukuran sehingga seluruh gambar selalu terlihat pada perangkat dan semua lapisan tertarik dengan tepat.

Metode drawBitmap(Canvas canvas) menarik Anda bitmap ke kanvas dan ukuran tepat sementara juga kembali kelipatan untuk scaling dimensi lain dengan benar.

drawFaceBox (Canvas canvas, double scale) metode mendapat sedikit lebih menarik. Setiap wajah yang terdeteksi dan menyelamatkan memiliki nilai posisi di atas dan di sebelah kiri dari setiap wajah. Metode ini akan mengambil posisi dan menggambar persegi panjang hijau dari itu untuk mencakup setiap wajah yang berdasarkan pada lebar dan tinggi.

Anda perlu menentukan objek Paint dan kemudian loop melalui setiap Face Anda SparseArray untuk menemukan posisi, lebar, dan tinggi, dan menggambar persegi panjang pada kanvas yang menggunakan informasi tersebut.

Pada titik ini, Anda harus dapat menjalankan aplikasi Anda dan melihat gambar Anda dengan persegi di sekitar setiap wajah yang telah terdeteksi. Hal ini penting untuk dicatat bahwa Face Detection API masih cukup baru pada saat tulisan ini dan itu tidak dapat mendeteksi setiap wajah . Anda dapat bermain dengan beberapa pengaturan dalam objek FaceDetector.Builder untuk mudah-mudahan mengumpulkan data lebih banyak, meskipun itu tidak dijamin.

Faces detected and bound by a drawn rectangle

3. pemahaman Landmark

Landmark yang menarik pada wajah. Face detection API tidak menggunakan Landmark untuk mendeteksi wajah, tapi agak mendeteksi wajah secara keseluruhan sebelum mencari Landmark. Itu sebabnya, menemukan Landmark pengaturan opsional yang dapat diaktifkan melalui FaceDetector.Builder.

Anda dapat menggunakan Landmark sebagai sumber tambahan informasi, seperti mana yang subjek mata, sehingga Anda dapat bereaksi secara tepat dalam app Anda. Ada dua belas Landmark yang mungkin untuk ditemukan:

  • mata kiri dan kanan
  • telinga kiri dan kanan
  • tip telinga kiri dan kanan
  • dasar hidung
  • pipi kiri dan kanan
  • sudut kiri dan kanan mulut
  • dasar mulut

Landmark yang tersedia tergantung pada sudut wajah terdeteksi. Misalnya, seseorang menghadapi ke sisi hanya akan memiliki satu mata yang terlihat, yang berarti bahwa mata lain tidak akan terdeteksi. Tabel berikut garis Landmark yang harus terdeteksi berdasarkan sudut Euler Y (arah kiri atau kanan) wajah.

Euler Y Landmark terlihat
<-36 ° kiri kiri mulut, mata, telinga kiri, hidung pipi dasar, kiri
-36 ° ke 12 ° meninggalkan mulut, hidung base, bawah mulut, mata kanan, mata kirinya, meninggalkan pipi, telinga kiri Tips
-12° 12 ° mata kanan, kiri mata, basis hidung, pipi kiri, pipi kanan, kiri mulut, mulut kanan, bawah mulut
12° 36 ° mulut kanan, hidung base, bawah mulut, mata kiri, mata kanan, pipi kanan, telinga kanan tip
> 36° mata kanan, mulut kanan mata, telinga kanan, hidung dasar, kanan pipi

Landmark juga sangat mudah digunakan dalam aplikasi Anda seperti yang Anda sudah termasuk mereka selama face detection. Anda hanya perlu untuk memanggil getLandmarks() pada Face objek untuk mendapatkan List Landmark objek yang Anda dapat kerjakan.

Dalam tutorial ini, Anda akan melukis sebuah lingkaran kecil pada setiap landmark terdeteksi dengan memanggil metode baru, drawFaceLandmarks(Canvas canvas, double scale), dari onDraw (Canvas canvas) daripada drawFaceBox (Canvas canvas, double scale). Metode ini mengambil posisi setiap landmark, menyesuaikan untuk skala bitmap, dan kemudian menampilkan landmark indikator lingkaran.

Setelah memanggil metode ini, Anda akan melihat lingkaran hijau kecil yang menutupi wajah terdeteksi seperti ditunjukkan pada contoh di bawah.

Circles placed over detected facial landmarks

4. tambahan wajah Data

Sementara posisi wajah dan landmark yang berguna, Anda juga dapat menemukan informasi lebih lanjut mengenai setiap wajah yang terdeteksi dalam aplikasi Anda melalui beberapa metode built-in dari objek Face. Metode getIsSmilingProbability(), getIsLeftEyeOpenProbability(), dan getIsRightEyeOpenProbability() mencoba untuk menentukan jika mata terbuka atau jika orang yang terdeteksi tersenyum dengan mengembalikan float range dari 0.0 sampai 1.0. Semakin dekat ke 1.0, semakin besar kemungkinan bahwa orang tersenyum atau memiliki mata mereka kiri atau kanan yang terbuka.

Anda juga dapat menemukan sudut wajah pada sumbu Y dan Z dari suatu gambar dengan memeriksa nilai Euler. Euler Z nilai akan selalu dilaporkan, namun, Anda harus menggunakan modus akurat ketika mendeteksi wajah untuk menerima nilai X. Anda dapat melihat contoh tentang bagaimana untuk mendapatkan nilai-nilai ini dalam kode snippet berikut.

Kesimpulan

Dalam tutorial ini, Anda telah belajar tentang salah satu komponen utama dari perpustakaan Play Service, Face Detection, Anda sekarang tahu bagaimana mendeteksi wajah dalam gambar masih, bagaimana untuk mengumpulkan informasi, dan menemukan Landmark penting untuk setiap wajah.

Menggunakan apa yang telah Anda pelajari, Anda harus dapat menambahkan beberapa fitur besar untuk aplikasi Anda sendiri untuk menambah gambar diam, pelacakan wajah dalam video feed, atau apa pun yang dapat Anda bayangkan.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.