Как проверить, содержит ли изображение лицо или нет, прежде чем сохранить его в каталог мультимедиа?
Я работаю с Django Rest Framework для создания API распознавания лиц. Я создал автономное приложение для распознавания лиц, используя библиотеку 'face_recognition' в Python и OpenCV. Теперь мне нужно преобразовать этот отдельный проект в API.
В model.py я создал класс Person. который содержит некоторые поля для регистрации человека, такие как имя, email, пароль, а также изображение. Человек загружает изображение, и оно сохраняется в каталог media. Я хочу проверить, содержит ли загруженное изображение лицо или нет. Оно должно быть сохранено в медиа-каталоге тогда и только тогда, когда оно содержит только одно лицо. В противном случае должно появиться сообщение: "Загруженное изображение не содержит лица или содержит более одного лица".
Я новичок в Django Framework и API в целом. Любая помощь будет высоко оценена.
Коды следующие:
models.py
# Create your models here.
from django.db import models
# lets us explicitly set upload path and filename
def upload_to(instance, filename):
return 'images/{filename}'.format(filename=filename)
class Person(models.Model):
name = models.CharField(max_length=60, blank=False, null=False)
image_url = models.ImageField(upload_to=upload_to, blank=True, null=True)
def __str__(self):
return self.name
serializers.py
from rest_framework import serializers
from .models import Person
class PersonSerializer(serializers.HyperlinkedModelSerializer):
# image_url = serializers.ImageField(required=True)
class Meta:
model = Person
fields = ('id', 'name', 'image_url') # fields = ('id',) to use only one field
views.py
import face_recognition
from django.http import JsonResponse, HttpResponse
from rest_framework import viewsets
from .serializers import PersonSerializer
from .models import Person
from rest_framework import permissions
from rest_framework.parsers import MultiPartParser, FormParser
from django.conf import settings
class PersonViewSet(viewsets.ModelViewSet):
queryset = Person.objects.all().order_by('id')
serializer_class = PersonSerializer
parser_classes = (MultiPartParser, FormParser)
permission_classes = [
permissions.IsAuthenticatedOrReadOnly]
# recognition = recognize_face(settings.MEDIA_ROOT+'//images/', str(Person.image_url))
def getFacesUrl(request):
# path = '/' + path.replace('-', '/')
path = settings.MEDIA_ROOT+'//images/two_persons.jpg'
image = face_recognition.load_image_file(path)
face_locations = face_recognition.face_locations(image)
face_landmarks_list = face_recognition.face_landmarks(image)
list_of_face_encodings = face_recognition.face_encodings(image)
# y1, x2, y2, x1 = face_locations
# cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
# cv2.imshow('Test', image)
# c = cv2.waitKey(0)
responseData = {
'Faces': len(face_locations),
'Face Locations': face_locations,
'Face Landmarks': face_landmarks_list,
}
return JsonResponse(responseData)
Как передать URL текущего добавленного изображения в метод getFacesUrl?
Проверки, которые вы хотите реализовать, должны быть размещены в вашем фронтенд приложении, которое читает изображение, причина проста вы уже настроили вещи для игры с изображением, теперь, если вы хотите иметь эти проверки в Django env, вам нужно будет настроить все вещи в бэкенде.
Я не знаю, какой подход вы использовали, относительно OpenCV, есть одна статья для вас, https://www.digitalocean.com/community/tutorials/how-to-detect-and-extract-faces-from-an-image-with-opencv-and-python
Можно использовать модель обнаружения лиц для проверки того, содержит ли каждое изображение только одно лицо. Более быстрый RCNN с основой ResNet очень хорошо работает для этой задачи. В качестве альтернативы есть также Yolov4 с DarkNet в качестве основы.
Самый простой подход - взять предварительно обученную модель Faster RCNN из Keras. В этом блоге объясняется простой подход для этого: https://www.sitepoint.com/keras-face-detection-recognition/