Bu Yazıda El ile Yazılan/Çizilen Rakamları MNIST Veri Seti ve Yapay Zeka (Yapay Sinir Ağları - Derin Öğrenme (CNN)) Kullanarak Tanımaya Çalışacağız.
Projeye Genel Bir Bakış
El Yazısı Rakam Tanıma, El ile Yazılan Rakamların Bilgisayar Sistemleri Tarafından Tanınmasıdır. İnsanlar için Oldukça Kolay Olmasına Rağmen Makineler için Bu İşlem Zordur. Bunun Nedeni El Yazısıyla Yazılan Rakamlar Mükemmel Değildir ve Her İnsan için Farklı Olabilir. Makinelerin Bu İşlemi Başarması için Geçmiş El Yazısı Rakam Resimlerinden Öğrenme Yaparak Yorumlama ve Genelleme Yapması Gerekir. Genelleme, Makinenin Önceden Hiç Görmediği Bir El Yazısı Rakam Resmini Doğru Olarak Yorumlaması, Tahmin Etmesidir.
El Yazısı Rakam Resimlerinin Bir Sistem Tarafından Yüksek Doğrulukla Tanınabilmesi için Yapay Zekâ Kullanmamız Gerekir. Bu Nedenle Günümüzde de Çok Popüler Makine Öğrenmesi Tekniği Olan Yapay Sinir Ağları (Artificial Intelligence Network) ve Yapay Sinir Ağlarının Gelişmişi Olan Derin Öğrenmeyi Kullanabiliriz. Bu Projede Bir Derin Öğrenme Tekniği Olan ve Genellikle Görüntü Sınıflandırma için Kullanılan CNN (Convolutional Neural Network) Kullandım.
Yapay Sinir Ağları, İnsan Beyninin Özellikleri Kullanılarak Geliştirilen Bir Makine Öğrenmesi Yöntemidir. Sinir Sistemimizdeki Nöronlar Geçmiş Verilerden Nasıl Öğrenme Yapıyorsa, Yapay Sinir Ağları da Verilerden Öğrenip Tahmin veya Sınıflandırmayı Otomatik Şekilde Yapabilmektedir. YSA, Girdiler ve Çıktılar Arasında İlişki Kuran Doğrusal Olmayan İstatistiksel Bir Modeldir. Görüntü İşleme, Konuşma Tanıma ve Tıbbı Teşhis gibi Alanlarda Kullanılmaktadır. Yapay Sinir Ağının Bazı Özellikleri; Genelleme, Doğrusal Olmama, Hata Toleransı ve Öğrenmedir.
CNN, Genellikle Girdi Olarak Resimler Alan ve Görüntü İşleme için Kullanılan Bir Derin Öğrenme Ağı veya Tekniğidir. Klasik Yapay Sinir Ağlarında Çok Fazla Özellik Girişi Olduğundan Dolayı Yavaş Çalışabilir. CNN’de Mümkün Olan En Az Sayıda Giriş (Özellik) ile En Yüksek Başarı İstenir. Bu Nedenle Veriden Doğru Özelliklerin Çıkarılması Gerekmektedir. Veriden Özellik Çıkarma (Data Feature Extraction), Makine Öğrenmesinde Başlı Başına Bir Alandır. Doğru Özelliklerin Seçilmesi Zorluğunu Ortadan Kaldırmak için CNN’de Özellik Çıkarımı Ağ İçinde Yapılmaktadır. CNN’de Verilerden Otomatik Olarak Özellik Çıkarılmasında Filtreler Kullanılmaktadır.
Projede Programlama Dili Olarak Basit Olması ve Kütüphane Desteğinden Dolayı Python Tercih Ettim. Geliştirme Ortamı Olarak PyCharm Programını Kullandım. CNN Modelini Oluşturma, Eğitme, Test Etme ve Kaydetme İşlemleri için Derin Öğrenme Kütüphanesi olan Python Keras Kütüphanesini Kullandım. Kullanıcı ile Etkileşime Geçebilmek için Python Gradio Kütüphanesi ile Web Sayfası Üzerinde Arayüz Oluşturdum. Projedeki Verilerin Kaydedilebilmesi için Python SQLite Kütüphanesini Kullandım. Veritabanındaki Verilerin Web Sayfası Üzerinde Görüntülenebilmesi için Python Flask Kütüphanesini Kullandım.
Projede Bir Web Sayfası Üzerinde 28x28 Boyutundaki Boş Bir Panoya Kullanıcı Tarafından 0 ile 9 Arasında Bir Rakam Çizildikten Sonra Gerekli Butona Basılarak Çizilen Rakam Sistem Tarafından Otomatik Olarak Tanınmakta ve Kullanıcı İsterse Çizdiği Rakamı Veritabanına Kaydedebilmektedir. Veritabanında Çizilen Rakamın Resmi, Sistem Tarafından Tahmin Edilen Rakam ve Tahmin Edilen Rakamın Doğruluk Değeri Bilgileri Tutulmaktadır.
Gereksinimler
Python
Programlama Kısmında Python Programlama Dili Kullandım. Bunun Nedenleri Python’un Görece Basit Olması, Platform Bağımsız Olması, Yorumlanan Bir Dil Olmasından Ötürü Diğer Programlama Dillerine Göre Daha Hızlı Çalışması ve Geniş Harici Kütüphane Desteği Sayesinde Hızlı Bir Şekilde Uygulama Geliştirilebilmesidir. Projede Python 3.9.6 Sürümünü Kullandım.
PyCharm
Projede Geliştirme Ortamı için JetBrains Firmasına Ait PyCharm Programlama Platformunu Kullandım. Bunun Nedenleri Otomatik Kod Tamamlama, Harici Kütüphane Yükleme Arayüzü, Debug Desteği gibi Özellikler İçermesidir. Projede PyCharm 2021.2.1 Sürümünü Kullandım.
Keras
Keras Kütüphanesi Tensorflow Üzerinde Çalıştığı için Tensorflow Kütüphanesinin Ayrı Olarak Yüklenmesi Gerekmektedir. Ayrıca Keras Kütüphanesi ile Otomatik Olarak NumPy Kütüphanesi de Yüklenmektedir. Bilgisayar Ortamında Görüntüler Birer Matristir. Matrisin Her Bir Değerine de Piksel Denir. Bu Nedenle Görüntü Matrislerinin Boyutunu Öğrenmek ve Matrisleri Yeniden Şekillendirmek için NumPy Kütüphanesini Kullandım.
Gradio
Projede Kullanıcı ile Etkileşimin Sağlanması, Kullanıcının Web Sayfası Üzerinde Rakam Çizebilmesi, Çizilen Rakamın Sistem Tarafından Tahmin Edildikten Sonra Sonuçların Arayüzde Gösterilmesi ve Sonuçların Veritabanına Kaydedilmesini Sağlamak için Gradio Kütüphanesi ile Arayüz Oluşturdum. Projede Gradio 2.3.5 Sürümü Kullanılmıştır.
SQLite
Projede Elde Edilen Sonuçların Kaybolmaması ve Sonuçların Tek Bir Dosyada Tutulması için SQLite Veritabanını Kullandım.
Flask
Projede Veritabanının Web Tarayıcısı Üzerinden Görüntülenmesi için Flask Kütüphanesi Kullanıldı. Ayrıca Flask Kütüphanesinin Bir Uzantısı Olan SQLAlchemy, Veritabanı işlemlerinde SQLite Kütüphanesi ile Kullanılmıştır.
Süreç
- Derin Öğrenme Ağ Model Türünü Belirledim.
- Derin Öğrenme Ağ Modelini Oluşturdum.
- Derin Öğrenme Ağ Modelini Eğitmek için Veri Setini Belirledim.
- Derin Öğrenme Ağ Modelini Veri Seti ile Eğittim.
- Derin Öğrenme Ağ Modelini Test Veri Setini Kullanarak Test Ettim ve Başarısını Ölçtüm.
- Derin Öğrenme Ağ Modelini Daha Sonra Kullanmak Üzere Diske Kaydettim.
- Kullanıcı ile Etkileşime Geçmek için Grafiksel Arayüz Tasarladım. Arayüz Üzerinde Kullanıcı Rakam Çizdikten Sonra Gerekli Butona Bastığında Çizilen Rakam Resmini Önceden Diske Kaydettiğim Derin Öğrenme Ağ Modelini Kullanarak Tahmin Ettirdim ve Sonuçları Arayüzde Gösterdim.
- Arayüz Üzerinde Kullanıcının Çizdiği Rakamın Resmini, Çizilen Rakamın Tahminini ve Doğruluğunu Gerekli Butona Basarak Veritabanına Kaydedebilmesini Sağladım. Ayrıca Arayüz Üzerinde Kullanıcı Gerekli Butona Basarak Çizilen Rakamı Silebilmesini ve Yeni Bir Rakam Çizerek Bu Rakamın Tahmin Ettirebilmesini Sağladım.
- Veritabanının Web Tarayıcısı Üzerinden Görüntülenmesini Sağladım.
Projenin Uygulanması
MNIST Veri Setindeki Örnek İki Görüntü
CNN Modelinin Nasıl Eğitileceğini Bildirmek için Modelin Derlenmesi Gerekmektedir. Modelin Derlenmesinde Temel Olarak Kayıp Fonksiyonu (Loss Function), Optimizasyon Algoritması ve Metrik Parametrelerinin Belirtilmesi Gerekmektedir. Kayıp Fonksiyonu, Gerçek Değer ile Tahmin Edilen Değer Arasındaki Hatayı Hesaplar. Sınıflandırma Problemleri için Genellikle categorical_crossentropy Kayıp Fonksiyonu Kullanılmaktadır ve Projemde de Bunu Kullandım. Optimizasyon Algoritması, Eğitim Sırasında Tam Bağlantılı Yapay Sinir Ağı Katmanlarındaki Nöronların Ağırlık Değerlerinin Güncellenmesinde Kullanılır. Projede Adam Optimizasyon Algoritmasını Tercih Ettim. Metrik, Modelin Test Edilme Sırasındaki Hatayı Değerlendirme Kriteridir. Projede Accuracy Metrik Parametresini kullandım. Modelin Derlenmesini Python Keras Kütüphanesi ile Yaptım.
CNN Modelini MNIST Eğitim Veri Seti ile Eğitmek için 6 Adet Parametre Gerekmektedir:
- Eğitim Verisi, MNIST Eğitim Veri Setindeki İlk 784 Sütundaki Matris Değerleridir.
- Etiket Verisi, MNIST Eğitim Veri Setindeki Son Sütundaki Matris Değerleridir.
- Doğrulama (Validation) Verisi, Modelin Eğitilmesi Esnasında Test Edilebilmesi için Kullanılır. Doğrulama Verisi Olarak MNIST Test Veri Setini Kullandım. Böylece Model Eğitilirken Modelin Başarısı Anlık Olarak Gözlemlenebilmektedir.
- Epoch, Model Eğitiminde Eğitim Verilerinin Kaç Kez Yineleneceğini Belirler. Projede Bu Parametreyi 20 Olarak Belirledim. Fakat Bu Parametre İsteğe Göre Değişebilir, Optimum Değerinin Bulunması Gerekmektedir.
- Batch Size, Tam Bağlantılı Yapay Sinir Ağındaki Nöron Ağırlıklarının Güncellenmesi için Eğitim Veri Setinin Ne Kadarının Kullanılacağını Belirler. Projede Bu Parametreyi 150 Olarak Belirledim. Bunun Anlamı Her 150 Adet Eğitim Verisinde Bir Kayıp Fonksiyonu ile Hata Hesaplanır ve Adam Optimizasyon Algoritması ile Nöron Ağırlıkları Güncellenir. MNIST Eğitim Veri Setinde 60000 Veri Olduğundan 1 Epoch’ta 400 İterasyon Vardır.
- Shuffle, Her Bir Epoch’dan Önce Eğitim Verilerinin Yerlerini Değiştirir. Modelin Performansını Arttırması için Kullanılır.
Python Keras Kütüphanesi ile Bu Parametreleri Kullanarak CNN Modelini Eğittim. Eğitim Yaklaşık Olarak 5 Dakika Sürdü.
Python Keras Kütüphanesi ile Eğitilmiş CNN Modelini h5 Dosya Formatında Diske Kaydettim. Yeni Bir Python Script'i Oluşturup Python Keras Kütüphanesi ile Diskteki CNN Modelini Projeme Aktardım. Böylece Proje Her Çalıştırıldığında CNN Modelinin Oluşturulup Eğitilmesinin Önüne Geçmiş Oldum.
Kullanıcı Tarafından CNN Modeline Dışarıdan 28x28 Boyutunda El Yazısı Rakam Resmi Verip Bu Resmin Tahmin Edilmesini Sağlamam Gerekiyordu. Bu Nedenle Python Gradio Kütüphanesi ile Bir Arayüz Oluşturdum. Arayüz Üzerinde 28x28 Boyutunda Beyaz Bir Boş Pano Ekledim. Kullanıcı Panoya Siyah Renkte Rakam Çizebilmektedir. Kullanıcının Çizdiği Rakamı Backend Tarafına Gönderebilmesi için Yeşil Renkte Bir Buton Ekledim. Panoda Çizilen Rakam Resmini CNN Modeline Vererek Tahmin Edilen Rakamı ve Doğruluk Değerini Panonun Sağ Tarafında Olacak Şekilde Arayüz Üzerinde Gösterdim. Ayrıca Panonun ve Sonuçların Temizlenmesi için Beyaz Renkte Bir Buton Ekledim. Arayüzün Aşağı Tarafında ise Proje ile Bilgiler Vererek Kullanıcıyı Bilgilendirdim.
Kullanıcının Çizdiği Rakam Resmini ve Sonuçları Veritabanına Kaydedebilmesi için Arayüz Üzerinde İki Adet Kontrol Kutusu Oluşturdum ve Varsayılan Olarak “Hayır” Kontrol Kutusu Seçili Durumdadır. Kullanıcı Verileri Kaydetmek için “Evet” Kontrol Kutusunu Seçtikten Sonra Yeşil Butona Basması Gerekmektedir. Butona Bastıktan Sonra Yeni Bir Web Tarayıcı Sekmesinde Otomatik Olarak Veritabanı Giriş Sayfası Gelmektedir. Bu Sayfada Kullanıcının Giriş Bilgileri ile Oturum Açması Beklenmektedir. Eğer Kullanıcı Başarı ile Oturum Açarsa Veritabanını Görüntüleyebilmektedir.
Veritabanı Giriş Sayfasını Oluşturmak için HTML ve CSS Framework’ü Olan Bootstrap Kullandım.
Veritabanı Dosyasından Alınan Veriler, Veritabanı Görüntüleme Sayfasında Resim, Tahmin ve Doğruluk Alanlarında Gösterilmektedir.
“Tahmin Doğru mu?” Alanında ise Bir Kontrol Kutusu Oluşturdum. Bu Kontrol Kutusunun Amacı, Resim Tahmininin Doğru Olup Olmadığını Belirleyebilmektir. Yönetici, Veritabanı Görüntüleme Sayfasında Tahmin Edilen Rakam Doğru ise Kontrol Kutusunu İşaretler ve Gerekli Butona Basarak Genel Başarı Oranını Ölçebilir. Örnek Olarak Çizilen 10 Rakam Resminden 7'si Sistem Tarafından Doğru Tahmin Edildi ise 7 Adet Kontrol Kutusu İşaretleneceğinden Dolayı Başarı Oranı %70 Olarak Hesaplanacaktır. İşlem Alanında ise Veritabanındaki Kayıtların Silinebilmesi için Buton Ekledim. Kullanıcı Ayrıca Veritabanı Görüntüleme Sayfasındaki Verileri Tahmin Alanına Göre Küçükten Büyüğe veya Büyükten Küçüğe Doğru Sıralayabilmekte ve “Bul:” Metin Kutusu Sayesinde Tahmin Alanındaki Bir Rakamı Arayabilmektedir.
Test
Python’da Projenin Dağıtılması için Kullanılan Python Embedded Package Yapısını Kullanarak Projenin Her Platformda (Windows, Linux, vb.) Yalıtılmış Olarak ve Herhangi Bir Kurulum Gerektirmeden Çalışabilmesini Sağladım. Ayrıca Python Gradio Kütüphanesinin Oluşturulan Arayüzü Genel (Public) Olarak Paylaşma Özelliği Sayesinde Kullanıcılar İnternet Üzerinden Projenin Arayüzüne Erişebilmektedir. Veritabanınına ise Sadece Yetkili Kullanıcı Erişebilmektedir.
El Yazısı Rakam Tanıma Projesinin Başarısını Ölçmek için 5 Farklı Kullanıcıya Proje Arayüzünün İnternet Linkini Göndererek 0’dan 9’a Kadar 10 Adet Rakam Çizip Sisteme Tanıtmalarını ve Sonuçları Veritabanına Kaydetmelerini İstedim. Veritabanı Görüntüleme Sayfasındaki 50 Resmi de Kontrol Ederek Doğru Tahmin Edilenlerin Kontrol Kutusunu İşaretledim ve Gerekli Butona Bastığımda Başarı Oranının %90 Olarak Hesaplandığını Gördüm. Bu Sonuç 50 Resmin 45’inin Doğru Olarak Tahmin Edildiği Anlamına Gelmektedir.
Proje Kodları ve Projeyi Çalıştırma
Not: Veritabanı Giriş Sayfası Giriş Bilgileri; Kullanıcı Adı: admin, Şifre: admin
Projeyi Çalıştırdıktan Sonra Proje Arayüzünü Başkaları ile Paylaşıp Onların da Arayüzü Kullanabilmesini Sağlamak için Ana_Rutin.py Dosyasında En Son Satıra Gelin ve share Parametresini True Yapın.
Public URL ile Proje Arayüzünü Başkaları ile Paylaşabilirsiniz. Bu Link 72 Saat Sonra Kendiliğinden Silinecektir.
Okuduğunuz için Teşekkür Ederim.
Kaynaklar
- DataFlair, “Artificial Neural Networks for Machine Learning”. Web adresi: https://data-flair.training/blogs/artificial-neural-networks-for-machine-learning/
- Doğan, Ö., “CNN (Convolutional Neural Networks) Nedir?”, Kasım 2020. Web adresi: https://teknoloji.org/cnn-convolutional-neural-networks-nedir/
- DataFlair, “Convolutional Neural Networks tutorial Learn how machines interpret images”. Web adresi: https://data-flair.training/blogs/convolutional-neural-networks-tutorial/
- Python, “The Python Tutorial”, Ekim 2021. Web adresi: https://docs.python.org/3/tutorial/index.html
- PyCharm, “PyCharm Features”. Web adresi: https://www.jetbrains.com/pycharm/features/
- Doğan, Ö., “Keras Kütüphanesi Nedir? Derin Öğrenme Modeli Oluşturma”, Eylül 2020. Web adresi: https://teknoloji.org/keras-kutuphanesi-nedir-derin-ogrenme-modeli-olusturma/
- Gradio, “Demos for your ML Models”. Web adresi: https://gradio.app/
- SQLite, “About SQLite”. Web adresi: https://www.sqlite.org/about.html
- Flask, “Foreword”. Web adresi: https://flask.palletsprojects.com/en/2.0.x/foreword/
- Mutluer, Y., “Flask Nedir? Django ile Farkları Neler?”, Ağustos 2020. Web adresi: https://teknoloji.org/flask-nedir-django-ile-farklari-neler/
- Flask, “Flask-Sqlalchemy”. Web adresi: https://flask-sqlalchemy.palletsprojects.com/en/2.x/
- Ergin, T., “Convolutional Neural Network (ConvNet yada CNN) nedir, nasıl çalışır?”, Ekim 2018. Web adresi: https://medium.com/@tuncerergin/convolutional-neural-network-convnet-yada-cnn-nedir-nasil-calisir-97a0f5d34cad
- ICHI.PRO, “Convolutional Neural Network (CNN) ve Uygulaması”. Web adresi: https://ichi.pro/tr/convolutional-neural-network-cnn-ve-uygulamasi-bilmeniz-gereken-her-sey-266752320713701
- Ergin, T., “Keras ile Derin Öğrenme Modeli Oluşturma”, Ekim 2018. Web adresi: https://medium.com/@tuncerergin/keras-ile-derin-ogrenme-modeli-olusturma-4b4ffdc35323
- Budhiraja, A., “Dropout in (Deep) Machine learning”, Aralık 2016. Web adresi: https://medium.com/@amarbudhiraja/https-medium-com-amarbudhiraja-learning-less-to-learn-better-dropout-in-deep-machine-learning-74334da4bfc5
- WIKIPEDIA ONLINE ENCYCLOPEDIA, “MNIST database”, Ağustos 2021. Web adresi: https://en.wikipedia.org/wiki/MNIST_database
- Dabakoglu, C., “What is Convolutional Neural Network (CNN) ? - with Keras”, Aralık 2018. Web adresi: https://medium.com/@cdabakoglu/what-is-convolutional-neural-network-cnn-with-keras-cab447ad204c
- Python, “Using Python on Windows”. Web adresi: https://docs.python.org/3/using/windows.html
Yorum Gönder
Yorum Gönder