比较二张图片相似度包括人脸识别,接口用fastapi

####引入requestments.txt:

face_recognition==1.3.0
fastapi==0.111.0
numpy==1.26.4
opencv_python==4.9.0.80
Pillow==10.3.0
Requests==2.32.1
uvicorn==0.29.0

####二张图片相似度:

# -*- coding: utf-8 -*-
import os
import uuid
from PIL import Image
import requests
from io import BytesIO


# 对图片进行统一化处理
def get_thum(image, size=(64, 64), greyscale=False):
    if image is None:
        raise ValueError("Cannot process None image")
    image = image.resize(size, Image.ANTIALIAS)
    if greyscale:
        image = image.convert('L')
    return image


def getpic(image_url):
    random_filename = str(uuid.uuid4()) + '.jpg'
    try:
        response = requests.get(image_url)
        if response.status_code == 200:
            image_content = response.content
            image_stream = BytesIO(image_content)
            image = Image.open(image_stream)
            save_path = random_filename
            image.save(save_path)
            print(f'图片已保存到:{os.pa
预处理:读取图片 第一步,缩小尺寸。 将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。 第二步,简化色彩。 将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。 第三步,计算平均值。 计算所有64个像素的灰度平均值。 第四步,比较像素的灰度。 将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。 第五步,计算哈希值。 将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。 得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算"汉明距离"(Hammingdistance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。 你可以将几张图片放在一起,也计算出他们的汉明距离对比,就可以看看两张图片是否相似。 这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。 实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后再进行比较。 以上内容大部分直接从阮一峰的网站上复制过来,想看原著的童鞋可以去在最上面的链接点击进去看。
<think>嗯,用户想用若依框架,前端是Vue3+TS+Element Plus,集成人脸识别登录,而且要用开源的免费第三方插件。我得先理清楚整个流程,然后一步步分析怎么实现。 首先,我需要确认若依框架的结构。若依前后端分离版本,前端Vue,后端Spring Boot。用户已经用Vue3+TS+Element Plus,所以前端部分需要在这个基础上添加人脸识别功能。 人脸识别登录一般流程是:用户选择人脸登录,前端调用摄像头拍照,然后进行人脸检测,提取特征,发送到后端验证,返回结果。关键点在于前端如何调用摄像头和处理图像,后端如何进行人脸识别比对。 用户要求使用开源免费的第三方插件,所以得找合适的库。前端方面,tracking.js和face-api.js都是不错的选择,前者用于检测人脸位置,后者可以进行特征提取。不过face-api.js可能需要模型文件,虽然开源,但模型文件可能比较大,需要考虑加载速度。另外,还有TensorFlow.js的face-landmarks-detection,不过可能需要更多计算资源。 后端的话,可以考虑OpenCV或者dlib,这两个都是开源的。不过若依是Java后端,用OpenCV可能需要Java接口,或者用Python写服务,通过REST API调用。这里用户可能希望尽量用Java,所以可能需要找Java的人脸识别库,比如OpenCV Java版,或者DeepJavaLibrary(DJL),但DJL可能对用户来说有点复杂。另外,SeetaFace6是开源的,支持C++,可能需要JNI调用,集成起来麻烦些。 另一个思路是使用开源的Python库,比如face_recognition,然后写一个Python服务,通过HTTP和若依后端交互。不过这样会增加系统复杂度,需要部署Python服务,但可能开发起来更快,特别是如果团队熟悉Python的话。 现在用户可能更倾向于全Java栈,所以得看看有没有合适的Java库。或者,可能后端只需要存储用户的人脸特征数据,而前端将提取的特征发送过来比对。这样的话,后端可能不需要处理复杂的图像识别,只需要存储和比对特征向量。比如,用户注册时,前端提取特征并发送到后端保存;登录时,前端提取特征,后端比对相似度。 这样的话,后端的工作相对简单,主要用数据库存储特征向量,比对可以用余弦相似度或欧氏距离。但需要注意安全性和加密传输,因为人脸特征属于敏感信息。 接下来考虑具体实现步骤: 1. 前端调用摄像头:使用navigator.mediaDevices.getUserMedia获取视频流,在video元素显示。 2. 人脸检测:用tracking.js检测人脸区域,确认用户正对摄像头,然后截取图像。 3. 特征提取:可能需要用face-api.js或TensorFlow.js的模型提取特征向量。 4. 将特征向量发送到后端,与存储的特征进行比对。 5. 后端处理:存储用户特征,登录时进行比对,返回结果。 注册流程需要用户拍摄照片,提取特征,保存到数据库。登录时同样提取特征,查询数据库比对。 关于开源库的选择,前端使用face-api.js可能比较合适,因为它支持特征提取,而且有预训练的模型。虽然模型文件较大,但可以按需加载。后端的话,如果特征比对只是计算相似度,可能不需要复杂的库,用简单的向量计算即可。 安全问题需要考虑,比如传输是否加密,特征数据是否加密存储,防止中间人攻击。另外,人脸识别可能存在误识别,需要设置合适的阈值。 另外,用户可能需要活体检测,防止照片攻击。不过开源库可能没有现成的活体检测,可能需要通过动作指令(如眨眼、转头)来配合,但这样会增加前端逻辑的复杂度。如果用户不要求活体检测,可能可以暂时不做。 总结步骤: 前端部分: - 添加人脸登录按钮,跳转到人脸录入/识别页面。 - 调用摄像头,使用tracking.js或face-api.js检测人脸。 - 截取图像,提取特征,发送到后端。 后端部分: - 提供注册接口,保存用户ID和特征向量。 - 提供登录接口,接收特征向量,查找数据库中最相似的用户,返回token。 可能需要调整的若依原有代码: - 登录页添加人脸登录选项。 - 增加人脸注册和登录的API接口。 - 用户表添加人脸特征字段,或者单独的表存储。 注意事项: - 用户隐私和合规性,比如获取用户同意。 - 特征向量的存储安全,加密处理。 - 传输使用HTTPS。 - 前端处理浏览器的兼容性,比如Safari对getUserMedia的支持。 可能遇到的问题: - 人脸检测在低光照环境下的效果。 - 特征提取的准确性和速度。 - 后端比对性能,如果用户量大,可能需要优化特征检索,比如使用向量数据库。 这样分析下来,大致方案是可行的,但需要具体实现时注意细节,比如模型加载、特征处理等。可能需要分步骤实现,先完成基本的人脸检测和登录流程,再优化安全性和性能。</think>为了实现若依框架(Vue3 + TS + Element Plus)集成开源免费的人脸识别登录功能,以下是分步骤的实现方案和关键技术分析: --- ### **一、技术选型** #### **前端核心库** 1. **face-api.js** - **开源免费**:基于 TensorFlow.js 实现,支持人脸检测、特征提取和比对。 - **功能**:支持 68 点人脸特征检测、人脸匹配、实时摄像头处理。 - **模型文件**:需加载预训练的 `ssdMobilenetv1`(轻量级检测模型)和 `faceLandmark68Net`(特征点模型)。 2. **TensorFlow.js**(备选) - 支持自定义模型,但开发成本较高。 #### **后端核心库** 1. **OpenCV + JavaCV**(Java 生态) - 通过 Java 调用 OpenCV 进行人脸特征比对(需编译 OpenCV Java 库)。 2. **Python + face_recognition**(独立微服务) - **优势**:简单高效,直接调用 `face_recognition` 库的 API。 - **部署**:需将 Python 服务通过 REST API 暴露给若依后端。 --- ### **二、整体流程** 1. **注册流程** - 用户上传人脸照片 → 前端提取特征向量 → 后端保存特征值到数据库。 2. **登录流程** - 前端调用摄像头拍照 → 提取特征向量 → 后端比对特征值 → 返回登录结果。 --- ### **三、前端实现步骤** #### 1. **集成 face-api.js** ```bash npm install face-api.js ``` #### 2. **加载模型文件** ```typescript import * as faceapi from 'face-api.js'; async loadModels() { await faceapi.nets.ssdMobilenetv1.loadFromUri('/models'); await faceapi.nets.faceLandmark68Net.loadFromUri('/models'); } ``` #### 3. **调用摄像头并检测人脸** ```vue <template> <video ref="video" autoplay></video> <button @click="capture">拍照</button> </template> <script setup lang="ts"> import { ref } from 'vue'; const video = ref<HTMLVideoElement>(); const canvas = document.createElement('canvas'); async function startCamera() { const stream = await navigator.mediaDevices.getUserMedia({ video: {} }); video.value!.srcObject = stream; } async function capture() { // 检测人脸并提取特征 const detections = await faceapi.detectSingleFace( video.value!, new faceapi.SsdMobilenetv1Options() ).withFaceLandmarks(); if (detections) { const descriptor = await faceapi.computeFaceDescriptor( video.value!, detections.landmarks ); // 发送 descriptor 到后端 } } </script> ``` #### 4. **人脸比对逻辑** - 将注册和登录时的特征向量(`descriptor`)通过 HTTPS 发送到后端。 --- ### **四、后端实现步骤(以 Python 微服务为例)** #### 1. **Python 服务代码** ```python from fastapi import FastAPI import face_recognition app = FastAPI() @app.post("/register") def register(user_id: str, face_image: bytes): image = face_recognition.load_image_file(face_image) encoding = face_recognition.face_encodings(image)[0] # 保存 encoding 到数据库(如 Redis 或 MySQL) @app.post("/login") def login(face_image: bytes): image = face_recognition.load_image_file(face_image) login_encoding = face_recognition.face_encodings(image)[0] # 从数据库读取所有用户特征值进行比对 matches = face_recognition.compare_faces([saved_encoding], login_encoding) return {"result": matches[0]} ``` #### 2. **若依后端集成** - 新增 `/face-login` 接口,调用 Python 服务的 API。 --- ### **五、安全与优化** 1. **安全措施** - 使用 HTTPS 加密传输。 - 特征值存储时加密(如 AES)。 - 活体检测(可选):通过要求用户眨眼或转头增加安全性。 2. **性能优化** - 前端使用 Web Worker 处理人脸检测。 - 后端使用 Redis 缓存特征值,加速比对。 --- ### **六、注意事项** 1. **浏览器兼容性** - 需处理 Safari 的摄像头权限问题。 2. **用户体验** - 在摄像头未授权时提供友好提示。 - 添加加载动画等待模型初始化。 --- 通过以上方案,可在若依框架中实现开源免费的人脸识别登录功能,代码量可控且符合企业级安全要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老大白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值