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:
- starter: Bu codelab için temel aldığınız başlangıç kodu.
- final: 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.
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 ( ) 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'ı ( ) 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 ( ) 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:
İ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:
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'ı ( ) 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( ) 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 vetext
, 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şindedetectionResults
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:
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çinBoxWithText
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'ı ( ) 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.
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