Компьютерное зрение играет очень важную роль в области медицины, и это исследование прикладного компьютерного зрения в медицине широко известно как Медицинская визуализация. Теперь компьютерное зрение достигается либо путем развертывания методологий машинного обучения или глубокого обучения, либо обоих (гибридных) в производственной среде.
В этой статье я собираюсь пролить свет на одну из таких методологий машинного обучения, в которой используется блок глубокого обучения, что делает ее гибридной моделью для классификации опухолей головного мозга.
Разработка гибридной модели для классификации опухолей головного мозга
- Набор данных: Набор данных изображений МРТ мозга, доступный в 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, полученными из необработанных экспериментов. Кроме того, в недавнем прошлом были опубликованы документы исследовательских конференций в области медицинской визуализации, в которых развертывались аналогичные гибридные модели глубокого обучения и машинного обучения:
- Чакрабарти, Навонил и Субхрасанкар Чаттерджи. Необычная методика обнаружения диабетической ретинопатии с использованием компьютерного зрения. 10-я Международная конференция по вычислительным, коммуникационным и сетевым технологиям (ICCCNT), 2019 г.. IEEE, 2019. (https://ieeexplore.ieee.org/document/8944633)
- Чакрабарти, Навонил и Субхрасанкар Чаттерджи. Новый подход к скринингу глаукомы с использованием компьютерного зрения. Международная конференция по интеллектуальным системам и изобретательским технологиям (ICSSIT) 2019. IEEE, 2019. (https://ieeexplore.ieee.org/document/8987803)
Для личного контакта по поводу статьи или обсуждений по машинному обучению / глубокому обучению / компьютерному зрению или любому отделу науки о данных или искусственного интеллекта, не стесняйтесь обращаться ко мне в LinkedIn.