真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

這篇文章主要介紹“Pytorch怎么實(shí)現(xiàn)人臉識(shí)別”,在日常操作中,相信很多人在Pytorch怎么實(shí)現(xiàn)人臉識(shí)別問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Pytorch怎么實(shí)現(xiàn)人臉識(shí)別”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

沂南網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),沂南網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為沂南近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的沂南做網(wǎng)站的公司定做!

一、人臉識(shí)別

人臉識(shí)別是一門比較成熟的技術(shù)。

它的身影隨處可見,刷臉支付,信息審核,監(jiān)控搜索,人臉打碼等。

更多的時(shí)候,它是方便了我們的生活,足不出戶,就可以實(shí)現(xiàn)各種 APP 的實(shí)名認(rèn)證,信息審核。

一些公司,也都有對(duì)內(nèi)部員工開放的刷臉支付系統(tǒng),不用帶手機(jī),不用帶工卡,帶著一張或美麗帥氣的臉龐,就可以在公司內(nèi)部「買買買,刷刷刷」。

二、人臉打碼

除了這些常規(guī)操作,還可以對(duì)視頻里的特定人物進(jìn)行打碼。

仝卓自爆高考作弊,可謂"教科書"級(jí)別的"仝"歸于盡的坑爹教程。

這「任性」的打碼方式,簡(jiǎn)單粗暴。

對(duì)于視頻,人工后期的逐幀處理,打碼任務(wù)無(wú)疑是個(gè)「體力活」。

但如果結(jié)合臉識(shí)別技術(shù),那這個(gè)任務(wù)就會(huì)簡(jiǎn)單很多。

三、人臉識(shí)別技術(shù)

人臉識(shí)別技術(shù)包涵了多種算法,整個(gè)流程大致如下:

  • 使用檢測(cè)技術(shù),檢測(cè)出人臉位置。

  • 使用 landmark 技術(shù),檢測(cè)出人臉關(guān)鍵點(diǎn)。

  • 根據(jù)人臉位置和人臉關(guān)鍵點(diǎn),裁剪出人臉區(qū)域,并根據(jù)關(guān)鍵點(diǎn)將人臉圖片進(jìn)行矯正,得到「標(biāo)準(zhǔn)臉」。

  • 計(jì)算「標(biāo)準(zhǔn)臉」的人臉特征向量。

  • 與「人臉庫(kù)」的人臉特征向量比對(duì),計(jì)算向量的距離,找到最接近的人,輸出人臉識(shí)別結(jié)果。

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

1、人臉檢測(cè)

輸入:原始的可能含有人臉的圖像。

輸出:人臉位置的 bounding box。

這一步一般我們稱之為“人臉檢測(cè)”(Face Detection),人臉檢測(cè)算法,可以使用的庫(kù)有很多,例如 OpenCV、dlib、face_recognition、RetianFace、CenterFace 等等。

太多了,數(shù)不過(guò)來(lái)。

當(dāng)然,自己用 yolo 、ssd 這類經(jīng)典的檢測(cè)算法,自己實(shí)現(xiàn)一個(gè)也是可以的。

2、人臉裁剪及矯正

輸入:原始圖像 + 人臉位置 bounding box。

輸出:“校準(zhǔn)”過(guò)的只含有人臉的圖像。

這一步需要使用 landmark 算法,檢測(cè)人臉中的關(guān)鍵點(diǎn),然后根據(jù)這些關(guān)鍵點(diǎn)對(duì)人臉做對(duì)齊校準(zhǔn)。

所謂的關(guān)鍵點(diǎn),就是下圖所示的綠色的點(diǎn),通常是眼角的位置、鼻子的位置、臉的輪廓點(diǎn)等等。

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

有了這些關(guān)鍵點(diǎn)后,我們就可以把人臉“校準(zhǔn)”,或者說(shuō)是“對(duì)齊”。

