国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

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

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

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

一、facenet_pytorch算法實現(xiàn)人臉識別

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

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

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

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

2.更新系統(tǒng)軟件
  1. apt-get update
復(fù)制代碼

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

復(fù)制代碼
4.安裝Pytorch支持工具
  1. # 克隆 PyTorch 源代碼
  2. git clone --recursive https://github.com/pytorch/pytorch
  3. # 進(jìn)入 PyTorch 目錄
  4. cd pytorch
  5. # 安裝 PyTorch (需要根據(jù)你的需求選擇 CUDA 版本,如果不需要 GPU 支持則不需要 --cuda 參數(shù))
  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__)"
復(fù)制代碼

5.安裝facenet_pytorch
  1. pip3 install facenet_pytorch
復(fù)制代碼

[size=2em]三、CSDN參考案例
1.代碼實現(xiàn)
  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檢測人臉,返回人臉數(shù)組
  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模型獲取人臉對應(yīng)的特征向量
  16. print("n人臉對應(yīng)的特征向量為:n", known_faces_emb)
  17. return known_faces_emb, knownImg
  18. # 計算人臉特征向量間的歐氏距離,設(shè)置閾值,判斷是否為同一張人臉
  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. # 獲取設(shè)備
  30. device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
  31. # mtcnn模型加載設(shè)置網(wǎng)絡(luò)參數(shù),進(jìn)行人臉檢測
  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 # 人臉特征向量匹配閾值設(shè)置
  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("設(shè)置的人臉特征向量匹配閾值為:", MatchThreshold)
  41. if isExistDst:
  42. boxes, prob, landmarks = mtcnn.detect(img, landmarks=True)
  43. print('由于歐氏距離小于匹配閾值,故匹配')
  44. else:
  45. print('由于歐氏距離大于匹配閾值,故不匹配')
復(fù)制代碼

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

2.實踐過程

第一次運行時系統(tǒng)需要下載預(yù)訓(xùn)練的vggface模型,下載過程較長,后面就不需要在下載了運行會很快。如圖所示:
3.程序運行異常被終止
運行程序,提示killed,系統(tǒng)殺死了本程序的運行,經(jīng)過多方面的測試,最終發(fā)現(xiàn)是識別的圖片過大,使得程序?qū)?nèi)存消耗過大導(dǎo)致。后將圖片縮小可以正常運行了。
以下是對比圖像和對比結(jié)果。


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

2.代碼實現(xiàn)
以下是facenet的python代碼,注意需要更改下面的一條程序"cuda" False,因為t527使用的是cpu,芯片到時自帶gpu但是cuda用不了,因為cuda是英偉達(dá)退出的一種計算機架構(gòu)。
  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. # 使用自己訓(xùn)練好的模型預(yù)測需要修改2個參數(shù)
  8. # model_path和backbone需要修改!
  9. #--------------------------------------------#
  10. class Facenet(object):
  11. _defaults = {
  12. #--------------------------------------------------------------------------#
  13. # 使用自己訓(xùn)練好的模型進(jìn)行預(yù)測要修改model_path,指向logs文件夾下的權(quán)值文件
  14. # 訓(xùn)練好后logs文件夾下存在多個權(quán)值文件,選擇驗證集損失較低的即可。
  15. # 驗證集損失較低不代表準(zhǔn)確度較高,僅代表該權(quán)值在驗證集上泛化性能較好。
  16. #--------------------------------------------------------------------------#
  17. "model_path" : "model_data/facenet_mobilenet.pth",
  18. #--------------------------------------------------------------------------#
  19. # 輸入圖片的大小。
  20. #--------------------------------------------------------------------------#
  21. "input_shape" : [160, 160, 3],
  22. #--------------------------------------------------------------------------#
  23. # 所使用到的主干特征提取網(wǎng)絡(luò)
  24. #--------------------------------------------------------------------------#
  25. "backbone" : "mobilenet",
  26. #-------------------------------------------#
  27. # 是否進(jìn)行不失真的resize
  28. #-------------------------------------------#
  29. "letterbox_image" : True,
  30. #-------------------------------------------#
  31. # 是否使用Cuda# 沒有GPU可以設(shè)置成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. # 載入模型與權(quán)值
  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. # 圖片預(yù)處理,歸一化
  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. # 圖片傳入網(wǎng)絡(luò)進(jìn)行預(yù)測
  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
復(fù)制代碼

3.代碼實現(xiàn)
此代碼調(diào)用的簽名的代碼,但其可以直接的去調(diào)用圖片進(jìn)行人臉識別。
  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)
復(fù)制代碼

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

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

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

廠商推薦

  • Microchip視頻專區(qū)
  • 5分鐘詳解定時器/計數(shù)器E和波形擴(kuò)展!
  • 基于CEC1712實現(xiàn)的處理器SPI FLASH固件安全彈性方案培訓(xùn)教程
  • 為何選擇集成電平轉(zhuǎn)換?
  • PIC18-Q71系列MCU概述
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色综合合久久天天给综看 | 国产精品好好热在线观看 | 狠狠色伊人亚洲综合第8页 狠狠色网站 | 超级乱淫视频播放日韩 | 精品国产香蕉 | 亚洲女同在线 | 中文字幕在线观看一区 | 成人黄激情免费视频 | 欧美日韩欧美日韩 | 特黄特级毛片免费视 | 欧美亚洲国产另类 | 天天爱天天做久久天天狠狼 | 亚洲自拍p| 日本在线免费观看 | 综合成人在线 | 亚洲欧洲一二三区 | 97免费观看视频 | 国产三级精品三级在线观看 | 岛国大片在线观看免费版 | 欧美一区二区三区影院 | 欧美精品免费专区在线观看 | 成年人视频在线观看免费 | 中文国产成人精品久久96 | 亚洲性片 | 久久精品免视着国产成人 | 黄片毛片免费 | 99久久国产综合精品1尤物 | 久久精品国产精品亚洲毛片 | 香蕉视频在线观看网址 | 欧美日韩1区2区 | 日韩一级片在线免费观看 | 国产精品视频专区 | 国产精品欧美在线观看 | 91视频观看 | 天堂а在线地址8最新版 | 最新香蕉97超级碰碰碰碰碰久 | 日本久久中文字幕 | 日韩在线二区 | 女人18毛片特级一级免费视频 | 国产免费久久精品 | 天堂在线链接 |