Makine öğrenmesi ile öksürük tespiti

Merhaba makine öğrenmesi yöntemlerini kullanarak öksürük tespitini yapacağız. Yazımı Türkçe yazıyorum çünkü bu konuda Türkçe kaynak yok. Örnekler vererek detaylıca açıklayarak size nasıl yapıldığını sunacağım iyi okumalar.

https://github.com/flavves/oksurukTespit

spektrum görüntülerini bu yazımda anlattığım şekilde elde edebilirsiniz

veri setine buradan ulaşabilirsiniz : https://wetransfer.com/downloads/d731d25849ca25f7f6bd0349392d8c2920210103141036/fd98e1


import numpy as np 
import pandas as pd



import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Flatten, Dropout
import time

import matplotlib.pyplot as plt


from tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array

Bu kısımda bizim elimizdeki spektrum png dosyalarımızı belirlenen parametreler filtrelemesi sayesinde belirli tanımlara atıyoruz

data_generator = ImageDataGenerator(rescale=1./255.,validation_split=0.2,
                                   featurewise_center=True,
        samplewise_center=True,
        featurewise_std_normalization=True,
        samplewise_std_normalization=True,
        rotation_range=20,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.15,
        zoom_range=0.15,
        fill_mode="nearest",
        horizontal_flip=True,
        vertical_flip=True
                        )

train_generator = data_generator.flow_from_directory(directory= 'D:/masaüstü/yazılımileilgilihersey/onluk/sestospectrum/we/dataset/training/',             
                                                     target_size=(224, 224),
                                                     class_mode='binary',
                                                     subset='training',
                                                     shuffle=True,
                                                     seed=2,
                                                     batch_size=32,
                                                     color_mode='rgb'
                                                     )

valid_generator = data_generator.flow_from_directory(directory= 'D:/masaüstü/yazılımileilgilihersey/onluk/sestospectrum/we/dataset/testing/',
                                                     target_size=(224, 224),
                                                     class_mode='binary',
                                                     subset='validation',
                                                     shuffle=True,
                                                     batch_size=32,
                                                     color_mode='rgb'
                                                    )

classes = ['oksuruk_degil', 'oksuruk']
sonuç

sample_training_images, _ = next(train_generator)

def plotImages(images_arr):
    fig, axes = plt.subplots(1, 5, figsize=(20,20))
    labels = sample_training_images
    axes = axes.flatten()
    for img, ax in zip(images_arr, axes):
        ax.imshow(img)
        ax.axis('off')
    plt.tight_layout()
    plt.show()


plotImages(sample_training_images[:5])
örnekler
model = tf.keras.models.Sequential()
model.add(MobileNetV2(include_top=False, pooling='avg', weights='imagenet', input_shape=(224, 224, 3), classes=2))
model.add(Dense(2, activation='softmax'))
model.layers[0].trainable = False
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

callbacks = tf.keras.callbacks.EarlyStopping(monitor = 'val_accuracy', patience = 2)
history = model.fit_generator(train_generator,
                              steps_per_epoch = len(train_generator),
                              epochs=15,
                              validation_steps = len(valid_generator),
                              validation_data=valid_generator,
                              callbacks = [callbacks]
                              )

def visualize_training(history, lw = 3):
    plt.figure(figsize=(10,6))
    plt.plot(history.history['accuracy'], label = 'training', marker = '*', linewidth = lw)
    plt.plot(history.history['val_accuracy'], label = 'validation', marker = 'o', linewidth = lw)
    plt.title('Training Accuracy vs Validation Accuracy')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.legend(fontsize = 'x-large')
    plt.show()

    plt.figure(figsize=(10,6))
    plt.plot(history.history['loss'], label = 'training', marker = '*', linewidth = lw)
    plt.plot(history.history['val_loss'], label = 'validation', marker = 'o', linewidth = lw)
    plt.title('Training Loss vs Validation Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend(fontsize = 'x-large')
    plt.show()
visualize_training(history)

preds = model.predict_generator(valid_generator,steps=15)
label = valid_generator.classes

pred= model.predict(valid_generator)
predicted_class_indices=np.argmax(pred,axis=1)
labels = (valid_generator.class_indices)
labels2 = dict((v,k) for k,v in labels.items())
predictions = [labels2[k] for k in predicted_class_indices]
print(predicted_class_indices)
print (labels)
print (predictions)

Haydi sizinle beraber şimdi tahmin yapalım

image_path = 'D:/masaüstü/yazılımileilgilihersey/onluk/sestospectrum/we/dataset/testing/oksuruk/a48.png'
image = tf.keras.preprocessing.image.load_img(image_path)
input_arr = tf.keras.preprocessing.image.img_to_array(image)
input_arr = np.array([input_arr])  # Convert single image to a batch.
predictions = model.predict(input_arr)

predictions

from sklearn.metrics import confusion_matrix, classification_report, roc_curve

rc = roc_curve(predicted_class_indices,label)
cf_matrix = confusion_matrix(predicted_class_indices,label)
cf_report = classification_report(predicted_class_indices,label)
print('Confusion matrix report of the model : \n{}'.format(cf_matrix))


exp_series = pd.Series(label)
pred_series = pd.Series(predicted_class_indices)
pd.crosstab(exp_series, pred_series, rownames=['Actual'], colnames=['Predicted'],margins=True)

print('Classification report of the model : \n{}'.format(cf_report))

save_path = '.'
from tensorflow.keras.models import load_model
model2 = load_model(os.path.join(save_path,"D:/masaüstü/yazılımileilgilihersey/onluk/sestospectrum/bionluk.h5"))
pred = model2.predict(input_arr)
pred

Tahminimce hadi nerede sonuç diyebilirsiniz. Kendi ürettiğiniz model sonucunda test datanızdaki öksürük ve öksürük değil kararlarını karşılaştırın gelen arraylerin aralığını veya yüksekliğine göre tahmin yapın

save_path = '.'
model2 = load_model(os.path.join(save_path,"bionluk.h5"))
pred = model2.predict(giris)
pred
for a in pred:
    print(a[1])
    sonuc=a[0]
    sonuc1=a[1]
    
if sonuc >0.50:
    print("SONUÇ ÖKSÜRÜK")
else:
    print("NEGATİF")

Tarzında yapabilirsiniz sizin terciğinize kalmış.

Teşekkür ederim eğer bir sorunuz olursa

batuhanokmen@gmail.com üzerinden sorularınızı iletebilirsiniz.

Bir cevap yazın