import pandas as pd from sklearn.model_selection import StratifiedKFold import os import glob import numpy as np import random from PIL import Image import matplotlib.pyplot as plt import seaborn as sns import sys import cv2 import tensorflow as tf sys.path.append('./') from utils.train_config import config from utils.datagenerator import _denorm from utils.datagenerator import get_tf_test_data from utils.datagenerator import plot_batch_samples,view_image, debug_batch, get_eyeball_set_from_tf_data from utils.tfexplain_utils import get_tfexplain_callbacks, get_post_gradcam_heatmap, get_peak_location import utils.vis as vis_utl from utils.tfexplain_utils import get_thresholded_img_contours # preprocessing function pre_func = tf.keras.applications.efficientnet.preprocess_input IMG_WIDTH = config.MODEL.win IMG_HEIGHT = config.MODEL.hin img_shape = (IMG_HEIGHT, IMG_WIDTH, 3) def load_model(model_path): new_model = tf.keras.models.load_model(model_path) return new_model def get_feature_extractor_model(keras_model): feature_extractor = tf.keras.Model(keras_model.inputs,keras_model.layers[-3].output) return feature_extractor def open_gray(fn): img = cv2.cvtColor(cv2.imread(fn), cv2.COLOR_BGR2GRAY) img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) return img def read_image_3_channel_v2(path): img = open_gray(path) img = cv2.resize(img, (IMG_WIDTH, IMG_HEIGHT), cv2.INTER_LINEAR) # img = img/255. # Apply model-specific preprocessing function img = pre_func(img).astype(float) return img def get_predictions_and_roi(tmp_path, new_model): LABELS = ['CNV', 'DRUSEN', 'DME', 'NORMAL'] img3 = read_image_3_channel_v2(tmp_path) # pre_procc_img_2 = read_image_3_channel_v2(row['path']) pre_procc_img_2 = np.expand_dims(img3,axis=0) class_prob = new_model.predict(pre_procc_img_2) pred_lbl = LABELS[np.argmax(class_prob)] cls_index = np.argmax(class_prob) heat_map = get_post_gradcam_heatmap(new_model,img3,class_index=cls_index) # get thresholded and bounding boox clos_img,cv2_bbox = get_thresholded_img_contours(heat_map) # tmp_img = _denorm(tmp_img, np.min(tmp_img), np.max(tmp_img)) tmp_img = open_gray(tmp_path) tmp_img = cv2.resize(tmp_img, (IMG_WIDTH, IMG_HEIGHT), cv2.INTER_LINEAR) #merge map and frame tmp_img = cv2.addWeighted(heat_map.astype(float), 0.4, tmp_img.astype(float), 1, 0) tmp_img = vis_utl.draw_bbox(tmp_img,[cv2_bbox[0],cv2_bbox[1],cv2_bbox[0]+cv2_bbox[2],cv2_bbox[1]+cv2_bbox[3]]) return _denorm(tmp_img, np.min(tmp_img), np.max(tmp_img)), class_prob def get_feature_vector(tmp_path, feature_extractor): img3 = read_image_3_channel_v2(tmp_path) pre_procc_img_2 = np.expand_dims(img3,axis=0) # new_model = tf.keras.Model(new_model.inputs, new_model.layers[-3].output) feature = feature_extractor.predict(pre_procc_img_2) emb = feature.astype(np.float16) return emb # LABELS = ['CNV', 'DRUSEN', 'DME', 'NORMAL'] # img3 = read_image_3_channel_v2(tmp_path.replace("F:/","E:/")) # heat_map = get_post_gradcam_heatmap(new_model,img3,class_index=0) # # pre_procc_img_2 = read_image_3_channel_v2(row['path']) # pre_procc_img_2 = np.expand_dims(img3,axis=0) # class_prob = new_model.predict(pre_procc_img_2) # print("done") # # new_model = tf.keras.Model(new_model.inputs, new_model.layers[-3].output) # feature = feature_extractor.predict(pre_procc_img_2) # print(feature.astype(np.float16).shape) # pred_prob_max = np.max(class_prob) # pred_lbl = LABELS[np.argmax(class_prob)] # print(np.argmax(class_prob)) # print(pred_lbl) # # get thresholded and bounding boox # clos_img,cv2_bbox = get_thresholded_img_contours(heat_map) # # tmp_img = _denorm(tmp_img, np.min(tmp_img), np.max(tmp_img)) # tmp_img = open_gray(tmp_path.replace("F:/","E:/")) # tmp_img = cv2.resize(tmp_img, (IMG_WIDTH, IMG_HEIGHT), cv2.INTER_LINEAR) # #merge map and frame # tmp_img = cv2.addWeighted(heat_map.astype(float), 0.4, tmp_img.astype(float), 1, 0) # tmp_img = vis_utl.draw_bbox(tmp_img,[cv2_bbox[0],cv2_bbox[1],cv2_bbox[0]+cv2_bbox[2],cv2_bbox[1]+cv2_bbox[3]])