解釋就是原先人臉可能比較歪,這里根據(jù)關(guān)鍵點(diǎn),使用仿射變換將人臉統(tǒng)一“擺正”,盡量去消除姿勢(shì)不同帶來(lái)的誤差。這一步我們一般叫 Face Alignment 。

3、人臉特征

輸入:校準(zhǔn)后的單張人臉圖像。

輸出:一個(gè)向量表示。

這一步就是使用深度卷積網(wǎng)絡(luò),將輸入的人臉圖像,轉(zhuǎn)換成一個(gè)向量的表示。這個(gè)向量就是人臉的特征,例如:

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

這密密麻麻的 128 維的向量,就是一張人臉的特征,你也可以叫做人臉的編碼。

提取特征這種事,卷積神經(jīng)網(wǎng)絡(luò)很在行。

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

舉個(gè)例子,VGG16 是深度學(xué)習(xí)中一個(gè)比較簡(jiǎn)單的基本模型。

輸入卷積神經(jīng)網(wǎng)絡(luò)的是圖像,經(jīng)過(guò)一系列卷積后,全連接分類得到類別概率。

整個(gè)過(guò)程是這樣的:

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

其實(shí),卷積神經(jīng)網(wǎng)絡(luò)不斷的進(jìn)行卷積,下采樣,這就是一個(gè)提取特征的過(guò)程,最后通過(guò)全鏈接層得到類別概率。

人臉特征提取,我們也可以這么操作。我們可以去掉全連接層,用計(jì)算的特征(一般就是卷積層的最后一層,e.g. 圖中的conv5_3)來(lái)當(dāng)作提取的特征進(jìn)行計(jì)算。

與分類任務(wù)不同的是,最后使用的 loss 損失函數(shù)是不同的。

在理想的狀況下,我們希望“向量表示”之間的距離就可以直接反映人臉的相似度:

  • 對(duì)于同一個(gè)人的人臉圖像,對(duì)應(yīng)的向量的歐幾里得距離應(yīng)該比較小。

  • 對(duì)于不同人的人臉圖像,對(duì)應(yīng)的向量之間的歐幾里得距離應(yīng)該比較大。

所以,每個(gè)人臉的類別中心,應(yīng)該盡可能遠(yuǎn)一些,這樣才能用于區(qū)別不同的人。

人臉常用的 loss 有 center loss 、 arcface loss 等。

人臉識(shí)別類似于,細(xì)粒度的分類。

訓(xùn)練過(guò)分類任務(wù)的,應(yīng)該都知道。

訓(xùn)練人和豬的二分類,很好訓(xùn)練,因?yàn)槿撕拓i的特征差別很明顯。

但訓(xùn)練男人和女人的二分類,就要難一些,因?yàn)槟腥撕团说奶卣骱芟嘟?/p>

為了更好區(qū)分男人和女人,就需要使用類別中心間距大的損失函數(shù)。

人臉識(shí)別,更是一種細(xì)粒度的區(qū)分,都是人,但你要區(qū)分出張三、李四、王二麻。

4、人臉識(shí)別

人臉識(shí)別,一般是需要建立一個(gè)「檢索庫(kù)」。

簡(jiǎn)單解釋一下,我們要識(shí)別張三、李四、王二麻。

那么,我們就要選張三、李四、王二麻每個(gè)人的 10 張(自己定)圖片。

然后使用我們訓(xùn)練好的人臉特征模型,提取每個(gè)人的人臉特征。

這樣每個(gè)人,就都有 10 個(gè)人臉特征了,這就是一個(gè)「檢索庫(kù)」。

需要識(shí)別的圖片,提取人臉特征后,依次與檢索庫(kù)已有的人臉特征去比對(duì),投票選出最接近的人。

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

四、人臉打碼

人臉識(shí)別技術(shù)原理清楚了,我們就可以使用這個(gè)技術(shù),給仝卓打碼。

