ML Kit ile görüntülerdeki nesneleri algılama: Android

1. Başlamadan önce

ML Kit, Google'ın cihaz üzerindeki makine öğrenimi uzmanlığını Android ve iOS uygulamalarına getiren bir mobil SDK'dır. Uygulamalarınızdaki sık karşılaşılan zorlukları çözmek veya yepyeni kullanıcı deneyimleri oluşturmak için, hem güçlü hem de kullanımı kolay Vision API ve Natural Language API'leri kullanabilirsiniz. Tüm cihazlar Google'ın sınıfının en iyisi makine öğrenimi modelleri tarafından desteklenmektedir ve size ücretsiz olarak sunulur.

ML Kit'in API'lerinin tamamı cihaz üzerinde çalışarak canlı kamera akışını işlemek istediğiniz gerçek zamanlı kullanım alanlarına olanak tanır. Bu, işlevin çevrimdışı olarak kullanılabileceği anlamına da gelir.

Bu codelab'de, belirli bir görüntü için mevcut Android uygulamanıza Nesne Algılama ve İzleme (ODT) özelliğinin eklenmesiyle ilgili basit adımlar açıklanmaktadır. Bu codelab'de ML Kit ODT kullanımını vurgulamak için bazı kısayollar kullanıldığını lütfen unutmayın.

Oluşturacaklarınız

Bu codelab'de, Makine Öğrenimi Kiti ile bir Android uygulaması geliştireceksiniz. Uygulamanız, belirli bir görüntüdeki nesneleri algılamak için ML Kit Nesne Algılama ve İzleme API'sini kullanır.Son olarak, sağdaki resme benzer bir şey göreceksiniz.

Neler öğreneceksiniz?

  • ML Kit SDK'sını Android uygulamanıza entegre etme
  • ML Kit Nesne Algılama ve İzleme API'sı

Gerekenler

  • Android Studio'nun yeni bir sürümü (v4.1.2+)
  • Android Studio Emülatörü veya fiziksel bir Android cihaz
  • Örnek kod
  • Kotlin'de Android uygulaması geliştirmeyle ilgili temel bilgiler

Bu codelab'de, Makine Öğrenimi Kiti'ne odaklanılmıştır. Alakalı olmayan kavramlar ve kod blokları işaretlenmiştir ve yalnızca kopyalayıp yapıştırmanız için kullanımınıza sunulmuştur.

2. Hazırlanın

Kodu İndirme

Bu codelab'e ait tüm kodları indirmek için şu bağlantıyı tıklayın:

İndirilen zip dosyasının paketini açın. Bu işlem, ihtiyacınız olan tüm kaynakların yer aldığı bir kök klasörü (mlkit-android-main) açar. Bu codelab için yalnızca object-detection alt dizinindeki kaynaklara ihtiyacınız vardır.

mlkit-android deposundaki nesne algılama alt dizini iki dizin içerir:

  • android_studio_folder.pngstarter: Bu codelab için temel aldığınız başlangıç kodu.
  • android_studio_folder.pngFinal: Tamamlanmış örnek uygulama için tamamlanmış kod.

3. Projeye ML Kit Nesne Algılama ve İzleme API'si ekleme

Uygulamayı Android Studio'ya aktarma

Başlangıç uygulamasını Android Studio'ya aktararak başlayalım.

Android Studio'yu açın, Import Project (Gradle, Eclipse ADT vb.) seçeneğini belirleyin ve daha önce indirdiğiniz kaynak kodundan starter klasörünü seçin.

7c0f27882a2698ac.png

ML Kit Nesne Algılama ve İzleme için bağımlılıkları ekleyin

ML Kit bağımlılıkları, ML Kit ODT SDK'yı uygulamanıza entegre etmenizi sağlar. Projenizin app/build.gradle dosyasının sonuna aşağıdaki satırları ekleyin:

build.gradle

dependencies {
  // ...
  implementation 'com.google.mlkit:object-detection:16.2.4'
}

Projenizi gradle dosyalarıyla senkronize etme

Tüm bağımlılıkların uygulamanızda kullanılabildiğinden emin olmak için bu noktada projenizi gradle dosyalarıyla senkronize etmeniz gerekir.

Android Studio araç çubuğundan Projeyi Gradle Dosyalarıyla Senkronize Et'i ( b451ab2d04d835f9.png) seçin.

(Bu düğme devre dışıysa deponun tamamını değil, yalnızca starter/app/build.gradle içe aktardığınızdan emin olun.)

4. Başlangıç uygulamasını çalıştırma

