Компьютерное зрение играет очень важную роль в области медицины, и это исследование прикладного компьютерного зрения в медицине широко известно как Медицинская визуализация. Теперь компьютерное зрение достигается либо путем развертывания методологий машинного обучения или глубокого обучения, либо обоих (гибридных) в производственной среде.

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

Разработка гибридной модели для классификации опухолей головного мозга

  • Набор данных: Набор данных изображений МРТ мозга, доступный в Kaggle, используется для разработки модели (скачать). Набор данных содержит 253 МРТ-изображения головного мозга. Примеры изображений показаны ниже.

  • Трехуровневая сверточная нейронная сеть с прямой связью и прямой связью для извлечения признаков изображения. Предлагаемая архитектура CNN показана ниже:

Эта архитектура CNN передается вперед только один раз (без обратного распространения) для извлечения признаков. Это блок глубокого обучения, о котором говорилось выше.

  • Support Vector Machine (SVM) -RBF Kernel: RBF Kernel SVM создан и обучен для разработки прогнозных моделей. Блок ML разработан с использованием Scikit-Learn.

Реализация гибридной модели CNN-SVM

Модель CNN разработана с использованием Keras Framework:

# Importing all necessary libraries
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
# CNN Model Development
classifier = Sequential()
# CONVOLUTION (1st Layer)
classifier.add(Convolution2D(32,(3,3),strides = (3,3),input_shape=(1000,1000,3),activation='relu'))
# Max-Pooling for 1st Convolutional Layer
classifier.add(MaxPooling2D(pool_size=(2,2)))
# CONVOLUTION (2nd Layer)
classifier.add(Convolution2D(32,(3,3),strides = (3,3), activation = 'relu'))
# Max-Pooling for 2nd Convolutional Layer 
classifier.add(MaxPooling2D(pool_size=(2,2)))
# CONVOLUTION (3rd Layer)
classifier.add(Convolution2D(32,(3,3),strides = (3,3), activation = 'relu'))
# Max-Pooling for 3rd Convolutional Layer
classifier.add(MaxPooling2D(pool_size=(2,2)))
# FLATTENING
classifier.add(Flatten())

Углубляемся в модель CNN:

classifier.summary()

Загрузка модели CNN с предварительно сохраненными весами, полученными в результате необработанного экспериментирования всей методологии (еще предстоит обсудить оставшиеся шаги). Веса доступны в файле иерархического формата данных (H5) по ссылке, указанной ниже:



classifier.load_weights("Brain_Tumor_PCA.h5")

Извлечение функций изображения с использованием созданной модели CNN

# Importing the necessary libraries
import numpy as np
import cv2
import os
# initializing the feature matrix
X = np.ones((253, 512))
# image loading and feature extraction
i = 0
os.chdir('.../MRI_IMAGES/train/yes')
for filename in os.listdir('.../MRI_IMAGES/train/yes'):
    img = cv2.imread(filename)
    img = cv2.resize(img,(1000,1000))
    img = np.divide(img,255)
    img = img.reshape(1,1000,1000,3)
    X[i] = classifier.predict(img)
    i = i + 1
os.chdir('.../MRI_IMAGES/train/no')
for filename in os.listdir('.../MRI_IMAGES/train/no'):
    img = cv2.imread(filename)
    img = cv2.resize(img,(1000,1000))
    img = np.divide(img,255)
    img = img.reshape(1,1000,1000,3)
    X[i] = classifier.predict(img)
    i = i + 1
os.chdir('.../MRI_IMAGES/test/yes')
for filename in os.listdir('.../MRI_IMAGES/test/yes'):
    img = cv2.imread(filename)
    img = cv2.resize(img,(1000,1000))
    img = np.divide(img,255)
    img = img.reshape(1,1000,1000,3)
    X[i] = classifier.predict(img)
    i = i + 1
os.chdir('.../MRI_IMAGES/test/no')
for filename in os.listdir('.../MRI_IMAGES/test/no'):
    img = cv2.imread(filename)
    img = cv2.resize(img,(1000,1000))
    img = np.divide(img,255)
    img = img.reshape(1,1000,1000,3)
    X[i] = classifier.predict(img)
    i = i + 1
# Preparing the Actual Labels
y = np.concatenate((np.ones(121), np.zeros(79), np.ones(34), np.zeros(19)))

Уменьшение размерности с помощью анализа главных компонентов

# Importing necessary libraries
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
pca.fit(X.T)
Z = pca.components_.T

Визуализация точечной диаграммы для набора данных

# Importing the necessary libraries
import matplotlib.pyplot as plt
plt.scatter(Z.T[0], Z.T[1], c = y, s = 10, marker = 'x')
plt.title('Scatter Plot Visualization (VIOLET -> Non-Tumorous, YELLOW -> Tumorous)')
plt.xlabel("F1_PCA")
plt.ylabel("F2_PCA")

Итак, из точечной диаграммы очевидно, что никакой алгоритм машинного обучения, который линейно разделяет исходное пространство признаков, здесь не применим.

Разделение набора данных на обучающий и тестовый

# Importing necessary libraries
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(Z,y, test_size=0.1, random_state=1234)

Разработка прогнозной модели SVM (ядро RBF) и настройка поиска по сетке для выбора наилучшего гиперпараметра, т. е. C (параметр штрафа в SVM)

