Flutter & Mobil İle İleri Düzey Nesne Tanıma Sistemi Nasıl Yapılır?

Flutter & Mobil İle İleri Düzey Nesne Tanıma Sistemi Nasıl Yapılır?
Flutter & Mobil İle İleri Düzey Nesne Tanıma Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projenize başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. Nesne tanıma işlemleri yoğun hesaplama gerektirdiği için emülatör yerine fiziksel bir cihaz kullanmanız önerilir.

  • Flutter SDK 3.24 veya üzeri sürüm.
  • Dart 3.5 veya üzeri sürüm.
  • Android için minSdkVersion 23 ve üzeri, iOS için 13.0 ve üzeri.
  • Kamera erişimi için gerekli izinlerin (AndroidManifest.xml ve Info.plist) yapılandırılması.

Projenize gerekli bağımlılıkları eklemek için pubspec.yaml dosyanıza şu paketleri dahil etmelisiniz:

dependencies:
  flutter:
    sdk: flutter
  google_mlkit_object_detection: ^0.13.0
  camera: ^0.11.0
  permission_handler: ^11.3.1

Bu paketler, Google'ın ML Kit kütüphanesini kullanarak nesne tanıma mantığını yönetmemize ve cihaz kamerasından canlı veri akışı almamıza olanak tanır.

Kamera Akışını Yapılandırma

Nesne tanıma sisteminin kalbi, kameradan gelen görüntü kareleridir (frames). Bu kareleri yakalayıp işleyebilmek için camera paketini kullanarak bir kontrolcü (controller) oluşturmamız gerekir.

late CameraController _controller;

Future initializeCamera() async {
  final cameras = await availableCameras();
  _controller = CameraController(cameras[0], ResolutionPreset.medium);
  await _controller.initialize();
  if (mounted) setState(() {});
}

Burada ResolutionPreset.medium seçimi, performans ve doğruluk arasındaki dengeyi korumak için idealdir. Çok yüksek çözünürlük, işlemciyi yorarak kare hızını (FPS) düşürebilir.

Güvenlik Uyarısı: Kamera izinlerini sadece ihtiyaç duyulduğunda isteyin. Kullanıcı gizliliği için uygulamanızın kamera kullandığını belirten bir bildirim metnini mutlaka Info.plist dosyanıza ekleyin.

ML Kit ile Nesne Algılama Modeli Kurulumu

Google ML Kit, nesne algılama için önceden eğitilmiş modeller sunar. İleri düzey uygulamalarda, nesnelerin takibi (tracking) ve sınıflandırılması için ObjectDetector nesnesini yapılandırmanız gerekir.

final options = ObjectDetectorOptions(
  mode: DetectionMode.stream,
  classifyObjects: true,
  multipleObjects: true,
);

final objectDetector = ObjectDetector(options: options);

Bu kod bloğunda, DetectionMode.stream kullanarak canlı akış için optimize edilmiş bir yapı kurduk. classifyObjects parametresini true yaparak, nesnenin ne olduğunu (örneğin: "sandalye", "telefon") öğreniyoruz.

Görüntü İşleme ve Nesne Tanıma Adımları

Kameradan gelen her kareyi işlemek için InputImage formatına dönüştürmemiz gerekir. Bu, ML Kit'in anlayabileceği standart bir formattır.

Future processImage(CameraImage image) async {
  final inputImage = InputImage.fromBytes(
    bytes: image.planes[0].bytes,
    metadata: InputImageMetadata(
      size: Size(image.width.toDouble(), image.height.toDouble()),
      rotation: InputImageRotation.rotation0deg,
      format: InputImageFormat.nv21,
      bytesPerRow: image.planes[0].bytesPerRow,
    ),
  );
  
  final objects = await objectDetector.processImage(inputImage);
  // Nesneleri ekrana çizdirme mantığı buraya gelecek
}

