Как проверить, содержит ли изображение лицо или нет, прежде чем сохранить его в каталог мультимедиа?

Я работаю с 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/

Вернуться на верх