Zephyrnet Logosu

Flask kullanarak Görüntü Sınıflandırıcıyı Geliştirin ve Dağıtın: Bölüm 1

Tarih:

Bu makale, Veri Bilimi Blogathon.

Hey Guys,

Umarım hepiniz iyisinizdir.

Bu makalede flask kullanarak bir görüntü sınıflandırıcıyı nasıl geliştirip dağıtabileceğinizi öğreneceğiz. Diğer makalelerim gibi bu makale de size kod konusunda uygulamalı deneyim kazandıracak ve bu makalenin sonunda görüntüyü sınıflandıracak basit ve etkili bir şişe API'si oluşturabileceksiniz. Bu yazıda öncelikle teori kısmı, ardından kodlama kısmı yer alacaktır. Bu makalenin ilerleyen kısımlarında, koşuşturmanızı kurtaracak koda bir bağlantı vereceğim. O halde öğrenmeye odaklanalım. Yine bu yazı tamamen PYTHON'a dayalı olacaktır.

Bu makale tüm izleyici kategorilerine açıktır (Başlangıç, Orta, İleri Düzey). Bu makalenin içerik tablosu aşağıdadır, dolayısıyla zaten rahat olduğunuz bölümleri atlamaktan çekinmeyin.

Bu bölümde flask kullanılarak görüntü sınıflandırıcıya odaklanılacaktır. İkinci bölümü bulabilirsiniz okuyun yalnızca şişe API'si oluşturmakla ilgileniyorsanız.

İçerik Tablosu

  1. Görüntü Sınıflandırma nedir?
    1. 1. Evrişimsel Sinir Ağı
    1. 2. Öğrenimi Aktarın
  2.  Görüntü Sınıflandırıcı Kodlaması
  3. Sonuç

Görüntü Sınıflandırması

Görüntü Sınıflandırma, belirli kurallara dayalı olarak bir görüntü içindeki piksel veya vektör gruplarını kategorize etme ve etiketleme işlemidir. Meslekten olmayan terimlerle, ilgili görselleri veya benzer görselleri bir şekilde gruplandırmaya çalışıyoruz.
Görüntü sınıflandırma teknikleri temel olarak iki türe ayrılır: Denetimsiz ve Denetimli Görüntü sınıflandırması. Burada Denetimli Görüntü Sınıflandırma Tekniklerini kullanacağız. Bu konunun derinlerine dalmayacağım.

Görüntü sınıflandırmasında en son teknoloji, Evrişimli Sinir Ağları (CNN) olarak bilinen Derin Öğrenmeye dayanmaktadır.

Evrişimsel Sinir Ağı

CNN'e geçmeden önce Neural Network'e bir göz atalım.

Sinir ağı: Bunlar, insan beyninin çalışmasına benzer bir süreç yoluyla bir veri kümesindeki temel kalıpları/ilişkileri tanıyan bir dizi algoritmadır. Derin Öğrenme: Kalıpları tanımada çok iyi olan ancak genellikle çok sayıda veri gerektiren Makine Öğrenimi Algoritmalarının bir alt kümesidir.

CNN Convnet olarak da bilinen, başlangıçta bir evrişim katmanına sahip olması dışında normal bir sinir ağıyla aynı şekilde çalışan özel bir Sinir Ağı türüdür.

Neden CNN kullanıyoruz?

  1. Basit ileri beslemeli sinir ağları, girdilerinde herhangi bir sıra görmez. Tüm görüntülerinizi aynı şekilde karıştırırsanız, sinir ağı, karıştırılmamış görüntüler üzerinde eğitilirken sahip olduğu performansın aynısına sahip olacaktır.
  2. görüntülerin yerel mekansal tutarlılığından yararlanın. Bu, bitişik piksellerin birlikte anlamlı olması nedeniyle, bitişik piksellerin yamaları üzerinde evrişim kullanarak bir görüntüyü işlemek için gereken işlem sayısını önemli ölçüde azaltabilecekleri anlamına gelir.
  3. Görüntünüzü alt örneklemek için havuzlama katmanı adı verilen bir şey kullanırlar.

Aşağıdaki resimde klasik bir CNN örneği gösterilmektedir.

Flask kullanarak Görüntü Sınıflandırıcı

CNN'de VIP şartları

Evrişim: Giriş görüntüsünün bir alt kümesi olarak girdiyi alan bir dizi filtre/çekirdek (ağırlık kümesi) içerir. Görüntülerin alt kümeleri, genellikle görüntüden daha küçük boyutlu filtrelerle çarpılır. Aşağıdaki resim Evrişim katmanı hakkında fikir edinmenize yardımcı olacaktır.

Flask kullanarak Görüntü Sınıflandırıcı
Resim https://cs231n.github.io/convolutional-networks/ adresinden alınmıştır.

