免费开源人脸识别系统 —— CompreFace
CompreFace 是一个强大的开源人脸识别系统,提供了灵活的 API 接口和多种人脸识别功能。你可以在 GitHub 上找到项目源码:
GitHub 地址:https://github.com/exadel-inc/CompreFace
在 Linux 环境下部署
1. 安装必要环境
确保已安装 Docker 和 Docker Compose。
2. 下载 CompreFace
3. 解压存档
解压下载的文件,进入解压后的文件夹。
4. 启动服务
在文件夹中打开终端,运行以下命令启动服务:
docker-compose up -d
5. 访问服务
打开浏览器,访问以下地址进入管理界面:
http://localhost:8000/login
在 Windows 环境下部署
部署流程与 Linux 基本相同,唯一的区别是需要通过 cmd 进入解压后的文件夹,然后运行以下命令启动服务:
docker-compose up -d
配置人脸识别功能
1. 创建应用
进入管理界面后,点击 “创建应用”,填写应用名称完成创建。
2. 创建功能
进入应用后,点击 “创建功能”,可以选择以下功能之一:
人脸检测(Detection)
人脸识别(Recognition)
人脸验证(Verification)
这里我们选择 人脸识别(Recognition) 功能。
3. 配置人员库
(1)添加主题
填写主题名称,创建一个人员分类。
(2)上传人脸照片
点击虚线框区域,选择包含人脸照片的文件夹上传。
支持批量上传图片。
可通过 bulk select 批量删除已上传图片。
4. 测试功能
点击左侧菜单的 “Test”,上传一张测试图片。
系统会自动识别照片中的人脸,给出所属分类及相似度结果。
此外,CompreFace 还可以识别性别和年龄信息。
应用场景
CompreFace 的人脸识别功能可以应用于多个场景,例如:
判断某人是否属于特定组织。
验证某人是否为指定身份。
如何调用摄像头结合接口?
调用流程
通过 Python 结合 OpenCV 和 CompreFace 的 API,可以实现实时摄像头人脸识别。具体步骤如下:
安装依赖:
pip install opencv-python requests
使用代码进行调用:
捕获摄像头每一帧画面并截图。
使用
requests
模块将截图发送到 CompreFace 的 API 接口进行识别。
以下是示例代码:
import cv2
import requests
# CompreFace API的URL和认证信息
COMPREFACE_API_URL = "http://192.168.1.59:8000/api/v1/recognition/recognize?face_plugins=landmarks,gender,age,pose"
API_KEY = "5d8abd38-fbe8-46a8-b158-xxxxxxxxxx"
# 启动摄像头捕获
cap = cv2.VideoCapture(0) # 0代表笔记本的内建摄像头
if not cap.isOpened():
print("无法打开摄像头")
exit()
while True:
# 捕获视频流中的一帧图像
ret, frame = cap.read()
if not ret:
print("无法从摄像头获取图像")
break
# 显示当前捕获的图像
cv2.imshow('Video Stream', frame)
# 将图像保存为临时文件
image_path = 'temp_image.jpg'
cv2.imwrite(image_path, frame)
# 准备上传文件
with open(image_path, 'rb') as img_file:
files = {'file': img_file}
headers = {'x-api-key': API_KEY}
# 发送POST请求到CompreFace API进行人脸识别
response = requests.post(COMPREFACE_API_URL, headers=headers, files=files)
if response.status_code == 200:
result = response.json()
print("识别到人脸:", result)
else:
print(f"请求失败,状态码: {response.status_code}")
print("错误信息:", response.text)
# 按 'q' 键退出监控
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()
效果如下: