Core ML Nedir, Nasıl Kullanılır? (Nesne Algılama ⚙️)

Merhaba arkadaşlar, bu benim Medium üzerindeki ilk blog yazım olacak, yaklaşık 3 yıldır Swift ile iOS uygulamalar geliştiriyorum, tecrübelerimi, deneyimlerimi sizinle paylaşmak için uygun yol arıyordum eskaza Şule Turp 🍋’un Objective-C dili üzerindeki ‘Protocol ve Delegate’ kavramlarını anlattığı yazıya denk geldim. Kendisine buna vesile olduğu için teşekkür ediyorum.

Core ML nedir?

Core ML, Apple’ın 2017 yılında duyurduğu; Kamera, Siri ve QuickType’ın da dahil olmak üzere Apple ürünlerinde kullanılan yeni bir Makine Öğrenme framework’udur. Core ML ile bir kaç satır kod yazarak akıllı ve yenilikçi uygulamalar geliştirebilirsiniz. Bunların dışında, Core ML performansı ve entegrasyon kolaylığıyla dikkat çekiyor.

Apple dökümantasyonlarına nasıl ulaşabilirim?

Apple, Makine Öğrenmesi için yeni bir sayfa oluşturdu, ona buradan ulaşabilirsiniz.

Core ML dökümantasyonlarına ise buradan ulaşabilirsiniz.

… ve son olarak Vision dökümantasyonlarına ise buradan ulaşabilirsiniz.

Bunları başlangıçta anlatmamın sebebi; kod kısmına geçtiğimizde, Core ML ve Vision kısımlarında aklınızdaki bulanıklığı kaldırma ve olaya net açıdan bakabilmenizi sağlamaktı.☺️

Tabii, Nesne algılama içinde Kamera’yı kullanacağız, o yüzden projemize AVKit frameworkü de dahil oluyor. Nedir AVKit framework’u?

AVKit ile birlikte projelerimize Kamera/Ses için kaydetme/alma gibi fonksiyonları kullanabiliyoruz. Bizde Nesne Algılama kullanırken Kamera input/output (giriş/çıkış) birimleriyle ilgileneceğiz.

Hepsinden önce Info.plist dosyamıza Kamera’nın gizliliğine dair ‘Usage Description’ girmeliyiz, aksi taktirde uygulamayı build edip çalıştırdığınız anda uygulama crash olacaktır.

Privacy — Camera Usage Description

viewDidLoad() methodumuz altında görüntü çıktısı almak için bir oturum (session) oluşturuyoruz.

sessionPreset ise çıktısını alacağımız görüntü/ses’in kalitesi diyebilirim (bitrate).

previewLayer ise görüntüyü oturumumuzdan alacak bizim ekranda görmemizi sağlayacak view parçasına deniyor.

previewLayer’i ana view nesnemize alt layer (sublayer) olarak ekliyoruz ve previewLayer’in frame’ini (x, y, width, height) değerlerini belirtmemiz gerekiyor aksi taktirde ekranda kameranızın gönderdiği çıktıları view parçanız üzerinde göremezsiniz.

Nesne Algılamak için en can alıcısı nokta burası! 😈

Öncelikle sınıfımıza AVCaptureVideoDataOutputSampleBufferDelegate protokolünü dahil ediyoruz.

Bu protokolü dahil ederek AVKit’in cameraOutput methodunu kullanacağız, bu method sayesinde video çıktı durumunu gözleyebileceğimiz gibi tampon verilerini de elde edebileceğiz. 👐🏼

Preview Layer’ı ekledikten sonra aşağıdaki satırları dahil ediyoruz. Sınıfımıza eklediğimiz protokolü tetikleyecek satırlar bunlar.

Bu esnada çalıştığımız controller dosyasının en üst tepesine, Vision framework’u dahil edilmeli.

viewDidLoad() fonksiyonu dışında, AVCaptureVideoDataOutputSampleBufferDelegate protokolünün alt methodlarından olan captureOutput’u oluşturmanız gerekiyor. Bu method ile, üstte de belirttiğim gibi kamera çıktınızın tampon verileri ile VNCoreMLRequest sayesinde, Makine Öğrenmesi modellerinden göndermiş olduğunuz görüntünün ne içerdiğine dair tahmin üretip bunları görüntüleyebileceğiz. 📹

Haa Model demişken, Nedir bu model?

Model gönderdiğiniz tampon verinin işlenerek içerisinde bulunan patternlara göre tahmin üretmeye yarayan bileşenlerdir. Apple’ın sitesinde yayınlamış olduğu 6 adet model var. Bunlar: MobileNet, SqueezeNet, Places205-GoogLeNet, ResNet50, Inception v3, VGG16'dır.

Her biri yaklaşık 1000'er farklı kategoride pattern içeriyor. Bunlar genellikle; ağaçlar, hayvanlar, yemekler, araçlar, insanlar ve daha fazlasını içeriyor.

İstediğiniz modeli kullanmakta özgürsünüz, ben bu örnek için MobileNet modelini kullandım. Elbette modellerin boyutlarına bakarsanız MobileNet 17MB, VGG16 ise 553MB’lık modeldir. Kararlı ve net cevaplar almak istiyorsanız VGG16 modelini kullanmanız daha iyi olabilir.

Modellerin bulunduğu sayfadan istediğiniz modeli indirerek proje dosyanıza sürüklemeniz yeterli. Aşağıdaki captureOutput methodunda VNCoreMLModel(for: MobileNet().model) şeklinde belirtmelisiniz..

Çıktımıza bakalım 😎

Örnek koda GitHub’dan ulaşabilirsiniz; >> Buradan <<

Görüş ve önerilerinizi yorum olarak belirtirseniz, elimden geldiğince yanıt vermeye çalışacağım. Bir sonraki yazımızın konusuna da, sizlerin yorumlarıyla karar vermemiz mümkün. 🙌🏼

Okuduğunuz için teşekkürler. 📍