Havuzlama: Bu katman görsellerimizin altörneklenmesine yardımcı olur. Matris üzerinde bir filtre çalıştırıyoruz ve çıktıyı oluşturmak için üzerine bir fonksiyon uyguluyoruz. MAXPOOL aşağıdaki resimde görüldüğü gibi maksimum değerde çıktı veren bir fonksiyondur.

Havuzlama | Flask kullanarak Görüntü Sınıflandırıcı

Resim https://cs231n.github.io/convolutional-networks/ adresinden alınmıştır.

relu

Düzeltilmiş Doğrusal Aktivasyon Fonksiyonu veya kısaca ReLU, giriş pozitifse doğrudan çıkış verecek, aksi takdirde sıfır çıkış verecek parçalı doğrusal bir fonksiyondur. Birçok sinir ağı türü için varsayılan aktivasyon işlevi haline gelmiştir çünkü onu kullanan bir modelin eğitilmesi daha kolaydır ve genellikle daha iyi performansa ulaşır.

Bırakmak

Bu katman, sinir ağındaki belirli düğümleri rastgele bırakarak ve tahmin için dinlenmeyi kullanarak modelimizin aşırı uyumunu önlemeye yardımcı olur. CNN'i yalnızca belirli düğümlere bağımlı olmaya değil, tüm düğümlerden bir bileşen veya söze sahip olmaya zorlayan bir düzenleme tekniğidir.

Tam Bağlantılı Katman

Tamamen bağlantılı bir katmandaki nöronlar, bir önceki katmandaki tüm aktivasyonlarla tam bağlantılara sahiptir. Dolayısıyla bunların aktivasyonları bir matris çarpımı ve ardından bir sapma sapması ile hesaplanabilir.

Daha fazla ayrıntı okuyabilirsiniz .

Transfer Öğrenimi 

Transfer Öğrenme, önceden öğrenilen bir modelin yeni bir problem üzerinde yeniden kullanılmasıdır. Bunlar Görüntü İşleme alanında en çok kullanılan tekniklerdir çünkü bu teknikleri benzer yeni bir sorunu çözmek için kullandığınızda büyük miktarda zahmetten tasarruf sağlarlar. Mesela kedi-maymun sınıflandırması için bir model oluşturduk, bunu kaplan-gorili sınıflandırmak için kullanabilir miyiz? Transfer öğrenimi ile bunu kesinlikle başarabiliriz.

Modelimizi oluştururken transfer Learning'i de kullanacağız. Görüntü Sınıflandırma için kullanılan transfer öğrenme modellerine örnek olarak Resnet50, MobileNet, VGG16, VGG19, DenseNet verilebilir.

Transfer Öğrenme hakkında daha fazlasını okuyun .

Teori bu kadar yeter BANA KODU GÖSTER!

Görüntü Sınıflandırıcı Kodlaması 

Görüntü sınıflandırıcılar için TensorFlow, PyTorch,fastai vb. birçok modül vardır. Bu blog için şunları kullanacağız: TensorFlow. 

Kütüphaneleri İçe Aktar: 

# Yardımcı Kütüphaneler os import numpy'yi np olarak içe aktarır matplotlib.pyplot'u plt olarak içe aktarır
# Tensorflow, tensorflow'u tf olarak içe aktarır

tensorflow.keras.applications.imagenet_utils'den preprocess_input, decode_predictions'ı içe aktarın

tensorflow.keras.models'den load_model'i içe aktarın, model_from_json'u, Model

tensorflow.keras.preprocessing'den tensorflow içe aktarma keraslarından içe aktarma görüntüsü from keras.preprocessing.image import ImageDataGenerator

Veri kümenizi oluşturma

Değişkenleri kullanımınıza göre bildirmeniz ve değiştirmeniz gerekir.

# Değişkenleri Bildirmek train_data_dir = 'v_data/train' validation_data_dir = 'v_data/test' nb_train_samples =400 nb_validation_samples = 100 epochs = 10 Batch_size = 16
img_width, img_height = 224, 224 input_shape = (img_width, img_height, 3)

çağlar: 1 Dönem, tüm veri kümesinin sinir ağı üzerinden yalnızca bir kez ileri ve geri aktarıldığı zamandır.
Parti boyutu: Tüm veri kümesinin ileri ve geri iletilmesi hesaplama maliyetinin artmasına neden olacağından, ağ üzerinden dağıtılacak örneklerin sayısı olarak tanımlanan bir toplu iş boyutu kullanıyoruz.

train_datagen = ImageDataGenerator( rescale=1, / 255, shear_range=0.2, zoom_range=0.2, yatay_flip=True) test_datagen = ImageDataGenerator(rescale=1, / 255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(img_width, img_height), Batch_size=batch_size, class_mode='binary') validation_generator = test_datagen.flow_from_directory( validation_data_dir, target_size=(img_width, img_height), Batch_size=batch_size, class_mode='binary')

