Spaces:
Runtime error
Runtime error
| #!/usr/bin/env python | |
| # coding: utf-8 | |
| # # Importing the Required Libraries. | |
| from IPython import get_ipython | |
| import keras | |
| import os | |
| os.environ['SM_FRAMEWORK'] = 'tf.keras' | |
| import segmentation_models as sm | |
| import glob | |
| import matplotlib.pyplot as plt | |
| from scipy import ndimage | |
| from scipy.ndimage import label, generate_binary_structure | |
| import radiomics | |
| import cv2 | |
| import SimpleITK as sitk | |
| import six | |
| import numpy as np | |
| import pandas as pd | |
| import seaborn as sns | |
| import matplotlib.pyplot as plt | |
| import pickle | |
| from sklearn.model_selection import train_test_split | |
| from sklearn.feature_selection import SelectKBest | |
| from sklearn.feature_selection import mutual_info_classif | |
| from sklearn.ensemble import RandomForestClassifier | |
| from sklearn.feature_selection import RFE | |
| from sklearn.metrics import roc_auc_score | |
| from sklearn.feature_selection import SelectFromModel | |
| from sklearn.linear_model import Lasso, LogisticRegression | |
| from sklearn.preprocessing import StandardScaler | |
| from sklearn.decomposition import PCA | |
| from sklearn.svm import LinearSVC | |
| from sklearn.datasets import load_iris | |
| from sklearn.feature_selection import SelectFromModel | |
| from sklearn.feature_selection import mutual_info_classif as MIC | |
| from sklearn.feature_selection import mutual_info_classif, mutual_info_regression | |
| from sklearn.feature_selection import SelectKBest, SelectPercentile | |
| from sklearn.feature_selection import SequentialFeatureSelector | |
| from sklearn.neighbors import KNeighborsClassifier | |
| from sklearn.linear_model import LogisticRegression | |
| from sklearn.ensemble import RandomForestClassifier | |
| from sklearn.svm import SVC | |
| from sklearn.metrics import f1_score | |
| from sklearn.model_selection import cross_validate | |
| from sklearn.tree import DecisionTreeClassifier | |
| from sklearn.linear_model import Perceptron | |
| from sklearn.model_selection import RandomizedSearchCV | |
| from sklearn.model_selection import GridSearchCV | |
| import gradio as gr | |
| os.environ["CUDA_VISIBLE_DEVICES"] = "1" | |
| # # Defining the path to Model and Images | |
| # In[2]: | |
| IMAGE_SIZE = (256,256,3) | |
| path_base_model = './/models//' | |
| # # Loading the models | |
| # In[4]: | |
| BACKBONE = 'efficientnetb0' | |
| model1 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet') | |
| model2 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet') | |
| model3 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet') | |
| BACKBONE = 'efficientnetb7' | |
| model4 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet') | |
| model5 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet') | |
| preprocess_input = sm.get_preprocessing(BACKBONE) | |
| model1.load_weights(path_base_model + 'model1.hdf5') | |
| model2.load_weights(path_base_model + 'model2.hdf5') | |
| model3.load_weights(path_base_model + 'model3.hdf5') | |
| model4.load_weights(path_base_model + 'model4.hdf5') | |
| model5.load_weights(path_base_model + 'model5.hdf5') | |
| # # Defining Required Functions | |
| # In[5]: | |
| def preprocessing_HE(img_): | |
| hist, bins = np.histogram(img_.flatten(), 256,[0,256]) | |
| cdf = hist.cumsum() | |
| cdf_m = np.ma.masked_equal(cdf,0) | |
| cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min()) | |
| cdf = np.ma.filled(cdf_m,0).astype('uint8') | |
| img_2 = cdf[img_] | |
| return img_2 | |
| def get_binary_mask (mask_, th_ = 0.5): | |
| mask_[mask_>th_] = 1 | |
| mask_[mask_<=th_] = 0 | |
| return mask_ | |
| def ensemble_results (mask1_, mask2_, mask3_, mask4_, mask5_): | |
| mask1_ = get_binary_mask (mask1_) | |
| mask2_ = get_binary_mask (mask2_) | |
| mask3_ = get_binary_mask (mask3_) | |
| mask4_ = get_binary_mask (mask4_) | |
| mask5_ = get_binary_mask (mask5_) | |
| ensemble_mask = mask1_ + mask2_ + mask3_ + mask4_ + mask5_ | |
| ensemble_mask[ensemble_mask<=2.0] = 0 | |
| ensemble_mask[ensemble_mask> 2.0] = 1 | |
| return ensemble_mask | |
| def postprocessing_HoleFilling (mask_): | |
| ensemble_mask_post_temp = ndimage.binary_fill_holes(mask_).astype(int) | |
| return ensemble_mask_post_temp | |
| def get_maximum_index (labeled_array): | |
| ind_nums = [] | |
| for i in range (len(np.unique(labeled_array)) - 1): | |
| ind_nums.append ([0, i+1]) | |
| for i in range (1, len(np.unique(labeled_array))): | |
| ind_nums[i-1][0] = len(np.where (labeled_array == np.unique(labeled_array)[i])[0]) | |
| ind_nums = sorted(ind_nums) | |
| return ind_nums[len(ind_nums)-1][1], ind_nums[len(ind_nums)-2][1] | |
| def postprocessing_EliminatingIsolation (ensemble_mask_post_temp): | |
| labeled_array, num_features = label(ensemble_mask_post_temp) | |
| ind_max1, ind_max2 = get_maximum_index (labeled_array) | |
| ensemble_mask_post_temp2 = np.zeros (ensemble_mask_post_temp.shape) | |
| ensemble_mask_post_temp2[labeled_array == ind_max1] = 1 | |
| ensemble_mask_post_temp2[labeled_array == ind_max2] = 1 | |
| return ensemble_mask_post_temp2.astype(int) | |
| def get_prediction(model_, img_org_): | |
| img_org_resize = cv2.resize(img_org_,(IMAGE_SIZE[0],IMAGE_SIZE[1]),cv2.INTER_AREA) | |
| img_org_resize_HE = preprocessing_HE (img_org_resize) | |
| img_ready = preprocess_input (img_org_resize_HE) | |
| img_ready = np.expand_dims(img_ready, axis=0) | |
| pr_mask = model_.predict(img_ready) | |
| pr_mask = np.squeeze(pr_mask) | |
| pr_mask = np.expand_dims(pr_mask, axis=-1) | |
| return pr_mask[:,:,0] | |
| # ## Create and intantiate Feature Extractor and enable the required features | |
| # In[9]: | |
| extractor = radiomics.featureextractor.RadiomicsFeatureExtractor(force2D=True) | |
| extractor.enableImageTypeByName('Original') # extract features from the original image | |
| extractor.enableFeatureClassByName('firstorder') # extract first-order features | |
| extractor.enableFeatureClassByName('glcm') # extract GLCM features | |
| extractor.enableFeatureClassByName('gldm') # extract GLDM features | |
| extractor.enableFeatureClassByName('glszm') # extract GLSZM features | |
| extractor.enableFeatureClassByName('ngtdm') # extract NGTDM features | |
| features_name = ['diagnostics_Versions_PyRadiomics', | |
| 'diagnostics_Versions_Numpy', | |
| 'diagnostics_Versions_SimpleITK', | |
| 'diagnostics_Versions_PyWavelet', | |
| 'diagnostics_Versions_Python', | |
| 'diagnostics_Configuration_Settings', | |
| 'diagnostics_Configuration_EnabledImageTypes', | |
| 'diagnostics_Image-original_Hash', | |
| 'diagnostics_Image-original_Dimensionality', | |
| 'diagnostics_Image-original_Spacing', | |
| 'diagnostics_Image-original_Size', | |
| 'diagnostics_Image-original_Mean', | |
| 'diagnostics_Image-original_Minimum', | |
| 'diagnostics_Image-original_Maximum', | |
| 'diagnostics_Mask-original_Hash', | |
| 'diagnostics_Mask-original_Spacing', | |
| 'diagnostics_Mask-original_Size', | |
| 'diagnostics_Mask-original_BoundingBox', | |
| 'diagnostics_Mask-original_VoxelNum', | |
| 'diagnostics_Mask-original_VolumeNum', | |
| 'diagnostics_Mask-original_CenterOfMassIndex', | |
| 'diagnostics_Mask-original_CenterOfMass', | |
| 'original_firstorder_10Percentile', | |
| 'original_firstorder_90Percentile', | |
| 'original_firstorder_Energy', | |
| 'original_firstorder_Entropy', | |
| 'original_firstorder_InterquartileRange', | |
| 'original_firstorder_Kurtosis', | |
| 'original_firstorder_Maximum', | |
| 'original_firstorder_MeanAbsoluteDeviation', | |
| 'original_firstorder_Mean', | |
| 'original_firstorder_Median', | |
| 'original_firstorder_Minimum', | |
| 'original_firstorder_Range', | |
| 'original_firstorder_RobustMeanAbsoluteDeviation', | |
| 'original_firstorder_RootMeanSquared', | |
| 'original_firstorder_Skewness', | |
| 'original_firstorder_TotalEnergy', | |
| 'original_firstorder_Uniformity', | |
| 'original_firstorder_Variance', | |
| 'original_glcm_Autocorrelation', | |
| 'original_glcm_ClusterProminence', | |
| 'original_glcm_ClusterShade', | |
| 'original_glcm_ClusterTendency', | |
| 'original_glcm_Contrast', | |
| 'original_glcm_Correlation', | |
| 'original_glcm_DifferenceAverage', | |
| 'original_glcm_DifferenceEntropy', | |
| 'original_glcm_DifferenceVariance', | |
| 'original_glcm_Id', | |
| 'original_glcm_Idm', | |
| 'original_glcm_Idmn', | |
| 'original_glcm_Idn', | |
| 'original_glcm_Imc1', | |
| 'original_glcm_Imc2', | |
| 'original_glcm_InverseVariance', | |
| 'original_glcm_JointAverage', | |
| 'original_glcm_JointEnergy', | |
| 'original_glcm_JointEntropy', | |
| 'original_glcm_MCC', | |
| 'original_glcm_MaximumProbability', | |
| 'original_glcm_SumAverage', | |
| 'original_glcm_SumEntropy', | |
| 'original_glcm_SumSquares', | |
| 'original_gldm_DependenceEntropy', | |
| 'original_gldm_DependenceNonUniformity', | |
| 'original_gldm_DependenceNonUniformityNormalized', | |
| 'original_gldm_DependenceVariance', | |
| 'original_gldm_GrayLevelNonUniformity', | |
| 'original_gldm_GrayLevelVariance', | |
| 'original_gldm_HighGrayLevelEmphasis', | |
| 'original_gldm_LargeDependenceEmphasis', | |
| 'original_gldm_LargeDependenceHighGrayLevelEmphasis', | |
| 'original_gldm_LargeDependenceLowGrayLevelEmphasis', | |
| 'original_gldm_LowGrayLevelEmphasis', | |
| 'original_gldm_SmallDependenceEmphasis', | |
| 'original_gldm_SmallDependenceHighGrayLevelEmphasis', | |
| 'original_gldm_SmallDependenceLowGrayLevelEmphasis', | |
| 'original_glrlm_GrayLevelNonUniformity', | |
| 'original_glrlm_GrayLevelNonUniformityNormalized', | |
| 'original_glrlm_GrayLevelVariance', | |
| 'original_glrlm_HighGrayLevelRunEmphasis', | |
| 'original_glrlm_LongRunEmphasis', | |
| 'original_glrlm_LongRunHighGrayLevelEmphasis', | |
| 'original_glrlm_LongRunLowGrayLevelEmphasis', | |
| 'original_glrlm_LowGrayLevelRunEmphasis', | |
| 'original_glrlm_RunEntropy', | |
| 'original_glrlm_RunLengthNonUniformity', | |
| 'original_glrlm_RunLengthNonUniformityNormalized', | |
| 'original_glrlm_RunPercentage', | |
| 'original_glrlm_RunVariance', | |
| 'original_glrlm_ShortRunEmphasis', | |
| 'original_glrlm_ShortRunHighGrayLevelEmphasis', | |
| 'original_glrlm_ShortRunLowGrayLevelEmphasis', | |
| 'original_glszm_GrayLevelNonUniformity', | |
| 'original_glszm_GrayLevelNonUniformityNormalized', | |
| 'original_glszm_GrayLevelVariance', | |
| 'original_glszm_HighGrayLevelZoneEmphasis', | |
| 'original_glszm_LargeAreaEmphasis', | |
| 'original_glszm_LargeAreaHighGrayLevelEmphasis', | |
| 'original_glszm_LargeAreaLowGrayLevelEmphasis', | |
| 'original_glszm_LowGrayLevelZoneEmphasis', | |
| 'original_glszm_SizeZoneNonUniformity', | |
| 'original_glszm_SizeZoneNonUniformityNormalized', | |
| 'original_glszm_SmallAreaEmphasis', | |
| 'original_glszm_SmallAreaHighGrayLevelEmphasis', | |
| 'original_glszm_SmallAreaLowGrayLevelEmphasis', | |
| 'original_glszm_ZoneEntropy', | |
| 'original_glszm_ZonePercentage', | |
| 'original_glszm_ZoneVariance', | |
| 'original_ngtdm_Busyness', | |
| 'original_ngtdm_Coarseness', | |
| 'original_ngtdm_Complexity', | |
| 'original_ngtdm_Contrast', | |
| 'original_ngtdm_Strength'] | |
| # In[12]: | |
| df = pd.read_csv('final_dataset1.csv') | |
| df.shape | |
| # In[13]: | |
| X_train, X_test, y_train, y_test = train_test_split( | |
| df.drop(labels=['Label'], axis=1), | |
| df['Label'], | |
| test_size=0.2, | |
| random_state=23) | |
| final_model = pickle.load(open('best_model', 'rb')) | |
| # In[42]: | |
| def pneumonia(image): | |
| img_ = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
| resized_img = cv2.resize(img_,(256,256)) | |
| original_image = 'original.jpeg' | |
| cv2.imwrite(original_image,resized_img) | |
| img = cv2.imread(original_image) | |
| pr_mask1 = get_prediction (model1, img); | |
| pr_mask2 = get_prediction (model2, img); | |
| pr_mask3 = get_prediction (model3, img); | |
| pr_mask4 = get_prediction (model4, img); | |
| pr_mask5 = get_prediction (model5, img); | |
| ensemble_mask = ensemble_results (pr_mask1, pr_mask2, pr_mask3, pr_mask4, pr_mask5) | |
| ensemble_mask_post_HF = postprocessing_HoleFilling (ensemble_mask) | |
| ensemble_mask_post_HF_EI = postprocessing_EliminatingIsolation (ensemble_mask_post_HF) | |
| mask = 'mask.jpeg' | |
| cv2.imwrite(mask,ensemble_mask_post_HF_EI*255) | |
| features = {} | |
| df = pd.DataFrame(columns=features_name) | |
| image_ = sitk.ReadImage(original_image, sitk.sitkInt8) | |
| mask = sitk.ReadImage(mask, sitk.sitkInt8) | |
| features = extractor.execute(image_, mask) | |
| data = [] | |
| values = [] | |
| for key in features: | |
| values.append(features[key]) | |
| data.extend([values]) | |
| df.loc[0] = data[0] | |
| cols = df.columns[22:] | |
| # Create new dataframe with selected columns | |
| DataFrame = df[cols] | |
| # Selected 55 best features using Correlation based feature selection | |
| selector = SelectKBest(score_func=mutual_info_classif, k=65) # choose the number of features you want to keep | |
| CFS = selector.fit_transform(X_train, y_train) # features are selected | |
| colu = list(X_test.columns[selector.get_support()]) #generating name of columns consisting that feature | |
| Selected_DF = DataFrame[colu] | |
| final_model = pickle.load(open('best_model', 'rb')) | |
| prediction = final_model.predict(Selected_DF) | |
| if prediction == 0: # Determine the predicted class | |
| Label = "Normal" | |
| elif prediction == 1: | |
| Label = "Pneumonia" | |
| return Label | |
| # In[43]: | |
| iface =gr.Interface(fn = pneumonia, | |
| inputs = "image", | |
| outputs = [gr.outputs.Textbox(label="Prediction")], | |
| title = "Pnuemonia Detection from Chest X ray images", | |
| description = "Upload a Chest X ray image") | |
| iface.launch() | |