Créer un webservice à partir d’une IA en python

Rapide tuto pour transformer un bout de code d’ia sous keras (python) en webservice avec flask.

Please accept YouTube cookies to play this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.

YouTube privacy policy

If you accept this notice, your choice will be saved and the page will refresh.

Ici l’idée est d’utiliser le librairie de segmentation-keras pour le transformer en magnifique webservice !!!

C’est très simple, l’ia prend en entrée une image et donne en sortie une image, on prend donc en entrée de notre webservice, l’upload hpp d’un fichier de type image qu’on donne à l’ia, et on renvoit un fichier de type image …

#!/usr/bin/python
from flask import Flask, request, jsonify, render_template,send_file
from flask_cors import CORS
import os
import sys
import numpy as np
import json
import glob
import keras_segmentation
import tensorflow as tf

from datetime import datetime
from keras.backend.tensorflow_backend import set_session
from werkzeug.utils import secure_filename

#Tensorflow debug stuff
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 
graph = tf.get_default_graph()

#Config app upload
UPLOAD_FOLDER = '/tmp/'
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
stripe.api_key = 'rk_test_D6Xn26R3FBp8PFK3h6spkcrj005mIangwJ'

#On précharge l'ia, sinon ça fait long dans le thread (ça peux être "partagé" etre plusieurs executions.
model = keras_segmentation.pretrained.pspnet_101_voc12()

app = Flask(__name__,static_url_path='', static_folder='web',template_folder='web/templates')
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
CORS(app)

@app.route('/api/test', methods=['POST'])
def postai():
    if not 'file' in request.files:
        return json.dumps({'error':'file not found'}), 400
    
    img_file = request.files.get('file')
    img_name = secure_filename(img_file.filename)
    mimetype = img_file.content_type
    
    if not allowed_file(img_file.filename):
        return json.dumps({'error':'file not found'}), 401
    
    file_orig = os.path.join(app.config['UPLOAD_FOLDER'], img_name)
    file_out = "/tmp/out"+str(datetime.timestamp(datetime.now()))+".png"
    img_file.save(file_orig)
    with graph.as_default():
        out = model.predict_segmentation(inp=file_orig,out_fname=file_out)
    return send_file(file_out)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000,debug=True) 

Concernant la mise en production de ce type de projet … vous pouvez tenter de kubernetiser des instances dockerisé utilisant uwsgi … mais ne vous attendez pas à des performances exceptionnelles.