Использование камеры на стороне клиента, с Django, в FER
Я пытаюсь сделать приложение для распознавания эмоций с помощью Django и OpenCV.
Мое приложение также установлено на Azure, и мне сообщили, что мне нужно получить доступ к камере на стороне клиента, поскольку на серверах Azure нет камер.
Я пытался использовать каналы для этого, но я не могу найти способ заставить видео работать так, как я хочу.
Кто-нибудь нашел способ использовать OpenCV на стороне клиента с помощью Django/Channels?
Вот мой код, чтобы мы все могли посмотреть, что у меня есть на данный момент.
camera.py
import cv2
import mediapipe as mp
from fer import FER
import os
import numpy as np
from keras.models import model_from_json
from keras.preprocessing import image
json_file = open("emotion/fer.json")
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# Model setup
loaded_model.load_weights('emotion/models/fer/fer.h5')
detector = FER()
# Media pipe face mesh
mp_draw = mp.solutions.drawing_utils
mp_face_mesh = mp.solutions.face_mesh
faceMesh = mp_face_mesh.FaceMesh(max_num_faces=2)
draw_specs = mp_draw.DrawingSpec((255, 0, 0), 1, 1)
# OpenCV Haarcascade
face_cascade = cv2.CascadeClassifier(
'emotion/haarcascade_frontalface_default.xml')
class VideoCamera(object):
def __init__(self):
self.video = cv2.VideoCapture(0)
self.prediction = ""
self.score = 0
def __del__(self):
self.video.release()
def getScore(self):
return self.score
def getEmotion(self):
return self.prediction
def get_frame(self):
success, frame = self.video.read()
frame = cv2.flip(frame, 1)
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces_in_frame = face_cascade.detectMultiScale(gray, 1.1, 5)
for (x, y, w, h) in faces_in_frame:
reigon_of_interest = gray[y:y+w, x:x+h]
reigon_of_interest = cv2.resize(reigon_of_interest, (48, 48))
frame_pixels = image.img_to_array(
reigon_of_interest)
frame_pixels = np.expand_dims(frame_pixels, axis=0)
# predictions = loaded_model.predict(frame_pixels)
# max_index = np.argmax(predictions[0])
# emotion_detection = ('angry', 'disgust', 'fear',
# 'happy', 'sad', 'surprise', 'neutral')
# self.prediction = emotion_detection[max_index]
self.prediction, self.score = detector.top_emotion(frame)
results = faceMesh.process(rgb)
if results.multi_face_landmarks:
faces = []
for face_landmarks in results.multi_face_landmarks:
mp_draw.draw_landmarks(
frame, face_landmarks, mp_face_mesh.FACEMESH_CONTOURS, draw_specs, draw_specs)
face = []
for id, lm in enumerate(face_landmarks.landmark):
ih, iw, ic = frame.shape
x, y = int(lm.x * iw), int(lm.y*ih)
face.append([x, y])
faces.append(face)
ret, jpeg = cv2.imencode('.jpg', frame)
return jpeg.tobytes()
views.py
from django.shortcuts import render
from django.views.generic import TemplateView
from django.views.generic.edit import CreateView
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.views import LoginView, LogoutView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import redirect
from django.http.response import StreamingHttpResponse
from emotion.camera import VideoCamera
from django.views.decorators import gzip
# Create your views here.
camera = VideoCamera()
def HomeView(request):
context = {
'camera': camera
}
return render(request, 'welcome.html', context)
def gen(camera):
while True:
frame = camera.get_frame()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
@gzip.gzip_page
def video_feed(request, camera=camera):
return StreamingHttpResponse(gen(camera),
content_type='multipart/x-mixed-replace; boundary=frame')
welcome.html
{% extends 'base.html' %}
{% block content %}
<h1>Welcome to Emotion Recognition!</h1>
<div style="width:auto;" >
<img src="{% url 'video_feed' %}" alt="camera feed" width="75%">
</div>
<div>
<h1>Results</h1>
<p id="emotion">{{ camera.prediction }}</p>
<p id="emotions_score">{{ camera.score }}</p>
</div>
{% endblock %}
Если требуется больше кода, дайте мне знать, и я внесу изменения.