29 lines
1.3 KiB
Python
29 lines
1.3 KiB
Python
import os, cv2, face_recognition
|
|
from pathlib import Path
|
|
from dotenv import load_dotenv
|
|
from mcp.server.fastmcp import FastMCP
|
|
load_dotenv();mcp=FastMCP("Alfred Face Recognition");DB=Path(os.getenv('FACE_DB','/home/hermes/faces'));T=float(os.getenv('FACE_TOLERANCE','0.48'))
|
|
def encodings():
|
|
known=[]
|
|
for person in DB.iterdir() if DB.exists() else []:
|
|
if not person.is_dir():continue
|
|
for f in person.glob('*'):
|
|
try:
|
|
im=face_recognition.load_image_file(str(f)); es=face_recognition.face_encodings(im)
|
|
if es:known.append((person.name,es[0]))
|
|
except Exception:pass
|
|
return known
|
|
@mcp.tool()
|
|
def identify_people(camera_index:int=0):
|
|
cap=cv2.VideoCapture(camera_index);ok,frame=cap.read();cap.release()
|
|
if not ok:raise RuntimeError('Caméra indisponible')
|
|
rgb=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB); locs=face_recognition.face_locations(rgb); es=face_recognition.face_encodings(rgb,locs); known=encodings();out=[]
|
|
for e in es:
|
|
name='inconnu';best=T
|
|
for n,k in known:
|
|
d=face_recognition.face_distance([k],e)[0]
|
|
if d<best:name,best=n,d
|
|
out.append({'name':name,'distance':float(best)})
|
|
return {'count':len(out),'people':out,'unknown_count':sum(x['name']=='inconnu' for x in out)}
|
|
if __name__=='__main__':mcp.run()
|