FacenetPytorch人脸识别方案--基于米尔全志T527开发板

2024-11-28

1059

来源:米尔电子
本篇测评由电子工程世界的优秀测评者“小火苗”提供。
本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志 T527开发板)的FacenetPytorch人脸识别方案测试。
一、facenet_pytorch算法实现人脸识别
深度神经网络
1.简介
Facenet-PyTorch 是一个基于 PyTorch 框架实现的人脸识别库。它提供了 FaceNet 模型的 PyTorch 实现,可以用于训练自己的人脸识别模型。FaceNet 是由 Google 研究人员提出的一种深度学习模型,专门用于人脸识别任务。
在利用PyTorch神经网络算法进行人脸图像对比的实验设置中,我们专注于对比环节,而不涉及实际项目的完整实现细节。但55555贴近实际应用,我们可以构想以下流程:
1)捕捉新人脸图像:首先,我们使用摄像头或其他图像采集设备捕捉一张新的人脸照片。
2)加载存储的人脸图像:接着,从数据库中加载所有已存储的人脸图像。这些图像是之前采集并存储的,用于与新捕捉到的人脸照片进行对比。
3)构建神经网络模型:为了实现对比功能,我们需要一个预先训练好或自定义的神经网络模型。这个模型能够提取人脸图像中的关键特征,使得相似的图像在特征空间中具有相近的表示。
4)特征提取:利用神经网络模型,对新捕捉到的人脸照片和存储的每一张人脸图像进行特征提取。这些特征向量将用于后续的对比计算。
5)计算相似度:采用合适的相似度度量方法(如余弦相似度、欧氏距离等),计算新照片特征向量与存储图像特征向量之间的相似度。
6)确定匹配图像:根据相似度计算结果,找到与新照片相似度最高的存储图像,即认为这两张图像匹配成功。
7)输出匹配结果:最后,输出匹配成功的图像信息或相关标识,以完成人脸对比的实验任务。
2.核心组件
MTCNN:Multi-task Cascaded Convolutional Networks,即多任务级联卷积网络,专门设计用于同时进行人脸检测和对齐。它在处理速度和准确性上都有出色的表现,是当前人脸检测领域的主流算法之一。
FaceNet:由Google研究人员提出的一种深度学习模型,专门用于人脸识别任务。FaceNet通过将人脸图像映射到一个高维空间,使得同一个人的不同图像在这个空间中的距离尽可能小,而不同人的图像距离尽可能大。这种嵌入表示可以直接用于人脸验证、识别和聚类。
3.功能
支持人脸检测:使用MTCNN算法进行人脸检测,能够准确识别出图像中的人脸位置。
支持人脸识别:使用FaceNet算法进行人脸识别,能够提取人脸特征并进行相似度计算,实现人脸验证和识别功能。
二、安装facenet_pytorch库
1.更新系统
更新ubuntu系统,详情查看米尔提供的资料文件
2.更新系统软件
apt-get update
3.安装git等支持软件
sudo apt-get install -y python3-dev python3-pip libopenblas-dev libssl-dev libffi-dev git cmake
4.安装Pytorch支持工具
# 克隆 PyTorch 源代码
git clone --recursive https://github.com/pytorch/pytorch
# 进入 PyTorch 目录
cd pytorch
# 安装 PyTorch (需要根据你的需求选择 CUDA 版本,如果不需要 GPU 支持则不需要 --cuda 参数)
pip3 install --no-cache-dir torch -f https://download.pytorch.org/whl/torch_stable.html
# 测试 PyTorch 安装
python3 -c "import torch; print(torch.__version__)"
5.安装facenet_pytorch
pip3 install facenet_pytorch
三、CSDN参考案例
1.代码实现
############face_demo.py#############################
import cv2
import torch
from facenet_pytorch import MTCNN, InceptionResnetV1
# 获得人脸特征向量
def load_known_faces(dstImgPath, mtcnn, resnet):
aligned = []
knownImg = cv2.imread(dstImgPath) # 读取图片
face = mtcnn(knownImg) # 使用mtcnn检测人脸,返回人脸数组
if face is not None:
aligned.append(face[0])
aligned = torch.stack(aligned).to(device)
with torch.no_grad():
known_faces_emb = resnet(aligned).detach().cpu()
# 使用ResNet模型获取人脸对应的特征向量
print("n人脸对应的特征向量为:n", known_faces_emb)
return known_faces_emb, knownImg
# 计算人脸特征向量间的欧氏距离,设置阈值,判断是否为同一张人脸
def match_faces(faces_emb, known_faces_emb, threshold):
isExistDst = False
distance = (known_faces_emb[0] - faces_emb[0]).norm().item()
print("n两张人脸的欧式距离为:%.2f" % distance)
if (distance < threshold):
isExistDst = True
return isExistDst
if __name__ == '__main__':
# help(MTCNN)
# help(InceptionResnetV1)
# 获取设备
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# mtcnn模型加载设置网络参数,进行人脸检测
mtcnn = MTCNN(min_face_size=12, thresholds=[0.2, 0.2, 0.3],
keep_all=True, device=device)
# InceptionResnetV1模型加载用于获取人脸特征向量
resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)
MatchThreshold = 0.8 # 人脸特征向量匹配阈值设置
known_faces_emb, _ = load_known_faces('yz.jpg', mtcnn, resnet) # 已知人物图
faces_emb, img = load_known_faces('yz1.jpg', mtcnn, resnet) # 待检测人物图
isExistDst = match_faces(faces_emb, known_faces_emb, MatchThreshold) # 人脸匹配
print("设置的人脸特征向量匹配阈值为:", MatchThreshold)
if isExistDst:
boxes, prob, landmarks = mtcnn.detect(img, landmarks=True)
print('由于欧氏距离小于匹配阈值,故匹配')
else:
print('由于欧氏距离大于匹配阈值,故不匹配')
此代码是使用训练后的模型程序进行使用,在程序中需要标明人脸识别对比的图像。
2.实践过程
第一次运行时系统需要下载预训练的vggface模型,下载过程较长,后面就不需要在下载了运行会很快。如图所示:
3.程序运行异常被终止
运行程序,提示killed,系统杀死了本程序的运行,经过多方面的测试,最终发现是识别的图片过大,使得程序对内存消耗过大导致。后将图片缩小可以正常运行了。
以下是对比图像和对比结果。
四、gitHub开源代码
1.首先下载代码文件
代码库中,大致的介绍了facenet算法的训练步骤等。
2.代码实现
以下是facenet的python代码,注意需要更改下面的一条程序"cuda" False,因为t527使用的是cpu,芯片到时自带gpu但是cuda用不了,因为cuda是英伟达退出的一种计算机架构。
import matplotlib.pyplot as plt
import numpy as np
import torchimport torch.backends.cudnn as cudnn
from nets.facenet import Facenet as facenet
from utils.utils import preprocess_input, resize_image, show_config
#--------------------------------------------#
# 使用自己训练好的模型预测需要修改2个参数
# model_path和backbone需要修改!
#--------------------------------------------#
class Facenet(object):
_defaults = {
#--------------------------------------------------------------------------#
# 使用自己训练好的模型进行预测要修改model_path,指向logs文件夹下的权值文件
# 训练好后logs文件夹下存在多个权值文件,选择验证集损失较低的即可。
# 验证集损失较低不代表准确度较高,仅代表该权值在验证集上泛化性能较好。
#--------------------------------------------------------------------------#
"model_path" : "model_data/facenet_mobilenet.pth",
#--------------------------------------------------------------------------#
# 输入图片的大小。
#--------------------------------------------------------------------------#
"input_shape" : [160, 160, 3],
#--------------------------------------------------------------------------#
# 所使用到的主干特征提取网络
#--------------------------------------------------------------------------#
"backbone" : "mobilenet",
#-------------------------------------------#
# 是否进行不失真的resize
#-------------------------------------------#
"letterbox_image" : True,
#-------------------------------------------#
# 是否使用Cuda# 没有GPU可以设置成False
#-------------------------------------------#
"cuda" : False,
}
@classmethod
def get_defaults(cls, n):
if n in cls._defaults:
return cls._defaults[n]
else:
return "Unrecognized attribute name '" + n + "'"
#---------------------------------------------------#
# 初始化Facenet
#---------------------------------------------------#
def __init__(self, **kwargs):
self.__dict__.update(self._defaults)
for name, value in kwargs.items():
setattr(self, name, value)
self.generate()
show_config(**self._defaults)
def generate(self):
#---------------------------------------------------#
# 载入模型与权值
#---------------------------------------------------#
print('Loading weights into state dict...')
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
self.net = facenet(backbone=self.backbone, mode="predict").eval()
self.net.load_state_dict(torch.load(self.model_path, map_location=device), strict=False)
print('{} model loaded.'.format(self.model_path))
if self.cuda:
self.net = torch.nn.DataParallel(self.net)
cudnn.benchmark = True
self.net = self.net.cuda()
#---------------------------------------------------#
# 检测图片
#---------------------------------------------------#
def detect_image(self, image_1, image_2):
#---------------------------------------------------#
# 图片预处理,归一化
#---------------------------------------------------#
with torch.no_grad():
image_1 = resize_image(image_1, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
image_2 = resize_image(image_2, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
photo_1 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_1, np.float32)), (2, 0, 1)), 0))
photo_2 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_2, np.float32)), (2, 0, 1)), 0))
if self.cuda:
photo_1 = photo_1.cuda()
photo_2 = photo_2.cuda()
#---------------------------------------------------#
# 图片传入网络进行预测
#---------------------------------------------------#
output1 = self.net(photo_1).cpu().numpy()
output2 = self.net(photo_2).cpu().numpy()
#---------------------------------------------------#
# 计算二者之间的距离
#---------------------------------------------------#
l1 = np.linalg.norm(output1 - output2, axis=1)
plt.subplot(1, 2, 1)
plt.imshow(np.array(image_1))
plt.subplot(1, 2, 2)
plt.imshow(np.array(image_2))
plt.text(-12, -12, 'Distance:%.3f' % l1, ha='center', va= 'bottom',fontsize=11)
plt.show()
return l1
3.代码实现
此代码调用的签名的代码,但其可以直接的去调用图片进行人脸识别。
from PIL import Image
from facenet import Facenet
if __name__ == "__main__":
model = Facenet()
while True:
image_1 = input('Input image_1 filename:')
try:
image_1 = Image.open(image_1)
except:
print('Image_1 Open Error! Try again!')
continue
image_2 = input('Input image_2 filename:')
try:
image_2 = Image.open(image_2)
except:
print('Image_2 Open Error! Try again!')
continue
probability = model.detect_image(image_1,image_2)
print(probability)
4.程序运行
运行程序后首先显示的是程序的配置信息,然后可以输入图像对比检测的内容。以下是图像识别的效果和对比的准确率。
五、参考文献
CSDN博客
https://blog.csdn.net/weixin_45939929/article/details/124789487?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-124789487-blog-142987324.235^v43^pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.2&utm_relevant_index=4
官方源码来源
https://gitcode.com/gh_mirrors/fac/facenet-pytorch/overview
*部分图片来源于网络,如有版权问题请联系删除
2025-05-08
米尔基于MYD-YG2LX系统启动时间优化应用笔记
1.概述MYD-YG2LX采用瑞萨RZ/G2L作为核心处理器,该处理器搭载双核Cortex-A55@1.2GHz+Cortex-M33@200MHz处理器,其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元(支持H.264硬件编解码),16位的DDR4-1600 / DDR3L-1333内存控制器、千兆以太网控制器、USB、CAN、SD卡、MIPI-CSI等外设接口
2025-04-25
喜讯!米尔电子与安路科技达成IDH生态战略合作,共筑FPGA创新生态
以芯为基,智创未来。近日,领先的嵌入式模组厂商-米尔电子正式与国产FPGA企业安路科技达成IDH生态战略合作。双方将围绕安路科技飞龙SALDRAGON系列高性能FPSoC,联合开发核心板、开发板及行业解决方案,助力开发者开发成功,加速工业控制、边缘智能、汽车电子等领域的创新应用落地。米尔电子&安路科技IDH生态合作证书硬核技术+生态协同安路科技作为国产FPGA领域的标杆企业,其S
2025-04-25
名单揭晓,狂送30套开发板!米尔-安路飞龙派「硬核创造力」
经过米尔电子和安路科技的严格筛选,30位「硬核玩家」从千帆竞逐中脱颖而出,正式成为米尔-安路飞龙派创意秀的玩家。开发者们将以MYD-YM90X开发板为起点,开启一场FPGA的盛宴,在安路飞龙派的赛道上探索无限可能!现将入选的30位开发者/团队名单公布如下(排名不分先后):入选名单后续流程第一步:板卡领取入选的开发者将在近日收到米尔工作人员的联系,我们将为您提供专属优惠券,以便您以1元的价格在myi
2025-04-17
如何在米尔-STM32MP257开发板上实现环境监测系统
本文将介绍基于米尔电子MYD-LD25X开发板(米尔基于STM35MP257开发板)的环境监测系统方案测试。摘自优秀创作者-lugl4313820一、前言环境监测是当前很多场景需要的项目,刚好我正在论坛参与的一个项目:Thingy:91X 蜂窝物联网原型开发平台的试用。把两个项目结合起来,实现一个简单的环境监测系统。二、硬件平台1、米尔-STM32MP257开发板2、Thingy:91X三、项目规
2025-04-10
OpenCV行人检测应用方案--基于米尔全志T527开发板
本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV行人检测方案测试。摘自优秀创作者-小火苗一、软件环境安装1.安装OpenCVsudoapt-getinstalllibopencv-devpython3-opencv2.安装pipsudoapt-getinstallpython3-pip二、行人检测概论使用HOG和SVM构建行人检测器的关键步骤包括:准备训练
2025-04-03
免费送30套开发板!米尔-安路飞龙派创意秀限时活动
大赛简介为鼓励工程师勇于创新探索的精神,提升实践动手能力,更深度的体验安路飞龙派产品,米尔电子发起“米尔基于安路DR1M90开发板创意秀”,提供米尔安路DR1M90开发板支持开发者创新应用。报名条件:需关注米尔电子公众号的用户;报名对象:面向企业、创客团队、工程师、电子爱好者、研究院等人士,不限个人或团体形式参赛。大赛日程01-活动申请【时间:即日起-2025/04/21】在线填《报名申请表》(见
2025-03-20
一篇文章玩转T113的ARM+RSIC V+DSP三核异构!
近年来,随着半导体产业的快速发展和技术的不断迭代,物联网设备种类繁多(如智能家居、工业传感器),对算力、功耗、实时性要求差异大,单一架构无法满足所有需求。因此米尔推出MYD-YT113i开发板(基于全志T113-i)来应对这一市场需求。米尔基于全志T113-i核心板及开发板part 01T113-i芯片及OpenAMP简介T113-i芯片简介T113-i由两颗ARM A7 、一颗C906(RISC
2025-03-13
ST×米尔STM32MP25x高阶实战培训会
STM32MP25x是ST推出的搭载了双核Cortex-A35@1.5 GHz和Cortex-M33@400 MHz的微处理器。米尔电子基于STM32MP25x推出了MYD-LD25X开发板,开发板配备丰富的扩展接口。为助力开发者深度掌握与应用STM32MP25x处理器,米尔将与ST在2025年4月11日和2025年4月18日分别于深圳、上海联合举办线下高阶实战培训会,本次培训在上一期“Bring
2025-03-13
瑞萨交流日进行中,米尔演讲-RZ/T2H高性能模组赋能工业产品创新
3月12日,2025瑞萨工业以太网技术日在深圳拉开序幕。会议全方位解读瑞萨电子最新EtherCAT/PROFINET/EIP解决方案,洞察行业发展趋势,助力企业高效开发更具竞争力的工业以太网产品。米尔电子作为瑞萨的IDH生态合作伙伴发表演讲,并展出RZ/T2H的核心板开发板、技术方案等。米尔活动现场会上,米尔电子产品经理张先生发表了题为"米尔RZ/T2H高性能模组赋能工业产品创新&quo
2025-03-13
米尔闪耀德国纽伦堡Embedded World 2025,展现嵌入式技术无限可能
2025年3月11日,全球领先的嵌入式解决方案提供商米尔电子,在德国纽伦堡盛大亮相全球规模最大的嵌入式系统展览会Embedded World 2025。此次展会,米尔电子携多款重磅新品和前沿技术方案惊艳登场,为嵌入式开发者带来了一场科技盛宴。米尔展台现场展会现场,米尔电子展示全系列产品,基于国内外知名厂商ST、TI、NXP、瑞萨、AMD(Xilinx)、瑞芯微、全志、新唐、芯驰、海思、紫光同创等主