Bonne journée!Je m’appelle Andrey Sobolev et aujourd’hui nous allons créer un simple «chignon» pour Django, qui vérifiera le visage de la personne sur la photo (ce qui est utile dans un tas de situations).Pour ce faire, nous avons besoin d'OpenCV et de 5 minutes de temps libre. Aller.Installation
Tout d'abord, installez les bibliothèques nécessaires dans le conteneur Docker:FROM python:3.8.3-buster
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y \
gcc && apt-get install -y \
libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev libjpeg-dev libfreetype6-dev python-dev libpq-dev python-dev libxml2-dev libxslt-dev postgresql-client git && \
apt-get install -y libxrender1 libxext-dev fontconfig && \
pip3 install -U pip setuptools
COPY ./requirements.txt /home/
* * *
Et ajoutez les dépendances à requirements.txt:opencv-python
matplotlib
numpy
Fonction de vérification du visage detect_face
Créez le fichier utils.py (par exemple, dans le dossier principal, vous pouvez avoir n'importe quel autre dossier) et ajoutez-y les lignes suivantes:import cv2 as cv
import numpy as np
def detect_face(in_memory_photo):
face_cascade = cv.CascadeClassifier(cv.__path__[0] + "/data/haarcascade_frontalface_default.xml")
in_memory_photo = in_memory_photo.read()
nparr = np.fromstring(in_memory_photo, np.uint8)
img = cv.imdecode(nparr, 4)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
if len(faces) > 0:
return True
else:
return False
Intégration dans le formulaire de saisie utilisateur
Importez notre fonction:from main.utils import detect_face
Et «vérifiez le visage» lors de l'enregistrement d'un nouvel utilisateur.if request.method == "POST":
form = RegistrationForm(request.POST, request.FILES)
if form.is_valid():
try:
in_memory_uploaded_file = request.FILES["photo"]
except:
in_memory_uploaded_file = None
if not in_memory_uploaded_file or not detect_face(in_memory_uploaded_file):
messages.add_message(request, messages.WARNING, _("You can only upload a face photo. Please try to uploading a different photo."))
return HttpResponseRedirect(reverse("main:profile_registration"))
Un exemple sans cadre
import os
import cv2 as cv
import numpy as np
def detect_face(in_memory_photo):
face_cascade = cv.CascadeClassifier(cv.__path__[0] + "/data/haarcascade_frontalface_default.xml")
in_memory_photo = in_memory_photo.read()
nparr = np.fromstring(in_memory_photo, np.uint8)
img = cv.imdecode(nparr, 4)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
if len(faces) > 0:
return True
else:
return False
with open(os.path.dirname(os.path.abspath(__file__)) + '/photo.jpg', 'rb') as in_memory_photo:
is_it_face = detect_face(in_memory_photo)
print(is_it_face)
C'est tout.Comme vous pouvez le constater, tout est assez simple (si vous avez besoin d'un simple contrôle bien sûr).Liens utiles
Versdatascience.com/face-detection-in-2-minutes-using-opencv-python-90f89d7c0f81new-friend.org/ru/195/2800/12918/profile-registration (un exemple du fonctionnement de cette solution).