Files
PComputerVison/predictors/predict_beauty.py
2021-02-16 00:20:14 -05:00

128 lines
4.5 KiB
Python

from keras.layers import Conv2D, Input, MaxPool2D,Flatten, Dense, Permute, GlobalAveragePooling2D
from keras.models import Model
from keras.optimizers import Adam
import numpy as np
import pickle
import keras
import cv2
import sys
import dlib
import os.path
from keras.models import Sequential
from keras.applications.resnet50 import ResNet50
#from keras.applications.resnet50 import Dense
from keras.layers.core import Dense
from keras.optimizers import Adam
import pickle
import numpy as np
import cv2
import os
from keras.layers import Dropout
import config
#APP_ROOT = os.path.dirname(os.path.abspath(__file__))
#parent_path = os.path.dirname(APP_ROOT)
#parent_path = os.path.dirname(parent_path)
#model_path = parent_path+"/common/mmod_human_face_detector.dat"
#cnn_face_detector = dlib.cnn_face_detection_model_v1(model_path)
cnn_face_detector = dlib.cnn_face_detection_model_v1(config.CNN_FACE_DETECTOR_MODEL_PATH)
resnet = ResNet50(include_top=False, pooling='avg')
beautyModel = Sequential()
beautyModel.add(resnet)
beautyModel.add(Dense(5, activation='softmax'))
beautyModel.layers[0].trainable = False
beautyModel.load_weights(config.BEAUTY_MODEL_WEIGHTS_PATH)
def score_mapping(modelScore):
if modelScore <= 1.9:
mappingScore = ((4 - 2.5) / (1.9 - 1.0)) * (modelScore-1.0) + 2.5
elif modelScore <= 2.8:
mappingScore = ((5.5 - 4) / (2.8 - 1.9)) * (modelScore-1.9) + 4
elif modelScore <= 3.4:
mappingScore = ((6.5 - 5.5) / (3.4 - 2.8)) * (modelScore-2.8) + 5.5
elif modelScore <= 4:
mappingScore = ((8 - 6.5) / (4 - 3.4)) * (modelScore-3.4) + 6.5
elif modelScore < 5:
mappingScore = ((9 - 8) / (5 - 4)) * (modelScore-4) + 8
return mappingScore
def predict_beauty(img):
#im0 = cv2.imread(imgPath)
im0 = img
if im0.shape[0] > 1280:
new_shape = (1280, im0.shape[1] * 1280 / im0.shape[0])
elif im0.shape[1] > 1280:
new_shape = (im0.shape[0] * 1280 / im0.shape[1], 1280)
elif im0.shape[0] < 640 or im0.shape[1] < 640:
new_shape = (im0.shape[0] * 2, im0.shape[1] * 2)
else:
new_shape = im0.shape[0:2]
im = cv2.resize(im0, (int(new_shape[1]), int(new_shape[0])))
dets = cnn_face_detector(im, 0)
for i, d in enumerate(dets):
face = [d.rect.left(), d.rect.top(), d.rect.right(), d.rect.bottom()]
croped_im = im[face[1]:face[3], face[0]:face[2], :]
resized_im = cv2.resize(croped_im, (224, 224))
normed_im = np.array([(resized_im - 127.5) / 127.5])
pred = beautyModel.predict(normed_im)
ldList = pred[0]
out = 1 * ldList[0] + 2 * ldList[1] + 3 * ldList[2] + 4 * ldList[3] + 5 * ldList[4]
out = score_mapping(out)
return out
# print(img + " 打分:" + str('%.2f' % (out)))
# cv2.rectangle(im, (face[0], face[1]), (face[2], face[3]), (0, 255, 0), 3)
# cv2.putText(im, str('%.2f' % (out)), (face[0], face[3]), cv2.FONT_HERSHEY_SIMPLEX,
# 1, (0, 0, 255), 2)
#
# ret = path + "/output-" + img
# cv2.imwrite(ret, im)
# return ret
def predict_beauty_from_faces(detected_faces, img):
outList = []
im0 = img
if im0.shape[0] > 1280:
new_shape = (1280, im0.shape[1] * 1280 / im0.shape[0])
elif im0.shape[1] > 1280:
new_shape = (im0.shape[0] * 1280 / im0.shape[1], 1280)
elif im0.shape[0] < 640 or im0.shape[1] < 640:
new_shape = (im0.shape[0] * 2, im0.shape[1] * 2)
else:
new_shape = im0.shape[0:2]
im = cv2.resize(im0, (int(new_shape[1]), int(new_shape[0])))
for i, d in enumerate(detected_faces):
face = [d.left(), d.top(), d.right(), d.bottom()]
croped_im = im[face[1]:face[3], face[0]:face[2], :]
resized_im = cv2.resize(croped_im, (224, 224))
normed_im = np.array([(resized_im - 127.5) / 127.5])
pred = beautyModel.predict(normed_im)
ldList = pred[0]
out = 1 * ldList[0] + 2 * ldList[1] + 3 * ldList[2] + 4 * ldList[3] + 5 * ldList[4]
out = score_mapping(out)
outList.append(out)
return outList
# beauty_predict(parent_path+"/samples/image",'fengjie.jpg')
# beauty_predict(parent_path+"/samples/image",'nenghua.jpg')
# beauty_predict(parent_path+"/samples/image",'shunli.jpg')
# beauty_predict(parent_path+"/samples/image",'test1.jpg')
# beauty_predict(parent_path+"/samples/image",'test2.jpg')
# beauty_predict(parent_path+"/samples/image",'test3.jpg')
# beauty_predict(parent_path+"/samples/image",'fty1845.jpg')
#beauty_predict(parent_path+"/samples/image",'fty1959.jpg')
# beauty_predict(parent_path+"/samples/image",'jiyou.png')