Введение:

В этой статье рассказывается о диагностике COVID-19 по рентгеновскому снимку грудной клетки пациента с использованием модели глубокого обучения сверточной нейронной сети (CNN) в рабочей области машинного обучения Azure.

Это серия из двух частей, в части 1 мы обсуждаем модель глубокого переноса обучения для диагностики COVID-19 на основе рентгеновских снимков грудной клетки пациента, а в части 2 мы обсудим, как развернуть наше предварительно обученное глубокое обучение COVID-19. модель в Azure ML.

Часть 2: Как развернуть предварительно обученную модель COVID-19 в Azure ML.

Я надеюсь, что конец этой статьи поможет читателям понять, как построить модель обучения с глубоким переносом для любой классификации изображений или набора данных распознавания объектов и как развернуть любую специально созданную модель в Azure ML Workspace.

Обзор набора данных:

Здесь набор данных рентгеновского снимка грудной клетки пациента с положительным результатом COVID-19 и здорового пациента был получен из общедоступного набора данных с открытым исходным кодом.

Для COVID-19 положительные пациенты собираются из репозитория GitHub, в нем есть рентгеновские снимки грудной клетки и компьютерная томография пациентов, которые положительны или подозреваются на COVID-19 или другие вирусные и бактериальные пневмонии (MERS, SARS и ARDS). Из этого набора данных мы собрали только рентгеновские снимки грудной клетки пациента с COVID-19, и в нем содержится около 235 изображений, которые мы использовали для нашего прогноза. Эти изображения копируются в папку «Dataset / COVID-19».

Набор данных рентгена грудной клетки пациента с положительным результатом на COVID-19: https://github.com/ieee8023/covid-chestxray-dataset

Для ОБЫЧНЫХ данных рентгенограммы грудной клетки пациента были получены из Kaggle. Он имеет данные рентгеновских снимков грудной клетки пациентов с нормальным состоянием и пневмонией. Исходя из этого, мы собрали только 231 рентгеновский снимок грудной клетки здорового пациента, чтобы убедиться, что набор данных сбалансирован с данными COVID-19. Эти изображения копируются в папку «Dataset / NORMAL».

Набор данных рентгенографии грудной клетки здорового пациента: https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia

Коллекция наборов данных:

После того, как изображения скопированы в локальную папку, мы использовали метод ниже для создания фрейма данных. В этом кадре данных мы сохранили каждый путь к изображению в «ImageName» и соответствующее значение «Class», для COVID-19 мы установили значение метки как 1, а для обычного изображения мы установили значение метки как 0.

#In the GenerateDataSet method collect all image file path from COVID-19 and NORMAL folder and return as dataframe.
#In this dataframe, ImageName has file path and "Class" has label value 0 for NORMAL and 1 for COVID-19.
#Note : PNEUMONIA folder is not in use here
def GenerateDataSet(rootFolder):
    rows_list = []
    listOfFiles = os.listdir(rootFolder)
    for l in listOfFiles:
      if l=="PNEUMONIA":
        continue
      subFolder = rootFolder + "/" + l
      label=0
      if l == "COVID-19":
        label=1
      
      for label_file in glob(osp.join(subFolder, '*.*')):
        rows_list.append({'ImageName':label_file,'Class':label})
      
    return pd.DataFrame(rows_list)

Всего мы собрали 466 рентгеновских снимков, из них 235 рентгеновских снимков в папке COVID-19 и 231 рентгеновских снимков в папке NORMAL.

Предварительная обработка данных изображения:

После того, как набор данных собран, мы должны предварительно обработать данные изображения, как показано ниже:

  1. Мы случайным образом разделили набор данных на набор данных Train (298), Validation (75) и Test (93).

2. После разделения данных мы использовали описанный ниже общий метод предварительной обработки изображений в поезде, проверки и тестирования данных.

Этот метод использовал пакет Open CV для чтения изображения и изменения размера изображения до 150x150 и его нормализации данных изображения до 0–1 от 1–255. И, наконец, верните массив numpy и соответствующее значение метки.

