Я сделал модель распознавания эмоций на лице. Я хочу развернуть это на экземпляре ec2, где пользователь может загрузить видео, и мой код будет рисовать ограничивающие рамки на лицах в видеокадрах, и на основе этого будут отображаться видеокадры вместе с ограничивающими прямоугольниками и прогнозируемым выражением лица. В настоящее время у меня есть docker изображение для кода на экземпляре ec2.
Но я получаю сообщение об ошибке: «Не удается подключиться к X-серверу» всякий раз, когда я пытаюсь составить docker с помощью команды sudo docker-compose up
.
Я пробовал различные решения, но я не в состоянии правильно понять, что все происходит в решениях. Может кто-нибудь сказать, пожалуйста, самый простой способ сделать это и объяснить это правильно?
Решения пробовали: Можно ли запустить GUI приложений в Docker контейнере?
РЕДАКТИРОВАТЬ:
По сути, я просто хочу веб-приложение, в которое пользователь мог бы загрузить видео и в выходной файл просмотреть видео, в котором в каждом кадре на лицах изображения нарисован ограничивающий прямоугольник, а над ним помечена предсказанная эмоция лица.
Ниже приведен мой код для отображения видеокадров с ограничивающими рамками и прогнозируемым выражением лица:
import numpy as np
import argparse
import cv2
import os
from keras.preprocessing.image import img_to_array, load_img
from keras.models import load_model
import os
import time
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
model_file = "facial_model.h5"
# emotions will be displayed on your face from the webcam feed
model = load_model(model_file, compile=False)
# prevents openCL usage and unnecessary logging messages
cv2.ocl.setUseOpenCL(False)
# dictionary which assigns each label an emotion (alphabetical order)
emotion = ["Angry", "Disgusted", "Fearful",
"Happy", "Neutral", "Sad", "Surprised"]
facecasc = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# start the webcam feed
cap = cv2.VideoCapture('video.mp4')
img_width = 48
img_height = 48
while True:
# Find haar cascade to draw bounding box around face
ret, frame = cap.read()
# frame = cv2.transpose(frame, 0)
# frame = cv2.flip(frame, flipCode=0)
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = facecasc.detectMultiScale(
gray, scaleFactor=1.3, minNeighbors=5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 1)
cropped_img = gray[y:y + h, x:x + w]
try:
os.remove("image.jpeg")
except:
pass
cv2.imwrite('image.jpeg', cropped_img)
path = 'image.jpeg'
img = load_img(path, target_size=(
img_width, img_height), color_mode='grayscale')
img = img_to_array(img)
img = np.expand_dims(img, axis=0)
index = model.predict_classes(img)
val = emotion[index[0]]
cv2.putText(frame, val, (x+20, y-60),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
cv2.imshow('Video', cv2.resize(
frame, (800, 800), interpolation=cv2.INTER_CUBIC))
if cv2.waitKey(20) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Dockerfile:
# The first instruction is what image we want to base our container on
# We Use an official Python runtime as a parent image
FROM python:3.6
# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONUNBUFFERED 1
# create root directory for our project in the container
RUN mkdir /facial_model
# Set the working directory to /facial_model
WORKDIR /facial_model
# Copy the current directory contents into the container at /facial_model
ADD . /facial_model/
# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt
docker -compose.yml
version: "3"
services:
web:
build: .
command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
container_name:facial_model
volumes:
- .:/facial_model
ports:
- "8000:8000"