Burada InputImageMetadata kısmında cihazın sensör verilerini doğru eşlemek kritiktir. Yanlış meta veri tanımlamaları, nesne koordinatlarının kaymasına neden olur.

Nesne Tanıma Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
ML Kit (Cihaz İçi) Çevrimdışı çalışır, hızlıdır. Model özelleştirilemez.
TensorFlow Lite Özel model eğitilebilir. Geliştirme süreci karmaşıktır.
Bulut Tabanlı API Çok yüksek doğruluk. İnternet bağımlılığı, gecikme.

Yaygın Hatalar ve Performans İpuçları

Nesne tanıma uygulamalarında en sık karşılaşılan sorun "kare atlama" (frame dropping) ve pil tüketimidir. Bunu engellemek için:

  • İşlemleri Isolate (Dart'ın çoklu iş parçacığı yapısı) üzerinde yapmayı değerlendirin.
  • Kamera çözünürlüğünü ihtiyacınızdan fazla tutmayın.
  • Nesne tespiti yapılmadığı anlarda objectDetector.close() metodunu çağırarak kaynakları serbest bırakın.
@override
void dispose() {
  _controller.dispose();
  objectDetector.close();
  super.dispose();
}

Sıkça Sorulan Sorular

Nesne tanıma sistemi pil tüketimini nasıl etkiler?

Sürekli kamera akışı ve görüntü işleme CPU'yu yüksek yük altında tutar. Performansı artırmak için işlem aralıklarını (örneğin saniyede 5 kare yerine 2 kare) optimize edebilirsiniz.

Özel nesneleri nasıl tanıtabilirim?

ML Kit'in standart modeli genel nesneleri tanır. Eğer özel bir nesne (örneğin sadece sizin ürününüz) tanımlamak istiyorsanız, TensorFlow Lite ile kendi modelinizi eğitip LocalModel olarak uygulamaya eklemelisiniz.

Bu sistem internet olmadan çalışır mı?

Evet, Google ML Kit cihaz üzerinde çalıştığı için internet bağlantısı gerektirmez. Bu, gizlilik odaklı uygulamalar için büyük bir avantajdır.

Neden nesne kutuları kayıyor?

Bu genellikle cihazın ekran oryantasyonu ile kamera sensörünün yönü arasındaki uyumsuzluktan kaynaklanır. InputImageRotation değerini cihazın o anki yönüne göre dinamik güncellemelisiniz.

Uygulama neden çöküyor?

Genellikle kaynak yönetimi hatalarından kaynaklanır. CameraController veya ObjectDetector nesnelerini dispose etmeyi unutmak bellek sızıntısına yol açar.

Özel Nesne Tanıma için TFLite Modeli Entegrasyonu

Google ML Kit, genel nesne tespiti için harika bir başlangıç noktası olsa da, belirli bir endüstriyel parça, bitki türü veya özel bir ürün grubu gibi spesifik nesneleri tanımanız gerektiğinde kendi eğitilmiş modelinizi kullanmanız gerekir. Bu noktada TensorFlow Lite (TFLite) devreye girer.

TFLite Modelini Projeye Dahil Etme

Eğittiğiniz .tflite model dosyasını ve buna karşılık gelen labels.txt dosyasını projenizin assets klasörüne ekleyin. Ardından pubspec.yaml dosyanızda bu dosyaları tanımlamayı unutmayın:

flutter:
  assets:
    - assets/my_model.tflite
    - assets/labels.txt

Özel Model ile Çıkarım Yapma

Modeli yüklemek ve kamera akışından gelen verileri bu modele beslemek için tflite_flutter paketini kullanabilirsiniz. Aşağıdaki kod bloğu, bir görüntünün model üzerinden nasıl işleneceğini göstermektedir:

import 'package:tflite_flutter/tflite_flutter.dart';

class ModelInterpreter {
  late Interpreter _interpreter;

  Future loadModel() async {
    _interpreter = await Interpreter.fromAsset('my_model.tflite');
  }

  void runInference(List input) {
    var output = List.filled(1 * 10, 0).reshape([1, 10]);
    _interpreter.run(input, output);
    print("Tahmin Sonucu: $output");
  }
}

Nesne Tanıma Sistemlerinde Dağıtım (Deployment) ve Test Stratejileri

Geliştirdiğiniz nesne tanıma uygulamasını canlıya almadan önce, farklı donanım konfigürasyonlarında performans testi yapmanız kritik öneme sahiptir. Yapay zeka modelleri, düşük seviyeli cihazlarda aşırı ısınmaya veya kare hızının (FPS) düşmesine neden olabilir.

Performans Testi İçin İpuçları

  • FPS İzleme: Uygulamanızın saniyede kaç kare işlediğini fps_monitor gibi araçlarla takip edin. 20 FPS altı, kullanıcı deneyimini ciddi oranda düşürür.
  • Quantization (Nicemleme): Modelinizi eğitirken veya dönüştürürken Float16 veya Int8 nicemleme yöntemlerini kullanarak model boyutunu küçültün ve işlemci üzerindeki yükü azaltın.
  • GPU Delegasyonu: TFLite kullanırken GpuDelegate kullanarak hesaplamaların CPU yerine GPU üzerinde yapılmasını sağlayın. Bu, özellikle karmaşık modellerde 3-4 kat hız artışı sağlayabilir.
İpucu: Uygulamanızı yayınlamadan önce mutlaka flutter build apk --split-per-abi komutunu kullanarak, her işlemci mimarisi (arm64-v8a, armeabi-v7a) için optimize edilmiş ayrı paketler oluşturun. Bu, uygulamanızın boyutunu küçültecek ve kurulum başarısını artıracaktır.

Hata Ayıklama (Debugging) Süreci

Nesne tanıma hataları genellikle "yanlış sınıflandırma" veya "tespit edememe" şeklinde ortaya çıkar. Bu durumları çözmek için:

  1. Görüntü Ön İşleme: Kameradan gelen görüntünün renk uzayı (YUV vs RGB) ile modelin beklediği formatın aynı olduğundan emin olun.
  2. Güven Skoru (Confidence Score): Modelin döndürdüğü tahmin sonuçlarında bir eşik değeri (threshold) belirleyin. Örneğin, güven oranı %60'ın altında olan sonuçları ekrana yazdırmayın.
  3. Loglama: Modelin girişine giden tensör verilerini loglayarak, görüntünün kırpılıp kırpılmadığını veya yanlış ölçeklenip ölçeklenmediğini kontrol edin.

Sonuç

Flutter ile nesne tanıma sistemi kurmak, doğru kütüphane seçimi ve kaynak yönetimi ile oldukça verimli bir süreçtir. Bu rehberde, ML Kit ile gerçek zamanlı nesne tespitini nasıl yapacağınızı, kamera akışını nasıl yöneteceğinizi ve performansı nasıl optimize edeceğinizi öğrendiniz. Bir sonraki adım olarak, tanıdığınız nesnelerin üzerine metin veya etiket ekleyerek bir "Artırılmış Gerçeklik" (AR) arayüzü geliştirmeyi deneyebilirsiniz.

Yasal Sorumluluk Reddi: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Uygulamanızda kullanacağınız yapay zeka modellerinin etik kullanımı, kişisel verilerin korunması ve KVKK/GDPR uyumluluğu tamamen geliştiricinin sorumluluğundadır. Uygulamanızın güvenlik açıklarına karşı düzenli test edilmesi önerilir.

Bu yazıya tepkinizi paylaşın:
Mert Çelik

Kendin yap (DIY) projeleri ve teknik tamirat rehberleri konusunda uzmanım. Denenmiş ve test edilmiş yöntemlerle okuyuculara güvenilir bilgiler sunuyorum.

Yorumlar (0)

Yorum Yaz