人脸识别无法检测非肖像照片中的人脸。

3

我尝试使用这个链接提供的人脸识别功能:人脸识别

然后像这样修改代码,main.py:

#!/usr/bin/env python
import cgitb, cgi
cgitb.enable()
print("Content-Type: text/html;charset=utf-8")

print "Content-type:text/html\r\n\r\n"
import base64
import simplejson as json
import re
import face_recognition
import numpy as np
import io
from imageio import imread
from PIL import Image
import datetime
import os, errno
import shutil

params = cgi.FieldStorage()
now = datetime.datetime.now()
date = str(now)
date2 = date.replace(" ","")
img = params.getvalue('img')
data1 = json.loads(img)
data2 = data1['img2']['data']

numparray = data1['img1']
numparray2 = numparray.replace(" ", "+")

b=bytes(numparray2)
imgdata = base64.b64decode(b)

os.makedirs(date2)
with open(date2+"/img1.png", "wb") as f:
    f.write(imgdata)

image = face_recognition.load_image_file(date2+'/img1.png')

try:
    face_encode = face_recognition.face_encodings(image)[0]
    #print("face_encode = ".format(face_encode))
except IndexError:
    print("encode image failed")
    quit()

known_faces = []
y = 1
for images in data2:
    ir = images.replace(" ", "+")
    ib = bytes(ir)
    imagedata = base64.b64decode(ib)
    x = str(y)
    with open(date2+"/compare"+x+".png", "wb") as g:
        g.write(imagedata)
    compare = face_recognition.load_image_file(date2+"/compare"+x+".png")
    try:
        compare_encode = face_recognition.face_encodings(compare)[0]
        #print("face_encode = ".format(face_encode))
    except IndexError:
        print("encode image compare failed")
        quit()
    known_faces.append(compare_encode)
    y = y+1

results = face_recognition.face_distance(known_faces, face_encode)

datahasil = []
#hasilakhir = "{"
for i, face_distance in enumerate(results):
    h = "{:.2}".format(face_distance, i)
    #hasilakhir = hasilakhir+"compare{}"
    datahasil.append(h)

hasilakhir = ','.join(datahasil)

shutil.rmtree(date2, ignore_errors=True)

print("{\"hasilcompare\" : \"" +hasilakhir+ "\"}")

最终结果是比较两张图片并给出分数,如果图像是肖像照,则比较成功。但是,当其中一张图片不是肖像照(脸部不在肖像位置)或者脸部角度超过90度时,就会产生错误信息,捕获编码失败。
我曾尝试使用人脸检测的方法,在将2张图片发送到main.py进行检测之前先检测图像中的人脸,但当它无法检测到人脸时,我尝试旋转图像直到代码检测到人脸,但有时候人脸检测可以检测到90度角度的人脸,但在面部识别(main.py)中仍然无法读取面部。
code of rotate is here, rotate.py:import numpy as np
import cv2
from scipy import ndimage, misc
import os
from PIL import Image


face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

for counter in range (0, 4):
    img = cv2.imread('img/1.jpg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    if(len(faces) == 1):
        i = False
        print ("face found")
        break
    else:
        print("no face found")
        i = False
        img = Image.open("img/1.jpg")
        img.rotate(90).save("img/1.jpg")
1个回答

0

是的,我认为这是库的问题。我在同一张图片上进行了测试。一次是在旋转后的图像上,一次是在原始图像上。它无法检测到旋转后的图像,face_locationsface_encodings都是空列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接