Projeyi Android Studio'ya aktarıp ML Kit Nesne Algılama ve İzleme için bağımlılıkları eklediğinize göre, uygulamayı ilk kez çalıştırmaya hazırsınız.

Android cihazınızı USB ile ana makinenize bağlayın veya Android Studio emülatörünü başlatın, ardından Android Studio araç çubuğunda Çalıştır'ı ( yürütme.png) tıklayın.

Uygulamayı çalıştırma ve keşfetme

Uygulama, Android cihazınızda başlatılır. Bu kod, fotoğraf çekmenize veya önceden ayarlanmış bir görüntü seçmenize olanak tanıyan standart kodlar içerir. Bu kodları, bu codelab'de derleyeceğiniz nesne algılama ve izleme ardışık düzenine beslemenize olanak tanır. Kod yazmadan önce uygulamaya biraz göz atalım.

İlk olarak, alt kısımda bir Button ( c6d965d639c3646.png) bulunur:

  • Cihazınızda/emülatörünüzde entegre kamera uygulamasını açın
  • kamera uygulamanızın içinde fotoğraf çekin
  • Yakalanan görüntüyü başlangıç uygulamasında alın
  • resmi göster

Fotoğraf çek düğmesini deneyin, fotoğraf çekmek için talimatları uygulayın, fotoğrafı kabul edin ve başlangıç uygulamasında gösterilip gösterilmediğini kontrol edin.

İşleyiş şeklini görmek için bu işlemi birkaç kez tekrarlayın:

9ec541980dbe2d31.png 8312dde41425ba4b.png fa8492bfc1914ff0.png

İkinci olarak, aralarından seçim yapabileceğiniz 3 hazır ayar resim var. Bir Android emülatöründe çalıştırıyorsanız daha sonra bu resimleri nesne algılama kodunu test etmek için kullanabilirsiniz.

Önceden ayarlanmış 3 resimden bir resim seçin. Resmin daha büyük görünümde göründüğünden emin olun:

1dd41b3ec978f1d9.png

5. Cihaz üzerinde nesne algılama özelliği ekleyin

Bu adımda, resimlerdeki nesneleri algılamak için başlangıç uygulamasına işlev ekleyeceksiniz. Önceki adımda gördüğünüz gibi, başlangıç uygulaması cihazdaki kamera uygulamasıyla fotoğraf çekmek için ortak kod içerir. Ayrıca, codelab'i bir Android emülatöründe çalıştırıyorsanız nesne algılamayı deneyebileceğiniz, önceden ayarlanmış 3 görüntü de vardır.

Önceden ayarlanmış resimlerden veya kamera uygulamasıyla fotoğraf çeken bir resim seçtiğinizde, ortak metin kodu ilgili resmin kodunu çözerek Bitmap örneğine dönüştürür, ekranda gösterir ve resimle birlikte runObjectDetection yöntemini çağırır.

Bu adımda, nesne algılama işlemi için runObjectDetection yöntemine kod ekleyeceksiniz.

Resimler üzerinde cihaz üzerinde nesne algılamayı kurma ve çalıştırma

ML Kit ODT'yi ayarlamak için 3 API ile yalnızca 3 basit adım yeterlidir:

  • bir resim hazırlayın: InputImage
  • algılayıcı nesnesi oluşturun: ObjectDetection.getClient(options)
  • yukarıdaki 2 nesneyi bağlayın: process(image)

Bu işlemleri MainActivity.kt dosyasındaki runObjectDetection(bitmap: Bitmap) işlevinde yapabilirsiniz.

/**
 * ML Kit Object Detection Function
 */
private fun runObjectDetection(bitmap: Bitmap) {
}

Şu anda işlev boştur. ML Kit ODT'yi uygulamak için aşağıdaki adımlara geçin. Android Studio da gerekli içe aktarma işlemlerini eklemenizi ister:

  • com.google.mlkit.vision.common.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

1. Adım: BirEntryImage oluşturun

ML Kit, Bitmap üzerinden InputImage oluşturmak için basit bir API sunar. Ardından ML Kit API'lerine InputImage besleyebilirsiniz.

// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)

Yukarıdaki kodu runObjectDetection(bitmap:Bitmap) alanının üst kısmına ekleyin.

2. Adım: Algılayıcı örneği oluşturun

