CoreML: Sınıflandırma
CreateML ile sınıflandırma modelleri oluşturarak kendi makine öğrenmesi modellerinizi oluşturabilirsiniz.
Merhaba sevgili TurkishKit okurları! 👋 Bugün size Apple’ın WWDC 2018’de tanıtmış olduğu CreateML ile nasıl uygulamalarınızda makine öğrenmesi modellerini kullanabileceğinizi göstereceğiz. Hazırsanız haydi başlayalım! 🙃
CreateML nedir?
CreateML Apple tarafından çıkarılan ve kullanıcıların uygulamarında makine öğrenmesinden faydalanabilecekleri bir altyapıdır. CreateML kendi data setlerinizi kullanarak yarattığınız CoreML modellerini IOS uygulamalarınızda kullanmanıza olanak sağlar. Mesela bu modelleri kullanarak bir fotoğraftaki hayvanları tespit edebilir, bir ses kaydını yazıya dönüştürebilir ve fotoğrafları sınıflandırabilirsiniz. Eğer siz de uygulamanızın bu ilgi çekici özelliklere sahip olmasını istiyorsanız gelin birlikte adım adım bir makine öğrenme modelini nasıl oluşturabileceğimizi ve uygulamalarımda kullanabileceğimizi öğrenelim! 🎉
Sınıflandırıcı Yaratmak
Makine öğrenme modellerini sayısız amaç için kullanabilirsiniz ancak bu yazının devamında kolay bir şekilde uygulamalarınızda kullanabileceğiniz bir kedi-köpek sınıflandırıcısı yaratacağız. Bu sınıflandırıcı uygulamaya verilen bir resim üzerine bu resimde bulunanın bir köpek mi yoksa kedi mi olduğunu belirleyecek. Her ne kadar Apple kullanıcıları için birçok CoreML modeli çıkarmış olsa da kendi uygulamanız için özel olarak tasarlanmış bir makine öğrenme modeli yaratabilirsiniz!
Veri Setlerini Hazırlamak
Kendi CoreML modelinizi oluşturmanın ilk aşaması verilerinizi hazırlamaktır. Bu veriler testing ve training veri setleri olarak ikiye ayrılır. Peki testing ve training veri seti ne demek? Training veri seti modelinize önceden sınıflandırılmış resimler ekleyerek modelinizi eğitmenizi sağlar. Mesela birazdan oluşturacağımız köpek ve kedi sınıflandırıcısında kullanacağımız training seti modelimizin köpek ve kedi arasındaki farkları anlamasını sağlar. Testing veri seti ise modelinizin ne kadar iyi çalıştığını ve ne kadar doğru sınıflandırma yaptığını anlamanıza yardımcı olur. Peki training ve testing veri setlerini oluştururken nelere dikkat etmek gerekir?
1. Training ve testing veri setlerinizde aralarında sınıflandırma yapacağınız nesneler olmalı. Örneğin bu yazıda yapacağımız köpek-kedi sınıflandırıcısının veri setlerinde köpek ve kedi fotoğrafları olmalı. Kullanacağınız fotoğrafların %80’ini training seti için %20’sini ise testing seti için ayırın. Bu oranlar sahip olduğunuz fotoğraf sayısına göre değişse de makine öğrenme standartlarında en çok kabul edilen oranlar bunlardır.
2. Bir fotoğrafın sadece training data setinde ya da testing data setinde olmasına özen gösterin.
3. Kedi ve köpek fotoğraflarınızın benzer sayılarda olmasına dikkat edin. Örneğin 100 tane köpek fotoğrafınız varken 10 tane kedi fotoğrafınız olmamalı.
4. Çeşitli fotoğraflar kullanmaya çalışın. Farklı renklerde, farklı açılarda ve farklı büyüklüklerde kedi ve köpek resimleri kullanmak modelinizin daha başarılı sınıflandırmalar yapmasını sağlayacaktır.
Yukarıdaki noktalara dikkat ederek veri setlerimizi hazırladıktan sonra verilerimizi klasörlerde düzenliyoruz.
Training veri setimizdeki fotoğrafları ayrı bir klasöre, testing veri setimizi ise ayrı bir klasöre koyuyoruz. Bu iki klasör içinde de yine ikişer tane köpek ve kedi alt-klasörleri yaratıp köpek ve kedi fotoğraflarını sınıflandırıyoruz. Verilerimizi hazırladığımıza göre artık CreateML üzerinden bir model oluşturabiliriz! 🤗
CreateML ile CoreML Modeli Oluşturmak
İlk olarak Xcode’u açtıktan sonra Xcode>Open Developer Tools>CreateML ile bir CreateML dosyası açıyoruz. Çıkan ana sayfada ImageClassifier’ı seçiyoruz ve sınıflandırıcımıza bir ad veriyoruz.
Sınıflandırıcımıza anlamlı bir ad verdikten sonra çok kısa bir sürede kod yazmadan bir CoreML modeli oluşturacağız! Projemizin içindeki Model Sources sayfasındaki Training Data kısmına training setimizin olduğu klasörünü, sağ taraftaki Testing Data kısmına ise testing setimizin olduğu klasörü sürüklüyoruz. Aynı sayfada bulunan parameters kısmından modelinizin veri setinizi kaç kere eğitmesi gerektiğini seçebilirsiniz. Ancak unutmayın daha fazla eğitmek modelinizi kuvvetlendirse de modelinizin eğitim süresini uzatacaktır.
Daha sonra yukarıda bulunan train sekmesine girip play butonuna tıklıyoruz ve modelimizin verileri eğitmesini bekliyoruz. CreateML bu eğitim sırasında training setinizi biri training biri de validation olmak üzere iki sete ayırır. Bu nedenle modelinizin doğruluk yüzdesi her eğitimde farklı çıkabilir. Eğitimin sonunda sayfanın üst kısmında çıkan doğruluk yüzdesi modelinizin fotoğrafları ne kadar doğru sınıflandırdığını yansıtır.
Modelemizi eğittikten sonra şimdi sırada modelimizi test etmek var! Bunun için bulunduğunuz sayfadaki testing sekmesine gelerek play butonuna tıklamanız yeterli. CreateML sizin için daha önceden oluşturduğunuz testing seti klasöründeki fotoğrafların hepsini işler ve bu fotoğraflar için tahmini bir sınıflandırma yapar. Daha sonra bu sınıflandırmayı fotoğrafların gerçek etiketleriyle karşılaştırarak testing doğruluk yüzdesine ulaşır.
Eğer modelinizin doğruluk oranları istediğiniz yükseklikteyse bu modeli uygulamanızda kullanmak için kaydetmeniz gerekir. Sayfada bulunan Output sekmesinden modelinizi sürükleyerek bir .mlmodel formatında kaydedebilirsiniz. Artık modeliniz uygulamanızda kullanılmayı hazır! 👏 👏
CoreML Modelimizi Uygulamamıza Aktarmak
Şimdi işin en heyecanlı kısmına geldik: modelimizi uygulamamıza aktarmak! Bunun için ilk olarak bir Xcode dosyası açıyoruz ve dosyaya CreateML ile oluşturduğumuz modeli sürüklüyoruz. Ve kodlamaya başlıyoruz!
CoreML Modeli ile Vision Kurulumu
Modelinizi Xcode dosyanıza aktardığınızda CoreML sizin için modelinizin adında bir class oluşturuyor. Mesela hazırladığımız CatAndDogClassifier modeli için bir CatAndDogClassifier classı oluşuyor. Uygulamamızda fotoğrafları sınıflandırmak istediğimizden dolayı Vision anayapısından yararlanmamız gerekiyor. Bunun için ilk olarak ViewController.swift dosyasına CoreML ve Vision yapılarını import ediyoruz. Daha sonra modelimizin classını VNCoreMLModel
classını kullanarak model
adlı bir objede aktif hale getiriyoruz. Şimdi de bir Vision yapısını kurmak için VNCoreMLRequest
classından request
adlı bir obje yaratıyoruz ve bu classın model
adlı özelliğini kullanarak bir önceki satırda oluşturduğumuz model
objesini ekliyoruz.
lazy var classificationRequest: VNCoreMLRequest = {
do {
let model = try VNCoreMLModel(for: CatAndDogClassifier().model)
let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in self?.processClassifications(for: request, error: error)
})
request.imageCropAndScaleOption = .centerCrop
return request
} catch {
fatalError("Vision ML modelinde bir sorun oluştu: \(error)")
}
}()
Yukarıdaki kodda görebileceğiniz gibi request
objemizin completionHandler
özelliğini kullanarak modelimizin sonuçlarını almamızı sağlayan .processClassifier
metodunu ekliyoruz. Uygulamamıza koyulan fotoğraflar ML modelimizin eğitildiği fotoğraflardan farklı boyutlara sahip olabilir. Modelimizin bu fotoğrafları işleyebilmesi için request
objemizin .imageCropAndScaleOption
özelliğini kullanıyoruz. Böylece, aşağıdaki satırlarla ML modelimizi kullanarak uygulamamızda bir Vision altyapısı yaratıyoruz.
Vision Objemizi Aktif Hale Getirmek
İlk olarak uygulamamıza koyulan UIImage
ı CIImage
a dönüştüyoruz. Eğer bu gerçekleştirilemezse uygulamamız hata veriyor ve sınıflandırma yapılamıyor. `
func createClassificationsRequest(for image: UIImage) {
let orientation = CGImagePropertyOrientation(image.imageOrientation)
guard let ciImage = CIImage(image: image) else {
fatalError("Fotoğraf işlenemedi")
}
Şimdi Vision objemizi çalıştırma vakti! Bunun için ilk olarak bir VNImageRequestHandler
objesi oluşturuyoruz ve bir önceki adımda oluşturduğumuz ciImage
objesiyle modelimizin işlemek istediği fotoğrafları belirtiyoruz. Daha sonra oluşturduğumuz objenin .perform
metodunu kullanarak Vision’ı aktif hale getiriyoruz. Ve tabiki herhangi bir fotoğrafın işlenmesinde çıkabilecek bir hata için catch
ifadesini kullanıyoruz.
DispatchQueue.global(qos: .userInitiated).async {
let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
do {
try handler.perform([self.classificationRequest])
} catch {
print("Sınıflandırılma yapılamadı.\n (error.localizedDescription)")
}
}
Modelimizi Çalıştırmak
Haydi şimdi de sınıflandırmamızın sonuçlarını görelim! Sonuçları görmek için sınıflandırma objemizin .results
özelliğini kullanıyoruz. .results
VNClassificationObservation
objelerinden yararlanarak bize ML modelimizin yarattığı sınıflandırmaları gösteriyor. Bu sonuçları görmek için aşağıdaki satırları yazmamız yeterli.
func processClassifications(for request: VNRequest, error: Error?) {
DispatchQueue.main.async {
guard let results = request.results
else {
self.classificationLabel.text = "Fotoğraf sınıflandırılamadı.\n\(error!.localizedDescription)"
return
}
let classifications = results as [VNClassificationObservation]
CreateML ile Sınıflandırma’nın sonuna geldik! Birlikte CreateML kullanarak fotoğraflar arasında sınıflandırma yapacak bir model yarattık ve bu modeli uygulamamıza aktarmanın yollarını öğrendik. Hepinize keyifli ve hatasız kodlamalar dilerim 🤗 💻