CarolineM5 commited on
Commit
38ecdbd
·
verified ·
1 Parent(s): f73dcf6

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +111 -0
  2. requirements.txt +4 -0
app.py ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Created on Tue Jun 10 11:16:28 2025
4
+
5
+ @author: camaac
6
+ """
7
+
8
+ import gradio as gr
9
+ from PIL import Image
10
+ import torch
11
+ import torchvision.transforms as T
12
+
13
+ # --- 1) IMPORTER VOTRE CODE D'INFERENCE ---
14
+ # Par exemple, si vous avez un fichier inference.py qui définit une fonction `infer_wood(fibers_map, rings_map)`
15
+ # vous pouvez faire :
16
+ #
17
+ # from inference import infer_wood
18
+ #
19
+ # Et vous assurez que `infer_wood` prend en entrée deux objets PIL.Image
20
+ # (cartographie fibres et cartographie cernes) et renvoie une PIL.Image résultat.
21
+ #
22
+ # Si vous n'avez pas encore ce fichier, créez une fonction de type :
23
+
24
+ # def infer_wood(fibers_img: Image.Image, rings_img: Image.Image) -> Image.Image:
25
+ # """
26
+ # Exemple de squelette de fonction d'inférence.
27
+ # -> Remplacez tout ce qui est à l'intérieur par votre propre pipeline (prétraitement, appel du modèle, post-traitement).
28
+ # """
29
+ # # --- Pré-traitement (adapté à votre modèle) ---
30
+ # # Par exemple :
31
+ # preprocess = T.Compose([
32
+ # T.Resize((256, 256)),
33
+ # T.ToTensor(),
34
+ # # T.Normalize(mean=[...], std=[...]) # si votre modèle a été entraîné avec normalisation
35
+ # ])
36
+ # x1 = preprocess(fibers_img).unsqueeze(0).to(torch.device('cuda' if torch.cuda.is_available() else 'cpu'))
37
+ # x2 = preprocess(rings_img).unsqueeze(0).to(torch.device('cuda' if torch.cuda.is_available() else 'cpu'))
38
+
39
+ # # --- Chargement / usage du modèle (ici, c'est un exemple générique) ---
40
+ # # Imaginons que vous aviez déjà chargé votre modèle quelque part globalement :
41
+ # # device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
42
+ # # model = VotreModeleWood().to(device)
43
+ # # model.load_state_dict(torch.load('chemin/vers/votre_modele.pth', map_location=device))
44
+ # # model.eval()
45
+ # #
46
+ # # Ici, on concatène les deux cartes pour former l’entrée (adaptez selon votre archi).
47
+
48
+ # input_tensor = torch.cat([x1, x2], dim=1) # par exemple (1, C1+C2, H, W)
49
+
50
+ # with torch.no_grad():
51
+ # pred_tensor = model(input_tensor) # suppose que `model` est déjà défini globalement et chargé
52
+
53
+ # # --- Post-traitement pour revenir à PIL.Image ---
54
+ # postprocess = T.ToPILImage()
55
+ # output_img = postprocess(pred_tensor.squeeze(0).cpu().clamp(0, 1))
56
+ # return output_img
57
+
58
+ def infer_wood(fibers_img: Image.Image, rings_img: Image.Image):
59
+ return rings_img
60
+
61
+
62
+ # --- 2) CHARGEMENT GLOBAL DU MODÈLE (optionnel) ---
63
+ # Vous pouvez charger votre modèle une seule fois, ici, en dehors de la fonction infer_wood,
64
+ # afin que Gradio ne fasse pas recharger à chaque appel. Par exemple :
65
+
66
+ device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
67
+
68
+ # Exemple :
69
+ # from models.votre_modele import VotreModeleWood
70
+ # model = VotreModeleWood().to(device)
71
+ # model.load_state_dict(torch.load('models/chemin_du_modele.pth', map_location=device))
72
+ # model.eval()
73
+
74
+
75
+ # --- 3) FONCTION GRADIO D’INTERFACE ---
76
+ def gradio_generate(fibers_map: Image.Image, rings_map: Image.Image) -> Image.Image:
77
+ """
78
+ Cette fonction sera appelée à chaque upload par Gradio.
79
+ Elle doit retourner une PIL.Image (ou un chemin vers l’image enregistrée).
80
+ """
81
+ # Vérifier que les deux images sont bien en mode RGB (ou adapter si besoin)
82
+ fibers_map = fibers_map.convert("RGB")
83
+ rings_map = rings_map.convert("RGB")
84
+ # Appel de votre code d'inférence
85
+ result_img = infer_wood(fibers_map, rings_map)
86
+ return result_img
87
+
88
+
89
+ # --- 4) DÉFINITION DE L’INTERFACE GRADIO ---
90
+ iface = gr.Interface(
91
+ fn=gradio_generate,
92
+ inputs=[
93
+ gr.inputs.Image(type="pil", label="Cartographie d’orientation des fibres"),
94
+ gr.inputs.Image(type="pil", label="Cartographie des limites de cernes")
95
+ ],
96
+ outputs=gr.outputs.Image(type="pil", label="Bois photoréalistique généré"),
97
+ title="Générateur de bois photoréalistique",
98
+ description="""
99
+ Téléchargez :
100
+ 1) une image de cartographie d’orientation des fibres,
101
+ 2) une image de cartographie des limites de cernes.
102
+
103
+ Le modèle renvoie un rendu photoréalistique de bois que vous pouvez ensuite télécharger.
104
+ """
105
+ )
106
+
107
+ # --- 5) LANCER L’APPLICATION ---
108
+ if __name__ == "__main__":
109
+ # Vous pouvez préciser `server_name="0.0.0.0"` si vous souhaitez qu’il soit accessible sur le réseau
110
+ # et `server_port=7860` (ou autre port) si vous voulez le personnaliser.
111
+ iface.launch(server_name="0.0.0.0", server_port=7860, share=False)
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio==3.x
2
+ torch
3
+ torchvision
4
+ pillow