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

1. Başlamadan önce

ML Kit, Google'ın cihaz üzerinde makine öğrenimi uzmanlığını Android ve iOS uygulamalarına taşıyan bir mobil SDK'dır. Uygulamalarınızdaki yaygın sorunları çözmek veya yepyeni kullanıcı deneyimleri oluşturmak için güçlü ancak kullanımı kolay Vision ve Natural Language API'lerini kullanabilirsiniz. Tümü Google'ın sınıfının en iyisi makine öğrenimi modelleriyle desteklenir ve size ücretsiz olarak sunulur.

ML Kit'in tüm API'leri cihaz üzerinde çalışır. Bu sayede, örneğin canlı kamera görüntü akışını işlemek istediğiniz gerçek zamanlı kullanım alanlarında kullanılabilir. Bu, işlevin çevrimdışı olarak da kullanılabileceği anlamına gelir.

Bu codelab'de, belirli bir resim için Nesne Algılama ve İzleme (ODT) özelliğini mevcut Android uygulamanıza ekleme konusunda 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.

Ne oluşturacaksınız?

Bu codelab'de ML Kit ile bir Android uygulaması oluşturacaksınız. Uygulamanız, belirli bir görüntüdeki nesneleri algılamak için ML Kit Nesne Algılama ve İzleme API'sini kullanır.Sonunda, sağdaki görüntüye benzer bir şey görmeniz gerekir.

Neler öğreneceksiniz?

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

Gerekenler

  • Android Studio'nun yeni bir sürümü (4.1.2 veya daha yeni)
  • Android Studio Emulator veya fiziksel bir Android cihaz
  • Örnek kod
  • Kotlin ile Android geliştirme hakkında temel düzeyde bilgi sahibi olma

Bu codelab, ML Kit'e odaklanmaktadır. Alakalı olmayan kavramlar ve kod blokları işaretlenmiştir ve yalnızca kopyalayıp yapıştırmanız için paylaşılmıştır.

2. Hazırlanın

Kodu İndirme

Bu codelab'in tüm kodunu indirmek için aşağıdaki bağlantıyı tıklayın:

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

mlkit-android deposundaki object-detection alt dizini iki dizin içerir:

  • android_studio_folder.pngstarter: Bu codelab'de temel alacağınız başlangıç kodu.
  • android_studio_folder.pngfinal: Tamamlanmış örnek uygulamanın kodu.

3. Projeye ML Kit Nesne Algılama ve İzleme API'sini 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, etc.)'yi (Projeyi İçe Aktar (Gradle, Eclipse ADT vb.)) seçin ve daha önce indirdiğiniz kaynak kodundan starter klasörünü belirleyin.

7c0f27882a2698ac.png

ML Kit Nesne Algılama ve İzleme'nin bağımlılıklarını ekleme

ML Kit bağımlılıkları, ML Kit ODT SDK'sını uygulamanıza entegre etmenize olanak tanır. 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ılabilir olduğundan 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 yalnızca starter/app/build.gradle öğesini içe aktardığınızdan emin olun. Deponun tamamını içe aktarmayın.)

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

Projeyi Android Studio'ya aktardığınıza ve ML Kit Nesne Algılama ve İzleme bağımlılıklarını 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 ve Android Studio araç çubuğunda Run'ı ( execute.png) tıklayın.

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

Uygulama, Android cihazınızda başlatılmalıdır. Fotoğraf çekmenize veya önceden ayarlanmış bir resmi seçip bu codelab'de oluşturacağınız nesne algılama ve izleme işlem hattına aktarmanıza olanak tanıyan bazı ortak metin kodları içerir. Kod yazmadan önce uygulamayı biraz inceleyelim.

İlk olarak, altta Düğme ( c6d965d639c3646.png) bulunur. Bu düğmeyle:

  • cihazınızda/emülatörünüzde entegre kamera uygulamasını açma
  • Kamera uygulamanızda fotoğraf çekme
  • çekilen görüntüyü başlangıç uygulamasında alma
  • resmi görüntüleme

