ev6's picture
Update app/apps/emotion_recognition/emotion_recognition.py
a76893e verified
from tensorflow import keras
from keras.models import Sequential
from keras.models import load_model
from keras.models import model_from_json
from keras.utils import img_to_array
import keras.utils as image
import cv2
import numpy as np
import os
from django_app.settings import BASE_DIR
model = Sequential()
model = model_from_json(open(
os.path.join(BASE_DIR,'model/model_4layer_2_2_pool.json'), "r").read())
model.load_weights(os.path.join(
BASE_DIR,'model/model_4layer_2_2_pool.h5'))
class_labels = {0: 'Angry', 1: 'Disgust', 2: 'Fear',
3: 'Happy', 4: 'Sad', 5: 'Surprise', 6: 'Neutral'}
classes = list(class_labels.values())
face_classifier = cv2.CascadeClassifier(os.path.join(
BASE_DIR,'model/haarcascade_frontalface.xml'))
# camera = cv2.VideoCapture(0)
def text_on_detected_boxes(text, text_x, text_y, image, font_scale=1,
font=cv2.FONT_HERSHEY_SIMPLEX,
FONT_COLOR=(0, 0, 0),
FONT_THICKNESS=2,
rectangle_bgr=(0, 255, 0)):
(text_width, text_height) = cv2.getTextSize(
text, font, fontScale=font_scale, thickness=2)[0]
box_coords = ((text_x-10, text_y+4), (text_x +
text_width+10, text_y - text_height-5))
cv2.rectangle(image, box_coords[0],
box_coords[1], rectangle_bgr, cv2.FILLED)
cv2.putText(image, text, (text_x, text_y), font,
fontScale=font_scale, color=FONT_COLOR, thickness=FONT_THICKNESS)
def face_detector_image(img):
"""
Обнаружение лиц на изображении.
Args:
img (numpy array): Исходное изображение.
Returns:
tuple: (rects, allfaces, img) - координаты лиц, обрезанные лица и изображение с рамками.
"""
gray = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY)
faces = face_classifier.detectMultiScale(gray, 1.3, 5)
if faces == ():
return (0, 0, 0, 0), np.zeros((48, 48), np.uint8), img
allfaces = []
rects = []
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_gray = cv2.resize(roi_gray, (48, 48), interpolation=cv2.INTER_AREA)
allfaces.append(roi_gray)
rects.append((x, w, y, h))
return rects, allfaces, img
def emotionImage(imgPath):
img = cv2.imread(BASE_DIR + '/media/' + imgPath)
rects, faces, image = face_detector_image(img)
i = 0
for face in faces:
roi = face.astype("float") / 255.0
roi = img_to_array(roi)
roi = np.expand_dims(roi, axis=0)
preds = model.predict(roi)[0]
label = class_labels[preds.argmax()]
label_position = (
rects[i][0] + int((rects[i][1] / 2)), abs(rects[i][2] - 10))
i += 1
# Отрисовка текста и рамок
text_on_detected_boxes(
label, label_position[0], label_position[1], image)
precentages = dict(zip(classes, preds*100))
return image, precentages, label
def emotionImageFromArray(img_array):
"""
Обрабатывает изображение и возвращает результат обработки.
Args:
img_array (numpy array): Исходное изображение (numpy array).
Returns:
tuple: (image, precentages, label)
- image: Изображение с рамками и текстом эмоций.
- precentages: Вероятности каждой эмоции.
- label: Определенная эмоция.
"""
rects, faces, image = face_detector_image(img_array)
i = 0
for face in faces:
roi = face.astype("float") / 255.0
roi = img_to_array(roi)
roi = np.expand_dims(roi, axis=0)
preds = model.predict(roi)[0]
label = class_labels[preds.argmax()]
label_position = (
rects[i][0] + int((rects[i][1] / 2)), abs(rects[i][2] - 10))
i += 1
# Отрисовка текста и рамок
text_on_detected_boxes(
label, label_position[0], label_position[1], image)
precentages = dict(zip(classes, preds*100))
return image, precentages, label
# def face_detector_video(img):
# gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# faces = face_classifier.detectMultiScale(gray, 1.3, 5)
# if faces is ():
# return (0, 0, 0, 0), np.zeros((48, 48), np.uint8), img
# for (x, y, w, h) in faces:
# cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), thickness=2)
# roi_gray = gray[y:y + h, x:x + w]
# roi_gray = cv2.resize(roi_gray, (48, 48), interpolation=cv2.INTER_AREA)
# return (x, w, y, h), roi_gray, img
# def emotionVideo():
# while True:
# ret, frame = camera.read()
# rect, face, image = face_detector_video(frame)
# if np.sum([face]) != 0.0:
# roi = face.astype("float") / 255.0
# roi = img_to_array(roi)
# roi = np.expand_dims(roi, axis=0)
# preds = model.predict(roi)[0]
# label = class_labels[preds.argmax()]
# label_position = (rect[0] + rect[1]//50, rect[2] + rect[3]//50)
# text_on_detected_boxes(label, label_position[0], label_position[1], image)
# fps = camera.get(cv2.CAP_PROP_FPS)
# cv2.putText(image, str(fps),(5, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# else:
# cv2.putText(image, "No Face Found", (5, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
# ret, buffer = cv2.imencode('.jpg', image)
# frame = buffer.tobytes()
# yield (b'--frame\r\n'
# b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
# def gen_frames():
# while True:
# success, frame = camera.read()
# if not success:
# cv2.putText(image, "No Face Found", (5, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
# break
# else:
# gray_img= cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# faces_detected = face_classifier.detectMultiScale(gray_img, 1.32, 5)
# for (x,y,w,h) in faces_detected:
# cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),thickness=7)
# roi_gray=gray_img[y:y+w,x:x+h]
# roi_gray=cv2.resize(roi_gray,(48,48))
# img_pixels = image.img_to_array(roi_gray)
# img_pixels = np.expand_dims(img_pixels, axis = 0)
# img_pixels /= 255
# predictions = model.predict(img_pixels)
# max_index = np.argmax(predictions[0])
# emotions = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral']
# predicted_emotion = emotions[max_index]
# cv2.putText(frame, predicted_emotion, (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
# resized_img = cv2.resize(frame, (600, 400))
# ret, buffer = cv2.imencode('.jpg', frame)
# frame = buffer.tobytes()
# yield (b'--frame\r\n'
# b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')