|
a |
|
b/src/inference.py |
|
|
1 |
import os |
|
|
2 |
import sys |
|
|
3 |
import argparse |
|
|
4 |
import tensorflow as tf |
|
|
5 |
from tensorflow import keras |
|
|
6 |
import pandas as pd |
|
|
7 |
from data_loader import read_trainset, DataGenerator |
|
|
8 |
import parse_config |
|
|
9 |
|
|
|
10 |
|
|
|
11 |
# comment out if using tensorflow 2.x |
|
|
12 |
if parse_config.USING_RTX_20XX: |
|
|
13 |
config = tf.ConfigProto() |
|
|
14 |
config.gpu_options.allow_growth = True |
|
|
15 |
tf.keras.backend.set_session(tf.Session(config=config)) |
|
|
16 |
|
|
|
17 |
parser = argparse.ArgumentParser(description='Intracranial Hemorrhage Stage 2 Inference Script', |
|
|
18 |
formatter_class=argparse.ArgumentDefaultsHelpFormatter) |
|
|
19 |
parser.add_argument('--model_filename', type=str) |
|
|
20 |
args = parser.parse_args() |
|
|
21 |
MODEL_NAME = '../models/' + args.model_filename |
|
|
22 |
img_size = (256,256,3) |
|
|
23 |
batch_size=16 #must be evenly divisiable by number of images in data gen. |
|
|
24 |
|
|
|
25 |
# Define paths |
|
|
26 |
test_images_dir = '../../data/stage_2_test_images/' |
|
|
27 |
testset_filename = "../submissions/stage_2_sample_submission.csv" |
|
|
28 |
|
|
|
29 |
def read_testset(filename): |
|
|
30 |
""" Read the submission sample csv |
|
|
31 |
Args: |
|
|
32 |
filename (str): Filename of the sample submission |
|
|
33 |
Returns: |
|
|
34 |
df (panda dataframe): Return a dataframe for inference. |
|
|
35 |
|
|
|
36 |
""" |
|
|
37 |
df = pd.read_csv(filename) |
|
|
38 |
df["Image"] = df["ID"].str.slice(stop=12) |
|
|
39 |
df["Diagnosis"] = df["ID"].str.slice(start=13) |
|
|
40 |
|
|
|
41 |
df = df.loc[:, ["Label", "Diagnosis", "Image"]] |
|
|
42 |
df = df.set_index(['Image', 'Diagnosis']).unstack(level=-1) |
|
|
43 |
|
|
|
44 |
return df |
|
|
45 |
|
|
|
46 |
def create_submission(model, data, test_df): |
|
|
47 |
|
|
|
48 |
print('+'*50) |
|
|
49 |
print("Creating predictions on test dataset") |
|
|
50 |
pred = model.predict_generator(data, verbose=1) |
|
|
51 |
out_df = pd.DataFrame(pred, index=test_df.index, columns=test_df.columns) |
|
|
52 |
test_df = out_df.stack().reset_index() |
|
|
53 |
test_df.insert(loc=0, column='ID', value=test_df['Image'].astype(str) + "_" + test_df['Diagnosis']) |
|
|
54 |
test_df = test_df.drop(["Image", "Diagnosis"], axis=1) |
|
|
55 |
print("Saving submissions to submission.csv") |
|
|
56 |
test_df.to_csv('../submissions/stage2-final-submission-v2.csv', index=False) |
|
|
57 |
|
|
|
58 |
return test_df |
|
|
59 |
|
|
|
60 |
def main(): |
|
|
61 |
test_df = read_testset(testset_filename) |
|
|
62 |
test_generator = DataGenerator(list_IDs = test_df.index, |
|
|
63 |
batch_size = batch_size, |
|
|
64 |
img_size = img_size, |
|
|
65 |
img_dir = test_images_dir) |
|
|
66 |
best_model = keras.models.load_model(MODEL_NAME, compile=False) |
|
|
67 |
create_submission(best_model, test_generator, test_df) |
|
|
68 |
|
|
|
69 |
|
|
|
70 |
if __name__ == "__main__": |
|
|
71 |
main() |