#This method used for pre-proceesing data from dataframe before modelling for Train and same will be used for Validate and Test data set.
#This method return image normalized data in numpy array format as X and corresponding label value in Y.
def imagePreProcess(data):
  X=[]
  Y=[]
  for i in data.itertuples():
    #Read image from physical file using Open CV
    img_arr = cv2.imread(i[1])
    #Resize image bytes to 150x150
    resized_arr = cv2.resize(img_arr, (img_size, img_size))
    X.append(resized_arr)
    Y.append(i[2])
  #Normalize the image data to 0-1 from 0-255 
  X=np.array(X)/255
  return X, np.array(Y)

Построение модели:

Это проблема классификации двоичных изображений или распознавания изображений; наша модель должна прогнозировать, что COVID-19 будет ПОЛОЖИТЕЛЬНЫМ или ОТРИЦАТЕЛЬНЫМ на основе входных данных.

Здесь мы использовали популярную модель обучения с глубокой передачей для обучения нашего набора данных, мы использовали четыре различные базовые архитектуры модели глубокого обучения (Xception, InceptionV3, DenseNet201 и ResNet50) и повторно обучились с нашим набором данных, и, наконец, мы выбрали лучшую модель, которая является соответствуют этому набору данных.

Пожалуйста, обратитесь к моей записной книжке о том, как построить и обучить эти четыре модели глубокого обучения с использованием TensorFlow 2.0.

Во всех этих четырех моделях мы использовали вес Imagnet по умолчанию, скомпилировали с оптимизатором «nadam» и повторно обучили модель вместе с ModelCheckpoint и событием обратного вызова EarlyStopping, чтобы остановить переобучение. Через событие обратного вызова modelcheckpoint мы сохраняем нашу лучшую модель как файл .h5 во время обучения.

Найдите код обучения передачи модели Xception ниже:

# Pre-Trained CNN Model using imagenet dataset for pre-trained weights
base_xception_model = tf.keras.applications.Xception(input_shape=(img_size, img_size, 3), weights='imagenet', include_top=False)
# Top Model Block
x = base_xception_model.output
x = tf.keras.layers.GlobalAveragePooling2D()(x)
predictions = tf.keras.layers.Dense(1, activation='sigmoid')(x)
# add your top layer block to your base model
xception_model = tf.keras.models.Model(base_xception_model.input, predictions)
#Compile the model
xception_model.compile(optimizer='adam',
              loss='binary_crossentropy',  # categorical_crossentropy if multi-class classifier
              metrics=['accuracy'])
#File path tosave best model while traiing
final_weights_path = './xception_Final_Best_model.h5'
#Assign Callback function
callbacks_list = [
    tf.keras.callbacks.ModelCheckpoint(final_weights_path, verbose=1, save_best_only=True,),
    tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=0)
]
# Train the Xception Model for 10 epochs with train and validation data.
#Using callback function we are adding Model checkpoint to save best model in each epoch 
#And doing early stopping the training to stop model overfitting.
xception_history=xception_model.fit(X_train,y_train, 
                                    validation_data=( X_val , y_val ),
                                    epochs=10,
                                    batch_size=batch_size,
                                    callbacks=callbacks_list)

Модель Оценка:

Найдите оценку обученной модели для тестовых данных, и здесь модели Xception и InceptionV3 дали лучший результат, чем DenNet201 и ResNet50.

Модель Xception дает точность 99%, а модель InceptionV3 дает точность 98%.

Модель Xception: матрица смешения тестовых данных

Согласно матрице недоразумений для наших тестовых данных, модель Xception способна правильно предсказать 52 ПОЛОЖИТЕЛЬНЫХ изображения COVID-19 из 53 изображений, при этом 1 изображение было предсказано неверно, а все 40 здоровых изображений правильно предсказаны как ОТРИЦАТЕЛЬНЫЙ COVID-19.

Заключение по части 1:

1. Из-за очень ограниченного количества данных о поездах наша модель переоценивается.

2. Набор данных был собран из двух разных репозиториев с открытым исходным кодом и из-за ограничения данных рентгеновского излучения COVID-19; мы сбалансировали оба рентгеновских изображения.

3. Мы повторно обучили этот набор данных с помощью различной базовой архитектуры Deep Transfer Learning и модели Xception, что дало наилучшую точность (99%) для этого набора данных.

4. Наконец, используя технику Deep Transfer Learning, мы можем получить многообещающий результат для этого набора данных.

Репозиторий исходного кода:

Пожалуйста, найдите исходный код этого решения в репозитории мой GitHub.



См. Часть 2: Как развернуть предварительно обученную модель COVID-19 в Azure ML.