Mohamed IBN KHEDHER commited on
Commit
5e34732
·
1 Parent(s): eca1ad5

Add application file

Browse files
Files changed (3) hide show
  1. Dockerfile +19 -0
  2. app/main.py +54 -0
  3. requirements.txt +5 -0
Dockerfile ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Utiliser une image Python officielle comme base
2
+ FROM python:3.9-slim
3
+
4
+ # Définir le dossier de travail dans le conteneur
5
+ WORKDIR /code
6
+
7
+ # Copier le fichier des dépendances et les installer
8
+ COPY ./requirements.txt /code/requirements.txt
9
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
10
+
11
+ # Copier le code de notre application dans le conteneur
12
+ COPY ./app /code/app
13
+
14
+ # Exposer le port sur lequel l'application va tourner
15
+ EXPOSE 8000
16
+
17
+ # Commande pour lancer l'application quand le conteneur démarre
18
+ # Uvicorn est un serveur pour les applications FastAPI
19
+ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
app/main.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app/main.py
2
+
3
+ from fastapi import FastAPI, File, UploadFile
4
+ from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2, preprocess_input, decode_predictions
5
+ from tensorflow.keras.preprocessing import image
6
+ import numpy as np
7
+ import io
8
+
9
+ # 1. Initialiser l'application FastAPI
10
+ app = FastAPI(title="API de classification d'images", description="Une API simple pour classifier des images avec MobileNetV2.")
11
+
12
+ # 2. Charger le modèle de Deep Learning (il sera téléchargé la première fois)
13
+ model = MobileNetV2(weights='imagenet')
14
+
15
+ # 3. Fonction pour traiter l'image et faire la prédiction
16
+ def predict(image_data):
17
+ # Charger l'image depuis les données reçues
18
+ img = image.load_img(io.BytesIO(image_data), target_size=(224, 224))
19
+
20
+ # Convertir l'image en tableau NumPy
21
+ img_array = image.img_to_array(img)
22
+
23
+ # Ajouter une dimension pour correspondre à l'entrée du modèle (batch)
24
+ img_array_expanded = np.expand_dims(img_array, axis=0)
25
+
26
+ # Prétraiter l'image pour le modèle MobileNetV2
27
+ preprocessed_img = preprocess_input(img_array_expanded)
28
+
29
+ # Faire la prédiction
30
+ predictions = model.predict(preprocessed_img)
31
+
32
+ # Décoder les prédictions en labels lisibles (ex: 'chat', 'chien')
33
+ decoded_predictions = decode_predictions(predictions, top=3)[0]
34
+
35
+ # Formatter le résultat
36
+ result = [{"label": label, "probability": float(prob)} for (id, label, prob) in decoded_predictions]
37
+
38
+ return result
39
+
40
+ # 4. Définir le "endpoint" de l'API
41
+ @app.post("/predict/")
42
+ async def create_upload_file(file: UploadFile = File(...)):
43
+ # Lire le contenu du fichier envoyé
44
+ image_data = await file.read()
45
+
46
+ # Obtenir les prédictions
47
+ prediction_result = predict(image_data)
48
+
49
+ return {"filename": file.filename, "predictions": prediction_result}
50
+
51
+ # Un endpoint simple pour vérifier que l'API fonctionne
52
+ @app.get("/")
53
+ def read_root():
54
+ return {"message": "Bienvenue ! Envoyez une image à l'endpoint /predict/"}
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ tensorflow
4
+ numpy
5
+ Pillow