Model oluşturma

model = Sequential()
model.add(Conv2D(32, (2, 2), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

Burada modelimizin yapısını oluşturduk.

model.compile(loss='binary_crossentropy',
optimizer='adam',metrics=['accuracy'])

Yukarıdaki kod, kayıp fonksiyonunu, adam olarak optimize ediciyi ve model için değerlendirmeyi içerecek bir derleme fonksiyonu yaratacaktır.

Öğrenme modelini aktar

tensorflow.keras.applications.mobilenet_v2'den MobileNetV2 modelini içe aktarın = MobileNetV2(weights='imagenet')

Bu kod, MobileNetV2 yapısına sahip, imagenet ağırlıkları yüklü bir model oluşturacaktır.

İnce Ayar Transferi Öğrenme modeli

Sorunumuza göre önceden eğitilmiş sinir ağlarını ayarlamak için onları veri setimizde eğitmemiz gerekiyor. Görüntü Sınıflandırma modelinin sonuna bazı ekstra katmanlar da ekleyebiliriz.

keras.applications'dan içe aktar Resnet50 base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(IMG_SIZE, IMG_SIZE, 3))
çıktı_kategorileri = 2 # son katmandaki kategori sayısı. add_model = Sıralı() add_model.add(Düz(input_shape=base_model.output_shape[1:])) add_model.add(Bırakma(0.3)) add_model.add(Yoğun(128, aktivasyon='relu')) add_model.add( Bırakma(0.3)) add_model.add(Dense(output_categories, aktivasyon='softmax')) model = Model(inputs=base_model.input, Outputs=add_model(base_model.output))

Burada Resnet50'yi önceden eğitilmiş bir model olarak kullandık ve daha sonra modelimizin sonuna bazı katmanlar ekledik, böylece durumumuz için ince ayar yapabiliriz.

Eğitim Modeli

model.fit_generator( train_generator,steps_per_epoch=nb_train_samples //batch_size, epochs=epochs, validation_data=validation_generator, validation_steps=nb_validation_samples //batch_size)

Modeli kullanarak tahmin etme 

def model_predict(img, model): img = img.resize((224, 224))
 # Görüntünün ön işlenmesi x = image.img_to_array(img) # x = np.true_divide(x, 255) x = np.expand_dims(x, axis=0)
 # Eğitimli modelinizin girdiyle nasıl ilgilendiğine dikkat edin # aksi halde doğru tahminde bulunamaz! x = önişlem_input(x, mode='tf')
 tercihler = model.predict(x) dönüş tercihleri

Modeli Kaydetme

model_json = model.to_json() ile open("ImageClassifier.json", "w") json_file olarak: json_file.write(model_json) # ağırlıkları HDF5'e serileştirin model.save_weights("ImageClassifier.h5")

Konumlar sisteminize göre değişecektir.

Model Yükleniyor

model_json = open(path_to_model_json, 'r') yüklenen_model_json = model_json.read() model_json.close() model = model_from_json(loaded_model_json) model.load_weights(path_to_model_wieght)

Kafanız karıştıysa ve kodu görmek veya kopyalamak istiyorsanız. Görüntü Sınıflandırıcı Referansı okuyun.

Sonuç

Bu, flask kullanan görüntü sınıflandırıcının sonudur. Umarım bir görüntü sınıflandırıcıyı nasıl oluşturabileceğiniz ve transfer öğrenmeyi nasıl uygulayabileceğiniz ve bilgisayarlı görme sorunlarınız için daha iyi sonuçlar elde etmek için bunu nasıl kullanabileceğiniz hakkında bir fikriniz vardır. Takip eden makalede, görüntü sınıflandırıcımızı tutmak ve dağıtmak için bir API oluşturacağız. Bu eğitimin tam kodunu zaten aşağıdaki GitHub deposuna koydum.

KODU BUL

BENİM HAKKIMDA 

Bilgisayar Bilimi ve Mühendisliği alanında lisans eğitimimi sürdüren IIIT'nin son sınıf öğrencisiyim. Derin ve Makine Öğrenimi hakkında giderek daha fazlasını keşfetmeyi ve denemeyi seviyorum. İşbirliği yapmak istiyorsanız aşağıdaki bağlantıları kullanabilirsiniz:

Linkedin: Beni tıkla

Github: Beni tıkla

: Beni tıkla

Bana postala: [e-posta korumalı]

Umarım Flask kullanarak görüntü sınıflandırıcı hakkındaki makalemi beğenmişsinizdir. Okuduğunuz için teşekkürler!

Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır. 

Kaynak: https://www.analyticsvidhya.com/blog/2022/01/develop-and-deploy-image-classifier-using-flask-part-1/

spot_img

En Son İstihbarat

spot_img