这里我是用了frp进行内网穿透的
face_recognition_pypi
在安装face_recognition
的时候,需要安装dlib
,Ubuntu
可以参考我另一篇文章
由于再使用face_recognition
的时候要编译C++
,服务器再编译C++
的时候,内存不够或者是配置不够,导致一直编译失败。
所以使用frp对服务器开放一个端口映射到本地电脑
穿透方法
- 在frp下载对应电脑版本的frp.如果服务器和本地电脑系统不一样也是可以的.
- 解压下回来的文件,把
frpc
和frpc.ini
文件留在本地电脑,frps
和frps.ini
放在服务器上面。
配置文件就根据frp文档设置.
要先确保本地的face_recognition能用
django下的设置
前端的代码:
页面很简陋
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'image_upload' %}" method="post" enctype="multipart/form-data" >
{% csrf_token %}
上传:
<input type="file" name="picture1">
<input type="submit" value="上传">
</form>
<form action="{% url 'image_upload2' %}" method="post" enctype="multipart/form-data" >
{% csrf_token %}
上传:
<input type="file" name="picture2">
<input type="submit" value="上传">
</form>
<br>
<a href="{% url 'face_test' %}"><button>识别</button>
{# <button onclick={% url 'face_test' %}>识别</button>#}
</a>
<h1>返回值:{{ info }}</h1>
</body>
</html>
django一些基础的设置,就不列出来了
forms.py
class UploadImageForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ['image', ]
view.py
代码
大概的意思就是,先保存用全局变量保存两张图片,然后调用识别函数的时候,再进行识别
from io import BytesIO
from PIL import Image
import numpy as np
class UploadImageView(View):
def post(self, request):
# data = request.FILES.get('image', None)
name1 = request.FILES.get('picture1')
name1 = str(name1)
img_bytes = request.FILES.get('picture1').read()
im = Image.open(BytesIO(img_bytes))
im.convert('RGB')
global picture1
picture1 = np.array(im)
image_form = UploadImageForm(
request.POST, request.FILES, instance=request.user)
if image_form.is_valid():
image_form.save()
# # 取出cleaned data中的值,一个dict
# image = image_form.cleaned_data['image']
# request.user.image = image
# request.user.save()
return render(request, 'test.html', {'info': '已上传'+name1})
else:
return HttpResponse(
'{"status":"fail"}',
content_type='application/json')
class UploadImageView2(View):
# login_url = '/login/'
# redirect_field_name = 'next'
def post(self, request):
name2 = request.FILES.get('picture2')
name2 = str(name2)
img_bytes = request.FILES.get('picture2').read()
# print(name)
# convert_img_raw_data = base64.b64decode(img_b64_string)
im = Image.open(BytesIO(img_bytes))
im.convert('RGB')
global picture2
picture2 = np.array(im)
# 这时候用户上传的文件就已经被保存到imageform了 ,为modelform添加instance值直接保存
image_form = UploadImageForm2(
request.POST, request.FILES, instance=request.user)
if image_form.is_valid():
image_form.save()
# # 取出cleaned data中的值,一个dict
# image = image_form.cleaned_data['image']
# request.user.image = image
# request.user.save()
return render(request, 'test.html', {'info': '已上传'+name2 })
else:
return HttpResponse(
'{"status":"fail"}',
content_type='application/json')
def face_test(request):
# -*- coding:utf-8 -*-
# Author: cmzz
# @Time :19-2-21
import face_recognition
# f = open(1, 'rb')
# photo1 = f.read()
# f2 = open(2, 'rb')
# photo2 = f2.read()
# picture_of_me = face_recognition.load_image_file("")
my_face_encoding = face_recognition.face_encodings(picture1)[0]
# my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]
# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face!
# unknown_picture = face_recognition.load_image_file("")
unknown_face_encoding = face_recognition.face_encodings(picture2)[0]
# Now we can see the two face encodings are of the same person with `compare_faces`!
results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)
if results[0] == True:
result= "是同一个人"
else:
result = "不是同一个人"
# f.close()
# f2.close()
return render(request, 'test.html', {'info': result})
识别如下:
总体来说识别率还是挺高的,识别速度也还可以.大概就是1秒左右,face_recognition不单单只有这个功能,还有其他功能,有需要的可以在文章开头上面找到face_recognition的链接进行学习