Core ML: Temel Bilgiler

CoreML, matematiksel ve istatistiksel yöntemler kullanarak mevcut verilerden çıkarımlar yapan yöntemler dizisidir.

Berkin Ceylan
TurkishKit
6 min readDec 4, 2018

--

Apple, WWDC17'de geliştiricilerin kendi uygulamalarına AI (Yapay Zeka) yetenekleri ekleyebilmeleri için Core ML adında bir kütüphane tanıttı. Bu kütüphane ile nesne algılama, duygu analizi, el yazısı tanıma ve müzik etiketleme gibi modeller ile çok çeşitli alanlarda kullanıcılarınızı şaşırtabilirsiniz.

Machine Learning (Makine Öğrenmesi) Nedir?

Makine öğrenmesi, matematiksel ve istatistiksel yöntemler kullanarak mevcut verilerden çıkarımlar yapan, bu çıkarımlarla bilinmeyene dair tahminlerde bulunan yöntemler dizisidir. Makine öğrenmesine güncel hayatımızdan bazı örnekler: yüz tanıma, belge sınıflandırma, spam tespiti.*

Makine öğrenmesinin en bilinen kullanım senaryolarından biri de Facebook Haber Kaynağı‘dır. Haber Kaynağı, her kullanıcının özet akışını kişiselleştirmek için makine öğrenimini kullanır.

CoreML Modeli Nedir?

CoreML modelini daha iyi anlayabilmeniz için öncelikle makine öğrenmesinde bir modelin ne ifade ettiğini bilmelisiniz. Model, bir makine öğrenmesi algoritmasının belirli bir konudaki eğitim setinin kullanılarak eğitilmesi ile yaratılan bir model yapısını ifade eder.

TurkishKit — CoreML Modeli

CoreML modeli ise farklı bir platformda önceden hazırlanmış eğitimli bir modelin Swift ile kullanılabilecek .mlmodel formatındaki dosyadır.

Eğitimli Model Ne demek?

Evet farkındayım, şimdiden birçok terim ile karşı karşıyasınız ancak terimler, konuyu anlamamız için gerekli. Belki biraz da sarılmak.

Eğitimli Model, eğitim süreci tarafından oluşturulan ve sonuçlandırılan bir yapıdır. Bir modelin eğitim süreci, öğrenilecek eğitim verisi ve öğrenme algoritmasını içerir.

Diğer bir deyişle CoreML modelini bir anahtar gibi düşünebiliriz. Ona eğitilmesinde kullanılan türden bir veri verirsek, bize doğru olduğunu düşündüğü cevabı verecektir. Örneğin bitki türlerini tanıması amacıyla eğitilmiş bir modele yalnızca bir bitkiye ait veri verebilir ve modelin bir çıktı elde etmesini beklersiniz. Bitki türlerini tanıyan bir modele araba fotoğrafı verirseniz size doğru sonucu vermeyecektir.

Hazır Eğitimli Modeller

Apple tarafından eğitilmiş ve farklı tür kullanımlara hazır 6 model mevcut;

  • MobileNet
  • SqueezeNet
  • Places205-GoogLeNet
  • ResNet50
  • Inception v3
  • VGG16.

Her bir model yaklaşık 1000'er farklı kategoride pattern içeriyor. Bu kategorilerden bazıları;

  • Ağaçlar
  • Hayvanlar
  • Yemekler
  • Araçlar
  • İnsanlar

gibi yapıları içeriyor.

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

Apple’ın hazırladığı eğitimli modellerine buradan,

Vision dosyalarına ise buradan ulaşabilirsiniz.

Tüm bunları anlatmamın sebebi; kodlamaya geçtiğimizde, Core ML ve Vision ile ilgili kısımları kolaylıkla anlayabilmenizi sağlamaktı.

Proje Zamanı!

Core ML’in sihirli dünyasını anlayabilmek ancak örnek bir proje ile mümkün bence. Birazdan geliştireceğimiz basit uygulama ile iPhone’unuzun kamerasını kullanarak anlık olarak gösterilen objelerin ne olduklarını algılayacağız.

Bunun için öncelikle iPhone kamerasına erişmeli ve kameradan gelen anlık görüntüyü ekranda göstermelisiniz. Tüm bu işlem AVKit adındaki kütüphane ile kolayca mümkün.

AVKit ile birlikte projelerimizde iPhone’un kamera ve mikrofon donanımlarına erişebiliyoruz ve kayıt alabiliyoruz.

Biz de kameradan gelen görüntü üzerinde nesne algılayacağımız için kamera input/output(giriş/çıkış) birimleni kullanacağız

Adım 1

Öncelikle Storyboard dosyamızın hazırda gelen ViewController’ına bir adet UILabel elementi ekliyoruz. Bu label, kameranın gördüğü objelerin model tarınca tahmin edilecek isimlerini gösterecek. Örneğin siz iPhone’a bir masa göstereceğiniz zaman bu label, “Desk” gibi bir sonuç yazacak.

Bu label’ın IBOutlet değişkenine identifierLabel adını verdim.

Adım 2

