update file
Browse files- Dockerfile +9 -6
- app.py → api.py +24 -20
Dockerfile
CHANGED
@@ -1,15 +1,18 @@
|
|
1 |
-
#
|
2 |
-
FROM python:3.
|
3 |
|
4 |
# Çalışma dizinini oluştur
|
5 |
WORKDIR /app
|
6 |
|
7 |
-
#
|
8 |
COPY requirements.txt requirements.txt
|
9 |
RUN pip install --no-cache-dir -r requirements.txt
|
10 |
|
11 |
-
# Uygulama
|
12 |
COPY . .
|
13 |
|
14 |
-
#
|
15 |
-
|
|
|
|
|
|
|
|
1 |
+
# Resmi Python görüntüsünü kullanıyoruz, versiyon 3.9
|
2 |
+
FROM python:3.9-slim
|
3 |
|
4 |
# Çalışma dizinini oluştur
|
5 |
WORKDIR /app
|
6 |
|
7 |
+
# Gereksinimler dosyasını kopyala ve gerekli paketleri yükle
|
8 |
COPY requirements.txt requirements.txt
|
9 |
RUN pip install --no-cache-dir -r requirements.txt
|
10 |
|
11 |
+
# Uygulama dosyasını kopyala
|
12 |
COPY . .
|
13 |
|
14 |
+
# Model dosyasını kopyala (Eğer model dosyası bu dizinde ise)
|
15 |
+
# COPY path/to/CLAHE_ODIR-ORJ-512_inception_v3.h5 .
|
16 |
+
|
17 |
+
# Uygulama başlatma komutu
|
18 |
+
CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "7860"]
|
app.py → api.py
RENAMED
@@ -1,14 +1,12 @@
|
|
1 |
from fastapi import FastAPI, File, UploadFile
|
2 |
-
from fastapi.responses import JSONResponse
|
3 |
-
import tensorflow as tf
|
4 |
import numpy as np
|
5 |
-
from PIL import Image
|
6 |
from io import BytesIO
|
7 |
-
import
|
|
|
8 |
|
9 |
app = FastAPI()
|
10 |
|
11 |
-
# Model yükleniyor
|
12 |
MODEL = tf.keras.models.load_model("CLAHE_ODIR-ORJ-512_inception_v3.h5")
|
13 |
|
14 |
# Sınıf isimleri
|
@@ -17,29 +15,35 @@ class_names = [
|
|
17 |
'Hypertension', 'Normal', 'Others', 'Pathological Myopia'
|
18 |
]
|
19 |
|
20 |
-
|
21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
image = tf.image.resize(image, (229, 229))
|
|
|
23 |
image = tf.cast(image, tf.float32) / 255.0
|
|
|
24 |
img_batch = np.expand_dims(image, 0)
|
|
|
|
|
25 |
predictions = MODEL.predict(img_batch)
|
26 |
predicted_class = class_names[np.argmax(predictions[0])]
|
27 |
confidence = np.max(predictions[0])
|
28 |
-
return predicted_class, confidence
|
29 |
|
30 |
-
@app.post("/predict")
|
31 |
-
async def predict_api(file: UploadFile = File(...)):
|
32 |
-
image_data = await file.read()
|
33 |
-
try:
|
34 |
-
image = Image.open(BytesIO(image_data))
|
35 |
-
except IOError:
|
36 |
-
return JSONResponse(content={"error": "Invalid image format"}, status_code=400)
|
37 |
-
|
38 |
-
predicted_class, confidence = predict(image)
|
39 |
return {
|
40 |
'class': predicted_class,
|
41 |
'confidence': float(confidence)
|
42 |
}
|
43 |
-
|
44 |
-
if __name__ == "__main__":
|
45 |
-
uvicorn.run(app, host="0.0.0.0", port=8000)
|
|
|
1 |
from fastapi import FastAPI, File, UploadFile
|
|
|
|
|
2 |
import numpy as np
|
|
|
3 |
from io import BytesIO
|
4 |
+
from PIL import Image
|
5 |
+
import tensorflow as tf
|
6 |
|
7 |
app = FastAPI()
|
8 |
|
9 |
+
# Model yükleniyor, yüklenen modelin yolunu kontrol ediniz.
|
10 |
MODEL = tf.keras.models.load_model("CLAHE_ODIR-ORJ-512_inception_v3.h5")
|
11 |
|
12 |
# Sınıf isimleri
|
|
|
15 |
'Hypertension', 'Normal', 'Others', 'Pathological Myopia'
|
16 |
]
|
17 |
|
18 |
+
@app.get("/ping")
|
19 |
+
async def ping():
|
20 |
+
return "Hello, I am alive"
|
21 |
+
|
22 |
+
def read_file_as_image(data) -> np.ndarray:
|
23 |
+
image = np.array(Image.open(BytesIO(data)))
|
24 |
+
return image
|
25 |
+
|
26 |
+
@app.post("/predict")
|
27 |
+
async def predict(file: UploadFile = File(...)):
|
28 |
+
image_data = await file.read()
|
29 |
+
try:
|
30 |
+
image = read_file_as_image(image_data)
|
31 |
+
except IOError:
|
32 |
+
return {"error": "Invalid image format"}
|
33 |
+
|
34 |
+
# Görüntüyü modelin beklediği boyuta getirme
|
35 |
image = tf.image.resize(image, (229, 229))
|
36 |
+
# Görüntüyü normalize etme
|
37 |
image = tf.cast(image, tf.float32) / 255.0
|
38 |
+
# Batch haline getirme
|
39 |
img_batch = np.expand_dims(image, 0)
|
40 |
+
|
41 |
+
# Model üzerinde tahmin yapma
|
42 |
predictions = MODEL.predict(img_batch)
|
43 |
predicted_class = class_names[np.argmax(predictions[0])]
|
44 |
confidence = np.max(predictions[0])
|
|
|
45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
return {
|
47 |
'class': predicted_class,
|
48 |
'confidence': float(confidence)
|
49 |
}
|
|
|
|
|
|