您好,登錄后才能下訂單哦!
這篇文章主要介紹“Pytorch怎么實現人臉識別”,在日常操作中,相信很多人在Pytorch怎么實現人臉識別問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Pytorch怎么實現人臉識別”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
人臉識別是一門比較成熟的技術。
它的身影隨處可見,刷臉支付,信息審核,監控搜索,人臉打碼等。
更多的時候,它是方便了我們的生活,足不出戶,就可以實現各種 APP 的實名認證,信息審核。
一些公司,也都有對內部員工開放的刷臉支付系統,不用帶手機,不用帶工卡,帶著一張或美麗或帥氣的臉龐,就可以在公司內部「買買買,刷刷刷」。
除了這些常規操作,還可以對視頻里的特定人物進行打碼。
仝卓自爆高考作弊,可謂"教科書"級別的"仝"歸于盡的坑爹教程。
這「任性」的打碼方式,簡單粗暴。
對于視頻,人工后期的逐幀處理,打碼任務無疑是個「體力活」。
但如果結合臉識別技術,那這個任務就會簡單很多。
人臉識別技術包涵了多種算法,整個流程大致如下:
使用檢測技術,檢測出人臉位置。
使用 landmark 技術,檢測出人臉關鍵點。
根據人臉位置和人臉關鍵點,裁剪出人臉區域,并根據關鍵點將人臉圖片進行矯正,得到「標準臉」。
計算「標準臉」的人臉特征向量。
與「人臉庫」的人臉特征向量比對,計算向量的距離,找到最接近的人,輸出人臉識別結果。
輸入:原始的可能含有人臉的圖像。
輸出:人臉位置的 bounding box。
這一步一般我們稱之為“人臉檢測”(Face Detection),人臉檢測算法,可以使用的庫有很多,例如 OpenCV、dlib、face_recognition、RetianFace、CenterFace 等等。
太多了,數不過來。
當然,自己用 yolo 、ssd 這類經典的檢測算法,自己實現一個也是可以的。
輸入:原始圖像 + 人臉位置 bounding box。
輸出:“校準”過的只含有人臉的圖像。
這一步需要使用 landmark 算法,檢測人臉中的關鍵點,然后根據這些關鍵點對人臉做對齊校準。
所謂的關鍵點,就是下圖所示的綠色的點,通常是眼角的位置、鼻子的位置、臉的輪廓點等等。
有了這些關鍵點后,我們就可以把人臉“校準”,或者說是“對齊”。
解釋就是原先人臉可能比較歪,這里根據關鍵點,使用仿射變換將人臉統一“擺正”,盡量去消除姿勢不同帶來的誤差。這一步我們一般叫 Face Alignment 。
輸入:校準后的單張人臉圖像。
輸出:一個向量表示。
這一步就是使用深度卷積網絡,將輸入的人臉圖像,轉換成一個向量的表示。這個向量就是人臉的特征,例如:
這密密麻麻的 128 維的向量,就是一張人臉的特征,你也可以叫做人臉的編碼。
提取特征這種事,卷積神經網絡很在行。
舉個例子,VGG16 是深度學習中一個比較簡單的基本模型。
輸入卷積神經網絡的是圖像,經過一系列卷積后,全連接分類得到類別概率。
整個過程是這樣的:
其實,卷積神經網絡不斷的進行卷積,下采樣,這就是一個提取特征的過程,最后通過全鏈接層得到類別概率。
人臉特征提取,我們也可以這么操作。我們可以去掉全連接層,用計算的特征(一般就是卷積層的最后一層,e.g. 圖中的conv5_3)來當作提取的特征進行計算。
與分類任務不同的是,最后使用的 loss 損失函數是不同的。
在理想的狀況下,我們希望“向量表示”之間的距離就可以直接反映人臉的相似度:
對于同一個人的人臉圖像,對應的向量的歐幾里得距離應該比較小。
對于不同人的人臉圖像,對應的向量之間的歐幾里得距離應該比較大。
所以,每個人臉的類別中心,應該盡可能遠一些,這樣才能用于區別不同的人。
人臉常用的 loss 有 center loss 、 arcface loss 等。
人臉識別類似于,細粒度的分類。
訓練過分類任務的,應該都知道。
訓練人和豬的二分類,很好訓練,因為人和豬的特征差別很明顯。
但訓練男人和女人的二分類,就要難一些,因為男人和女人的特征很相近。
為了更好區分男人和女人,就需要使用類別中心間距大的損失函數。
人臉識別,更是一種細粒度的區分,都是人,但你要區分出張三、李四、王二麻。
人臉識別,一般是需要建立一個「檢索庫」。
簡單解釋一下,我們要識別張三、李四、王二麻。
那么,我們就要選張三、李四、王二麻每個人的 10 張(自己定)圖片。
然后使用我們訓練好的人臉特征模型,提取每個人的人臉特征。
這樣每個人,就都有 10 個人臉特征了,這就是一個「檢索庫」。
需要識別的圖片,提取人臉特征后,依次與檢索庫已有的人臉特征去比對,投票選出最接近的人。
人臉識別技術原理清楚了,我們就可以使用這個技術,給仝卓打碼。
可以看到,人臉識別技術涉及到的算法較多,自己依次實現是需要時間的。
但這,難不倒身為優秀「調包俠」的我。
開源的第三方庫有很多,比如 face_recognition。
里面集成了人臉檢測、人臉識別等接口。
使用人臉識別技術,對這一小段視頻,給仝卓的人臉進行打碼。
整理一下思路:
首先,我們使用 opencv 這類的程序處理視頻,只能處理畫面,不能處理聲音。
所以,需要先將音頻保存,再將處理好的視頻和音頻進行合成,這樣既保證了畫面打碼,又保證了聲音還在。
這塊可以使用 ffmpeg 實現。
安裝好 ffmpeg 并配置好環境變量。
編寫如下代碼:
import subprocess import os from PIL import Image def video2mp3(file_name): """ 將視頻轉為音頻 :param file_name: 傳入視頻文件的路徑 :return: """ outfile_name = file_name.split('.')[0] + '.mp3' cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name subprocess.call(cmd, shell=True) def video_add_mp3(file_name, mp3_file): """ 視頻添加音頻 :param file_name: 傳入視頻文件的路徑 :param mp3_file: 傳入音頻文件的路徑 :return: """ outfile_name = file_name.split('.')[0] + '-f.mp4' subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name, shell=True)
視頻轉音頻,視頻加音頻的函數寫好了,接下來,我們寫視頻自動打碼的程序。
首先,安裝 face_recognition。
python -m pip install face_recognition
face_recognition 有詳細的 API 文檔:
https://face-recognition.readthedocs.io/en/latest/face_recognition.html
我們先將要處理的視頻保存到本地:
https://cuijiahua.com/wp-content/uploads/2020/07/cut.mp4
然后就可以使用 opencv 讀取視頻檢測畫面的每一張人臉。
import cv2 import face_recognition import matplotlib.pyplot as plt # %matplotlib inline # 在 jupyter 中使用的時候,去掉注釋 cap = cv2.VideoCapture('cut.mp4') ret, frame = cap.read() if ret: face_locations = face_recognition.face_locations(frame) for (top_right_y, top_right_x, left_bottom_y,left_bottom_x) in face_locations: cv2.rectangle(frame, (left_bottom_x,top_right_y), (top_right_x, left_bottom_y), (0, 0, 255), 10) plt.imshow(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) plt.show()
運行效果:
這樣,對畫面中檢測到的每張人臉,進行人臉識別,是仝卓,那就打碼。
打碼圖片,咱也用個簡單粗暴的。
將 mask.jpg 保存到本地。
再截取一張仝卓的人臉圖片,作為對比庫,當然多張也是可以的,這里用一張就夠了。
我們選擇這張圖片
將圖片下載到本地,編寫如下代碼,就可以提取人臉的特征。
import face_recognition known_image = face_recognition.load_image_file("tz.jpg") biden_encoding = face_recognition.face_encodings(known_image)[0] print(biden_encoding)
運行結果:
可以看到使用幾行代碼,就可以提取 128 維的人臉特征。
整體流程是:
使用 ffmpeg 保存音頻
處理視頻,給仝卓打碼。
為處理好的視頻添加音頻。
直接看代碼。
# Author : Jack Cui # Website: https://cuijiahua.com/ import cv2 import face_recognition import matplotlib.pyplot as plt # %matplotlib inline # 在 jupyter 中使用的時候,去掉注釋 import subprocess import os from PIL import Image def video2mp3(file_name): """ 將視頻轉為音頻 :param file_name: 傳入視頻文件的路徑 :return: """ outfile_name = file_name.split('.')[0] + '.mp3' cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name print(cmd) subprocess.call(cmd, shell=True) def video_add_mp3(file_name, mp3_file): """ 視頻添加音頻 :param file_name: 傳入視頻文件的路徑 :param mp3_file: 傳入音頻文件的路徑 :return: """ outfile_name = file_name.split('.')[0] + '-f.mp4' subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name, shell=True) def mask_video(input_video, output_video, mask_path='mask.jpg'): # 打碼圖片 mask = cv2.imread(mask_path) # 讀取視頻 cap = cv2.VideoCapture(input_video) # 讀取視頻參數,fps、width、heigth CV_CAP_PROP_FPS = 5 CV_CAP_PROP_FRAME_WIDTH = 3 CV_CAP_PROP_FRAME_HEIGHT = 4 v_fps = cap.get(CV_CAP_PROP_FPS) v_width = cap.get(CV_CAP_PROP_FRAME_WIDTH) v_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT) # 設置寫視頻參數,格式為 mp4 size = (int(v_width), int(v_height)) fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter(output_video,fourcc, v_fps, size) # 已知人臉 known_image = face_recognition.load_image_file("tz.jpg") biden_encoding = face_recognition.face_encodings(known_image)[0] # 讀取視頻 cap = cv2.VideoCapture(input_video) while(cap.isOpened()): ret, frame = cap.read() if ret: # 檢測人臉 face_locations = face_recognition.face_locations(frame) # 檢測每一個人臉 for (top_right_y, top_right_x, left_bottom_y,left_bottom_x) in face_locations: unknown_image = frame[top_right_y-50:left_bottom_y+50, left_bottom_x-50:top_right_x+50] unknown_encoding = face_recognition.face_encodings(unknown_image)[0] # 對比結果 results = face_recognition.compare_faces([biden_encoding], unknown_encoding) # 是仝卓,就將打碼貼圖。 if results[0] == True: mask = cv2.resize(mask, (top_right_x-left_bottom_x, left_bottom_y-top_right_y)) frame[top_right_y:left_bottom_y, left_bottom_x:top_right_x] = mask # 寫入視頻 out.write(frame) else: break if __name__ == '__main__': # 將音頻保存為cut.mp3 video2mp3(file_name='cut.mp4') # 處理視頻,自動打碼,輸出視頻為output.mp4 mask_video(input_video='cut.mp4', output_video='output.mp4') # 為 output.mp4 處理好的視頻添加聲音 video_add_mp3(file_name='output.mp4', mp3_file='cut.mp3')
到此,關于“Pytorch怎么實現人臉識別”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。