當前位置:首頁 > 廠商動態(tài) > 米爾電子
[導讀]Facenet-PyTorch 是一個基于 PyTorch 框架實現的人臉識別庫。它提供了 FaceNet 模型的 PyTorch 實現,可以用于訓練自己的人臉識別模型。FaceNet 是由 Google 研究人員提出的一種深度學習模型,專門用于人臉識別任務。

本文將介紹基于米爾電子MYD-LT527開發(fā)板(米爾基于全志 T527開發(fā)板)的FacenetPytorch人臉識別方案測試。

一、深度神經網絡

1.簡介

Facenet-PyTorch 是一個基于 PyTorch 框架實現的人臉識別庫。它提供了 FaceNet 模型的 PyTorch 實現,可以用于訓練自己的人臉識別模型。FaceNet 是由 Google 研究人員提出的一種深度學習模型,專門用于人臉識別任務。

在利用PyTorch神經網絡算法進行人臉圖像對比的實驗設置中,我們專注于對比環(huán)節(jié),而不涉及實際項目的完整實現細節(jié)。但為了貼近實際應用,我們可以構想以下流程:

1)捕捉新人臉圖像:首先,我們使用攝像頭或其他圖像采集設備捕捉一張新的人臉照片。

2)加載存儲的人臉圖像:接著,從數據庫中加載所有已存儲的人臉圖像。這些圖像是之前采集并存儲的,用于與新捕捉到的人臉照片進行對比。

3)構建神經網絡模型:為了實現對比功能,我們需要一個預先訓練好或自定義的神經網絡模型。這個模型能夠提取人臉圖像中的關鍵特征,使得相似的圖像在特征空間中具有相近的表示。

4)特征提?。豪蒙窠浘W絡模型,對新捕捉到的人臉照片和存儲的每一張人臉圖像進行特征提取。這些特征向量將用于后續(xù)的對比計算。

5)計算相似度:采用合適的相似度度量方法(如余弦相似度、歐氏距離等),計算新照片特征向量與存儲圖像特征向量之間的相似度。

6)確定匹配圖像:根據相似度計算結果,找到與新照片相似度最高的存儲圖像,即認為這兩張圖像匹配成功。

7)輸出匹配結果:最后,輸出匹配成功的圖像信息或相關標識,以完成人臉對比的實驗任務。

2.核心組件

MTCNN:Multi-task Cascaded Convolutional Networks,即多任務級聯(lián)卷積網絡,專門設計用于同時進行人臉檢測和對齊。它在處理速度和準確性上都有出色的表現,是當前人臉檢測領域的主流算法之一。

FaceNet:由Google研究人員提出的一種深度學習模型,專門用于人臉識別任務。FaceNet通過將人臉圖像映射到一個高維空間,使得同一個人的不同圖像在這個空間中的距離盡可能小,而不同人的圖像距離盡可能大。這種嵌入表示可以直接用于人臉驗證、識別和聚類。

米爾基于全志T527開發(fā)板

3.功能

支持人臉檢測:使用MTCNN算法進行人臉檢測,能夠準確識別出圖像中的人臉位置。

支持人臉識別:使用FaceNet算法進行人臉識別,能夠提取人臉特征并進行相似度計算,實現人臉驗證和識別功能。

二、安裝facenet_pytorch庫

1.更新系統(tǒng)

更新ubuntu系統(tǒng),詳情查看米爾提供的資料文件

2.更新系統(tǒng)軟件

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.實踐過程

第一次運行時系統(tǒng)需要下載預訓練的vggface模型,下載過程較長,后面就不需要在下載了運行會很快。如圖所示:

3.程序運行異常唄終止

運行程序,提示killed,系統(tǒng)殺死了本程序的運行,經過多方面的測試,最終發(fā)現是識別的圖片過大,使得程序對內存消耗過大導致。后將圖片縮小可以正常運行了。

以下是對比圖像和對比結果。

gitHub開源代碼

首先下載代碼文件

代碼庫中,大致的介紹了facenet算法的訓練步驟等。

代碼實現

以下是facenet的python代碼,注意需要更改下面的一條程序"cuda" False,因為t527使用的是cpu,芯片到時自帶gpu但是cuda用不了,因為cuda是英偉達退出的一種計算機架構。

import matplotlib.pyplot as plt

import numpy as np

import torch

import 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

代碼實現

此代碼調用的簽名的代碼,但其可以直接的去調用圖片進行人臉識別

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)

程序運行

運行程序后首先顯示的是程序的配置信息,然后可以輸入圖像對比檢測的內容。以下是圖像識別的效果和對比的準確率。


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