Face Recognition & Detection With Flutter ( Part -1 )

Hasan YATAR
5 min readJul 19, 2023

--

Face Recognition And Detection With Flutter

Yüz tanıma ve algılama, mobil uygulamalarda kullanıcı deneyimini geliştiren ve güvenlik sağlayan önemli bir özelliktir. Flutter, popüler bir framework olup, hızlı ve verimli bir şekilde birden fazla platform için uygulama geliştirmeyi mümkün kılar. Bu makalede, Flutter kullanarak yüz tanıma ve algılama özelliğini uygulamak için Camera, Google ML Kit ve TensorFlow Lite kütüphanelerini nasıl kullanabileceğinizi anlatacağım.

Bu Makaleyi üç bölüme ayırıyorum.

  1. Kamera (Her bir frame üzerinde işlem yapmak için gerekli olan kütüphanedir)
  2. Face Detection (Bir görüntüde veya videoda yüzlerin varlığını tespit etme sürecidir)
  3. Face Recognition (Bir yüzü tanıma veya kimliğini doğrulama sürecidir)

Haydi başlayalım ..:)

1. Kamera

Yüz tanıma ve algılama için öncelikle kameraya erişim sağlamamız gerekir. Flutter’ın “camera” kütüphanesi, kamera kaynağından görüntü almamıza ve işlememize yardımcı olacaktır. Kameraya erişmek için Flutter’ın “camera” kütüphanesini kullanarak bir kamera örneği oluşturabilir ve bu örneği kullanarak kamera görüntüsünü alabiliriz.

1.1. Kamera Paketi Kurulumu

Flutter projenizde kameraya erişmek için öncelikle “pubspec.yaml” dosyasını düzenleyin ve “camera” kütüphanesini projenize ekleyin.

1.2. Kamera Başlangıç Ayarları

Kameraya erişim sağlandıktan sonra, “camera” kütüphanesini kullanarak kamera görüntüsünü alabilirsiniz. Kamera görüntüsünü almak için aşağıdaki adımları izleyin:

İlk adım olarak, uygulamanın mevcut kameralarına erişmek ve kamera kontrollerini sağlamak için initState ‘de _initialize metodunu çağırmamız gerekiyor.

source code

Yukarıdaki kodda gösterildiği gibi_initialize metodu, _cameras listesinin boş olup olmadığını kontrol ederek başlıyor. Eğer _cameras listesi boş ise, availableCameras metodunu kullanarak kullanılabilir kameraları alıyoruz ve listeye atıyoruz.

Daha sonra, _cameras listesindeki kameraları döngüyle kontrol ediyoruz. initialCameraLensDirection ile belirtilen kamera lens yönüne sahip kamerayı buluyoruz. Bulduğumuz kamera indeksini _cameraIndex değişkenine atıyoruz ve döngüden çıkıyoruz.

Eğer _cameraIndex değişkeni -1 değilse, yani uygun bir kamera bulduysak, _startLiveFeed metodunu çağırarak canlı görüntü akışını başlatıyoruz.

dispose metodu ise, widget'in sonlandırıldığı zamanlarda çağrılıyor ve canlı görüntü akışını durdurmak için _stopLiveFeed metodunu çağırıyoruz.

Bu şekilde, _initialize metodunu başlatarak uygun kamera bulma işlemini gerçekleştiriyoruz ve canlı görüntü akışını başlatıp sonlandırmak için gerekli adımları atıyoruz.

1.3. Kamera Kontrollerini Ayarlamak

Aşağıdaki kodda da görüldüğü gibi_cameras, kullanılabilir kamera cihazlarının bir listesini temsil ederken, _controller ise CameraController sınıfından bir örnek oluşturuyor.

_startLiveFeed adlı metot, canlı görüntü akışını başlatmak için kullanılıyor. _cameraIndex değişkenine göre _cameras listesinden bir kamera seçiyoruz. Ardından, seçtiğimiz kamera ile bir CameraController örneği oluşturuyoruz.

source code

Yukarıda da görüldüğü gibi oluşturulan _controller örneği ile, çözünürlük ayarını (ResolutionPreset.high), sesi devre dışı bırakmayı (enableAudio: false) ve görüntü formatını (imageFormatGroup) belirliyoruz. Görüntü formatını belirlerken, Android için ImageFormatGroup.nv21, iOS platformu içinImageFormatGroup.bgra8888 kullanıyoruz.

Controller’ı başlatmak için _controller?.initialize() fonksiyonunu kullanıyoruz. Başarılı bir şekilde başlatıldıktan sonra, _controller üzerinden çeşitli kamera özelliklerine erişebiliyoruz. Örneğin, _controller?.getMinZoomLevel() ile minimum yakınlaştırma seviyesini alıyoruz ve _currentZoomLevel ile _minAvailableZoom değişkenlerini güncelliyoruz. Aynı şekilde, pozlama ayarları için de getMinExposureOffset() ve getMaxExposureOffset() fonksiyonlarını kullanarak minimum ve maksimum pozlama ofset değerlerini alıyoruz.