Fotoğraf çek düğmesini deneyin, fotoğraf çekmek için istemleri uygulayın, fotoğrafı kabul edin ve başlangıç uygulamasında gösterilmesini izleyin.

Nasıl çalıştığını görmek için birkaç kez tekrarlayın:

9ec541980dbe2d31.png 8312dde41425ba4b.png fa8492bfc1914ff0.png

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

3 hazır resimden birini seçin. Resmin daha büyük görünümde gösterildiğinden emin olun:

1dd41b3ec978f1d9.png

5. Cihaz üzerinde nesne algılama ekleme

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

Hazır resimlerden birini seçtiğinizde veya kamera uygulamasıyla fotoğraf çektiğinizde, ortak metin kodu bu resmi 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çin runObjectDetection yöntemine kod ekleyeceksiniz.

Görüntüde cihaz üzerinde nesne algılamayı ayarlama ve çalıştırma

ML Kit ODT'yi ayarlamak için yalnızca 3 basit adım ve 3 API vardır:

  • Resim hazırlama: InputImage
  • Algılayıcı nesnesi oluşturma: ObjectDetection.getClient(options)
  • Yukarıdaki 2 nesneyi bağla: process(image)

Bunları MainActivity.kt dosyasındaki runObjectDetection(bitmap: Bitmap) işlevinde yaparsınız.

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

Şu anda işlev boş. ML Kit ODT'yi uygulamak için aşağıdaki adımlara geçin. Bu süreçte Android Studio, gerekli içe aktarmaları eklemenizi ister:

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

1. adım: InputImage oluşturun

ML Kit, Bitmap öğesinden InputImage oluşturmak için basit bir API sağlar. Ardından, ML Kit API'lerine bir InputImage besleyebilirsiniz.

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

Yukarıdaki kodu runObjectDetection(bitmap:Bitmap) dosyasının en üstüne ekleyin.

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

ML Kit, Builder Design Pattern'i kullanır. Yapılandırmayı oluşturucuya iletir, ardından yapılandırmadan bir algılayıcı edinirsiniz. Yapılandırılacak 3 seçenek vardır (bu codelab'de kalın olarak belirtilen seçenekler kullanılır):

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

Bu kod laboratuvarı, tek görüntüde birden fazla nesne algılama ve sınıflandırma içindir. Hemen 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: Görüntüleri dedektöre aktarın

Nesne algılama ve sınıflandırma, eş zamansız işleme olarak yapılır:

  • Tespit aracına (process() üzerinden) bir resim gönderirsiniz.
  • Dedektör bu konuda oldukça yoğun çalışır.
  • Algılayıcı, sonucu geri arama yoluyla size bildirir.

Aşağıdaki kod tam olarak bunu yapar (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())
   }

Tamamlandığında dedektör sizi aşağıdaki bilgilerle uyarır:

  • Algılanan toplam nesne sayısı. Algılanan her nesne şu şekilde açıklanır:
  • trackingId: Çerçeveler arası izlemek için kullandığınız bir tam sayı (bu codelab'de kullanılmaz).
  • 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 alma)
  • text ("Moda Ürünleri", "Yiyecek", "Ev Ürünleri", "Yer", "Bitki" dahil olmak üzere bu etiketin metnini alın)
  • confidence ( 1,0 %100 anlamına gelen, 0,0 ile 1,0 arasında değişen bir kayan nokta)

Kodun, debugPrint() ile algılanan sonuç için printf benzeri bir işlem 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 algılama için resim kabul etmeye hazırsınız.

Android Studio araç çubuğunda Run'ı ( execute.png) tıklayarak codelab'i çalıştıralım. Önceden ayarlanmış bir resmi seçmeyi deneyin veya fotoğraf çekin, ardından IDE'deki logcat penceresine( 16bd6ea224cf8cf1.png) bakın.

Aşağıdakine benzer bir ifade 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

