<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • FacenetPytorch人臉識別方案——基于米爾全志T527開發板

    發布時間:2024-11-29 18:59    發布者:swiftman
    關鍵詞: 全志 , T527 , 人臉識別 , 嵌入式 , 米爾電子
    本篇測評由優秀測評者“小火苗”提供。

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

    一、facenet_pytorch算法實現人臉識別

    深度神經網絡

    1.簡介
    Facenet-PyTorch 是一個基于 PyTorch 框架實現的人臉識別庫。它提供了 FaceNet 模型的 PyTorch 實現,可以用于訓練自己的人臉識別模型。FaceNet 是由 Google 研究人員提出的一種深度學習模型,專門用于人臉識別任務。
    在利用PyTorch神經網絡算法進行人臉圖像對比的實驗設置中,我們專注于對比環節,而不涉及實際項目的完整實現細節。但55555貼近實際應用,我們可以構想以下流程:
    1)捕捉新人臉圖像:首先,我們使用攝像頭或其他圖像采集設備捕捉一張新的人臉照片。
    2)加載存儲的人臉圖像:接著,從數據庫中加載所有已存儲的人臉圖像。這些圖像是之前采集并存儲的,用于與新捕捉到的人臉照片進行對比。
    3)構建神經網絡模型:為了實現對比功能,我們需要一個預先訓練好或自定義的神經網絡模型。這個模型能夠提取人臉圖像中的關鍵特征,使得相似的圖像在特征空間中具有相近的表示。
    4)特征提。豪蒙窠浘W絡模型,對新捕捉到的人臉照片和存儲的每一張人臉圖像進行特征提取。這些特征向量將用于后續的對比計算。
    5)計算相似度:采用合適的相似度度量方法(如余弦相似度、歐氏距離等),計算新照片特征向量與存儲圖像特征向量之間的相似度。
    6)確定匹配圖像:根據相似度計算結果,找到與新照片相似度最高的存儲圖像,即認為這兩張圖像匹配成功。
    7)輸出匹配結果:最后,輸出匹配成功的圖像信息或相關標識,以完成人臉對比的實驗任務。

    2.核心組件
    MTCNN:Multi-task Cascaded Convolutional Networks,即多任務級聯卷積網絡,專門設計用于同時進行人臉檢測和對齊。它在處理速度和準確性上都有出色的表現,是當前人臉檢測領域的主流算法之一。
    FaceNet:由Google研究人員提出的一種深度學習模型,專門用于人臉識別任務。FaceNet通過將人臉圖像映射到一個高維空間,使得同一個人的不同圖像在這個空間中的距離盡可能小,而不同人的圖像距離盡可能大。這種嵌入表示可以直接用于人臉驗證、識別和聚類。

    3.功能
        支持人臉檢測:使用MTCNN算法進行人臉檢測,能夠準確識別出圖像中的人臉位置。
        支持人臉識別:使用FaceNet算法進行人臉識別,能夠提取人臉特征并進行相似度計算,實現人臉驗證和識別功能。
    二、安裝facenet_pytorch庫
    1.更新系統
    更新ubuntu系統,詳情查看米爾提供的資料文件

    2.更新系統軟件
    1. apt-get update
    復制代碼

    3.安裝git等支持軟件
    1. sudo apt-get install -y python3-dev python3-pip libopenblas-dev libssl-dev libffi-dev git cmake

    復制代碼
    4.安裝Pytorch支持工具
    1. # 克隆 PyTorch 源代碼
    2. git clone --recursive https://github.com/pytorch/pytorch
    3. # 進入 PyTorch 目錄
    4. cd pytorch
    5. # 安裝 PyTorch (需要根據你的需求選擇 CUDA 版本,如果不需要 GPU 支持則不需要 --cuda 參數)
    6. pip3 install --no-cache-dir torch -f https://download.pytorch.org/whl/torch_stable.html
    7. # 測試 PyTorch 安裝
    8. python3 -c "import torch; print(torch.__version__)"
    復制代碼

    5.安裝facenet_pytorch
    1. pip3 install facenet_pytorch
    復制代碼

    [size=2em]三、CSDN參考案例
    1.代碼實現
    1. ############face_demo.py#############################
    2. import cv2
    3. import torch
    4. from facenet_pytorch import MTCNN, InceptionResnetV1
    5. # 獲得人臉特征向量
    6. def load_known_faces(dstImgPath, mtcnn, resnet):
    7. aligned = []
    8. knownImg = cv2.imread(dstImgPath) # 讀取圖片
    9. face = mtcnn(knownImg) # 使用mtcnn檢測人臉,返回人臉數組
    10. if face is not None:
    11. aligned.append(face[0])
    12. aligned = torch.stack(aligned).to(device)
    13. with torch.no_grad():
    14. known_faces_emb = resnet(aligned).detach().cpu()
    15. # 使用ResNet模型獲取人臉對應的特征向量
    16. print("n人臉對應的特征向量為:n", known_faces_emb)
    17. return known_faces_emb, knownImg
    18. # 計算人臉特征向量間的歐氏距離,設置閾值,判斷是否為同一張人臉
    19. def match_faces(faces_emb, known_faces_emb, threshold):
    20. isExistDst = False
    21. distance = (known_faces_emb[0] - faces_emb[0]).norm().item()
    22. print("n兩張人臉的歐式距離為:%.2f" % distance)
    23. if (distance < threshold):
    24. isExistDst = True
    25. return isExistDst
    26. if __name__ == '__main__':
    27. # help(MTCNN)
    28. # help(InceptionResnetV1)
    29. # 獲取設備
    30. device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
    31. # mtcnn模型加載設置網絡參數,進行人臉檢測
    32. mtcnn = MTCNN(min_face_size=12, thresholds=[0.2, 0.2, 0.3],
    33. keep_all=True, device=device)
    34. # InceptionResnetV1模型加載用于獲取人臉特征向量
    35. resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)
    36. MatchThreshold = 0.8 # 人臉特征向量匹配閾值設置
    37. known_faces_emb, _ = load_known_faces('yz.jpg', mtcnn, resnet) # 已知人物圖
    38. faces_emb, img = load_known_faces('yz1.jpg', mtcnn, resnet) # 待檢測人物圖
    39. isExistDst = match_faces(faces_emb, known_faces_emb, MatchThreshold) # 人臉匹配
    40. print("設置的人臉特征向量匹配閾值為:", MatchThreshold)
    41. if isExistDst:
    42. boxes, prob, landmarks = mtcnn.detect(img, landmarks=True)
    43. print('由于歐氏距離小于匹配閾值,故匹配')
    44. else:
    45. print('由于歐氏距離大于匹配閾值,故不匹配')
    復制代碼

    此代碼是使用訓練后的模型程序進行使用,在程序中需要標明人臉識別對比的圖像。

    2.實踐過程

    第一次運行時系統需要下載預訓練的vggface模型,下載過程較長,后面就不需要在下載了運行會很快。如圖所示:
    3.程序運行異常被終止
    運行程序,提示killed,系統殺死了本程序的運行,經過多方面的測試,最終發現是識別的圖片過大,使得程序對內存消耗過大導致。后將圖片縮小可以正常運行了。
    以下是對比圖像和對比結果。


    [size=2em]四、gitHub開源代碼
    1.首先下載代碼文件
    代碼庫中,大致的介紹了facenet算法的訓練步驟等。

    2.代碼實現
    以下是facenet的python代碼,注意需要更改下面的一條程序"cuda" False,因為t527使用的是cpu,芯片到時自帶gpu但是cuda用不了,因為cuda是英偉達退出的一種計算機架構。
    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. import torchimport torch.backends.cudnn as cudnn
    4. from nets.facenet import Facenet as facenet
    5. from utils.utils import preprocess_input, resize_image, show_config
    6. #--------------------------------------------#
    7. # 使用自己訓練好的模型預測需要修改2個參數
    8. # model_path和backbone需要修改!
    9. #--------------------------------------------#
    10. class Facenet(object):
    11. _defaults = {
    12. #--------------------------------------------------------------------------#
    13. # 使用自己訓練好的模型進行預測要修改model_path,指向logs文件夾下的權值文件
    14. # 訓練好后logs文件夾下存在多個權值文件,選擇驗證集損失較低的即可。
    15. # 驗證集損失較低不代表準確度較高,僅代表該權值在驗證集上泛化性能較好。
    16. #--------------------------------------------------------------------------#
    17. "model_path" : "model_data/facenet_mobilenet.pth",
    18. #--------------------------------------------------------------------------#
    19. # 輸入圖片的大小。
    20. #--------------------------------------------------------------------------#
    21. "input_shape" : [160, 160, 3],
    22. #--------------------------------------------------------------------------#
    23. # 所使用到的主干特征提取網絡
    24. #--------------------------------------------------------------------------#
    25. "backbone" : "mobilenet",
    26. #-------------------------------------------#
    27. # 是否進行不失真的resize
    28. #-------------------------------------------#
    29. "letterbox_image" : True,
    30. #-------------------------------------------#
    31. # 是否使用Cuda# 沒有GPU可以設置成False
    32. #-------------------------------------------#
    33. "cuda" : False,
    34. }
    35. @classmethod
    36. def get_defaults(cls, n):
    37. if n in cls._defaults:
    38. return cls._defaults[n]
    39. else:
    40. return "Unrecognized attribute name '" + n + "'"
    41. #---------------------------------------------------#
    42. # 初始化Facenet
    43. #---------------------------------------------------#
    44. def __init__(self, **kwargs):
    45. self.__dict__.update(self._defaults)
    46. for name, value in kwargs.items():
    47. setattr(self, name, value)
    48. self.generate()
    49. show_config(**self._defaults)
    50. def generate(self):
    51. #---------------------------------------------------#
    52. # 載入模型與權值
    53. #---------------------------------------------------#
    54. print('Loading weights into state dict...')
    55. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    56. self.net = facenet(backbone=self.backbone, mode="predict").eval()
    57. self.net.load_state_dict(torch.load(self.model_path, map_location=device), strict=False)
    58. print('{} model loaded.'.format(self.model_path))
    59. if self.cuda:
    60. self.net = torch.nn.DataParallel(self.net)
    61. cudnn.benchmark = True
    62. self.net = self.net.cuda()
    63. #---------------------------------------------------#
    64. # 檢測圖片
    65. #---------------------------------------------------#
    66. def detect_image(self, image_1, image_2):
    67. #---------------------------------------------------#
    68. # 圖片預處理,歸一化
    69. #---------------------------------------------------#
    70. with torch.no_grad():
    71. image_1 = resize_image(image_1, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
    72. image_2 = resize_image(image_2, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
    73. photo_1 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_1, np.float32)), (2, 0, 1)), 0))
    74. photo_2 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_2, np.float32)), (2, 0, 1)), 0))
    75. if self.cuda:
    76. photo_1 = photo_1.cuda()
    77. photo_2 = photo_2.cuda()
    78. #---------------------------------------------------#
    79. # 圖片傳入網絡進行預測
    80. #---------------------------------------------------#
    81. output1 = self.net(photo_1).cpu().numpy()
    82. output2 = self.net(photo_2).cpu().numpy()
    83. #---------------------------------------------------#
    84. # 計算二者之間的距離
    85. #---------------------------------------------------#
    86. l1 = np.linalg.norm(output1 - output2, axis=1)
    87. plt.subplot(1, 2, 1)
    88. plt.imshow(np.array(image_1))
    89. plt.subplot(1, 2, 2)
    90. plt.imshow(np.array(image_2))
    91. plt.text(-12, -12, 'Distance:%.3f' % l1, ha='center', va= 'bottom',fontsize=11)
    92. plt.show()
    93. return l1
    復制代碼

    3.代碼實現
    此代碼調用的簽名的代碼,但其可以直接的去調用圖片進行人臉識別。
    1. from PIL import Image
    2. from facenet import Facenet
    3. if __name__ == "__main__":
    4. model = Facenet()
    5. while True:
    6. image_1 = input('Input image_1 filename:')
    7. try:
    8. image_1 = Image.open(image_1)
    9. except:
    10. print('Image_1 Open Error! Try again!')
    11. continue
    12. image_2 = input('Input image_2 filename:')
    13. try:
    14. image_2 = Image.open(image_2)
    15. except:
    16. print('Image_2 Open Error! Try again!')
    17. continue
    18. probability = model.detect_image(image_1,image_2)
    19. print(probability)
    復制代碼

    4.程序運行
    運行程序后首先顯示的是程序的配置信息,然后可以輸入圖像對比檢測的內容。以下是圖像識別的效果和對比的準確率。
    [size=2em]五、參考文獻
    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
    *部分圖片來源于網絡,如有版權問題請聯系刪除

    本文地址:http://www.portaltwn.com/thread-877599-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
    • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
    • Dev Tool Bits——使用DVRT協議查看項目中的數據
    • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