可以看到,人臉識(shí)別技術(shù)涉及到的算法較多,自己依次實(shí)現(xiàn)是需要時(shí)間的。

但這,難不倒身為優(yōu)秀「調(diào)包俠」的我。

開源的第三方庫(kù)有很多,比如 face_recognition。

里面集成了人臉檢測(cè)、人臉識(shí)別等接口。

使用人臉識(shí)別技術(shù),對(duì)這一小段視頻,給仝卓的人臉進(jìn)行打碼。

整理一下思路:

首先,我們使用 opencv 這類的程序處理視頻,只能處理畫面,不能處理聲音。

所以,需要先將音頻保存,再將處理好的視頻和音頻進(jìn)行合成,這樣既保證了畫面打碼,又保證了聲音還在。

這塊可以使用 ffmpeg 實(shí)現(xiàn)。

安裝好 ffmpeg 并配置好環(huán)境變量。

編寫如下代碼:

import subprocess
import os
from PIL import Image

def video2mp3(file_name):
    """
    將視頻轉(zhuǎn)為音頻
    :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)

視頻轉(zhuǎn)音頻,視頻加音頻的函數(shù)寫好了,接下來(lái),我們寫視頻自動(dòng)打碼的程序。

首先,安裝 face_recognition。

python -m pip install face_recognition

face_recognition 有詳細(xì)的 API 文檔:

https://face-recognition.readthedocs.io/en/latest/face_recognition.html

我們先將要處理的視頻保存到本地:

https://cuijiahua.com/wp-content/uploads/2020/07/cut.mp4

然后就可以使用 opencv 讀取視頻檢測(cè)畫面的每一張人臉。

import cv2
import face_recognition
import matplotlib.pyplot as plt
# %matplotlib inline # 在 jupyter 中使用的時(shí)候,去掉注釋

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

運(yùn)行效果:

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

這樣,對(duì)畫面中檢測(cè)到的每張人臉,進(jìn)行人臉識(shí)別,是仝卓,那就打碼。

打碼圖片,咱也用個(gè)簡(jiǎn)單粗暴的。

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

將 mask.jpg 保存到本地。

再截取一張仝卓的人臉圖片,作為對(duì)比庫(kù),當(dāng)然多張也是可以的,這里用一張就夠了。

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

我們選擇這張圖片

將圖片下載到本地,編寫如下代碼,就可以提取人臉的特征。

import face_recognition
known_image = face_recognition.load_image_file("tz.jpg")
biden_encoding = face_recognition.face_encodings(known_image)[0]
print(biden_encoding)

運(yùn)行結(jié)果:

Pytorch怎么實(shí)現(xiàn)人臉識(shí)別

可以看到使用幾行代碼,就可以提取 128 維的人臉特征。

整體流程是:

  • 使用 ffmpeg 保存音頻

  • 處理視頻,給仝卓打碼。

  • 為處理好的視頻添加音頻。

直接看代碼。

# Author : Jack Cui
# Website: https://cuijiahua.com/
import cv2
import face_recognition
import matplotlib.pyplot as plt
# %matplotlib inline # 在 jupyter 中使用的時(shí)候,去掉注釋

import subprocess
import os
from PIL import Image

def video2mp3(file_name):
    """
    將視頻轉(zhuǎn)為音頻
    :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)
    # 讀取視頻參數(shù),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)
    # 設(shè)置寫視頻參數(shù),格式為 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:
            # 檢測(cè)人臉
            face_locations = face_recognition.face_locations(frame)
            # 檢測(cè)每一個(gè)人臉
            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]
                # 對(duì)比結(jié)果
                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')
    # 處理視頻,自動(dòng)打碼,輸出視頻為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')

到此,關(guān)于“Pytorch怎么實(shí)現(xiàn)人臉識(shí)別”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


當(dāng)前標(biāo)題:Pytorch怎么實(shí)現(xiàn)人臉識(shí)別
網(wǎng)址分享:http://weahome.cn/article/gcjijc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部