Face Recognition & Detection With Flutter ( Part -1 )
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.
- Kamera (Her bir frame üzerinde işlem yapmak için gerekli olan kütüphanedir)
- Face Detection (Bir görüntüde veya videoda yüzlerin varlığını tespit etme sürecidir)
- 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.
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.
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.
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.
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ınansensorOrientation
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.
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!