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']

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])

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.