# Importing necessary libraries
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
# MODEL INSTANTIATION
model = SVC(kernel = 'rbf')
parameters = {'C':[0.1,1,10,100,1000,10000,100000]}
grid_search = GridSearchCV(param_grid = parameters, estimator = model, verbose = 3)
# MODEL TRAINING AND GRID-SEARCH TUNING
grid_search = grid_search.fit(X_train,y_train)

Получение наилучшего гиперпараметра, т. е. C, параметра штрафа

print(grid_search.best_params_)

И параметр «гамма» SVM (ядра RBF) установлен в (1 / number_of_features) в качестве значения по умолчанию в Scikit-Learn. Итак, гамма = 0,5

Анализ эффективности модели

print("Validation Accuracy:",grid_search.score(X_test,y_test))
print("Training Accuracy:  ",grid_search.score(X_train, y_train))

# Importing the necessary library
from sklearn.metrics import classification_report
print(classification_report(y_test,grid_search.predict(X_test)))

# Importing the necessary libraries
import matplotlib.pyplot as plt
%matplotlib inline
import itertools
from sklearn.metrics import confusion_matrix
def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')
print(cm)
plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)
fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
plt.figure()
plot_confusion_matrix(confusion_matrix(y_test, grid_search.predict(X_test)), classes=[0,1], normalize=True,
                      title='Confusion Matrix')

# Importing the necessary modules
from sklearn.metrics import roc_curve, auc
y_roc = np.array(y_test)
fpr, tpr, thresholds = roc_curve(y_roc, grid_search.decision_function(X_test))
roc_auc = auc(fpr, tpr)
print("Area under the ROC curve : %f" % roc_auc)

# Importing the necessary libraries
import pylab as pl
pl.clf()
pl.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
pl.plot([0, 1], [0, 1], 'k--')
pl.xlim([0.0, 1.0])
pl.ylim([0.0, 1.0])
pl.xlabel('False Positive Rate')
pl.ylabel('True Positive Rate')
pl.legend(loc="lower right")
pl.show()

Логическое обоснование границей решения

Логическое обоснование очень важно для любой модели ИИ, будь то на основе машинного обучения или глубокого обучения, и эта методология не является исключением. В моделях глубокого обучения, связанных с медицинской визуализацией, логическое обоснование выполняется с помощью Grad Cam Visualizations, которые позже проверяются врачами. Следовательно, чистые модели глубокого обучения имеют преимущество.

Здесь методология основана на машине опорных векторов, которая представляет собой алгоритм машинного обучения, основанный на распознавании образов, с использованием N-мерной геометрии пространства признаков. Итак, Визуализация границы принятия решения - лучший способ логического обоснования для всей методологии.

x_min, x_max = X_train[:, 0].min(), X_train[:, 0].max()
y_min, y_max = X_train[:, 1].min(), X_train[:, 1].max()
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.001),
                     np.arange(y_min, y_max, 0.001))
h = grid_search.predict(np.c_[xx.ravel(), yy.ravel()])
h = h.reshape(xx.shape)
plt.contourf(xx, yy, h)
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, s = 10, marker = 'o', edgecolor = 'k')
plt.title('Scatter Plot Visualization of Training Set (VIOLET -> Non-Tumorous, YELLOW -> Tumorous)')
plt.xlabel('F1_PCA')
plt.ylabel('F2_PCA')

x_min, x_max = X_test[:, 0].min(), X_test[:, 0].max()
y_min, y_max = X_test[:, 1].min(), X_test[:, 1].max()
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.001),
                     np.arange(y_min, y_max, 0.001))
h = grid_search.predict(np.c_[xx.ravel(), yy.ravel()])
h = h.reshape(xx.shape)
plt.contourf(xx, yy, h)
plt.scatter(X_test[:, 0], X_test[:, 1], c = y_test, s = 10, marker = 'o', edgecolor = 'k')
plt.title('Scatter Plot Visualization of Test Set (VIOLET -> Non-Tumorous, YELLOW -> Tumorous)')
plt.xlabel('F1_PCA')
plt.ylabel('F2_PCA')

Таким образом, разрабатывается гибридная модель глубокого обучения и машинного обучения, обеспечивающая точность теста 76,9% и AUROC 0,8 с другими показателями производительности, упомянутыми выше. Производительность может быть значительно увеличена за счет включения всех 512 извлеченных функций (пропуская этап PCA) и с различными весами CNN, полученными из необработанных экспериментов. Кроме того, в недавнем прошлом были опубликованы документы исследовательских конференций в области медицинской визуализации, в которых развертывались аналогичные гибридные модели глубокого обучения и машинного обучения:

  1. Чакрабарти, Навонил и Субхрасанкар Чаттерджи. Необычная методика обнаружения диабетической ретинопатии с использованием компьютерного зрения. 10-я Международная конференция по вычислительным, коммуникационным и сетевым технологиям (ICCCNT), 2019 г.. IEEE, 2019. (https://ieeexplore.ieee.org/document/8944633)
  2. Чакрабарти, Навонил и Субхрасанкар Чаттерджи. Новый подход к скринингу глаукомы с использованием компьютерного зрения. Международная конференция по интеллектуальным системам и изобретательским технологиям (ICSSIT) 2019. IEEE, 2019. (https://ieeexplore.ieee.org/document/8987803)

Для личного контакта по поводу статьи или обсуждений по машинному обучению / глубокому обучению / компьютерному зрению или любому отделу науки о данных или искусственного интеллекта, не стесняйтесь обращаться ко мне в LinkedIn.