将人脸识别功能部署为独立的API服务,通过HTTP请求的方式提供给机器人调用,实现功能与业务逻辑的解耦。
| 接口 | 方法 | 功能 | 请求体 | 响应 |
|---|---|---|---|---|
/api/recognize |
POST | 识别人脸 | {"image": "base64编码的图像"} |
{"detected": true, "faces": [...]} |
/api/add-face |
POST | 添加人脸 | {"name": "用户名", "image": "base64编码的图像"} |
{"success": true, "message": "添加成功"} |
/api/database |
GET | 获取数据库信息 | N/A | {"face_count": 5, "faces": ["张三", "李四"]} |
/api/health |
GET | 健康检查 | N/A | {"status": "healthy"} |
/api/recognize)请求:
{
"image": "base64编码的图像数据",
"threshold": 0.6 (可选)
}
响应:
{
"success": true,
"detected": true,
"faces": [
{
"name": "张三",
"confidence": 0.98,
"similarity": 0.85,
"bbox": [100, 100, 200, 200]
}
],
"count": 1
}
/api/add-face)请求:
{
"name": "张三",
"image": "base64编码的图像数据"
}
响应:
{
"success": true,
"message": "人脸添加成功",
"name": "张三"
}
face-recognition-api/
├── app/
│ ├── __init__.py
│ ├── api.py # API路由
│ ├── face_service.py # 人脸识别服务
│ └── utils.py # 工具函数
├── config.py # 配置文件
├── Dockerfile # Docker配置
├── requirements.txt # 依赖管理
└── run.py # 启动脚本
app/face_service.pyfrom face_recognition_api import FaceRecognitionAPI
class FaceService:
def __init__(self):
self.face_api = FaceRecognitionAPI()
def recognize(self, image):
"""识别人脸"""
return self.face_api.detect_and_recognize(image)
def add_face(self, name, image):
"""添加人脸"""
# 实现添加人脸逻辑
pass
def get_database_info(self):
"""获取数据库信息"""
return self.face_api.get_database_info()
app/api.pyfrom flask import Flask, request, jsonify
from app.face_service import FaceService
import base64
import cv2
import numpy as np
app = Flask(__name__)
face_service = FaceService()
@app.route('/api/recognize', methods=['POST'])
def recognize():
data = request.json
image_data = data.get('image')
# 解码base64图像
image = base64_to_cv2(image_data)
# 识别人脸
results = face_service.recognize(image)
return jsonify({
"success": True,
**results
})
@app.route('/api/add-face', methods=['POST'])
def add_face():
data = request.json
name = data.get('name')
image_data = data.get('image')
# 解码base64图像
image = base64_to_cv2(image_data)
# 添加人脸
success = face_service.add_face(name, image)
return jsonify({
"success": success,
"message": "添加成功" if success else "添加失败"
})
def base64_to_cv2(base64_string):
"""将base64字符串转换为cv2图像"""
import base64
import numpy as np
import cv2
# 移除base64头部
if ',' in base64_string:
base64_string = base64_string.split(',')[1]
# 解码
image_data = base64.b64decode(base64_string)
image_array = np.frombuffer(image_data, dtype=np.uint8)
image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
return image
DockerfileFROM python:3.8-slim
WORKDIR /app
# 安装依赖
RUN apt-get update && apt-get install -y \
libgl1-mesa-glx \
libglib2.0-0 \
fonts-wqy-microhei \
fonts-wqy-zenhei \
&& rm -rf /var/lib/apt/lists/*
# 复制文件
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 暴露端口
EXPOSE 5000
# 启动服务
CMD ["python", "run.py"]
requirements.txtFlask==2.0.1
numpy==1.24.3
opencv-python==4.5.5.64
insightface==0.7.3
freetype-py==2.3.0
Pillow==8.4.0
run.py)from app.api import app
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False)
import requests
import base64
import cv2
def recognize_face(image_path):
# 读取图像并编码为base64
with open(image_path, 'rb') as f:
image_data = f.read()
base64_image = base64.b64encode(image_data).decode('utf-8')
# 发送请求
response = requests.post(
'http://localhost:5000/api/recognize',
json={'image': base64_image},
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
return response.json()
# 使用示例
result = recognize_face('test.jpg')
print(result)
def handle_face_recognition():
# 拍照
image = capture_image()
# 调用API
result = recognize_face(image)
if result['detected']:
for face in result['faces']:
if face['name'] != 'Unknown':
return f"你好,{face['name']}!"
return "你好,陌生人!"
此方案既保留了现有人脸识别功能的完整性,又提供了灵活的API调用方式