Ai-Api / utils.py
FadySamy's picture
Update utils.py
ac88366 verified
Raw
History Blame Contribute Delete
5.14 kB
# Import Libraries
import requests
import os
from fastapi import HTTPException
from IPython.display import display
import tensorflow
import numpy as np
from numpy.linalg import norm
from tensorflow.keras.preprocessing import image
from tensorflow.keras.layers import GlobalMaxPooling2D
from tensorflow.keras.applications.efficientnet_v2 import preprocess_input as EFpreprocess_input
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
from PIL import Image
import numpy as np
import io
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import img_to_array
import cv2
import pandas as pd
import tensorflow as tf
from numpy.linalg import norm
from tensorflow.keras.preprocessing import image
from tensorflow.keras.layers import GlobalMaxPooling2D
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input as REpreprocess_input
from sklearn.neighbors import NearestNeighbors
import pickle
from keras.models import load_model
loaded_model = load_model("weights-improvement-11-0.98.keras")
# Load The model ResNet50
model = ResNet50(weights='imagenet',include_top=False,input_shape=(224,224,3))
model.trainable = False
model = tensorflow.keras.Sequential([
model,
GlobalMaxPooling2D()
])
# تحميل بيانات الصور من ملفات pickle
image_feature_list = pickle.load(open('embeddings.pkl', 'rb'))
image_ids = pickle.load(open('filenames.pkl', 'rb'))
# حجم الصورة المتوقع من الموديل
img_size = (224, 224)
# الأورام الحميدة (Benign)
benign_tumors = [
"Astrocitoma", # بعض الأنواع حميدة
"Ganglioglioma",
"Granuloma",
"Meningioma",
"Neurocitoma",
"Papiloma",
"Schwannoma",
"Tuberculoma",
]
# الأورام الخبيثة (Malignant)
malignant_tumors = [
"Carcinoma",
"Ependimoma",
"Germinoma",
"Glioblastoma",
"Meduloblastoma",
"Oligodendroglioma"
]
class_names = ['Astrocitoma', 'Carcinoma', 'Ependimoma', 'Ganglioglioma', 'Germinoma', 'Glioblastoma', 'Granuloma', 'Meduloblastoma', 'Meningioma', 'Neurocitoma', 'Oligodendroglioma', 'Papiloma', 'Schwannoma', 'Tuberculoma', '_NORMAL']
# دالة لتحويل الصورة إلى مصفوفة بعد تطبيق الـ preprocessing
def preprocess_image(file_bytes: bytes) -> np.ndarray:
"""تحويل الصورة إلى مصفوفة بعد تطبيق preprocessing الخاص بـ EfficientNetV2"""
image = Image.open(io.BytesIO(file_bytes)).convert("RGB")
image = image.resize(img_size)
image_array = img_to_array(image)
image_array = np.expand_dims(image_array, axis=0) # إضافة البعد الخاص بالـ batch
image_array = EFpreprocess_input(image_array) # تطبيق الـ preprocessing
return image_array
# دالة للتنبؤ بالمرض
def predict_disease(image_array: np.ndarray) -> dict:
"""تنبؤ بالمرض والـ confidence"""
predictions = loaded_model.predict(image_array)
predicted_class = np.argmax(predictions[0])
label = class_names[predicted_class]
if label in benign_tumors:
predicted_type = "Benign tumor"
elif label in malignant_tumors:
predicted_type = "Malignant tumor"
else:
predicted_type = "Normal"
confidence = float(np.max(predictions[0]))
return {
"prediction": class_names[predicted_class],
"predicted_type": predicted_type,
"confidence": round(confidence * 100, 2)
}
def extract_features(img_array):
preprocessed_img = REpreprocess_input(img_array)
result = model.predict(preprocessed_img).flatten()
normalized_result = result / norm(result)
return normalized_result
from sklearn.neighbors import NearestNeighbors
def check_similar_image(image_array, threshold=0.55):
"""التحقق من الصور المتشابهة باستخدام NearestNeighbors والتشابه بين الصور."""
# استخراج الميزات من الصورة المدخلة
features = extract_features(image_array) # استخراج ميزات الصورة
# استخدام NearestNeighbors للبحث عن أقرب الجيران
knn = NearestNeighbors(n_neighbors=1, metric='euclidean')
knn.fit(image_feature_list) # تدريب النموذج باستخدام الميزات المخزنة
# العثور على أقرب صورة بناءً على المسافة
distances, indices = knn.kneighbors([features])
# الحصول على المسافة إلى الصورة الأقرب
distance = distances[0][0]
# حساب درجة التشابه بناءً على المسافة
similarity = 1 / (1 + distance) # تحويل المسافة إلى درجة تشابه (أعلى يعني تشابه أعلى)
# التحقق إذا كانت الصورة مشابهة بناءً على العتبة
if similarity >= threshold:
return {"similarity_score": similarity, "is_similar": True}
else:
return {"similarity_score": similarity, "is_similar": False}