ML Kit, Builder Tasarım Kalıbı'na uygundur. Yapılandırmayı oluşturucuya iletir ve ardından bundan bir algılayıcı edinirsiniz. 3 farklı yapılandırma seçeneği bulunur (bu codelab'de kalın yazı tipindeki seçenekler kullanılmıştır):

  • algılayıcı modu (tek resimli veya akış)
  • algılama modu (tek veya çoklu nesne algılama)
  • sınıflandırma modu (açık veya kapalı)

Bu codelab tek bir görüntü (birden fazla nesne algılama ve en iyi uygulamaları görelim. Şimdi ekleyin:

// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
   .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
   .enableMultipleObjects()
   .enableClassification()
   .build()
val objectDetector = ObjectDetection.getClient(options)

3. Adım: Resimleri algılayıcıya gönderin

Nesne algılama ve sınıflandırma, eşzamansız işlemedir:

  • Algılayıcıya bir resim gönderirsiniz (process() aracılığıyla).
  • Algılayıcı bu konuda epey çalışıyor.
  • Algılayıcı, geri arama aracılığıyla sonucu size bildirir.

Aşağıdaki kod tam olarak bunu sağlar (kodu kopyalayıp fun runObjectDetection(bitmap:Bitmap)): içindeki mevcut koda ekleyin

// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
   .addOnSuccessListener {
       // Task completed successfully
        debugPrint(it)
   }
   .addOnFailureListener {
       // Task failed with an exception
       Log.e(TAG, it.message.toString())
   }

İşlem tamamlandığında algılayıcı size şu bilgileri verir:

  • Algılanan toplam nesne sayısı. Algılanan her nesne şunlarla birlikte açıklanır:
  • trackingId: Kareler arası izlemek için kullandığınız tam sayı (bu codelab'de KULLANILMAZ).
  • boundingBox: Nesnenin sınırlayıcı kutusu.
  • labels: Algılanan nesne için etiketlerin listesi (yalnızca sınıflandırma etkinleştirildiğinde):
  • index (Bu etiketin dizinini al)
  • text ("Moda Ürünleri", "Gıda", "Ev Ürünleri", "Yer", "Bitki" dahil olmak üzere bu etiketin metnini alın)
  • confidence ( 1,0 ile 0,0 ile 1,0 arasındaki bir kayan nokta %100 anlamına gelir)

Kodun, debugPrint() ile algılanan sonuç için Printf türü işleme yaptığını fark etmişsinizdir.

MainActivity sınıfına ekleyin:

private fun debugPrint(detectedObjects: List<DetectedObject>) {
   detectedObjects.forEachIndexed { index, detectedObject ->
       val box = detectedObject.boundingBox

       Log.d(TAG, "Detected object: $index")
       Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
       Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
       detectedObject.labels.forEach {
           Log.d(TAG, " categories: ${it.text}")
           Log.d(TAG, " confidence: ${it.confidence}")
       }
   }
}

Artık görüntüleri algılamak için kabul etmeye hazırsınız!

Android Studio araç çubuğunda Çalıştır'ı ( yürütme.png) tıklayarak codelab'i çalıştıralım. Hazır bir görüntü seçmeyi deneyin veya fotoğraf çekin, ardından IDE'deki logcat penceresine( 16bd6ea224cf8cf1.png) bakın.

Şuna benzer bir kod görürsünüz:

D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection:  categories: Food
D/MLKit Object Detection:  confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection:  categories: Home good
D/MLKit Object Detection:  confidence: 0.75390625

...bu da algılayıcının 3 nesne gördüğü anlamına gelir:

  • Kategoriler Gıda ve Ev eşyası şeklindedir.
  • Bilinmeyen bir sınıf olduğundan ikincisi için kategori döndürülmedi.
  • Hayır trackingId (çünkü bu tek resim algılama modudur).
  • boundingBox dikdörtgeninin içindeki konum (ör. (481, 2021) - (2426, 3376))
  • Algılayıcı, ilkinin Yemek olduğundan oldukça emin (%90 güven oranı; salataydı).

Teknik olarak ML Kit Nesne Algılama'nın çalışmasını sağlamak için ihtiyacınız olan tek şey bu. Şu anda her şeye sahipsiniz. Tebrikler!

Kullanıcı arayüzü tarafında, başlangıç aşamasında hâlâ aşamadasınız, ancak daha iyi bir deneyim oluşturmak için sınırlayıcı kutuyu çizmek gibi kullanıcı arayüzünde algılanan sonuçlardan yararlanabilirsiniz. Şimdi bir sonraki adıma geçelim. Algılanan sonuçları işlemden sonra işleme al!

6. Algılama sonuçlarını işleme sonrası

Önceki adımlarda, algılanan sonucu logcat'e (basit ve hızlı) yazdırırsınız.

Bu bölümde, sonucu görselde kullanacaksınız:

  • resimdeki sınırlayıcı kutuyu çiz
  • kategori adını ve güveni sınırlayıcı kutunun içine çizin

Görselleştirme yardımcı programlarını anlama

Codelab'in içinde, algılama sonucunu görselleştirmenize yardımcı olacak bazı standart kodlar bulunur. Görselleştirme kodumuzu basit hale getirmek için şu yardımcı programlardan yararlanın:

  • data class BoxWithText(val box: Rect, val text: String) Bu, görselleştirme için nesne algılama sonucunun depolandığı bir veri sınıfıdır. box, nesnenin bulunduğu sınırlayıcı kutu, text ise nesnenin sınırlayıcı kutusuyla birlikte gösterilecek algılama sonucu dizesidir.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap Bu yöntem, bitmap girişinde detectionResults olan nesne algılama sonuçlarını çeker ve bunun değiştirilmiş kopyasını döndürür.

Aşağıda, drawDetectionResult yardımcı programı yönteminin bir çıkışına ilişkin örnek verilmiştir:

58c6f1d4ddb00dfa.png

ML Kit algılama sonucunu görselleştirme

ML Kit nesne algılama sonucunu giriş görüntüsünün üzerine çizmek için görselleştirme yardımcı programlarını kullanın.

debugPrint() adını verdiğiniz yere gidin ve aşağıdaki kod snippet'ini altına ekleyin:

// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
    var text = "Unknown"

    // We will show the top confident detection result if it exist
    if (obj.labels.isNotEmpty()) {
        val firstLabel = obj.labels.first()
        text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
    }
    BoxWithText(obj.boundingBox, text)
}

// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)

// Show the detection result on the app screen
runOnUiThread {
    inputImageView.setImageBitmap(visualizedResult)
}
  • Görselleştirme sonucunu görüntülemek için Makine Öğrenimi Kiti DetectedObject'ni ayrıştırarak ve BoxWithText nesneden bir liste oluşturarak başlarsınız.
  • Daha sonra, algılama sonucunu drawDetectionResult yardımcı program yöntemini kullanarak giriş görüntüsünün üzerine çizin ve ekranda gösterirsiniz.

Çalıştırma

Şimdi Android Studio araç çubuğunda Çalıştır'ı ( yürütme.png) tıklayın.

Uygulama yüklendikten sonra, kamera simgesi bulunan düğmeye basın, kameranızı bir nesneye doğru tutun, fotoğraf çekin, fotoğrafı kabul edin (Kamera Uygulaması'nda) veya önceden ayarlanmış resimlere kolayca dokunun. Algılama sonuçlarını görürsünüz; En son ML Kit ODT'yi deneyimlemek amacıyla düğmeye tekrar basın veya başka bir görüntü seçerek birkaç kez tekrarlayın.

a03109cb30d5014d.png

7. Tebrikler!

Uygulamanıza Nesne Algılama özellikleri eklemek için ML Kit'i kullandınız:

  • 3 API ile 3 adım
  • Giriş Resmi Oluştur
  • Algılayıcı Oluştur
  • Resmi Algılayıcıya Gönder

Uygulamanızı hemen kullanmaya başlamak için ihtiyacınız olan bu kadar.

İlerledikçe modeli geliştirmek isteyebilirsiniz. Varsayılan modelin yalnızca 5 kategoriyi tanıyabildiğini, modelin bıçak, çatal ve şişeyi bile bilmediğini görebilirsiniz. Özel modelleri nasıl eğitebileceğinizi öğrenmek için Cihaz üzerinde Makine Öğrenimi - Nesne Algılama öğrenme rotamızdaki diğer codelab'e göz atın.

İşlediklerimiz

  • Android uygulamanıza ML Kit Nesne Algılama ve İzleme özelliğini ekleme
  • Görüntülerdeki nesneleri algılamak için ML Kit'te cihaz üzerinde nesne algılama ve izleme özelliği nasıl kullanılır?

Sonraki Adımlar

  • Daha fazla görüntü ve canlı video içeren ML Kit ODT ile daha fazlasını tespit edin ve öğrenin. sınıflandırma doğruluğu ve performansı
  • Özel bir modeli nasıl eğiteceğinizi öğrenmek için Cihaz üzerinde Makine Öğrenimi Nesne Algılama öğrenme rotasına göz atın
  • ML Kit ODT'yi kendi Android uygulamanızda uygulayın

Daha Fazla Bilgi