File size: 2,309 Bytes
58a226a
285b774
 
 
 
 
 
 
 
 
58a226a
bd0320b
58a226a
 
61a66af
 
58a226a
bd0320b
58a226a
61a66af
8c9f732
bd0320b
58a226a
 
bd0320b
51016cb
e8c243a
bd0320b
 
 
 
 
 
 
 
58a226a
 
 
bd0320b
58a226a
 
 
 
 
 
4f5a1cf
 
 
f5ae429
58a226a
bd0320b
 
4f5a1cf
 
 
 
bd0320b
4f5a1cf
 
58a226a
bd0320b
58a226a
 
 
bd0320b
58a226a
61a66af
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
# docker build -t reward-simulator .docker run -p 7860:7860 -v $(pwd)/data:/app/data reward-simulator
# **Flask** : micro-framework pour créer des applications web en Python.
# **request** : pour accéder aux données envoyées par le client (par exemple, des fichiers ou des données de formulaire).
# **jsonify** : pour retourner des réponses JSON bien formatées.
# **render_template** : pour générer des pages HTML à partir de fichiers de template (généralement `.html`).
# **send_from_directory** : pour envoyer des fichiers (comme des images ou des PDF) depuis un répertoire spécifique.


### ```python
from PIL import Image

from flask import Flask, request, jsonify, render_template, send_from_directory
from PIL import Image
import numpy as np
import io
import torch

from request import get_ft  # get_ft(model, image) doit retourner un np.ndarray

app = Flask(__name__)

# Global model
model = None

def load_model():
    """Load DINOv2  model"""
    torch.hub.set_dir("/tmp/torch_cache")  # Dossier temporaire autorisé
    model = torch.hub.load('facebookresearch/dinov2', 'dinov2_vits14')
    model.eval()
    model.to(torch.device('cuda' if torch.cuda.is_available() else 'cpu'))
    return model

def init_model():
    global model
    model = load_model()

@app.route('/')
def home():
    return render_template('index.html')  # Si tu as un front-end intégré

@app.route('/static/<path:filename>')
def serve_static(filename):
    return send_from_directory('static', filename)

@app.route('/process', methods=['POST'])
def process_images():
    if 'image1' not in request.files or 'image2' not in request.files:
        return jsonify({'error': 'Two images must be provided (image1 and image2)'}), 400

    try:
        image1 = Image.open(io.BytesIO(request.files['image1'].read())).convert('RGB')
        image2 = Image.open(io.BytesIO(request.files['image2'].read())).convert('RGB')

        features1 = get_ft(model, image1)
        features2 = get_ft(model, image2)

        distance = float(np.linalg.norm(features1 - features2))
        return jsonify({'distance': distance})

    except Exception as e:
        print(f"Erreur back-end: {e}")
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    init_model()
    app.run(host='0.0.0.0', port=7860)