poornesh110 commited on
Commit
6c0da01
1 Parent(s): 718802e

Upload 7 files

Browse files
.gitattributes CHANGED
@@ -32,3 +32,8 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
32
  *.zip filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
32
  *.zip filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
35
+ models/model1.hdf5 filter=lfs diff=lfs merge=lfs -text
36
+ models/model2.hdf5 filter=lfs diff=lfs merge=lfs -text
37
+ models/model3.hdf5 filter=lfs diff=lfs merge=lfs -text
38
+ models/model4.hdf5 filter=lfs diff=lfs merge=lfs -text
39
+ models/model5.hdf5 filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,429 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ # coding: utf-8
3
+
4
+ # # Importing the Required Libraries.
5
+
6
+ # In[1]:
7
+
8
+
9
+ import keras
10
+ get_ipython().run_line_magic('env', 'SM_FRAMEWORK=tf.keras')
11
+ import segmentation_models as sm
12
+ import glob
13
+ import matplotlib.pyplot as plt
14
+ from scipy import ndimage
15
+ from scipy.ndimage import label, generate_binary_structure
16
+ import radiomics
17
+ import cv2
18
+ import SimpleITK as sitk
19
+ import six
20
+ import numpy as np
21
+ import pandas as pd
22
+ import seaborn as sns
23
+ import matplotlib.pyplot as plt
24
+ from sklearn.model_selection import train_test_split
25
+ get_ipython().run_line_magic('matplotlib', 'inline')
26
+ from sklearn.feature_selection import SelectKBest
27
+ from sklearn.feature_selection import mutual_info_classif
28
+ from sklearn.ensemble import RandomForestClassifier
29
+ from sklearn.feature_selection import RFE
30
+ from sklearn.metrics import roc_auc_score
31
+ from sklearn.feature_selection import SelectFromModel
32
+ from sklearn.linear_model import Lasso, LogisticRegression
33
+ from sklearn.preprocessing import StandardScaler
34
+ from sklearn.decomposition import PCA
35
+ from sklearn.svm import LinearSVC
36
+ from sklearn.datasets import load_iris
37
+ from sklearn.feature_selection import SelectFromModel
38
+ from sklearn.feature_selection import mutual_info_classif as MIC
39
+ from sklearn.feature_selection import mutual_info_classif, mutual_info_regression
40
+ from sklearn.feature_selection import SelectKBest, SelectPercentile
41
+ from sklearn.feature_selection import SequentialFeatureSelector
42
+ from sklearn.neighbors import KNeighborsClassifier
43
+ from sklearn.linear_model import LogisticRegression
44
+ from sklearn.ensemble import RandomForestClassifier
45
+ from sklearn.svm import SVC
46
+ from sklearn.metrics import f1_score
47
+ from sklearn.model_selection import cross_validate
48
+ from sklearn.tree import DecisionTreeClassifier
49
+ from sklearn.linear_model import Perceptron
50
+ from sklearn.model_selection import RandomizedSearchCV
51
+ from sklearn.model_selection import GridSearchCV
52
+ # from hyperopt import hp
53
+
54
+ import warnings
55
+ warnings.filterwarnings('ignore')
56
+ import os
57
+
58
+ os.environ["CUDA_VISIBLE_DEVICES"] = "1"
59
+
60
+
61
+ # # Defining the path to Model and Images
62
+
63
+ # In[2]:
64
+
65
+
66
+ IMAGE_SIZE = (256,256,3)
67
+
68
+ path_base_model = './/models//'
69
+
70
+ # # Loading the models
71
+
72
+ # In[4]:
73
+
74
+
75
+ BACKBONE = 'efficientnetb0'
76
+ model1 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet')
77
+ model2 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet')
78
+ model3 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet')
79
+
80
+ BACKBONE = 'efficientnetb7'
81
+ model4 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet')
82
+ model5 = sm.Unet(BACKBONE, input_shape = (IMAGE_SIZE[0],IMAGE_SIZE[1],IMAGE_SIZE[2]),classes=1, activation='sigmoid',encoder_weights='imagenet')
83
+
84
+ preprocess_input = sm.get_preprocessing(BACKBONE)
85
+
86
+ model1.load_weights(path_base_model + 'model1.hdf5')
87
+ model2.load_weights(path_base_model + 'model2.hdf5')
88
+ model3.load_weights(path_base_model + 'model3.hdf5')
89
+ model4.load_weights(path_base_model + 'model4.hdf5')
90
+ model5.load_weights(path_base_model + 'model5.hdf5')
91
+
92
+
93
+ # # Defining Required Functions
94
+
95
+ # In[5]:
96
+
97
+
98
+ def preprocessing_HE(img_):
99
+
100
+ hist, bins = np.histogram(img_.flatten(), 256,[0,256])
101
+ cdf = hist.cumsum()
102
+ cdf_m = np.ma.masked_equal(cdf,0)
103
+ cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
104
+ cdf = np.ma.filled(cdf_m,0).astype('uint8')
105
+
106
+ img_2 = cdf[img_]
107
+
108
+ return img_2
109
+
110
+ def get_binary_mask (mask_, th_ = 0.5):
111
+ mask_[mask_>th_] = 1
112
+ mask_[mask_<=th_] = 0
113
+ return mask_
114
+
115
+ def ensemble_results (mask1_, mask2_, mask3_, mask4_, mask5_):
116
+
117
+ mask1_ = get_binary_mask (mask1_)
118
+ mask2_ = get_binary_mask (mask2_)
119
+ mask3_ = get_binary_mask (mask3_)
120
+ mask4_ = get_binary_mask (mask4_)
121
+ mask5_ = get_binary_mask (mask5_)
122
+
123
+ ensemble_mask = mask1_ + mask2_ + mask3_ + mask4_ + mask5_
124
+ ensemble_mask[ensemble_mask<=2.0] = 0
125
+ ensemble_mask[ensemble_mask> 2.0] = 1
126
+
127
+ return ensemble_mask
128
+
129
+ def postprocessing_HoleFilling (mask_):
130
+
131
+ ensemble_mask_post_temp = ndimage.binary_fill_holes(mask_).astype(int)
132
+
133
+ return ensemble_mask_post_temp
134
+
135
+ def get_maximum_index (labeled_array):
136
+
137
+ ind_nums = []
138
+ for i in range (len(np.unique(labeled_array)) - 1):
139
+ ind_nums.append ([0, i+1])
140
+
141
+ for i in range (1, len(np.unique(labeled_array))):
142
+ ind_nums[i-1][0] = len(np.where (labeled_array == np.unique(labeled_array)[i])[0])
143
+
144
+ ind_nums = sorted(ind_nums)
145
+
146
+ return ind_nums[len(ind_nums)-1][1], ind_nums[len(ind_nums)-2][1]
147
+
148
+ def postprocessing_EliminatingIsolation (ensemble_mask_post_temp):
149
+
150
+ labeled_array, num_features = label(ensemble_mask_post_temp)
151
+
152
+ ind_max1, ind_max2 = get_maximum_index (labeled_array)
153
+
154
+ ensemble_mask_post_temp2 = np.zeros (ensemble_mask_post_temp.shape)
155
+ ensemble_mask_post_temp2[labeled_array == ind_max1] = 1
156
+ ensemble_mask_post_temp2[labeled_array == ind_max2] = 1
157
+
158
+ return ensemble_mask_post_temp2.astype(int)
159
+
160
+ def get_prediction(model_, img_org_):
161
+
162
+ img_org_resize = cv2.resize(img_org_,(IMAGE_SIZE[0],IMAGE_SIZE[1]),cv2.INTER_AREA)
163
+ img_org_resize_HE = preprocessing_HE (img_org_resize)
164
+ img_ready = preprocess_input (img_org_resize_HE)
165
+
166
+ img_ready = np.expand_dims(img_ready, axis=0)
167
+ pr_mask = model_.predict(img_ready)
168
+ pr_mask = np.squeeze(pr_mask)
169
+ pr_mask = np.expand_dims(pr_mask, axis=-1)
170
+ return pr_mask[:,:,0]
171
+
172
+ # ## Create and intantiate Feature Extractor and enable the required features
173
+
174
+ # In[9]:
175
+
176
+
177
+ extractor = radiomics.featureextractor.RadiomicsFeatureExtractor(force2D=True)
178
+ extractor.enableImageTypeByName('Original') # extract features from the original image
179
+ extractor.enableFeatureClassByName('firstorder') # extract first-order features
180
+ extractor.enableFeatureClassByName('glcm') # extract GLCM features
181
+ extractor.enableFeatureClassByName('gldm') # extract GLDM features
182
+ extractor.enableFeatureClassByName('glszm') # extract GLSZM features
183
+ extractor.enableFeatureClassByName('ngtdm') # extract NGTDM features
184
+
185
+
186
+
187
+ features_name = ['diagnostics_Versions_PyRadiomics',
188
+ 'diagnostics_Versions_Numpy',
189
+ 'diagnostics_Versions_SimpleITK',
190
+ 'diagnostics_Versions_PyWavelet',
191
+ 'diagnostics_Versions_Python',
192
+ 'diagnostics_Configuration_Settings',
193
+ 'diagnostics_Configuration_EnabledImageTypes',
194
+ 'diagnostics_Image-original_Hash',
195
+ 'diagnostics_Image-original_Dimensionality',
196
+ 'diagnostics_Image-original_Spacing',
197
+ 'diagnostics_Image-original_Size',
198
+ 'diagnostics_Image-original_Mean',
199
+ 'diagnostics_Image-original_Minimum',
200
+ 'diagnostics_Image-original_Maximum',
201
+ 'diagnostics_Mask-original_Hash',
202
+ 'diagnostics_Mask-original_Spacing',
203
+ 'diagnostics_Mask-original_Size',
204
+ 'diagnostics_Mask-original_BoundingBox',
205
+ 'diagnostics_Mask-original_VoxelNum',
206
+ 'diagnostics_Mask-original_VolumeNum',
207
+ 'diagnostics_Mask-original_CenterOfMassIndex',
208
+ 'diagnostics_Mask-original_CenterOfMass',
209
+ 'original_firstorder_10Percentile',
210
+ 'original_firstorder_90Percentile',
211
+ 'original_firstorder_Energy',
212
+ 'original_firstorder_Entropy',
213
+ 'original_firstorder_InterquartileRange',
214
+ 'original_firstorder_Kurtosis',
215
+ 'original_firstorder_Maximum',
216
+ 'original_firstorder_MeanAbsoluteDeviation',
217
+ 'original_firstorder_Mean',
218
+ 'original_firstorder_Median',
219
+ 'original_firstorder_Minimum',
220
+ 'original_firstorder_Range',
221
+ 'original_firstorder_RobustMeanAbsoluteDeviation',
222
+ 'original_firstorder_RootMeanSquared',
223
+ 'original_firstorder_Skewness',
224
+ 'original_firstorder_TotalEnergy',
225
+ 'original_firstorder_Uniformity',
226
+ 'original_firstorder_Variance',
227
+ 'original_glcm_Autocorrelation',
228
+ 'original_glcm_ClusterProminence',
229
+ 'original_glcm_ClusterShade',
230
+ 'original_glcm_ClusterTendency',
231
+ 'original_glcm_Contrast',
232
+ 'original_glcm_Correlation',
233
+ 'original_glcm_DifferenceAverage',
234
+ 'original_glcm_DifferenceEntropy',
235
+ 'original_glcm_DifferenceVariance',
236
+ 'original_glcm_Id',
237
+ 'original_glcm_Idm',
238
+ 'original_glcm_Idmn',
239
+ 'original_glcm_Idn',
240
+ 'original_glcm_Imc1',
241
+ 'original_glcm_Imc2',
242
+ 'original_glcm_InverseVariance',
243
+ 'original_glcm_JointAverage',
244
+ 'original_glcm_JointEnergy',
245
+ 'original_glcm_JointEntropy',
246
+ 'original_glcm_MCC',
247
+ 'original_glcm_MaximumProbability',
248
+ 'original_glcm_SumAverage',
249
+ 'original_glcm_SumEntropy',
250
+ 'original_glcm_SumSquares',
251
+ 'original_gldm_DependenceEntropy',
252
+ 'original_gldm_DependenceNonUniformity',
253
+ 'original_gldm_DependenceNonUniformityNormalized',
254
+ 'original_gldm_DependenceVariance',
255
+ 'original_gldm_GrayLevelNonUniformity',
256
+ 'original_gldm_GrayLevelVariance',
257
+ 'original_gldm_HighGrayLevelEmphasis',
258
+ 'original_gldm_LargeDependenceEmphasis',
259
+ 'original_gldm_LargeDependenceHighGrayLevelEmphasis',
260
+ 'original_gldm_LargeDependenceLowGrayLevelEmphasis',
261
+ 'original_gldm_LowGrayLevelEmphasis',
262
+ 'original_gldm_SmallDependenceEmphasis',
263
+ 'original_gldm_SmallDependenceHighGrayLevelEmphasis',
264
+ 'original_gldm_SmallDependenceLowGrayLevelEmphasis',
265
+ 'original_glrlm_GrayLevelNonUniformity',
266
+ 'original_glrlm_GrayLevelNonUniformityNormalized',
267
+ 'original_glrlm_GrayLevelVariance',
268
+ 'original_glrlm_HighGrayLevelRunEmphasis',
269
+ 'original_glrlm_LongRunEmphasis',
270
+ 'original_glrlm_LongRunHighGrayLevelEmphasis',
271
+ 'original_glrlm_LongRunLowGrayLevelEmphasis',
272
+ 'original_glrlm_LowGrayLevelRunEmphasis',
273
+ 'original_glrlm_RunEntropy',
274
+ 'original_glrlm_RunLengthNonUniformity',
275
+ 'original_glrlm_RunLengthNonUniformityNormalized',
276
+ 'original_glrlm_RunPercentage',
277
+ 'original_glrlm_RunVariance',
278
+ 'original_glrlm_ShortRunEmphasis',
279
+ 'original_glrlm_ShortRunHighGrayLevelEmphasis',
280
+ 'original_glrlm_ShortRunLowGrayLevelEmphasis',
281
+ 'original_glszm_GrayLevelNonUniformity',
282
+ 'original_glszm_GrayLevelNonUniformityNormalized',
283
+ 'original_glszm_GrayLevelVariance',
284
+ 'original_glszm_HighGrayLevelZoneEmphasis',
285
+ 'original_glszm_LargeAreaEmphasis',
286
+ 'original_glszm_LargeAreaHighGrayLevelEmphasis',
287
+ 'original_glszm_LargeAreaLowGrayLevelEmphasis',
288
+ 'original_glszm_LowGrayLevelZoneEmphasis',
289
+ 'original_glszm_SizeZoneNonUniformity',
290
+ 'original_glszm_SizeZoneNonUniformityNormalized',
291
+ 'original_glszm_SmallAreaEmphasis',
292
+ 'original_glszm_SmallAreaHighGrayLevelEmphasis',
293
+ 'original_glszm_SmallAreaLowGrayLevelEmphasis',
294
+ 'original_glszm_ZoneEntropy',
295
+ 'original_glszm_ZonePercentage',
296
+ 'original_glszm_ZoneVariance',
297
+ 'original_ngtdm_Busyness',
298
+ 'original_ngtdm_Coarseness',
299
+ 'original_ngtdm_Complexity',
300
+ 'original_ngtdm_Contrast',
301
+ 'original_ngtdm_Strength']
302
+
303
+ # In[12]:
304
+
305
+
306
+ df = pd.read_csv('final_dataset.csv')
307
+ df.shape
308
+
309
+
310
+ # In[13]:
311
+
312
+
313
+ X_train, X_test, y_train, y_test = train_test_split(
314
+ df.drop(labels=['Label'], axis=1),
315
+ df['Label'],
316
+ test_size=0.2,
317
+ random_state=23)
318
+
319
+ X_train.shape, X_test.shape
320
+
321
+
322
+ # In[14]:
323
+
324
+
325
+ from sklearn.preprocessing import StandardScaler
326
+ def scale_data(dataset):
327
+ scaler = StandardScaler()
328
+ scaled_data = scaler.fit_transform(dataset)
329
+ return scaled_data
330
+
331
+
332
+ # In[15]:
333
+
334
+
335
+ scaled_train_set = scale_data(X_train)
336
+
337
+ scaled_test_set = scale_data(X_test)
338
+
339
+
340
+ # In[16]:
341
+
342
+
343
+ RF = RandomForestClassifier(criterion = 'entropy',max_depth = None, max_features = 'log2', max_leaf_nodes = None,
344
+ min_samples_leaf = 1,min_samples_split = 4, min_weight_fraction_leaf = 0.0, n_estimators = 200)
345
+ RF.fit(X_train,y_train)
346
+
347
+
348
+ # In[17]:
349
+
350
+
351
+ import pickle
352
+ # create an iterator object with write permission - model.pkl
353
+ with open('model_pkl', 'wb') as files:
354
+ pickle.dump(RF, files)
355
+
356
+
357
+ # In[19]:
358
+
359
+
360
+ model = pickle.load(open('model_pkl', 'rb'))
361
+ model.score(X_test,y_test)
362
+
363
+ # In[23]:
364
+
365
+
366
+ # from sklearn.preprocessing import MinMaxScaler
367
+
368
+
369
+ # In[42]:
370
+
371
+
372
+ def pneumonia(image):
373
+ img_ = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
374
+ resized_img = cv2.resize(img_,(256,256))
375
+ original_image = 'original.jpeg'
376
+ cv2.imwrite(original_image,resized_img)
377
+ img = cv2.imread(original_image)
378
+ pr_mask1 = get_prediction (model1, img);
379
+ pr_mask2 = get_prediction (model2, img);
380
+ pr_mask3 = get_prediction (model3, img);
381
+ pr_mask4 = get_prediction (model4, img);
382
+ pr_mask5 = get_prediction (model5, img);
383
+
384
+ ensemble_mask = ensemble_results (pr_mask1, pr_mask2, pr_mask3, pr_mask4, pr_mask5)
385
+ ensemble_mask_post_HF = postprocessing_HoleFilling (ensemble_mask)
386
+ ensemble_mask_post_HF_EI = postprocessing_EliminatingIsolation (ensemble_mask_post_HF)
387
+
388
+ mask = 'mask.jpeg'
389
+ cv2.imwrite(mask,ensemble_mask_post_HF_EI*255)
390
+
391
+ features = {}
392
+ df = pd.DataFrame(columns=features_name)
393
+
394
+ image_ = sitk.ReadImage(original_image, sitk.sitkInt8)
395
+ mask = sitk.ReadImage(mask, sitk.sitkInt8)
396
+ features = extractor.execute(image_, mask)
397
+
398
+ df = df.append(features, ignore_index=True)
399
+ cols = df.columns[22:]
400
+
401
+ # Create new dataframe with selected columns
402
+ DataFrame = df[cols]
403
+
404
+ prediction = model.predict(DataFrame)
405
+
406
+ if prediction == 0: # Determine the predicted class
407
+ Label = "Normal"
408
+
409
+ elif prediction == 1:
410
+ Label = "Pneumonia"
411
+
412
+ return Label
413
+
414
+
415
+ # In[43]:
416
+
417
+
418
+ import gradio as gr
419
+ iface =gr.Interface(fn = pneumonia,
420
+ inputs = "image",
421
+ outputs = [gr.outputs.Textbox(label="Prediction")],
422
+ title = "Pnuemonia Detection from Chest X ray images",
423
+ description = "Upload a Chest X ray image")
424
+ iface.launch(share = True)
425
+
426
+
427
+
428
+
429
+
final_dataset.csv ADDED
The diff for this file is too large to render. See raw diff
 
models/model1.hdf5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1039d5955156bad2d9d894ee0089b19f7bac18a8b6afa3c56f17674f01850963
3
+ size 41041760
models/model2.hdf5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e0fbea3981ad9768d71cbb2f58904b0b473cf46daae13cce9249f2131816570e
3
+ size 41042192
models/model3.hdf5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:447660e5fe37b977d3aa3e5b71da502ec380503abae7a191fcf857ca2a1ae231
3
+ size 41042192
models/model4.hdf5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:653d22962c626453a173d2698fd20a5d040d81868e64e674059ea637e4eb59b0
3
+ size 301947928
models/model5.hdf5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a664aaeaeb9117053aaa894151d58eb9c093e962aaaf23b62a281abd629a2839
3
+ size 301947928