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 getiren bir mobil SDK'dır. Güçlü ancak kullanımı kolay Vision ve Natural Language API'leri kullanarak uygulamalarınızdaki yaygın sorunları çözebilir veya yepyeni kullanıcı deneyimleri oluşturabilirsiniz. Bunların tümü Google'ın sınıfının en iyisi ML modelleriyle desteklenir ve size ücretsiz olarak sunulur.

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

Bu codelab'de, belirli bir resim için nesne algılama ve izlemeyi (ODT) mevcut Android uygulamanıza eklemeyle ilgili basit adımlarda size yol gösterilmektedir. Bu codelab'de, ML Kit ODT kullanımının vurgulanabilmesi için bazı kısayollar kullanıldığını lütfen unutmayın.

Oluşturacağınız uygulama

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.Sonuçta sağdaki resme benzer bir şey görürsünüz.

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 son sürümü (v4.1.2 ve üzeri)
  • Android Studio Emulator veya fiziksel bir Android cihaz
  • Örnek kod
  • Kotlin'de Android geliştirmeyle ilgili temel bilgiler

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 kullanımınıza sunulmuştur.

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ın sıkıştırması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 vardır.

mlkit-android deposundaki object-detection 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 uygulamanın tamamlanmış 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 içe aktararak başlayalım.

Android Studio'yu açın, Projeyi İçe Aktar (Gradle, Eclipse ADT vb.)'ı seçin ve daha önce indirdiğiniz kaynak koddan starter klasörünü seçin.

7c0f27882a2698ac.png

ML Kit Nesne Algılama ve İzleme için bağımlılıkları 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ı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 öğesini içe aktardığınızdan emin olun.)

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