...yani dedektör 3 nesne gördü:

  • Kategoriler Yiyecek ve Ev eşyası'dır.
  • 2. için bilinmeyen bir sınıf olduğundan kategori döndürülmedi.
  • trackingId yok (çünkü bu, tek resim algılama modudur).
  • boundingBox dikdörtgenin içindeki konum (ör. (481, 2021) – (2426, 3376))
  • Algılayıcı, 1. öğenin Yiyecek olduğuna oldukça emin (güven oranı% 90, salata olduğu için).

ML Kit Nesne Algılama'nın çalışması için teknik olarak ihtiyacınız olan her şeyi şu anda elde ettiniz. Tebrikler!

Kullanıcı arayüzü tarafında, başladığınız 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. Bir sonraki adıma geçelim: Algılanan sonuçları işleme sonrası hale getirin.

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

Önceki adımlarda, algılanan sonucu logcat'e yazdırıyorsunuz: basit ve hızlı.

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

  • görüntüde sınırlayıcı kutuyu çizin
  • sınırlayıcı kutunun içine kategori adını ve güven düzeyini çiz

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

Algılama sonucunu görselleştirmenize yardımcı olmak için codelab'in içinde bazı standart kodlar bulunur. Görselleştirme kodumuzu basitleştirmek için bu yardımcı programlardan yararlanın:

  • data class BoxWithText(val box: Rect, val text: String) Bu, görselleştirme için bir nesne algılama sonucunu depolayan 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örüntülenecek algılama sonucu dizesidir.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap Bu yöntem, giriş bitmap üzerinde detectionResults nesne algılama sonuçlarını çizer ve değiştirilmiş kopyasını döndürür.

drawDetectionResult yardımcı program yönteminin çıkışına dair bir örneği aşağıda görebilirsiniz:

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() işlevini çağırdığınız yere gidin ve altına aşağıdaki kod snippet'ini 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)
}
  • Öncelikle ML Kit'in DetectedObject ayrıştırarak görselleştirme sonucunu göstermek için BoxWithText nesnelerin listesini oluşturursunuz.
  • Ardından, drawDetectionResult yardımcı yöntemini kullanarak algılama sonucunu giriş resminin üzerine çizin ve ekranda gösterin.

Uygulayın

Şimdi Android Studio araç çubuğunda Run'ı ( execute.png) tıklayın.

Uygulama yüklendikten sonra kamera simgesinin bulunduğu düğmeye basın, kameranızı bir nesneye doğrultun, fotoğraf çekin, fotoğrafı kabul edin (Kamera uygulamasında) veya herhangi bir hazır resme kolayca dokunun. Algılama sonuçlarını görmeniz gerekir. En yeni ML Kit ODT'yi deneyimlemek için düğmeye tekrar basın veya başka bir resim seçin.

a03109cb30d5014d.png

7. Tebrikler!

Uygulamanıza Nesne Algılama özellikleri eklemek için ML Kit'i kullanmış olmanız gerekir:

  • 3 API ile 3 adım
  • Giriş Resmi Oluşturma
  • Algılayıcı Oluşturma
  • Resmi Tespit Aracı'na Gönderme

Çalıştırmak için yapmanız gerekenler bu kadar.

Devam ederken modeli geliştirmek isteyebilirsiniz: Varsayılan modelin yalnızca 5 kategoriyi tanıyabildiğini görebilirsiniz. Model, bıçak, çatal ve şişeyi bile bilmiyor. Özel bir modeli 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.

İşlediğimiz konular

  • Android uygulamanıza ML Kit Nesne Algılama ve İzleme'yi ekleme
  • Resimlerdeki nesneleri algılamak için ML Kit'te cihaz üzerinde nesne algılama ve izleme özelliğini kullanma

Sonraki Adımlar

  • Algılama ve sınıflandırma doğruluğu ile performansı deneyimlemek için daha fazla resim ve canlı video ile ML Kit ODT'yi kullanarak daha fazlasını keşfedin.
  • Ö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.
  • Kendi Android uygulamanızda ML Kit ODT'yi uygulama

Daha Fazla Bilgi