Spaces:
Sleeping
Sleeping
| # -*- coding: utf-8 -*- | |
| """демо.ipynb | |
| Automatically generated by Colab. | |
| Original file is located at | |
| https://colab.research.google.com/drive/1NK3gtM_1xpqJt79c_lDgu45FY4aMd3kr | |
| """ | |
| from huggingface_hub import hf_hub_download | |
| # Загрузка файла конфигурации и модели | |
| config_path = hf_hub_download(repo_id="alexakup05/eye_disease_classifier", filename="config.json") | |
| model_path = hf_hub_download(repo_id="alexakup05/eye_disease_classifier", filename="model1.pth") | |
| print(f"Модель и конфигурация загружены: {config_path}, {model_path}") | |
| import json | |
| # Загружаем конфигурацию | |
| with open(config_path, 'r') as f: | |
| config = json.load(f) | |
| print(config) # Проверим содержимое конфигурации | |
| import torch | |
| import torch.nn as nn | |
| from torchvision import models | |
| class EyeDiseaseEfficientNet(nn.Module): | |
| def __init__(self, config): | |
| super(EyeDiseaseEfficientNet, self).__init__() | |
| self.efficientnet = models.efficientnet_b4(pretrained=False) | |
| self.efficientnet.classifier = nn.Identity() | |
| self.fc_age_sex = nn.Sequential( | |
| nn.Linear(2, 64), | |
| nn.ReLU(), | |
| nn.Dropout(0.5) | |
| ) | |
| self.fc_combined = nn.Sequential( | |
| nn.Linear(1792 + 64, 512), | |
| nn.ReLU(), | |
| nn.Dropout(0.6), | |
| nn.Linear(512, 8) | |
| ) | |
| def forward(self, x_img, x_age_sex): | |
| x_img = self.efficientnet(x_img) | |
| x_age_sex = self.fc_age_sex(x_age_sex) | |
| x = torch.cat((x_img, x_age_sex), dim=1) | |
| x = self.fc_combined(x) | |
| return x | |
| model = EyeDiseaseEfficientNet(config) | |
| model.load_state_dict(torch.load(model_path, map_location=torch.device('cpu'))) | |
| device = torch.device("cpu") | |
| model = model.to(device) | |
| model.eval() | |
| input_image = torch.randn(1, 3, 224, 224).to(device) | |
| input_age_sex = torch.tensor([[45, 1]], dtype=torch.float32).to(device) | |
| with torch.no_grad(): | |
| output = model(input_image, input_age_sex) | |
| print(output) | |
| import torch.nn.functional as F | |
| logits = torch.tensor([[-2.6384, -1.8599, 0.0206, 2.0523, 0.2476, 1.9363, 1.5297, -1.0108]], device='cpu') | |
| probabilities = F.softmax(logits, dim=1) | |
| predicted_class = torch.argmax(probabilities, dim=1) | |
| print(f"Предсказанный класс: {predicted_class.item()}") | |
| import gradio as gr | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image | |
| def detect_eye(img): | |
| eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml') | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| eyes = eye_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) | |
| if len(eyes) > 0: | |
| (x, y, w, h) = eyes[0] | |
| img = img[y:y+h, x:x+w] | |
| return img | |
| def preprocess_image(img): | |
| img = cv2.medianBlur(img, 3) | |
| lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) | |
| l, a, b = cv2.split(lab) | |
| clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) | |
| l = clahe.apply(l) | |
| lab = cv2.merge((l, a, b)) | |
| img = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR) | |
| return img | |
| def resize_with_padding(img, target_size=(224, 224)): | |
| h, w = img.shape[:2] | |
| scale = min(target_size[0] / h, target_size[1] / w) | |
| new_w, new_h = int(w * scale), int(h * scale) | |
| resized_img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_AREA) | |
| pad_w = (target_size[1] - new_w) // 2 | |
| pad_h = (target_size[0] - new_h) // 2 | |
| padded_img = cv2.copyMakeBorder( | |
| resized_img, pad_h, target_size[0] - new_h - pad_h, pad_w, target_size[1] - new_w - pad_w, | |
| cv2.BORDER_CONSTANT, value=[0, 0, 0] | |
| ) | |
| return padded_img | |
| def predict(age, sex, img): | |
| img = detect_eye(img) | |
| img = preprocess_image(img) | |
| img = resize_with_padding(img) | |
| img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
| img = Image.fromarray(img) | |
| img_tensor = torch.tensor(np.array(img)).permute(2, 0, 1).unsqueeze(0).float() | |
| age_sex_tensor = torch.tensor([[age, 0 if sex == "Male" else 1]]).float() | |
| with torch.no_grad(): | |
| outputs = model(img_tensor, age_sex_tensor) | |
| probabilities = torch.softmax(outputs, dim=1).cpu().numpy()[0] | |
| disease_labels = [ | |
| "Normal", | |
| "Diabetic Retinopathy", | |
| "Glaucoma", | |
| "Cataract", | |
| "Age-related Macular Degeneration", | |
| "Hypertension", | |
| "Pathological Myopia", | |
| "Other Diseases/Abnormalities" | |
| ] | |
| result = {disease_labels[i]: f"{probabilities[i]*100:.2f}%" for i in range(len(disease_labels))} | |
| return result, img | |
| examples = [ | |
| [30, "Male", "myopia.png"] | |
| ] | |
| iface = gr.Interface( | |
| fn=predict, | |
| inputs=[ | |
| gr.Slider(minimum=0, maximum=100, step=1, label="Age"), | |
| gr.Radio(["Male", "Female"], label="Gener"), | |
| gr.Image(type="numpy", label="Upload Eye Image/ your Selfies / photo") | |
| ], | |
| outputs=[gr.JSON(label="Predictions"), gr.Image(label="Processed Image")], | |
| examples=examples | |
| ) | |
| iface.launch() | |