Apple güvenlik konusuna son derece önem veren bir kültüre sahip. Bunun izlerini tüm ürün ve servislerinde görmek mümkün. Bizler iPhone kullanıcılarının kameralarına erişeceğimiz için öncelikle kameralarını kullanabilmek için onlardan izin almalıyız.

Bunun için proje dosyanızda bulunan info.plist dosyasına gidin.

Bu listeye “privacy-Camera Usage Description” adında yeni bir alan ekleyin ve açıklamasına kullanıcının kamerasını hangi amaç ile kullanacağınızı açıkça belirtin. Bu açıklamanın yetersiz olması durumda Apple, uygulamanızın App Store’da yer almasına engel olabilir.

Privacy | Camera Usage Description

Adım 3

Sıra geldi kullanıcının kamerasını kullanarak görüntülenen anın ekrana canlı bir şekilde verilmesine. Bu noktada AVKit kütüphanesini kullanmaya başlayacağımız için ViewController.swift dosyanıza AVKit kütüphanesini eklemelisiniz. Bunun için; import AVKit

Kameradan görüntü çıktısı alabilmemiz için viewDidLoad fonksiyonumuzda bir AVCaptureSessionobjesi oluşturmamız gerekiyor.viewDidLoad içerisine yazılması gereken tüm kodlar şöyle;

sessionPreset: Çıktısını alacağımız verinin tipi.

previewLayer: Kamera görüntüsünü AVCapture oturumumuzdan alacak ve bizim ekranda görmemizi sağlayacak olan obje.Bu layer’ın width (genişlik) ve height(yükseklik) gibi bilgilerini de vererek ana view’ımızın sublayer’ı (alt layer’ı) olarak ekliyoruz.

Adım 4

Öncelikle bir önceki adımda oluşturduğumuz AVCaptureSession objesinden geelcek anlık görüntü verisini alabilmemiz için sınıfımızın AVCaptureVideoDataOutputSampleBufferDelegate protokolünü aşağıdaki gibi desteklemesi gerekiyor.

Bu protokolü destekleyerek AVKit’in cameraOutput fonksiyonunu kullanacağız. Bu fonksiyon sayesinde anlık video çıktısını gözleyebileceğimiz gibi tampon verilerini de elde edebileceğiz.

Bir önceki adımda previewLayer’ı viewDidLoad içerisine eklemiştik. Şimdi buraya küçük bir ekleme yapacağız. previewLayer.frame = view.frame yazan kodumuzun hemen altına aşağıdaki kodları ekleyeceğiz. Böylece protokolümüzün çalışmasını sağlayacağız.

viewDidLoad fonksiyonun son hali artık şöyle;

Adım 4

Sıra geldi nesne algılamaya 😏 Artık ViewController.swift dosyasının en üstüne, Vision kütüphanesini dahil etmenin zamanı geldi.

Projede kullandığımız tüm kütüphaneler

Kütüphane ile birlikte bir CoreML modeline de ihtiyacımız olacak tabii ki. Başlarda da bahsettiğim gibi bu projede MobileNet modelini kullanacağız. Modeli aşağıdaki linkten indirebilirsiniz;

https://developer.apple.com/machine-learning/build-run-models/

Modeli indirdikten sonra projenize sürükle-bırak ile almanız yeterli olacak.

AVCaptureVideoDataOutputSampleBufferDelegate protokolünden gelen bir fonksiyon olan captureOutput fonksiyonunu eklemeniz gerekiyor. Bu fonksiyon ile önceden de belirttiğim gibi anlık kamera görüntüsü ve tampon verileri alacaksınız. Sonrasında ise bu tampon verileri kullanarak VNCoreMLRequest oluşturacaksınız. Bu request, CoreML modelinize gönderilecek ve size tahmin ettiği sonucu verecek.

captureOutput fonksiyonu içerisine aşağıdaki kod satırlarını ekleyin;

Not: Özellikle resim koydum ki elinizle yazarken daha iyi anlayın. 🤓

Deneyimleme Zamanı

İşte CoreML ile geliştirdiğimiz ilk projemizi tamamladık! Şimdi projeyi çalıştırabilir ve siz dahil çevrenizdeki diğer insanları etkileyebilirsiniz 😁

Projeyi daha yakından incelemek isterseniz link burada:

https://github.com/TurkishKit/TurkishKit-CoreML

Görüş ve önerilerinizi yorum olarak bekliyorum. Bir sonraki yazımızda görüşmek üzere 🙌🏼

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

Swift Öğrenin. Uygulama Geliştirin. Sınırların Ötesine Geçin.

Hem kod yazmaya yeni başlayanların hem de profesyonellerin rahatlıkla takip edebilecekleri 40 saatlik videolu eğitim ile Swift programlama dilini derinlemesine keşfedin. Eğitim boyunca karşılaşacağınız problemleri birebir online görüşmelerde çözün.

Bizi daha yakından takip etmek istiyorsanız, sosyal medya hesaplarımıza aşağıdan ulaşabilirsiniz!

Twitter | Instagram | Facebook

--

--