<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 設(shè)計(jì)應(yīng)用 > FacenetPytorch人臉識(shí)別方案--基于米爾全志T527開發(fā)板

          FacenetPytorch人臉識(shí)別方案--基于米爾全志T527開發(fā)板

          作者: 時(shí)間:2024-11-28 來源:EEPW 收藏

          本文將介紹基于米爾電子MYD-L(米爾基于全志 )的FacenetPytorch方案測試。

          本文引用地址:http://www.ex-cimer.com/article/202411/465030.htm

          一、深度神經(jīng)網(wǎng)絡(luò)

          1.簡介

          Facenet-PyTorch 是一個(gè)基于 PyTorch 框架實(shí)現(xiàn)的庫。它提供了 FaceNet 模型的 PyTorch 實(shí)現(xiàn),可以用于訓(xùn)練自己的模型。FaceNet 是由 Google 研究人員提出的一種深度學(xué)習(xí)模型,專門用于人臉識(shí)別任務(wù)。

          在利用PyTorch神經(jīng)網(wǎng)絡(luò)算法進(jìn)行人臉圖像對比的實(shí)驗(yàn)設(shè)置中,我們專注于對比環(huán)節(jié),而不涉及實(shí)際項(xiàng)目的完整實(shí)現(xiàn)細(xì)節(jié)。但為了貼近實(shí)際應(yīng)用,我們可以構(gòu)想以下流程:

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

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

          3)構(gòu)建神經(jīng)網(wǎng)絡(luò)模型:為了實(shí)現(xiàn)對比功能,我們需要一個(gè)預(yù)先訓(xùn)練好或自定義的神經(jīng)網(wǎng)絡(luò)模型。這個(gè)模型能夠提取人臉圖像中的關(guān)鍵特征,使得相似的圖像在特征空間中具有相近的表示。

          4)特征提取:利用神經(jīng)網(wǎng)絡(luò)模型,對新捕捉到的人臉照片和存儲(chǔ)的每一張人臉圖像進(jìn)行特征提取。這些特征向量將用于后續(xù)的對比計(jì)算。

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

          6)確定匹配圖像:根據(jù)相似度計(jì)算結(jié)果,找到與新照片相似度最高的存儲(chǔ)圖像,即認(rèn)為這兩張圖像匹配成功。

          7)輸出匹配結(jié)果:最后,輸出匹配成功的圖像信息或相關(guān)標(biāo)識(shí),以完成人臉對比的實(shí)驗(yàn)任務(wù)。

          2.核心組件

          MTCNN:Multi-task Cascaded Convolutional Networks,即多任務(wù)級(jí)聯(lián)卷積網(wǎng)絡(luò),專門設(shè)計(jì)用于同時(shí)進(jìn)行人臉檢測和對齊。它在處理速度和準(zhǔn)確性上都有出色的表現(xiàn),是當(dāng)前人臉檢測領(lǐng)域的主流算法之一。

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

          1732789820483831.png

          米爾基于7開發(fā)板

          3.功能

          支持人臉檢測:使用MTCNN算法進(jìn)行人臉檢測,能夠準(zhǔn)確識(shí)別出圖像中的人臉位置。

          支持人臉識(shí)別:使用FaceNet算法進(jìn)行人臉識(shí)別,能夠提取人臉特征并進(jìn)行相似度計(jì)算,實(shí)現(xiàn)人臉驗(yàn)證和識(shí)別功能。

          二、安裝facenet_pytorch庫

          1.更新系統(tǒng)

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

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

          apt-get update

          1732789851566127.png

          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

          # 進(jìn)入 PyTorch 目錄

          cd pytorch

          # 安裝 PyTorch (需要根據(jù)你的需求選擇 CUDA 版本,如果不需要 GPU 支持則不需要 --cuda 參數(shù))

          pip3 install --no-cache-dir torch -f https://download.pytorch.org/whl/torch_stable.html

          # 測試 PyTorch 安裝

          python3 -c "import torch; print(torch.__version__)"

          1732789876793051.png

          5.安裝facenet_pytorch

          pip3 install facenet_pytorch

          1732789901536595.png

          三、CSDN參考案例

          1.代碼實(shí)現(xiàn)

          ############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檢測人臉,返回人臉數(shù)組

          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模型獲取人臉對應(yīng)的特征向量

          print("n人臉對應(yīng)的特征向量為:n", known_faces_emb)

          return known_faces_emb, knownImg

           # 計(jì)算人臉特征向量間的歐氏距離,設(shè)置閾值,判斷是否為同一張人臉

          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)

          # 獲取設(shè)備

          device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

          # mtcnn模型加載設(shè)置網(wǎng)絡(luò)參數(shù),進(jìn)行人臉檢測

          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  # 人臉特征向量匹配閾值設(shè)置

          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("設(shè)置的人臉特征向量匹配閾值為:", MatchThreshold)

          if isExistDst:

          boxes, prob, landmarks = mtcnn.detect(img, landmarks=True) 

          print('由于歐氏距離小于匹配閾值,故匹配')

          else:

          print('由于歐氏距離大于匹配閾值,故不匹配')

          此代碼是使用訓(xùn)練后的模型程序進(jìn)行使用,在程序中需要標(biāo)明人臉識(shí)別對比的圖像。

          2.實(shí)踐過程

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

          1732789937555811.png

          1732789957311234.png

          3.程序運(yùn)行異常唄終止

          運(yùn)行程序,提示killed,系統(tǒng)殺死了本程序的運(yùn)行,經(jīng)過多方面的測試,最終發(fā)現(xiàn)是識(shí)別的圖片過大,使得程序?qū)?nèi)存消耗過大導(dǎo)致。后將圖片縮小可以正常運(yùn)行了。

          以下是對比圖像和對比結(jié)果。

          image.png image.png

          1732790000823916.png

          image.png image.png

          1732790051747964.png

          四、gitHub開源代碼

          1.首先下載代碼文件

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

          1732790074423460.png

          2.代碼實(shí)現(xiàn)

          以下是facenet的python代碼,注意需要更改下面的一條程序"cuda"             False,因?yàn)閠527使用的是cpu,芯片到時(shí)自帶gpu但是cuda用不了,因?yàn)閏uda是英偉達(dá)退出的一種計(jì)算機(jī)架構(gòu)。

          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

          #--------------------------------------------#

          #   使用自己訓(xùn)練好的模型預(yù)測需要修改2個(gè)參數(shù)

          #   model_path和backbone需要修改!

          #--------------------------------------------#

          class Facenet(object):

          _defaults = {

          #--------------------------------------------------------------------------#

          #   使用自己訓(xùn)練好的模型進(jìn)行預(yù)測要修改model_path,指向logs文件夾下的權(quán)值文件

          #   訓(xùn)練好后logs文件夾下存在多個(gè)權(quán)值文件,選擇驗(yàn)證集損失較低的即可。

          #   驗(yàn)證集損失較低不代表準(zhǔn)確度較高,僅代表該權(quán)值在驗(yàn)證集上泛化性能較好。

          #--------------------------------------------------------------------------#

          "model_path"    : "model_data/facenet_mobilenet.pth",

          #--------------------------------------------------------------------------#

          #   輸入圖片的大小。

          #--------------------------------------------------------------------------#

          "input_shape"   : [160, 160, 3],

          #--------------------------------------------------------------------------#

          #   所使用到的主干特征提取網(wǎng)絡(luò)

          #--------------------------------------------------------------------------#

          "backbone"      : "mobilenet",

          #-------------------------------------------#

          #   是否進(jìn)行不失真的resize

          #-------------------------------------------#

          "letterbox_image"   : True,

          #-------------------------------------------#

          #   是否使用Cuda

          #   沒有GPU可以設(shè)置成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):

          #---------------------------------------------------#

          #   載入模型與權(quán)值

          #---------------------------------------------------#

          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):

          #---------------------------------------------------#

          #   圖片預(yù)處理,歸一化

          #---------------------------------------------------#

          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()

          #---------------------------------------------------#

          #   圖片傳入網(wǎng)絡(luò)進(jìn)行預(yù)測

          #---------------------------------------------------#

          output1 = self.net(photo_1).cpu().numpy()

          output2 = self.net(photo_2).cpu().numpy()

          #---------------------------------------------------#

          #   計(jì)算二者之間的距離

          #---------------------------------------------------#

          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.代碼實(shí)現(xiàn)

          此代碼調(diào)用的簽名的代碼,但其可以直接的去調(diào)用圖片進(jìn)行人臉識(shí)別。

          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.程序運(yùn)行

          1732790108251845.png

          運(yùn)行程序后首先顯示的是程序的配置信息,然后可以輸入圖像對比檢測的內(nèi)容。以下是圖像識(shí)別的效果和對比的準(zhǔn)確率。

          image.png

          1732790138589969.png

          1732790158206407.png

          1732790177247962.png

          1732790193900577.png

          image.png



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();