File size: 5,044 Bytes
a531cbc
 
 
 
 
900721d
a531cbc
 
 
900721d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a531cbc
 
900721d
a531cbc
 
 
0cb31d8
 
 
 
 
 
 
 
 
a531cbc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
900721d
a531cbc
 
 
 
900721d
a531cbc
 
900721d
a531cbc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
900721d
a531cbc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
900721d
 
a531cbc
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
from flask import Flask, request, jsonify, send_file
from flask_cors import CORS
from PIL import Image, ImageDraw
import io
import json
import os
import uuid
import google.generativeai as genai


generation_config = {
  "temperature": 1,
  "max_output_tokens": 8192,
}

safety_settings = [
  {
    "category": "HARM_CATEGORY_HARASSMENT",
    "threshold": "BLOCK_NONE"
  },
  {
    "category": "HARM_CATEGORY_HATE_SPEECH",
    "threshold": "BLOCK_NONE"
  },
  {
    "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
    "threshold": "BLOCK_NONE"
  },
  {
    "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
    "threshold": "BLOCK_NONE"
  },
]

GOOGLE_API_KEY = os.environ.get("TOKEN")


# Configuration de l'API Gemini
genai.configure(api_key=GOOGLE_API_KEY)  # Remplacez par votre clé API

app = Flask(__name__)
CORS(app)


@app.route('/', methods=['GET'])
def svt():
    """Renders the SVT page."""
    return render_template("svt.html")
    



# Prompt pour la détection d'objets
DETECTION_PROMPT = "Detect items, with no more than 20 items. Output a json list where each entry contains the 2D bounding box in \"box_2d\" and a text label in \"label\"."

# Prompt pour la description d'image satellite militaire
DESCRIPTION_PROMPT = """
Décrivez en détail cette image satellite militaire. Soyez précis et exhaustif dans votre analyse. 
Identifiez les éléments clés tels que :
- **Infrastructures** : Bâtiments, routes, ponts, aéroports, ports, etc.
- **Véhicules** : Chars, avions, navires, véhicules de transport de troupes, etc.
- **Unités militaires** : Formations de troupes, positions d'artillerie, camps, etc.
- **Défenses** : Bunkers, tranchées, barbelés, etc.
- **Éléments géographiques** : Relief, végétation, cours d'eau, etc.
- **Activités** : Mouvements de troupes, entraînements, constructions, etc.
- **Anomalies** : Tout ce qui semble inhabituel ou suspect.

Fournissez une évaluation globale de la situation et des implications stratégiques possibles.
"""

# Dossier pour enregistrer temporairement les images
UPLOAD_FOLDER = 'uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

@app.route('/analyze', methods=['POST'])
def analyze_image():
    try:
        if 'file' not in request.files:
            return jsonify({'error': 'No file part'}), 400

        file = request.files['file']
        if file.filename == '':
            return jsonify({'error': 'No selected file'}), 400

        if file:
            # Générer un nom de fichier unique pour éviter les conflits
            unique_filename = str(uuid.uuid4()) + os.path.splitext(file.filename)[1]
            filename = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename)
            file.save(filename)

            # 1. Détection d'objets avec Gemini
            model = genai.GenerativeModel("gemini-1.5-flash-exp",safety_settings=safety_settings,generation_config=generation_config)
            image_part = {
              "mime_type": "image/jpeg",  # Assurez-vous que cela corresponde au type de votre image
              "data": open(filename, "rb").read() # Le fichier est lu ici
            }
            response = model.generate_content([DETECTION_PROMPT, image_part])

            try:
                detection_results = json.loads(response.text)
            except json.JSONDecodeError:
                print(f"Erreur de décodage JSON : {response.text}")
                return jsonify({'error': 'Erreur lors de la détection des objets (JSON invalide)'}), 500

            # 2. Dessiner les boîtes englobantes
            image = Image.open(filename)
            draw = ImageDraw.Draw(image)

            for item in detection_results:
                box = item['box_2d']
                label = item['label']
                draw.rectangle(box, outline=(255, 0, 0), width=2)
                text_position = (box[0], box[1] - 10)
                draw.text(text_position, label, fill=(255, 255, 255))

            # Enregistrer l'image avec les boîtes
            output_filename = os.path.join(app.config['UPLOAD_FOLDER'], 'output_' + unique_filename)
            image.save(output_filename)

            # 3. Générer la description
            
            response = model.generate_content([DESCRIPTION_PROMPT, image_part])
            description = response.text

            # 4. Renvoyer les résultats
            return jsonify({
                'image_path': '/uploads/' + 'output_' + unique_filename, # Chemin relatif vers l'image
                'description': description,
                'detected_objects': detection_results
            })

    except Exception as e:
        print(f"Une erreur s'est produite : {e}")
        return jsonify({'error': f'Erreur lors du traitement de l\'image : {e}'}), 500

# Servir les fichiers statiques depuis le dossier 'uploads'
@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_file(os.path.join(app.config['UPLOAD_FOLDER'], filename))

if __name__ == '__main__':
    app.run(debug=True)