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
- Görüntü Sınıflandırma nedir?
1. 1. Evrişimsel Sinir Ağı
1. 2. Öğrenimi Aktarın - Görüntü Sınıflandırıcı Kodlaması
- 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?
- 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.
- 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.
- 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.
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.
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.
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 = 16img_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.
|
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
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.