Spaces:
Running
Running
Upload 8 files
Browse files- .gitattributes +2 -0
- README.md +8 -7
- app.py +61 -0
- galaxy_classification.py +95 -0
- galaxy_cnn_model.pt +3 -0
- gitattributes +37 -0
- requirements.txt +8 -0
- test_dataset.hdf5 +3 -0
- train_dataset.hdf5 +3 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
test_dataset.hdf5 filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
train_dataset.hdf5 filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
|
@@ -1,13 +1,14 @@
|
|
| 1 |
---
|
| 2 |
-
title: Galaxy
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
-
sdk:
|
| 7 |
-
sdk_version:
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
-
|
|
|
|
| 11 |
---
|
| 12 |
|
| 13 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Galaxy Classifier
|
| 3 |
+
emoji: 🦀
|
| 4 |
+
colorFrom: pink
|
| 5 |
+
colorTo: red
|
| 6 |
+
sdk: streamlit
|
| 7 |
+
sdk_version: 1.42.1
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
+
short_description: Upload a galaxy image and get morphological class prediction
|
| 12 |
---
|
| 13 |
|
| 14 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
app.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import torch
|
| 3 |
+
import torchvision.transforms as transforms
|
| 4 |
+
from torchvision.transforms import ToTensor, Normalize, Compose
|
| 5 |
+
from PIL import Image
|
| 6 |
+
import numpy as np
|
| 7 |
+
from galaxy_classification import GalaxyCNN # Modelini import et
|
| 8 |
+
|
| 9 |
+
# Streamlit sayfa yapılandırması
|
| 10 |
+
st.set_page_config(
|
| 11 |
+
page_title="Galaxy Morphology Classification",
|
| 12 |
+
page_icon="✨",
|
| 13 |
+
layout="wide",
|
| 14 |
+
initial_sidebar_state="expanded",
|
| 15 |
+
)
|
| 16 |
+
|
| 17 |
+
# Modeli yükle
|
| 18 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 19 |
+
model = GalaxyCNN().to(device)
|
| 20 |
+
model.load_state_dict(torch.load("galaxy_cnn_model.pt", map_location=device))
|
| 21 |
+
model.eval()
|
| 22 |
+
|
| 23 |
+
# Görsel işleme fonksiyonu
|
| 24 |
+
def process_image(image):
|
| 25 |
+
transform = Compose([ToTensor(), Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) # 3 kanal için normalize
|
| 26 |
+
image = image.convert("RGB").resize((64, 64)) # Modelin beklediği boyutta olmalı
|
| 27 |
+
image = transform(image).unsqueeze(0).to(device) # Model için uygun forma getir
|
| 28 |
+
return image
|
| 29 |
+
|
| 30 |
+
# Başlık ve alt başlık
|
| 31 |
+
st.title("🔭 Galaxy Morphology Classifier")
|
| 32 |
+
st.subheader("Upload a galaxy image and predict its morphological class!")
|
| 33 |
+
|
| 34 |
+
# Açıklama
|
| 35 |
+
st.write("""
|
| 36 |
+
### How It Works
|
| 37 |
+
1. Upload a galaxy image.
|
| 38 |
+
2. Click the "Classify Image" button.
|
| 39 |
+
3. The model predicts the galaxy's morphological class.
|
| 40 |
+
""")
|
| 41 |
+
|
| 42 |
+
# Görsel yükleme alanı
|
| 43 |
+
uploaded_file = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"])
|
| 44 |
+
|
| 45 |
+
if uploaded_file:
|
| 46 |
+
image = Image.open(uploaded_file)
|
| 47 |
+
st.image(image, caption="Uploaded Image", use_column_width=True)
|
| 48 |
+
|
| 49 |
+
# Tahmin butonu
|
| 50 |
+
if st.button("🔎 Classify Image"):
|
| 51 |
+
# Görseli işle
|
| 52 |
+
processed_image = process_image(image)
|
| 53 |
+
|
| 54 |
+
# Model ile tahmin yap
|
| 55 |
+
with torch.no_grad():
|
| 56 |
+
output = model(processed_image)
|
| 57 |
+
predicted_class = torch.argmax(output, dim=1).item()
|
| 58 |
+
|
| 59 |
+
# Sınıf isimleri
|
| 60 |
+
class_names = ["Smooth Round", "Smooth Cigar", "Edge-on Disk", "Spiral"]
|
| 61 |
+
st.write(f"**Prediction:** {class_names[predicted_class]} 🎯")
|
galaxy_classification.py
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
import torch.nn as nn
|
| 3 |
+
import torch.optim as optim
|
| 4 |
+
from torch.utils.data import DataLoader, TensorDataset
|
| 5 |
+
from torchvision.transforms import Compose, ToTensor, Normalize
|
| 6 |
+
from sklearn.metrics import accuracy_score
|
| 7 |
+
import h5py
|
| 8 |
+
|
| 9 |
+
# Veriyi yüklemek için bir fonksiyon
|
| 10 |
+
def load_hdf5_dataset(path):
|
| 11 |
+
with h5py.File(path, "r") as f:
|
| 12 |
+
images = torch.tensor(f['images'][:]) # Görseller
|
| 13 |
+
labels = torch.tensor(f['labels'][:]) # Etiketler
|
| 14 |
+
return images, labels
|
| 15 |
+
|
| 16 |
+
# Verileri yükleme
|
| 17 |
+
train_images, train_labels = load_hdf5_dataset('train_dataset.hdf5')
|
| 18 |
+
test_images, test_labels = load_hdf5_dataset('test_dataset.hdf5')
|
| 19 |
+
|
| 20 |
+
# Normalize etmek ve tensöre dönüştürmek için dönüşümler
|
| 21 |
+
transform = Compose([ToTensor(), Normalize((0.5,), (0.5,))])
|
| 22 |
+
|
| 23 |
+
# Verileri normalize et ve TensorDataset oluştur
|
| 24 |
+
train_images = train_images.permute(0, 3, 1, 2) / 255.0 # Görüntüleri 0-1 aralığına getir
|
| 25 |
+
test_images = test_images.permute(0, 3, 1, 2) / 255.0
|
| 26 |
+
train_dataset = TensorDataset(train_images, train_labels)
|
| 27 |
+
test_dataset = TensorDataset(test_images, test_labels)
|
| 28 |
+
|
| 29 |
+
# CNN Modelini Tanımlama
|
| 30 |
+
class GalaxyCNN(nn.Module):
|
| 31 |
+
def __init__(self):
|
| 32 |
+
super(GalaxyCNN, self).__init__()
|
| 33 |
+
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
|
| 34 |
+
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
|
| 35 |
+
self.pool = nn.MaxPool2d(2, 2)
|
| 36 |
+
self.fc1 = nn.Linear(64 * 16 * 16, 128) # Fully connected layer
|
| 37 |
+
self.fc2 = nn.Linear(128, 4) # 4 sınıf (smooth_round, smooth_cigar, vb.)
|
| 38 |
+
self.relu = nn.ReLU()
|
| 39 |
+
self.dropout = nn.Dropout(0.25)
|
| 40 |
+
|
| 41 |
+
def forward(self, x):
|
| 42 |
+
x = self.pool(self.relu(self.conv1(x)))
|
| 43 |
+
x = self.pool(self.relu(self.conv2(x)))
|
| 44 |
+
x = x.view(-1, 64 * 16 * 16) # Flatten
|
| 45 |
+
x = self.dropout(self.relu(self.fc1(x)))
|
| 46 |
+
x = self.fc2(x)
|
| 47 |
+
return x
|
| 48 |
+
|
| 49 |
+
# DataLoader
|
| 50 |
+
batch_size = 32
|
| 51 |
+
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
|
| 52 |
+
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
|
| 53 |
+
|
| 54 |
+
# Model ve cihaz
|
| 55 |
+
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
| 56 |
+
model = GalaxyCNN().to(device)
|
| 57 |
+
|
| 58 |
+
# Kayıp fonksiyonu ve optimizasyon
|
| 59 |
+
criterion = nn.CrossEntropyLoss()
|
| 60 |
+
optimizer = optim.Adam(model.parameters(), lr=0.001)
|
| 61 |
+
|
| 62 |
+
# Eğitim
|
| 63 |
+
epochs = 10
|
| 64 |
+
for epoch in range(epochs):
|
| 65 |
+
model.train()
|
| 66 |
+
running_loss = 0.0
|
| 67 |
+
for images, labels in train_loader:
|
| 68 |
+
images, labels = images.to(device), labels.to(device)
|
| 69 |
+
optimizer.zero_grad()
|
| 70 |
+
outputs = model(images)
|
| 71 |
+
loss = criterion(outputs, labels)
|
| 72 |
+
loss.backward()
|
| 73 |
+
optimizer.step()
|
| 74 |
+
running_loss += loss.item()
|
| 75 |
+
|
| 76 |
+
avg_loss = running_loss / len(train_loader)
|
| 77 |
+
print(f"Epoch {epoch+1}/{epochs}, Loss: {avg_loss:.4f}")
|
| 78 |
+
|
| 79 |
+
# Test ve doğrulama
|
| 80 |
+
model.eval()
|
| 81 |
+
all_preds = []
|
| 82 |
+
all_labels = []
|
| 83 |
+
with torch.no_grad():
|
| 84 |
+
for images, labels in test_loader:
|
| 85 |
+
images, labels = images.to(device), labels.to(device)
|
| 86 |
+
outputs = model(images)
|
| 87 |
+
_, preds = torch.max(outputs, 1)
|
| 88 |
+
all_preds.extend(preds.cpu().numpy())
|
| 89 |
+
all_labels.extend(labels.cpu().numpy())
|
| 90 |
+
|
| 91 |
+
accuracy = accuracy_score(all_labels, all_preds)
|
| 92 |
+
print(f"Validation Accuracy: {accuracy * 100:.2f}%")
|
| 93 |
+
torch.save(model.state_dict(), "galaxy_cnn_model.pt")
|
| 94 |
+
print("Model kaydedildi: galaxy_cnn_model.pt")
|
| 95 |
+
|
galaxy_cnn_model.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d1b1cb8209c1516b54b5a4f5403ea7587de75d094c2a396750f316ab4f1e7fb8
|
| 3 |
+
size 8472044
|
gitattributes
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
test_dataset.hdf5 filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
train_dataset.hdf5 filter=lfs diff=lfs merge=lfs -text
|
requirements.txt
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
torch
|
| 2 |
+
torchvision
|
| 3 |
+
scikit-learn
|
| 4 |
+
streamlit==1.18.1
|
| 5 |
+
tensorflow==2.14.0
|
| 6 |
+
Pillow==10.0.0
|
| 7 |
+
numpy==1.24.3
|
| 8 |
+
h5py==3.8.0
|
test_dataset.hdf5
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:95d53ca3e9c8fbf45150b77527cd1180c43e2423da0ff2e0fb0012f986e35901
|
| 3 |
+
size 24580048
|
train_dataset.hdf5
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9e357f36269e4c2d056e3660b877f3f7dc8d17b1446906b1117124b55567a201
|
| 3 |
+
size 98314048
|