Son olarak, Bu kısmı önemli :)

startImageStream(_processCameraImage) ile kameradan gelen görüntü akışını başlatıyoruz. widget.onCameraLensDirectionChanged işlevlerini çağırarak, kamera lens yönünü elde ediyoruz. Bu elde edilen ile dinamik olarak kamera lens yönünü değiştirebiliyoruz.

1.4. Kamera da her bir frame üzerinde işlem yapmak

Değerli okurlarım, sonunda en güzel bölüme geldik :)

Meraklı bir gözle kameraya baktığınızda, her bir karenin hayatın bir anını temsil ettiğini düşünebilirsiniz. Ancak, gerçekte, kamera görüntüleri üzerinde gerçekleştirilen işlemler sayesinde, bu kareler birçok sırrı saklar. İşte bu noktada,_processCameraImage fonksiyonu devreye giriyor.

source code

Bu kod bloğu, yüz tanıma özelliğiyle donatılmış bir kamera uygulamasının işleyişini kontrol ediyor. Her bir kareyi işlemlemek için kullanılıyor ve ardından elde edilen sonuçlar, daha fazla işleme veya kullanıcıya geri bildirim için kullanılıyor.

İlk olarak,_inputImageFromCameraImage fonksiyonu çağrılıyor. Bu fonksiyon, kamera görüntüsünü (frame) girdi olarak alır ve işlenebilir bir formata dönüştürür. Bu, görüntünün boyutunu, renk kanallarını veya diğer özelliklerini değiştirmek anlamına gelebilir. İşlenmiş girdi, inputImage değişkenine atanır. ( Bunu Google ML Kit için işlenebilir hâle getirmek adına yapıyoruz. Diğer yazımızda üstünde uzun uzun bahsedeceğiz …)

1.5. Her bir frame’i yüz tespit etmek için hazırla

Hadi biraz zamanı donduralım ;)

Şu ana kadar yaptığımız sadece kameradan alınan her frame üzerinde işlemler yapmak oldu. Bundan sonra yapacağımız süreç, her bir frame üzerinde bir format dönüşümü yapmak olacaktır. Kameradan alınan her frame bize CameraImage tipinde gelir. Ama bu ham veriyi direkt olarak Face Detection da kullanamayız. Bunu InputImage formatına dönüştürmemiz gerekir.

InputImage? _inputImageFromCameraImage(CameraImage image) fonksiyonu da tam da bu dönüşümün kalbinde yer alıyor.

source code

Yukarıdaki kod bloğu, kamera görüntülerini işlemek ve yüz tanıma için kullanılabilir hale getirmek amacıyla oluşturuldu. İşleyişini anlamak için adım adım ilerleyelim.

  • İlk olarak, _controller değişkeninin mevcut olup olmadığı kontrol ediliyor. Bu, kameranın kullanılabilir olduğunu ve görüntülerin işlenebileceğini gösterir. Eğer kamera kullanılamıyorsa veya görüntü boş ise, fonksiyon null değeri döndürerek işlemeyi sonlandırır.
  • Sonrasında, _cameraIndex değişkeni kullanılarak kamera (arka kamera, ön kamera …) seçilir. Bu, kameranın tüm bilgilerini sağlar. Kameradan alınan sensorOrientation değerini alarak sensör yönlendirme bilgisi alınır. Bu değerler kullanılarak kamera rotasyonu elde etmek amaçlanır. Bu adımda, hem iOS hem de Android platformları için uyumlu bir çözüm sunulur.
  • Daha sonra, görüntünün formatı kontrol edilir. Platforma bağlı olarak sadece desteklenen formatlara izin verilir. Android için “nv21” ve iOS için “bgra8888” formatları kullanılabilir. Eğer format desteklenmiyorsa veya geçerli değilse, dönüştürme işlemi sonlandırılır.
  • Sonraki adımda, görüntü düzlemine erişilir ve işlenmiş girdi oluşturulur. Görüntünün boyutu, byte’ları , dönüşüm bilgileri ve format bilgisi kullanılarak InputImage nesnesi oluşturulur. Bu nesne, yüz tanıma algoritması tarafından kullanılmak üzere hazır hale getirilmiş görüntüyü temsil eder.

Sonuç olarak,_inputImageFromCameraImage fonksiyonu, kamera görüntülerini yüz tanıma işlemi için uygun hale getirir.

Face detection kullanımında bir örnek

Umarım bu yazı sizin için faydalı olmuştur ve Flutter’da kamera işlemleri konusunda size ilham vermiştir. “Part 2 Face detection” yazımın devamı olarak ilerde eklenecektir.

Bu yazıyı okuduğunuz için teşekkür ederim. Başka yazılarımda görüşmek üzere, hoşça kalın!

--

--