Projeyi Android Studio'ya içe aktardığınıza ve 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 üzerinden ana makinenize bağlayın veya Android Studio emülatörünü başlatın ve Android Studio araç çubuğunda Çalıştır'ı ( execute.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 resim seçmenize ve bu kod laboratuvarında oluşturacağınız bir nesne algılama ve izleme ardışık düzenine beslemenize olanak tanıyan bazı standart kodlar içerir. Kod yazmadan önce uygulamayı biraz inceleyelim.

Öncelikle, alt kısımda aşağıdaki işlemleri yapabileceğiniz bir düğme ( c6d965d639c3646.png) vardır:

  • Cihazınıza/emülatörünüze entegre edilmiş kamera uygulamasını açın.
  • Kamera uygulamanızda fotoğraf çekin
  • Başlatıcı uygulamasında çekilen resmi alma
  • resmi gösterme

Fotoğraf çek düğmesini deneyin, fotoğraf çekmek için talimatları uygulayın, fotoğrafı kabul edin ve başlatıcı uygulamasında gösterildiğini gözlemleyin.

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ğini görebilirsiniz:

1dd41b3ec978f1d9.png

5. Cihaz üzerinde nesne algılama ekleme

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 şablon kod içerir. Codelab'i bir Android emülatöründe çalıştırıyorsanız uygulamada, nesne algılamayı denemeniz için önceden ayarlanmış 3 resim de vardır.

Hazır ayarlanmış resimlerden bir resim seçtiğinizde veya kamera uygulamasıyla fotoğraf çektiğinizde şablon kod, bu 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 yapmak için runObjectDetection yöntemine kod ekleyeceğiz.

Bir resimde cihaz üzerinde nesne algılamayı ayarlama ve çalıştırma

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

  • Resim hazırlama: 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 gerçekleştirirsiniz.

/**
 * 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 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: InputImage oluşturun

ML Kit, Bitmap'den 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, Oluşturucu Tasarım Deseni'ni izler. Yapılandırmayı oluşturucuya iletir ve ardından ondan bir algılayıcı edinirsiniz. Yapılandırabileceğiniz 3 seçenek vardır (bu kod laboratuvarındaki seçenekler kalın olarak gösterilmiştir):

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

Bu kod laboratuvarı, tek resimli birden fazla nesne algılama ve sınıflandırma içindir. Aşağıdakileri 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: Tarayıcıya resim besleyin

Nesne algılama ve sınıflandırma işlemi ayarsızdır:

  • process() aracılığıyla dedektöre bir resim gönderirsiniz.
  • Algılayıcı bu konuda oldukça yoğun çalışıyor.
  • Tanımlayıcı, geri arama yoluyla sonucu size bildirir.

Aşağıdaki kod tam da bunu yapar (fun runObjectDetection(bitmap:Bitmap)): içindeki mevcut koda kopyalayıp ekler).

// 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ı sizi aşağıdakilerle bilgilendirir:

  • Algılanan toplam nesne sayısı. Algılanan her nesne şu bilgilerle açıklanır:
  • trackingId: Çerçeveler arasında izlemek için kullandığınız bir tam sayı (bu kod laboratuvarında KULLANILMAZ).
  • boundingBox: Nesnenin sınırlayıcı kutusu.
  • labels: algılanan nesnenin etiketlerinin listesi (yalnızca sınıflandırma etkinleştirildiğinde):
  • index (Bu etiketin dizini)
  • text ("Giyim", "Yiyecek", "Ev Eşyaları", "Yer", "Bitki" gibi öğeleri içeren bu etiketin metnini alın)
  • confidence ( 0,0 ile 1,0 arasında değişen bir kayan nokta. 1,0 %100 anlamına gelir.)

Kodun, debugPrint() ile algılanan sonuç için printf türü bir işlem gerçekleştirdiğini 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 resimleri kabul etmeye hazırsınız.

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

Aşağıdakine benzer bir şey 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, dedektörün 3 nesne gördüğü anlamına gelir:

  • Kategoriler Yiyecek ve Ev eşyası'dır.
  • Bilinmeyen bir sınıf olduğu için 2. sınıf için kategori döndürülmez.
  • trackingId yok (bu tek resim algılama modu olduğu için).
  • boundingBox dikdörtgenindeki konum (ör. (481, 2021) - (2426, 3376))
  • Algılayıcı, birincinin Yiyecek olduğundan oldukça emin (%90 güven; salataydı).

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

Kullanıcı arayüzü tarafında, başladığınız aşamadasınız ancak daha iyi bir deneyim oluşturmak için kullanıcı arayüzünde algılanan sonuçlardan (ör. sınırlayıcı kutuyu çizme) yararlanabilirsiniz. Bir sonraki adıma geçelim: algılanan sonuçlar üzerinde son işlem yapma.

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

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

Bu bölümde, sonucu görüntüye uygulayacaksınız:

  • Resim üzerinde sınırlayıcı kutu çizme
  • Kategori adını ve güven puanını sınırlayıcı kutunun içine çizin

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

Kod laboratuvarının içinde, algılama sonucunu görselleştirmenize yardımcı olacak bazı standart kodlar vardır. Görselleştirme kodumuzu basitleştirmek için aşağıdaki 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ı kutudur ve text, 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 olarak nesne algılama sonuçlarını çizer ve değiştirilmiş kopyasını döndürür.

drawDetectionResult yardımcı yönteminin çıkışını gösteren örnek:

58c6f1d4ddb00dfa.png

ML Kit algılama sonucunu görselleştirme

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

debugPrint()'yi ç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)
}
  • ML Kit'in DetectedObject öğesini ayrıştırarak ve görselleştirme sonucunu görüntülemek için BoxWithText nesnelerinin bir listesini oluşturarak başlarsınız.
  • Ardından, drawDetectionResult yardımcı programı yöntemini kullanarak algılama sonucunu giriş görüntüsünün üzerine çizip ekranda gösterirsiniz.

Çalıştırın

Ardından Android Studio araç çubuğunda Çalıştır'ı ( 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 önceden ayarlanmış resimlere kolayca dokunabilirsiniz. Algılama sonuçlarını görürsünüz. En son ML Kit ODT'yi deneyimlemek için düğmeye tekrar basın veya birkaç kez tekrarlamak için başka bir resim seçin.

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şturma
  • Algılayıcı Oluşturma
  • Resmi algılayıcıya gönderme

Hepsi 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 tanımıyor. Özel bir modeli nasıl eğitebileceğinizi öğrenmek için Cihaz Üzerinde Makine Öğrenimi - Nesne Algılama öğrenme yolumuzda yer alan diğer kod laboratuvarına göz atın.

Ele aldığımız konular

  • 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 izlemeyi kullanma

Sonraki Adımlar

  • Algılama ve sınıflandırma doğruluğunu ve performansını deneyimlemek için daha fazla resim ve canlı video içeren ML Kit ODT ile daha fazlasını keşfedin
  • Özel bir modeli nasıl eğiteceğinizi öğrenmek için Cihaz Üzerinde Makine Öğrenimi - Nesne Algılama öğrenme yoluna göz atın.
  • ML Kit ODT'yi kendi Android uygulamanıza uygulama

Daha Fazla Bilgi