Apple Turi ML Kütüphanesi ile Görüntü Tanıma Uygulaması Geliştirmek
Merhaba, bu yazıda sizlere makine öğrenmesi kütüphanesi olan Turi’nin kullanımını bir örnek üzerinden anlatacağım. Sonrasında ise bu sistemden elde ettiğimiz modelin bir iOS uygulamasındaki kullanımını göstereceğim ama öncesinde sizlere Turi hakkında kısaca bilgi vermek istiyorum.
Apple 2016 yılında Turi yapay zeka & makine öğrenmesi teknolojileri sağlayan firmayı satın aldı. Sonrasında ise Apple Core ML Kütüphanesine entegre olan .mlmodel formatında çıktı alabilceğimiz bir araç haline geldi. Peki Core ML nedir ? Apple ürünlerinde kullanılan bir makine öğrenme çatısıdır. 2018 Haziran ayındaki Apple geliştirici etkinliğinde (WWDC18) 2. versiyonu tanıtılmıştır.
Turi, nesne algılaması, resim sınıflandırma, regresyon, kümeleme, yazı sınıflandırma gibi işleri yapabileceğiniz bir kütüphanedir. Turi’ye ek olarak IBM Watson gibi kod yazmadan makine öğrenmesini uygulayacağımız ve model olarak indirebileceğimiz sistemler de mevcut. Belki başka bir yazıda bu sistemlerden bahsedebiliriz.
Turi’nin avantajı eğer bir iOS, MacOS, tvOS uygulaması geliştiriyorsanız, Core ML ile uyumlu olarak modellerinizi çıktısını alıp uygulamanıza entegre edebilirsiniz.
Veri Kümesinin Hazırlanması
Ben bu yazıda uygulama yapmak için Google görselden 3 farklı enstrumanın (Gitar, Piyano, Bateri) fotoğraflarını indirdim (Google Chrome eklentisi olan Fatkun ile toplu olarak indirildi.) ve hepsini 100'er adet olacak şekilde hazırladım. En son elde edilen klasör yapısı aşağıdaki resimdeki gibi oldu.
Kurulum
Verilerimiz hazırlandıktan sonra Turi ve Python 3.6 bilgisayarınıza kurmamız gerekmektedir. Bu kurulum işlemleri farklılık gösterebilir. Benim uyguladığım yöntem PyCharm programı ile direk projeye ortamınına ekledim. Görseldeki gibi direk olarak indirip kurabilirsiniz.
Alternatif Turi Kurulumu : pip install turicreate
(Not: Bu anlatım macOS işletim sistemi üzerinden anlatılmaktadır. Kendi sayfasında, Linux (with glibc 2.12+) ve Windows 10 (via WSL) ile çalıştığı yazmakta ama denemedim. Ayrıca MacOS işletim sistemi haricinde .mlmodel formatında çıktı alınamayabilir. Çıktı almak için yine MacOS işletim sistemli bir cihazda uygulamanız gerekebilir.)
Github Linki:
Eğitim
Kurulumları tamanlandıktan sonra verilerimizi eğiteceğimiz ve bunları model halinde çıktı alabileceğimiz kodlarımızı yazmaya başlayalım. Bunun için 2 ayrı Python dosyası oluşturuyorum. İsimleri turi.py
, turi_train.py
olsun.
Burada dikkat edeceğimiz nokta çalışma alanımızın dosya yolunu doğru olarak vermek ve çıktıları yine doğru klasöre yazdırmak.
- turi.py
import turicreate as tc
import os
# 1. Load images
data = tc.image_analysis.load_images('data', with_path=True)
# 2. Create label column based on folder name
data['instrument_name'] = data['path'].apply(lambda path: os.path.basename(os.path.dirname(path)))
# 3. Save as .sframe - etiketli veri seti kaydediliyor.
data.save('instruments.sframe')
# 4. Explore - etiketli verilerin ön izlemesi
data.explore()
- turi_train.py
import turicreate as tc
# 1. Load the data
data = tc.SFrame('instruments.sframe')
# 2. Split to train and test data
train_data, test_data = data.random_split(0.8)
# 3. Create model
model = tc.image_classifier.create(train_data, target='instrument_name')
# 4. Predictions
predictions = model.predict(test_data)
# 5. Evaluate the model and show metrics
metrics = model.evaluate(test_data)
print(metrics['accuracy'])
# 6. Save the model
model.save('instruments.model')
# 7. Export to CoreML format
model.export_coreml('model/instruments.mlmodel')
Burada yaptığımız önemli noktalardan birisi verilerimizin etiketlemesini dosya isminden yararlanarak yapmamızdır. Böylece pratik bir etiketleme uygulamış oluyoruz. İşlem tamamlandıktan sonra turi.py ile elde edilen etiketli verimizin ön izlemesi şekildeki gibi görünmektedir.
turi_train.py
dosyasının 3. aşamasında aşağıdaki şekilde yazılmıştır. Bu şekilde model sınıflandırması yapılırsa Pretrained Model (Önceden eğitilmiş) olarak Resnet-50 modelini kullanacaktır. Biz de çalışmamızda bu şekilde kullandık. Ancak bu modelin dosya boyutu ~90mb olacaktır. Bu noktada Turi bize alternatif olarak boyutu ~4.7mb olan Squeezenet_v1.1 modelini seçme imkanı vermektedir. Ancak bu model Resnet-50 mimarisine göre doğruluğu daha düşük olacaktır. 3. Adım için aşağıdaki değişikleri uygulayabilirsiniz. Elde edilen sonuçları karşılaştırabilirsiniz.
# 3.1 Create model (Default)
model = tc.image_classifier.create(train_data, target='instrument_name')# 3.2 Create model (squeezenet_v1.1)
model = tc.image_classifier.create(train_data, target='instrument_name', model="squeezenet_v1.1")# 3.3 Create model (resnet-50)
model = tc.image_classifier.create(train_data, target='instrument_name', model="resnet-50")
Test & Model
Bu çalışmada yukarıdaki 2. adım olan veriyi rastgele olarak %80 eğitim %20 test için kullanılmıştır. Sonuçlar aşağıdaki görseldeki gibidir. Oluşturulan çıktı modelimizin adı : instruments.mlmodel şeklindedir. Bu model dosyasını iOS uygulamasında kullanacağız.
Eğitim işlemi tamamlandıktan sonra iterasyon sonuçları ve doğruluk (Accuracy) başarı ölçütü değerleri log’lara aşağıdaki görseldeki gibi yazdırılmıştır. Hazırlamış olduğumuz veri setinde doğruluk oldukça yüksek çıkmıştır ve 1 iterasyonla eğitim işlemi tamamlamıştır. Farklı veri setinde farklı iterasyon sayıları oluşabiliyor. Bu durum biraz da elimizdeki resim sayısı ile ilgilidir.
Hem model hem de .mlmodel dosyası proje klasöründe üretilmiştir. Artık model dosyasını bir iOS uygulamasında kullanabiliriz.
iOS Uygulaması
Yazının çok uzun olmaması için sıfırdan bir iOS projesi geliştirmek yerine örnek bir iOS projesi üzerinden modelin kullanımı aşağıda adımlar halinde anlatılmıştır. Bu projeyi de GitHub üzerinden paylaşıyorum.
Bu işlemler için MacOS X işletim sistemine sahip bir bilgisayara sahip olunması ve xCode yazılımının bilgisayarınızda kurulu olması gerekmektedir.
Eğer kendi veri setinizi uygulama üzerinde kullanmak isterseniz. Aşağıda anlatılan adımları örnek proje üzerinde düzenleyebilirisiniz.
https://github.com/fozoglu/instrument-recognition
Adımlar;
- Turi ile oluşturduğumuz instruments.mlmodel dosyasını projemize ekliyoruz.
- ViewController.swift‘de 16. satırına modelimizin değişkenini tanımlıyoruz.
- ViewController.swift‘de 25. satırına modelimizi oluşturuyoruz.
- ViewController.swift’de 94. satırına modelimizin etiket (label) sütunun ismini veriyoruz. (Sonucu label’a yazıdırmak için.)
Yazımı buraya kadar okuduğunuz için teşekkür ederim :) Umarım yazımı beğenmişsinizdir. Yazıda anlaşılmayan ya da hatalı gördüğünüz kısımları belirtirseniz sevinirim.
Sorularınızı https://sorucevap.deeplearningturkiye.com/c/donanim-bulut/ios adresinden soru&cevap sitemizde IOS kategorisi altında sorabilirsiniz.
İyi çalışmalar.