Giriş
Tüm dünyayı etkisi altına alan Covid-19 salgını sonrasında günlük hayatımıza pek çok yeni kavram girdi. Maske, mesafe, hijyen üçlüsüyle büyümeye başlayan Covid-19 lügatı ilerleyen dönemlerde zatürre, pnömoni gibi kavramları bünyesine kattı. Dileğim bu salgının daha fazla canlıya zarar gelmeden sona ermesidir. Bu yazının amacı Kaggle’ da akciğer röntgenlerini içeren veri setinden yola çıkarak, Google ürünleriyle bir Tensorflow Lite çıktısı elde edip bu çıktıyı Flutter SDK kullanarak mobil uygulama geliştirmektir. Önemli Not: Bu yazıdaki geliştirilen uygulamanın vereceği sonuçlar kesinlikle teşhis için kullanılmamalıdır. Teknik kısımlara başlamadan önce, pnömoninin ne olduğunu inceleyelim:
Pnömoni Nedir? | COVID-19 Sözlüğü
T.C Sağlık Bakanlığı resmi web sitesinde yer alan COVID-19 sözlüğünde Pnömoni,
“Akciğer dokusunun iltihabı; zatürre.
Açıklama: Koronavirüs ailesinde yer alan virüsler, insanlarda özellikle soğuk algınlığı, pnömoni ve çeşitli solunum yolu enfeksiyonlarına neden olabilmektedir. COVID-19 pnömonisine SARS-CoV-2 neden olmaktadır.” [1] şeklinde belirtilmiştir.
Veri Seti | Kaggle ❤
Kaggle’da paultimothymoon kullanıcısı tarafından sağlanan veri setinde yer alan açıklama yazısı şu şekilde verilmiştir: “Göğüs röntgeni görüntüleri (ön-arka), Guangzhou Kadın ve Çocuk Tıp Merkezi’nden bir ila beş yaşındaki pediyatrik hastaların retrospektif kohortlarından seçildi. Tüm göğüs röntgeni görüntülemesi, hastaların rutin klinik bakımının bir parçası olarak gerçekleştirildi. Göğüs röntgeni görüntülerinin analizi için, tüm göğüs radyografileri başlangıçta tüm düşük kaliteli veya okunamayan taramalar kaldırılarak kalite kontrol için tarandı. Görüntüler için teşhisler daha sonra AI sistemini eğitmek için temizlenmeden önce iki uzman doktor tarafından derecelendirildi. Herhangi bir not verme hatasını hesaba katmak için, değerlendirme seti de üçüncü bir uzman tarafından kontrol edildi.” [2]
Hazırız!
Veri setini indirildi, şarjımız full ve simulator sorunsuz açıldığına göre artık başlayabiliriz. 🤓
Adım 1: Teachable Machine
Öncelikle https://teachablemachine.withgoogle.com adresine giderek bir Image Project oluşturalım, burada sık karşılaşılan problemlerden birisi veri sayımız çok fazla olduğu için, upload adımında tarayıcının crash olmasıdır. Safari ile denemelerimde 3. seferde upload edebildim. Chrome ile tek seferde sorunsuz yükleme gerçekleştirebildim. Önerim başlamadan önce eğer yoksa Chrome’u edinmeniz yönünde;
Yeni projeyi yarattıktan sonra sınıflarımızı oluşturmamız gerekiyor. Biz bu örnekte yalnızca sağlıklı veya hastadeğerlendirmesi yapacağız. Bunun için 2 adet class yeterli olacaktır. Sınıfları Pnomoni ve Healthy olarak isimlendirdim:
İndirmiş olduğumuz veri seti içerisinde train klasöründeki verileri eğitim için kullanacağız. Eğitim verileri içerisinde Pnömoni için 3875 image, sağlıklı akciğer için 1341 image bulunuyor. Klasör içerisindeki görselleri sürükle bırak yöntemiyle ilgili sınıflara yükleyebilirsiniz. Tarayıcınızın crash olma durumu için verileri bölerek yükleme yapabilirsiniz.
Yükleme işleminin ardından sırada model eğitimi var. Burada karşımıza bazı kavramlar çıkıyor. Bu kavramları kısaca özetlemeye çalışacağım.
Epochs: Epoch sayısı, eğitim gerçekleşirken ağa verilerin kaç defa gösterileceğini belirtir. Kısaca döngü sayısı diyebiliriz. Epoch sayısının düşük olması doğruluğu azaltabileceği gibi çok yüksek olması da yine doğruluk oranını olumsuz yönde etkileyebilmektedir. Buradaki ölçüt, doğruluk oranı düşmeye başlayana kadar epoch sayısının artırılması yönündedir.
Batch Size: Veri sayısının çok olması göz önünde bulundurulduğunda eğitim işleminin ne kadar uzun süreceğini tahmin etmek güç değil. Bu durumda veri setini bölerek eğitim gerçekleştirmek gerekir. Batch boyutu ile modelin aynı anda kaç veriyi işleyeceğini bildiririz. Batch boyutu platformda default olarak 16 verilmiştir. Biz burada Batch sayısını 32 yaparak ilerleyeceğiz.
Learning Rate: Öğrenme oranı, bir ağın parametlerini ne kadar hızlı güncellediğini gösterir. Öğrenme oranının düşük olması eğitimi yavaşlatır ancak sorunsuz bir şekilde birleştirir. [3][4]
Değindiğim bu kavramları eğitim kısmında Epochs: 75 ve Batch Size: 32 olacak şekilde güncelledim. Ardından Train diyerek eğitim işlemini başlattım. Bu kısımda yine “Tarayıcı yanıt vermiyor” hatası ile karşılaşılabilir. Hiçbir müdahalede bulunulmadığı taktirde kendisine gelecektir 🤓
Eğitim işleminin bitmesinin ardından sağ tarafta yeni bir label oluşacaktır. Input tipini Webcam yerine File olarak değiştirip, test klasörü içerisinde bulunan akciğer görüntülerini bir test edelim:
Test sonucu şaşırtıcı. Birlikte deneyimlediğimiz bu işlemler sırasında çokta profesyonel gibi görünmeyen bir eğitim yöntemi gerçekleştirdik. Sonuçların iyileştirilmesi için epoch sayısını değiştirerek tekrar deneyebilirsiniz ancak aşırı öğrenme durumunda modelin ezberleme riskini göz önünde bulundurarak adım adım epoch sayısını yükseltmek daha faydalı olabilir. Buradaki işlemin bitmesine son bir adım kaldı. Export Model diyerek TFLite çıktımızı alacağımız adıma geçelim. Açılan pencerede Tensorflow Lite sekmesine geçip, Floating pointi seçtikten sonra modeli indirelim. İndirmiş olduğumuz converted_tflite.zip dosyası içerisinde TfLite formatına dönüştürülmüş olan model ve label bilgisi içeren txt dosyası assets klasörüne eklenmek üzere bizleri bekliyor olacak 🙂
Adım 2: Flutter İle Mobil Uygulama Geliştirilmesi
Model ile ilgili işlemlerin tamamlanmasının ardından Flutter’ın nimetlerinden faydalanmaya başlıyoruz. Flutter resmi reposunda (pub.dev) yer alan tflite paketi yardımıyla modelimizi mobil uygulama üzerinde çalıştıracağız.
O halde ihtiyacımız olan temel paketleri belirlemekle başlayalım:
tflite: ^1.1.1
image: ^3.0.2
image_picker: ^0.7.3
path_provider: ^1.6.1
bu temel paketler uygulamamızın çalışır duruma gelmesi için yeterlidir. Arayüz ve çeşitli işlevler için:
circular_bottom_navigation: ^1.0.1
cupertino_icons: ^0.1.2
flutter_launcher_icons:
url_launcher:
font_awesome_flutter:
paketlerini de kullandım. Eğitim sonucu aldığımız çıktılar labels.txt ve model_unquant.tflite dosyalarını assets klasörü içerisine kopyalayalım. Pubsec.yaml dosyamıza assets pathlerini vermeyi unutmayalım.
Bir önceki yazımda Flutter ile TfLite kullanımını detaylı olarak anlatmıştım. Burada sadace TFLite kısmına ait dart dosyasını sizinle paylaşacağım. Detaylar için aşağıdaki yazımı inceleyebilirsiniz 🙂
https://medium.com/flutter-türkiye/flutter-ile-tensorflow-lite-kullanimi-b026ff4d101c
Galeriden akciğer röntgeni seçilerek değerlendirmeleri yaptığım dart dosyası şu şekildedir:
loadModel, classifyImage, pickImage asıl olarak işlevleri yürüttüğüm metodlar. setState yapısını circular progress indicator ve label.txt dosyasından gelen sonucun durumunu yönetmek için kullandım.
loadModel(), TfLite paketi yardımıyla modelimizin uygulama belleğine alınmasını sağlıyor. model ve labelse ait pathleri burada belirtmemiz yeterli olacaktır.
pickImage(), galeriden akciğer röngtenlerine ait fotoğrafları seçmemize yarayacak olan bir metot 👀
classifyImage(), asıl işlevimiz 💁🏻. TfLite paketimize, galeriden veya kamera ile çektiğimiz fotoğrafı göndererek modelin çalışmasını sağlıyor. runModelOnImage() ‘ın result parametlerine baktığımızda tek kümeli bir json dönüyor.
Sonuç json yapımız:
{
index: 0,
label: “healthy”,
confidence: 1.0
}
Projenin kaynak kodlarına buradan ulaşabilirsiniz. İyi çalışmalar 🙅🏻♂️
Kaynaklar
[1] T.C Sağlık Bakanlığı, https://covid19.saglik.gov.tr/TR-66493/p.html
[2] Kaggle, https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia
[3] Devhunter, https://devhunteryz.wordpress.com/2018/08/27/yapay-sinir-aglarindaki-hiperparametreler
[4] Deep Learning Türkiye-Medium, https://medium.com/deep-learning-turkiye/derin-ogrenme-uygulamalarinda-en-sik-kullanilan-hiper-parametreler-ece8e9125c4
[5] Flutter-PubDev, www.pub.dev
[6] Freepik, www.freepik.com
Hocam selamlar, ilgili github reposuna ulaşamıyorum. Bu tarz bir projemiz var bazı konularda takıldık size soru sorma imkanımız varmı acaba ?