Commit 91760e33 authored by YONG-LIN SU's avatar YONG-LIN SU

version 1 api server

parents
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import inception_resnet_v1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import cv2\n",
"from skimage.transform import resize\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"img=cv2.imread('nas/Face/test/test2.jpg')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"face_cascade = cv2.CascadeClassifier(\"Face-Clock/model/cv2/haarcascade_frontalface_alt2.xml\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"faces = face_cascade.detectMultiScale(img,scaleFactor=1.1,minNeighbors=3)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 人臉偵測處理回傳結果矩陣\n",
"image_size=160\n",
"def face_cropped(img,faces, margin): \n",
" aligned_images = []\n",
" for f in faces:\n",
" (x, y, w, h) = f\n",
" cropped = img[y-margin//2:y+h+margin//2,x-margin//2:x+w+margin//2, :]\n",
" aligned = resize(cropped, (image_size, image_size), mode='reflect')\n",
" aligned_images.append(aligned)\n",
" \n",
" return np.array(aligned_images)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"inception_resnet_v1.calc_embs(face_cropped(img,faces,10))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
FLASK_APP=run.py FLASK_DEBUG=1 flask run -h 0.0.0.0 -p 8000
\ No newline at end of file
Face-Clock @ 2fbb3cf9
Subproject commit 2fbb3cf9dffbeaa2f9b3c7d3ee7f4c9eaecd0b1e
import pypyodbc as odbc # MS SQL Server
import os as __os, logger as __log
__drive = "DRIVER={FreeTDS};"
__server = "SERVER=" + __os.environ['MSSQL_HOST'] + "," + __os.environ['MSSQL_PORT'] + ";"
__database = "DATABASE=" + __os.environ['MSSQL_DB'] + ';'
__uid = "UID=" + __os.environ['MSSQL_USR'] + ";"
__pwd = "PWD=" + __os.environ['MSSQL_PWD'] + ";"
__version = "TDS_Version=" + __os.environ['MSSQL_TDS'] + ";"
def select(table, columns="*"): # (資料表, 資料欄位)
if isinstance(columns, list): # 查詢特定多個欄位
for column in columns:
fields = (fields + ", " if 'fields' in vars() else "") + column
else: # 查詢特定或所有欄位
fields = columns
# 從資料表中選出指定欄位的內容
return "SELECT " + fields + " FROM " + table
def insert(table, data): # (資料表, 新增資料)
for key in data.keys():
fields = (fields + ", " if 'fields' in vars() else "") + key
value = str(data[key])
values = (values + ", " if 'values' in vars() else "") + "'" + value + "'"
# 新增資料列到資料表中
return "INSERT INTO " + table + " (" + fields + ") VALUES (" + values + ")"
def update(table, data):
for key in data.keys():
pair = key + " = '" + str(data[key]) + "'"
pairs = (pairs + ", " if 'pairs' in vars() else "") + pair
# 更新特定欄位的內容 `" + table + "` SET " + data_set
return "UPDATE " + table + " SET " + pairs
def delete(table):
return "DELETE FROM " + table
def where(query, column, logic, value):
condition = column + ' ' + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " WHERE " + condition
def where_in(query, column, values):
if isinstance(values, list):
for value in values:
_in = (_in + ", " if '_in' in vars() else "") + "'" + value + "'"
else:
_in = "'" + values + "'"
# 設定查詢或更新符合條件的資料列
return query + " WHERE " + column + " IN (" + _in + ")"
def where_between(query, column, start, end):
_between = "'" + str(start) + "' AND '" + str(end) + "'"
return query + " WHERE " + column + " BETWEEN " + _between
def where_like(query, column, like):
return query + " WHERE " + column + " LIKE '" + like + "'"
def where_or(query, column, logic, value):
condition = column + " " + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " OR " + condition
def where_and(query, column, logic, value):
condition = column + ' ' + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " AND " + condition
def orderby(query, column, desc=False):
return query + " ORDER BY " + column + " " + ("DESC" if desc else "ASC")
def fetchall(ip, table, query):
connect = odbc.connect(__drive + __server + __database + __uid + __pwd + __version)
cursor = connect.cursor()
try:
cursor.execute(query)
rows = cursor.fetchall()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = len(rows) if isinstance(row, tuple) else 0
tag = "SELECT " + str(tag) + " data." if "SELECT" in query else tag
tag = "INSERT " + str(tag) + " data." if "INSERT" in query else tag
tag = "UPDATE " + str(tag) + " data." if "UPDATE" in query else tag
tag = "DELETE " + str(tag) + " data." if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return rows if isinstance(rows, tuple) else True
def fetchone(query):
connect = odbc.connect(__drive + __server + __database + __uid + __pwd + __version)
cursor = connect.cursor()
try:
cursor.execute(query)
row = cursor.fetchone() if "SELECT" in query else True
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = len(row) if isinstance(row, tuple) else 0
tag = "SELECT " + str(tag) + " data." if "SELECT" in query else tag
tag = "INSERT " + str(tag) + " data." if "INSERT" in query else tag
tag = "UPDATE " + str(tag) + " data." if "UPDATE" in query else tag
tag = "DELETE " + str(tag) + " data." if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return row if isinstance(row, tuple) else True
\ No newline at end of file
from flask import Flask as __flask
from flaskext.mysql import MySQL as __mysql
import os as __os, logger as __log
__app = __flask(__name__)
__app.config['MYSQL_DATABASE_HOST'] = __os.environ['MYSQL_HOST']
__app.config['MYSQL_DATABASE_PORT'] = int(__os.environ['MYSQL_PORT'])
__app.config['MYSQL_DATABASE_USER'] = __os.environ['MYSQL_USR']
__app.config['MYSQL_DATABASE_PASSWORD'] = __os.environ['MYSQL_PWD']
__app.config['MYSQL_DATABASE_DB'] = 'chiayi'
__mysql = __mysql()
__mysql.init_app(__app)
def select(table, columns="*"):
if isinstance(columns, list):
for column in columns:
fields = (fields + ", " if 'fields' in vars() else "") + "`" + column + "`"
else:
fields = "`" + columns + "`"
return "SELECT " + fields + " FROM `" + table + "`"
def insert(table, data):
for key in data.keys():
fields = (fields + ", " if 'fields' in vars() else "") + "`" + key + "`"
value = str(data[key])
values = (values + ", " if 'values' in vars() else "") + "'" + value + "'"
return "INSERT INTO `" + table + "` (" + fields + ") VALUES (" + values + ")"
def update(table, data):
for key in data.keys():
pair = "`" + key + "` = '" + str(data[key]) + "'"
pairs = (pairs + ", " if 'pairs' in vars() else "") + pair
return "UPDATE `" + table + "` SET " + pairs
def delete(table):
return "DELETE FROM `" + table + "`"
def where(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " WHERE " + condition
def where_in(query, column, values):
if isinstance(values, list):
for value in values:
temp = (temp + ", " if 'temp' in vars() else "") + "'" + value + "'"
else:
temp = "'" + values + "'"
return query + " WHERE `" + column + "` IN (" + temp + ")"
def where_between(query, column, start, end):
temp = "'" + str(start) + "' AND '" + str(end) + "'"
return query + " WHERE `" + column + "` BETWEEN " + temp
def where_like(query, column, like):
return query + " WHERE `" + column + "` LIKE '" + like + "'"
def where_or(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " OR " + condition
def where_and(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " AND " + condition
def orderby(query, column, desc=False):
return query + " ORDER BY `" + column + "` " + ("DESC" if desc else "ASC")
def fetchall(ip, table, query):
connect = __mysql.connect()
cursor = connect.cursor()
try:
cursor.execute(query)
rows = cursor.fetchall()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = str(connect.affected_rows())
tag = "SELECT " + tag + " data" if "SELECT" in query else tag
tag = "INSERT " + tag + " data" if "INSERT" in query else tag
tag = "UPDATE " + tag + " data" if "UPDATE" in query else tag
tag = "DELETE " + tag + " data" if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return rows if isinstance(rows, tuple) else True
def fetchone(ip, table, query):
connect = __mysql.connect()
cursor = connect.cursor()
try:
cursor.execute(query)
row = cursor.fetchone()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = str(connect.affected_rows())
tag = "SELECT " + tag + " data" if "SELECT" in query else tag
tag = "INSERT " + tag + " data" if "INSERT" in query else tag
tag = "UPDATE " + tag + " data" if "UPDATE" in query else tag
tag = "DELETE " + tag + " data" if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return row if isinstance(row, tuple) else True
\ No newline at end of file
import cv2
from skimage.transform import resize
import numpy as np
face_cascade = cv2.CascadeClassifier("Face-Clock/model/cv2/haarcascade_frontalface_alt2.xml")
print("人臉偵測cascade分類器載入完成")
# 人臉偵測處理回傳結果矩陣
image_size=160
def face_cropped(img,faces, margin):
aligned_images = []
for f in faces:
(x, y, w, h) = f
cropped = img[y-margin//2:y+h+margin//2,x-margin//2:x+w+margin//2, :]
aligned = resize(cropped, (image_size, image_size), mode='reflect')
aligned_images.append(aligned)
return np.array(aligned_images)
def get_face(img):
faces = face_cascade.detectMultiScale(img,scaleFactor=1.1,minNeighbors=3)
if(len(faces)==0):
return '偵測不到人臉請重新調整'
else:
return faces,face_cropped(img,faces,10)
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import os as __os, datetime as __datetime, pytz as __pytz
import sys as __sys, codecs as __codecs
def write(source, tag, table, message):
now = __datetime.datetime.now(tz=__pytz.timezone('Asia/Taipei'))
now = str(int(now.strftime("%Y%m%d%H%M")) - 191100000000)
date = __os.path.join("log", now[0:3], now[3:5])
# Create log folder if it't exists.
if not __os.path.exists(date):
__os.makedirs(date)
# Record SQL operator per day.
with __codecs.open(__os.path.join(date, now[5:7] + '.log'), "a", "utf-8") as f:
f.write(u"[" + source + "][" + now[7:9] + ":" + now[9:11] + "][" + tag + "][" + table + "]:\n" + message + "\n")
# try:
# __sys.stdout = __codecs.getwriter("utf-8")(__sys.stdout.detach())
# except:
# tag = "ERROR"
print(u"[" + source + "][" + now[7:9] + ":" + now[9:11] + "][" + table + "]:" + tag)
from keras.models import load_model
model=load_model('Face-Clock/model/keras/facenet_keras.h5')
# model._make_predict_function()
print("Facenet預測模型載入完成")
\ No newline at end of file
# coding: utf-8
# In[1]:
import cv2
from sklearn.externals import joblib
from skimage.transform import resize
from sklearn.preprocessing import LabelEncoder
from keras.models import load_model
import numpy as np
import os
import facenet_predict
# In[2]:
# 載入Facenet預測模型
# model=model_from_json(open("Face-Clock/model/keras/facenet_model.json","r").read())
# model.load_weights("Face-Clock/model/keras/facenet_weights.h5")
# model=load_model('Face-Clock/model/keras/facenet_keras.h5')
# model._make_predict_function()
# print("Facenet預測模型載入完成")
# 載入人臉偵測cascade分類器
# global face_cascade
face_cascade = cv2.CascadeClassifier("Face-Clock/model/cv2/haarcascade_frontalface_alt2.xml")
print("人臉偵測cascade分類器載入完成")
# In[3]:
# 載入Facenet預測模型
# model=model_from_json(open("Face-Clock/model/keras/facenet_model.json","r").read())
# model.load_weights("Face-Clock/model/keras/facenet_weights.h5")
# global model
# model=load_model('Face-Clock/model/keras/facenet_keras.h5')
# model._make_predict_function()
# print("Facenet預測模型載入完成")
# model.summary()
# In[4]:
# 載入SVM分類器
clf=joblib.load('Face-Clock/model/20190624135811/20190624135811.pkl')
# 載入LabelEncoder
le=LabelEncoder()
le.classes_ =np.load('Face-Clock/model/20190624135811/classes.npy')
print("SVM分類器載入完成")
# 建立儲存影像位置
with open('Face-Clock/model/20190624135811/labels.txt') as f:
lines = f.readlines()
for i in range(len(lines)):
name=lines[i].split('\n')[0]
save_path=os.path.abspath('nas/Face')
name_path=os.path.join(save_path,name)
if(not os.path.isdir(name_path)):
os.mkdir(name_path)
os.mkdir(os.path.join(name_path,'login_'))
os.mkdir(os.path.join(name_path,'logout_'))
os.mkdir(os.path.join(name_path,'error_'))
print("建立儲存影像位置完成")
# In[5]:
# 影像預處理
# def prewhiten(x):
# if x.ndim == 4:
# axis = (1, 2, 3)
# size = x[0].size
# elif x.ndim == 3:
# axis = (0, 1, 2)
# size = x.size
# else:
# print(x.ndim)
# raise ValueError('Dimension should be 3 or 4')
# mean = np.mean(x, axis=axis, keepdims=True)
# std = np.std(x, axis=axis, keepdims=True)
# std_adj = np.maximum(std, 1.0/np.sqrt(size))
# y = (x - mean) / std_adj
# return y
# def l2_normalize(x, axis=-1, epsilon=1e-10):
# output = x / np.sqrt(np.maximum(np.sum(np.square(x), axis=axis, keepdims=True), epsilon))
# return output
# In[6]:
# 人臉偵測處理回傳結果矩陣
image_size=160
def face_cropped(img,faces, margin):
aligned_images = []
for f in faces:
(x, y, w, h) = f
cropped = img[y-margin//2:y+h+margin//2,x-margin//2:x+w+margin//2, :]
aligned = resize(cropped, (image_size, image_size), mode='reflect')
aligned_images.append(aligned)
return np.array(aligned_images)
# In[7]:
# 取得人臉Facenet預測之特徵值
# def calc_embs(faces, margin=10, batch_size=1):
# aligned_images = prewhiten(faces)
# pd = []
# for start in range(0, len(aligned_images), batch_size):
# pd.append(model.predict_on_batch(aligned_images[start:start+batch_size]))
# embs = l2_normalize(np.concatenate(pd))
# return embs
# In[11]:
# 人臉辨識推斷
def infer(le, clf, img):
faces = face_cascade.detectMultiScale(img,scaleFactor=1.1,minNeighbors=3)
if(len(faces)==0):
return '偵測不到人臉請重新調整'
embs = facenet_predict.calc_embs(face_cropped(img,faces,10))
# pred = le.inverse_transform(clf.predict(embs))
# pred=get_labels(le,clf,embs)
results,confidences=get_labelsNconfidence(le,clf,embs)
return [faces,results,confidences]
# Labels 解析
def get_labels(le,clf,embs):
socres=clf.predict_proba(embs)
results=[]
for s in socres:
if(s[s.argmax()]>0.5):
results.append(le.inverse_transform([s.argmax()])[0])
else:
results.append('Unknow')
return results
# Labels 解析回傳結果與分數
def get_labelsNconfidence(le,clf,embs):
socres=clf.predict_proba(embs)
results=[]
confidences=[]
for s in socres:
results.append(le.inverse_transform([s.argmax()])[0])
confidences.append(s[s.argmax()])
return results,confidences
def get_result(img_path):
img=cv2.imread(img_path)
global le
global clf
return infer(le, clf, img)
\ No newline at end of file
from run import app
from flask_restful import Resource, reqparse
from werkzeug import datastructures
import datetime
import time
import cv2
import pytz
import os
import facenet_predict
import face_cascade
import svm_classification
import train
from influxdb import InfluxDBClient
import pymysql
class Whois(Resource):
def __init__(self):
self.reqparse = reqparse.RequestParser()
self.reqparse.add_argument('file',type=datastructures.FileStorage, location='files',required=True,help="Please slecet a image which incloud car to upload.")
@staticmethod
def save(self):
save_time=time.time()
dt = datetime.datetime.now(pytz.timezone('Asia/Taipei'))
dt = dt.strftime('%Y_%m_%d_%H_%M_%S_%f')+'.jpg'
filepath = os.path.abspath(os.path.join(app.config['UPLOAD_FOLDER'], dt))
args =self.reqparse.parse_args()
args['file'].save(filepath)
return save_time,filepath
def get(self):
return "hello world"
def post(self):
save_time,img_path = self.save(self)
# print(img_path)
img=cv2.imread(img_path)
faces=face_cascade.get_face(img)
if(len(faces)!=2):
return {'error':faces}
embs=facenet_predict.calc_embs(faces[1])
result=svm_classification.result(embs)
return {'time':save_time,'face_location':str(faces[0]),'name':result[0],'confidence':result[1]}
# if(len(result)!=3):
# return {'error':result}
# return {'face':str(result[0]),'name':result[1],'confidence':result[2]}
# result=train.get_result(img_path)
# return {'message':str(result)}
class Upload_image(Resource):
def __init__(self):
self.reqparse = reqparse.RequestParser()
self.reqparse.add_argument('name',required=True,help="Please write down your name and we will save your image to folder of train")
self.reqparse.add_argument('file',type=datastructures.FileStorage, location='files',required=True,help="Please slecet a image which incloud car to upload.")
@staticmethod
def save(self):
dt = datetime.datetime.now(pytz.timezone('Asia/Taipei'))
dt = dt.strftime('%Y_%m_%d_%H_%M_%S_%f')+'.jpg'
args =self.reqparse.parse_args()
fileroot=os.path.abspath(os.path.join('./nas/Face/train',args['name']))
filepath = os.path.join(fileroot,dt)
if(not os.path.isdir(fileroot)):
os.mkdir(fileroot)
args['file'].save(filepath)
return args['name'],filepath
def post(self):
name,img_path=self.save(self)
img=cv2.imread(img_path)
faces=face_cascade.get_face(img)
if(len(faces)!=2):
return {'error':'偵測不到人臉 請重新上傳'}
else:
return {'message':name+'已新增訓練樣本'}
class Train(Resource):
def get(self):
train.go_train()
return {'message':'training is done'}
class Clock(Resource):
def __init__(self):
self.reqparse = reqparse.RequestParser()
self.reqparse.add_argument('name',required=True,help="Please write down your name")
self.reqparse.add_argument('time',required=True,help="Please write down save time")
self.reqparse.add_argument('log',required=True,help="Please write down your login or logout")
self.reqparse.add_argument('status',required=True,help="Please write down your status")
def post(self):
args =self.reqparse.parse_args()
save_time=args['time']
save_name=args['name']
save_log=args['log']
status=args['status']
if(status == 'error_'):
save_log=status
utc_time=datetime.datetime.utcfromtimestamp(float(save_time))
tzutc_8 = datetime.timezone(datetime.timedelta(hours=8))
local_dt = utc_time.astimezone(tzutc_8)
img_file = local_dt.strftime('%Y_%m_%d_%H_%M_%S_%f')+'.jpg'
img=cv2.imread(os.path.join('./tmp/upload',img_file))
cv2.imwrite(os.path.abspath(os.path.join('./nas/Face',save_name,save_log,img_file)),img)
# 建立資料庫連線
client=InfluxDBClient(host='192.168.0.6',port=8086,username='root',password='xMd2k5aK',database='rd')
json_body = [
{
"measurement": save_log,
"time": utc_time,
"fields": {
"name": save_name,
'snapshot':save_log+'/'+img_file+'.jpg'
}
}
]
client.write_points(json_body)
client.close()
return {'message':save_name+'打卡成功'}
class Insert_employee(Resource):
def __init__(self):
self.reqparse = reqparse.RequestParser()
self.reqparse.add_argument('name',required=True,help="Please write down your name")
self.reqparse.add_argument('engname',required=True,help="Please write down save time")
self.reqparse.add_argument('phone',required=True,help="Please write down your login or logout")
self.reqparse.add_argument('years',required=True,help="Please write down your status")
def post(self):
args=self.reqparse.parse_args()
name=args['name']
engname=args['engname']
phone=args['phone']
years=args['years']
db=pymysql.connect('192.168.0.5','root','xMd2k5aK','rd')
cursor = db.cursor()
# 資料庫查詢此類別最後一組id避免重複
sql="SELECT id FROM employee WHERE id LIKE 'RD{0}%'".format(years)
a=cursor.execute(sql)
if(a==0):
full_num='RD'+years+'00'
else:
result=cursor.fetchall()
num=int(max(result)[0].split(years)[1])+1
full_num='RD'+years+str(num)
sql="""INSERT INTO `employee` (`id`, `name`, `english_name`, `phone`) VALUES ('{0}', '{1}', '{2}', '{3}')""".format(full_num,name,engname,phone)
try:
# 执行SQL语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
db.close()
return {'message':str(args)}
\ No newline at end of file
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
from flask_jwt_extended import JWTManager
def warn(*args, **kwargs):
pass
import warnings
warnings.warn = warn
app = Flask(__name__)
api = Api(app)
import os
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'some-secret-string'
app.config['UPLOAD_FOLDER'] = 'tmp/upload'
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
db = SQLAlchemy(app)
app.config['JWT_SECRET_KEY'] = 'jwt-secret-string'
jwt = JWTManager(app)
app.config['JWT_BLACKLIST_ENABLED'] = True
app.config['JWT_BLACKLIST_TOKEN_CHECKS'] = ['access', 'refresh']
@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
jti = decrypted_token['jti']
return models.RevokedTokenModel.is_jti_blacklisted(jti)
import views, models, resources
api.add_resource(resources.Whois,'/whois')
api.add_resource(resources.Upload_image,'/upload/image')
api.add_resource(resources.Train,'/train')
api.add_resource(resources.Clock,'/clock')
api.add_resource(resources.Insert_employee,'/insert')
@app.before_first_request
def create_tables():
db.create_all()
if __name__ == '__main__':
# print(('* Loading Keras model and Flask starting server...'
# 'please wait until server has fully started'))
# perload_model()
app.run()
# app.run(host='0.0.0.0', port=8000, debug=True)
\ No newline at end of file
from sklearn.externals import joblib
from sklearn.preprocessing import LabelEncoder
import numpy as np
import os
svm_path=os.path.abspath('./nas/Face/model/svm')
svm_version=max(os.listdir(svm_path))
print('svm version:',svm_version)
# 載入SVM分類器
clf=joblib.load(os.path.join(svm_path,svm_version,svm_version+'.pkl'))
# 載入LabelEncoder
le=LabelEncoder()
le.classes_ =np.load(os.path.join(svm_path,svm_version,'classes.npy'))
print("SVM分類器載入完成")
# Labels 解析回傳結果與分數
def get_labelsNconfidence(le,clf,embs):
socres=clf.predict_proba(embs)
results=[]
confidences=[]
for s in socres:
results.append(le.inverse_transform([s.argmax()])[0])
confidences.append(s[s.argmax()])
return results,confidences
def result(embs):
global le
global clf
return get_labelsNconfidence(le,clf,embs)
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment