Невозможно получить степень медицинского эксперта, чтобы классифицировать болезнь, но угадайте, что машинное обучение и компьютерное зрение позволяют вам делать это самостоятельно 🫁⚕️.

Насколько распространен рак легких?

Рак легкого (как мелкоклеточный, так и немелкоклеточный) является вторым наиболее распространенным видом рака как у мужчин, так и у женщин в Соединенных Штатах (не считая рака кожи). У мужчин чаще встречается рак предстательной железы, а у женщин — рак молочной железы.

Оценки Американского онкологического общества относительно рака легких в США на 2023 год таковы:

  • Около 238 340 новых случаев рака легких (117 550 у мужчин и 120 790 у женщин)
  • Около 127 070 смертей от рака легких (67 160 мужчин и 59 910 женщин)

Подход последовал: -

  • Для обучения нашей модели мы использовали Keras API.
  • Мы использовали слой 2D Convolution вместе с последовательными слоями MaxPooling для повышения производительности моделей.
  • Поскольку мы сталкиваемся с проблемой классификации двух классов, то есть с проблемой бинарной классификации, мы закончим сеть с сигмовидной активацией. Выходом сети будет один скаляр от 0 до 1, кодирующий вероятность того, что текущее изображение относится к классу 1 (в отличие от класса 0).
  • Ссылка на набор данных изображений
  • Ниже приведен список кода по пути и установите следующую переменную.
import os

base_dir = '/content/drive/MyDrive/ctscan_images'  (your path can be different)

print("Contents of base directory:")
print(os.listdir(base_dir))

print("\nContents of train directory:")
print(os.listdir(f'{base_dir}/train'))

print("\nContents of validation directory:")
print(os.listdir(f'{base_dir}/validation'))


-------------------------------------------------

Output:-

Contents of base directory:
['validation', 'train']

Contents of train directory:
['normal', 'lung_cancer']

Contents of validation directory:
['normal', 'lung_cancer']

Создание небольшой модели с нуля для достижения точности ~72%. Чтобы обучить нейронную сеть обрабатывать изображения, вам нужно, чтобы они были одинакового размера. Вы выберете для этого 150x150 пикселей, и вскоре вы увидите код, который предварительно обрабатывает изображения до этой формы.

import tensorflow as tf

model = tf.keras.models.Sequential([
    # Note the input shape is the desired size of the image 150x150 with 3 bytes color
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2), 
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'), 
    tf.keras.layers.MaxPooling2D(2,2),
    # Flatten the results to feed into a DNN
    tf.keras.layers.Flatten(), 
    # 512 neuron hidden layer
    tf.keras.layers.Dense(512, activation='relu'), 
    # Only 1 output neuron. It will contain a value from 0-1 where 0 for 1 class ('cats') and 1 for the other ('dogs')
    tf.keras.layers.Dense(1, activation='sigmoid')  
])

Компиляция модели

Вы будете обучать нашу модель с потерей binary_crossentropy, потому что это проблема бинарной классификации, а ваша окончательная активация — это сигмоид. Мы будем использовать оптимизатор rmsprop со скоростью обучения 0,001. Во время обучения вы захотите следить за точностью классификации.

from tensorflow.keras.optimizers import RMSprop       
        model.compile(optimizer=RMSprop(learning_rate=0.001),
        loss='binary_crossentropy',
        metrics = ['accuracy'])

Подгонка данных к модели

Вы будете обучать нашу модель с потерей binary_crossentropy, потому что это проблема бинарной классификации, а ваша окончательная активация — это сигмоид. Мы будем использовать оптимизатор rmsprop со скоростью обучения 0,001. Во время обучения вы захотите следить за точностью классификации.

model.fit(
        train_generator,
        epochs=15,
        validation_data=validation_generator,
        verbose=2
            )

Подгонка данных к модели

Вы будете обучать нашу модель с потерей binary_crossentropy, потому что это проблема бинарной классификации, а ваша окончательная активация — это сигмоид. Мы будем использовать оптимизатор rmsprop со скоростью обучения 0,001. Во время обучения вы захотите следить за точностью классификации.

model.fit(
        train_generator,
        epochs=15,
        validation_data=validation_generator,
        verbose=2
            )

Построение графика обучения и проверки (точность и потери)

import matplotlib.pyplot as plt

def plot_loss_acc(history):
  '''Plots the training and validation loss and accuracy from a history object'''
  acc = history.history['accuracy']
  val_acc = history.history['val_accuracy']
  loss = history.history['loss']
  val_loss = history.history['val_loss']

  epochs = range(len(acc))

  plt.plot(epochs, acc, 'r', label='Training accuracy')
  plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
  plt.title('Training and validation accuracy')

  plt.figure()

  plt.plot(epochs, loss, 'r', label='Training Loss')
  plt.plot(epochs, val_loss, 'b', label='Validation Loss')
  plt.title('Training and validation loss')
  plt.legend()

  plt.show()

Прогнозирование изображения, взятого из проверочного набора, или любого случайного изображения компьютерной томографии.

import numpy as np

from google.colab import files
from tensorflow.keras.utils import load_img, img_to_array

uploaded=files.upload()

for fn in uploaded.keys():
 
  # predicting images
  path='/content/' + fn
  img=load_img(path, target_size=(150, 150))
  
  x=img_to_array(img)
  x /= 255
  x=np.expand_dims(x, axis=0)
  images = np.vstack([x])
  
  classes = model.predict(images, batch_size=10)
  
  print(classes[0])
  
  if classes[0][0]>0.5:
    print(fn + " is a normal case")
  else:
    print(fn + " is a lung cancer case")

Экспорт обученной модели в файл «.h5».

from keras.models import load_model
model.save("lungcancer_model_cnn.h5")

Вы можете получить доступ ко всему файлу коллаба здесь, чтобы попробовать его самостоятельно … 🧑‍💻 [ССЫЛКА]