diff --git a/api/bin_models/v1/rf-classifier b/api/bin_models/v1/rf-classifier deleted file mode 100644 index a7cc2cc..0000000 Binary files a/api/bin_models/v1/rf-classifier and /dev/null differ diff --git a/api/bin_models/v1/tf-idf-vectorizer b/api/bin_models/v1/tf-idf-vectorizer deleted file mode 100644 index 553926b..0000000 Binary files a/api/bin_models/v1/tf-idf-vectorizer and /dev/null differ diff --git a/api/bin_models/v1/model_keystroke.pickle b/api/bin_models/v1/voting.pickle old mode 100644 new mode 100755 similarity index 82% rename from api/bin_models/v1/model_keystroke.pickle rename to api/bin_models/v1/voting.pickle index b9c84a0..6463a1a Binary files a/api/bin_models/v1/model_keystroke.pickle and b/api/bin_models/v1/voting.pickle differ diff --git a/api/classifier.py b/api/classifier.py index ff08182..3214967 100644 --- a/api/classifier.py +++ b/api/classifier.py @@ -4,16 +4,15 @@ #import handlers.pickle_handler as model_handler import handlers.data_transform as data_transform +import sys -def keystroke_classifier(req_json): +def keystroke_classifier(df): # TODO: Implementar classifier = load_keystroke_model() - keystroke_array = data_transform.array_for_predict(req_json) + pred = classifier.predict(df) - pred = classifier.predict(keystroke_array) - - return 1 + return pred def face_classifier(req_decoded_image): @@ -21,35 +20,19 @@ def face_classifier(req_decoded_image): #classifier = load_facial_model() pic = face_recognition.load_image_file(req_decoded_image) encoding = face_recognition.face_encodings(pic)[0] - + results = face_recognition.compare_faces(clientes, encoding,tolerance=0.6) - + return max(results) #pred = classifier.predict(decoded_image) return "foo" -def text_classify(text): - text_vectorized = vectorize_text(text) - classifier = load_text_model() - - pred = classifier.predict(text_vectorized) - - flag = None - - if pred[0] == 0: - flag = 'Red flag' - elif pred[0] == 1: - flag = 'Green flag' - - return flag - - #TODO enviar funções para o handlers # Keystroke def load_keystroke_model(): - model = pickle.load(open('./bin_models/v1/model_keystroke.pickle', 'rb')) + model = pickle.load(open('/api/api/bin_models/v1/voting.pickle', 'rb')) return model @@ -58,23 +41,4 @@ def load_keystroke_model(): def load_facial_model(): model = pickle.load(open('./bin_models/v1/model_facial.pickle', 'rb')) - return model - - -# Text -def load_text_model(): - model = pickle.load(open('./bin_models/v1/rf-classifier', 'rb')) - - return model - -def load_text_vectorizer(): - vectorizer = pickle.load(open('./bin_models/v1/tf-idf-vectorizer', 'rb')) - - return vectorizer - -def vectorize_text(text): - vectorizer = load_text_vectorizer() - - text_vectorized = vectorizer.transform([text]) - - return text_vectorized \ No newline at end of file + return model \ No newline at end of file diff --git a/api/handlers/data_transform.py b/api/handlers/data_transform.py index b7e7b29..dd584c8 100644 --- a/api/handlers/data_transform.py +++ b/api/handlers/data_transform.py @@ -1,4 +1,34 @@ +import pandas as pd +import sys + + def array_for_predict(req_json): print('ayn') #array precisa ser de 31, e preencher com 0 o que não tiver. return [0,1,0,1] + + +def transform_keystroke(data): + df = pd.DataFrame.from_dict([data]) + df.fillna(0, inplace=True) + print(df.columns) + + df['DD.5.shift.r'] = df.get('DD.5.shift', 0) + df.get('DD.shift.r', 0) + df['UD.5.shift.r'] = df.get('UD.5.r', 0) + df.get('UD.5.shift', 0) + + df['H.shift.r'] = df.get('H.r', 0) + df['DD.shift.r.o'] = df.get('DD.r.o', 0) + df['UD.shift.r.o'] = df.get('UD.r.o', 0) + df.get('UD.shift.o', 0) + + df.drop(columns=['UD.r.o', 'UD.shift.o', 'H.r', 'UD.5.r', 'UD.5.shift', 'DD.shift.r', 'DD.5.shift'], inplace=True, errors='ignore') + df['H.return'] = df['H.l'] + + colsnew = ['H.period', 'DD.period.t', 'UD.period.t', 'H.t', 'DD.t.i', 'UD.t.i', 'H.i', 'DD.i.e', 'UD.i.e', + 'H.e', 'DD.e.5', 'UD.e.5', 'H.5', 'DD.5.shift.r', 'UD.5.shift.r', 'H.shift.r', 'DD.shift.r.o', + 'UD.shift.r.o', 'H.o', 'DD.o.a', 'UD.o.a', 'H.a', 'DD.a.n', 'UD.a.n', 'H.n', + 'DD.n.l', 'UD.n.l', 'H.l', 'DD.l.return', 'UD.l.return', 'H.return' + ] + + df = df[colsnew] + + return df diff --git a/api/server.py b/api/server.py index a6ae898..8c331d2 100644 --- a/api/server.py +++ b/api/server.py @@ -1,17 +1,20 @@ import numpy as np +import sys import cv2 +import json from flask import Flask from flask import jsonify from flask import request from flasgger import Swagger from flasgger import swag_from +from flask_cors import CORS from swagger.swagger_config import swagger_configuration from classifier import keystroke_classifier from classifier import face_classifier -from classifier import text_classify +from handlers.data_transform import transform_keystroke #import os #import sys @@ -22,6 +25,7 @@ app = Flask(__name__) swagger = Swagger(app, config=swagger_configuration) +CORS(app, origins="*") def decode_image(file): @@ -44,11 +48,13 @@ def status(): @app.route('/keystroke', methods=['POST']) @swag_from('swagger/keystroke.yml') def keystroke(): - req_dict = request.get_json() + req_dict = json.loads(request.data) - classification = keystroke_classifier(req_dict) + data = transform_keystroke(req_dict) - return jsonify({'classification': classification}) + classification = keystroke_classifier(data) + + return jsonify({'classification': classification[0]}) @app.route('/face', methods=['POST']) @@ -60,24 +66,9 @@ def face_recognition(): return response #precisa que manda a imagem e não decodificado - decoded_image = decode_image(request.files['image']) + #o que é essa função decode_image??? - classification = face_classifier(decoded_image) return jsonify({'classification': classification}) - -#classificação textual para remover depois - -@app.route('/classify', methods=['POST']) -@swag_from('swagger/classify.yml') -def route_classify(): - req_dict = request.get_json() - - try: - classification = text_classify(req_dict['text']) - except KeyError: - return jsonify({'Error': 'Corpo da requisição inválido'}), 400 - - return jsonify({'classification': classification}) diff --git a/docker-compose.yml b/docker-compose.yml index 4c59856..2a16616 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,3 +10,9 @@ services: FLASK_DEBUG: 1 volumes: - .:/api + networks: + - lion + +networks: + lion: + driver: bridge diff --git a/requirements.txt b/requirements.txt index 12e9f63..d1b7b5b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,6 @@ opencv-python-headless gunicorn cmake dlib -face_recognition \ No newline at end of file +face_recognition +pandas +flask-cors \ No newline at end of file