隨趣科技有限公司
隨趣科技有限公司虛擬人技術(shù)傳播者

公司成立于2021年,是全球范圍內(nèi)少數(shù)同時(shí)擁有全棧3D AIGC技術(shù)和自然語(yǔ)言生成式大模型技術(shù)的前沿人工智能公司。

󦌑136?2108?0965

󦘑136 2108 0965

󦗑1039900924

󦌡1039900924@qq.com

python 虛擬人臉,虛擬人臉生成

2022-07-10534

1、如何使用Python,基于OpenCV與Face++實(shí)現(xiàn)人臉解鎖的功能

   Windows

入門(mén)的時(shí)候配置環(huán)境總是一個(gè)非常麻煩的事情,在Windows上配置OpenC更是如此。

既然寫(xiě)了這個(gè)推廣的科普教程,總不能讓讀者卡在環(huán)境配置上吧。

下面用到的文件都可以在 這里 (提取碼:b6ec)下載,但是注意,。

將cv2加入sitepackages

將下載下來(lái)的 文件放入Python安裝的文件夾下的 Libsitepackages 目錄。

就我的電腦而言,這個(gè)目錄就是 C:PythonLibsitepackages 。

記得不要直接使用pip安裝,將文件拖過(guò)去即可。

安裝numpy組件

在命令行下進(jìn)入到下載下來(lái)的文件所在的目錄(按住Shift右鍵有在該目錄開(kāi)命令行的選項(xiàng))

鍵入命令:

如果你的系統(tǒng)或者Python不適配,可以在 這里 下載別的輪子。

測(cè)試OpenC安裝

在命令行鍵入命令:

python c "import cv2"

如果沒(méi)有出現(xiàn)錯(cuò)誤提示,那么cv2就已經(jīng)安裝好了。

OpenC的人臉檢測(cè)應(yīng)用

人臉檢測(cè)應(yīng)用,簡(jiǎn)而言之就是一個(gè)在照片里找到人臉,然后用方框框起來(lái)的過(guò)程(我們的相機(jī)經(jīng)常做這件事情)

那么具體而言就是這樣一個(gè)過(guò)程:

獲取攝像頭的圖片

在圖片中檢測(cè)到人臉的區(qū)域

在人臉的區(qū)域周?chē)L制方框

獲取攝像頭的圖片

這里簡(jiǎn)單的講解一下OpenC的基本操作。

以下操作是開(kāi)攝像頭的基本操作:

#coding=utf8

importcv2

# 一般筆記本的默認(rèn)攝像頭都是0

capInput = (0)

# 我們可以用這條命令檢測(cè)攝像頭是否可以讀取數(shù)據(jù)

if not (): print('Capture failed because of camera')

那么怎么從攝像頭讀取數(shù)據(jù)呢?

# 接上段程序

# 現(xiàn)在攝像頭已經(jīng)開(kāi)了,我們可以使用這條命令讀取圖像

# img就是我們讀取到的圖像,就和我們使用open('', 'rb').read()讀取到的數(shù)據(jù)是一樣的

ret, img = ()

# 你可以使用open的方式存儲(chǔ),也可以使用cv2提供的方式存儲(chǔ)

('', img)

# 同樣,你可以使用open的方式讀取,也可以使用cv2提供的方式讀取

img = ('')

為了方便顯示圖片,cv2也提供了顯示圖片的方法:

# 接上段程序

# 定義一個(gè)窗口,當(dāng)然也可以不定義

imgWindowName = 'ImageCaptured'

imgWindow = (imgWindowName, )

# 在窗口中顯示圖片

(imgWindowName, img)

當(dāng)然在完成所有操作以后需要把攝像頭和窗口都做一個(gè)釋放:

# 接上段程序

# 釋放攝像頭

()

# 釋放所有窗口

()

在圖片中檢測(cè)到人臉的區(qū)域

OpenC給我們提供了已經(jīng)訓(xùn)練好的人臉的xml模板,我們只需要載入然后比對(duì)即可。

# 接上段程序

# 載入xml模板

faceCascade = ('')

# 將圖形存儲(chǔ)的方式進(jìn)行轉(zhuǎn)換

gray = (img, )

# 使用模板匹配圖形

faces = (gray, , 5)

print(faces)

在人臉的區(qū)域周?chē)L制方框

在上一個(gè)步驟中,faces中的四個(gè)量分別為左上角的橫坐標(biāo)、縱坐標(biāo)、寬度、長(zhǎng)度。

所以我們根據(jù)這四個(gè)量很容易的就可以繪制出方框。

# 接上段程序

# 函數(shù)的參數(shù)分別為:圖像,左上角坐標(biāo),右下角坐標(biāo),顏色,寬度

img = (img, (x, y), (x w, y h), (), 2)

成果

根據(jù)上面講述的內(nèi)容,我們現(xiàn)在已經(jīng)可以完成一個(gè)簡(jiǎn)單的人臉辨認(rèn)了:

#coding=utf8

importcv2

print('Press Esc to exit')

faceCascade = ('')

imgWindow = ('FaceDetect', )

defdetect_face():

capInput = (0)

# 避免處理時(shí)間過(guò)長(zhǎng)造成畫(huà)面卡頓

nextCaptureTime = ()

faces = []

if not (): print('Capture failed because of camera')

while 1:

ret, img = ()

gray = (img, )

if nextCaptureTime

使用Face完成人臉辨識(shí)

第一次認(rèn)識(shí)Face還是因?yàn)橹Ц秾毜娜四樦Ц?,響?yīng)速度還是非常讓人滿意的。

現(xiàn)在只需要免費(fèi)注冊(cè)一個(gè)賬然后新建一個(gè)應(yīng)用就可以使用了,非常方便。

他的方是 這個(gè) ,注冊(cè)好之后在 這里 的我的應(yīng)用中創(chuàng)建應(yīng)用即可。

創(chuàng)建好應(yīng)用之后你會(huì)獲得API Key與API Secret。

Face的API調(diào)用邏輯簡(jiǎn)單來(lái)說(shuō)是這樣的:

上傳圖片獲取讀取到的人的face_id

創(chuàng)建Pern,獲取pern_id(Pern中的圖片可以增加、刪除)

比較兩個(gè)face_id,判斷是否是一個(gè)人

比較face_id與pern_id,判斷是否是一個(gè)人

上傳圖片獲取face_id

在將圖片通過(guò)post方法上傳到特定的地址后將返回一個(gè)jn的值。

如果api_key, api_secret沒(méi)有問(wèn)題,且在上傳的圖片中有識(shí)別到人臉,那么會(huì)存儲(chǔ)在jn的face鍵值下。

#coding=utf8

importrequests

# 這里填寫(xiě)你的應(yīng)用的API Key與API Secret

API_KEY = ''

API_SECRET = ''

# 目前的API是這個(gè),你可以在API文檔里找到這些

BASE_URL = '

# 使用Requests上傳圖片

url = '%s/detection/detect?api_key=%s

創(chuàng)建Pern

這個(gè)操作沒(méi)有什么可以講的內(nèi)容,可以對(duì)照這段程序和方的API介紹。

方的API介紹可以見(jiàn) 這里 ,相信看完這一段程序以后你就可以自己完成其余的API了。

# 上接上一段程序

# 讀取face_id

if not facesis None: faceIdList = [face['face_id'] for facein faces]

# 使用Requests創(chuàng)建Pern

url = '%s/pern/create'%BASE_URL

params = {

'api_key': API_KEY,

'api_secret': API_SECRET,

'pern_name': 'LittleCoder',

'face_id': ','.join(faceIdList), }

r = (url, params = params)

# 獲取pern_id

print .()['pern_id']

進(jìn)度確認(rèn)

到目前為止,你應(yīng)該已經(jīng)可以就給定的兩張圖片比對(duì)是否是同一個(gè)人了。

那么讓我們來(lái)試著寫(xiě)一下這個(gè)程序吧,兩張圖片分別為’’, ‘’好了。

下面我給出了我的代碼:

defupload_img(fileDir, oneface = True):

url = '%s/detection/detect?api_key=%s

成品

到此,所有的知識(shí)介紹都結(jié)束了,相比大致如何完成這個(gè)項(xiàng)目各位讀者也已經(jīng)有想法了吧。

python 虛擬人臉,虛擬人臉生成  第1張

2、如何利用python進(jìn)行精準(zhǔn)人臉識(shí)別

   要調(diào)用api接口,建議用face的,支付寶的人臉識(shí)別都是用的這個(gè)。可能需要一點(diǎn)費(fèi)用,不貴,代碼里把fece的api接口放進(jìn)代碼就行,還可以可以檢測(cè)情緒,年齡等等的。

當(dāng)然也有其他人臉識(shí)別的api接口,自己發(fā)現(xiàn)吧,其實(shí)很多,但基本都不會(huì)免費(fèi),有的可以試用

,加入了新的類facerecognizer,我們可以使用它便捷地進(jìn)行人臉識(shí)別實(shí)驗(yàn)。本文既介紹代碼使用,又介紹算法原理。(他寫(xiě)的源代碼,我們可以在opencv的opencv\modules\contrib\doc\facerec\src下找到,當(dāng)然也可以在他的github中找到,如果你想研究源碼,自然可以去看看,不復(fù)雜)

目前支持的算法有

eigenfaces特征臉createeigenfacerecognizer()

fisherfaces createfisherfacerecognizer()

localbinary patterns histograms局部二值直方圖 createlbphfacerecognizer()

下面所有的例子中的代碼在opencv安裝目錄下的samples/cpp下面都能找到,所有的代碼商用或者學(xué)習(xí)都是免費(fèi)的。

recognition

對(duì)人類來(lái)說(shuō),人臉識(shí)別很容易。文獻(xiàn)[tu]中有描述。一個(gè)維的特征向量被用在一個(gè)大數(shù)據(jù)庫(kù)上,單靠幾何特征不能提供足夠的信息用于人臉識(shí)別。

特征臉?lè)椒ㄔ谖墨I(xiàn)[tp]。其中一個(gè)基本的想法就是,使類內(nèi)方差最小的同時(shí),使類外方差最大。

近年來(lái),各種局部特征提取方法出現(xiàn)。為了避免輸入的圖像的高維數(shù)據(jù),僅僅使用的局部特征描述圖像的方法被提出,提取的特征(很有希望的)對(duì)于局部遮擋、光照變化、小樣本等情況更強(qiáng)健。有關(guān)局部特征提取的方法有蓋伯小波(gabor waelets)([wiskott])。使用什么方法來(lái)提取時(shí)域空間的局部特征依舊是一個(gè)開(kāi)放性的研究問(wèn)題,因?yàn)榭臻g信息是潛在有用的信息。

database

我們先獲取一些數(shù)據(jù)來(lái)進(jìn)行實(shí)驗(yàn)吧。我不想在這里做一個(gè)幼稚的例子。我們?cè)谘芯咳四樧R(shí)別,所以我們需要一個(gè)真的人臉圖像!你可以自己創(chuàng)建自己的數(shù)據(jù)集,也可以從這里(下載一個(gè)。

at&tfacedatabase又稱orl人臉數(shù)據(jù)庫(kù),個(gè)人,每人張照片。照片在不同時(shí)間、不同光照、不同表情(睜眼閉眼、笑或者不笑)、不同人臉細(xì)節(jié)(戴眼鏡或者不戴眼鏡)下采集。所有的圖像都在一個(gè)黑暗均勻的背景下采集的,正面豎直人臉(有些有有輕旋轉(zhuǎn))。

python 虛擬人臉,虛擬人臉生成  第2張

3、人臉識(shí)別為什么用python開(kāi)發(fā)

   可以使用OpenC,OpenC的人臉檢測(cè)功能在一般場(chǎng)合還是不錯(cuò)的。而ubuntu正好提供了pythonopencv這個(gè)包,用它可以方便地實(shí)現(xiàn)人臉檢測(cè)的代碼。

寫(xiě)代碼之前應(yīng)該先安裝pythonopencv:

#!/usr/bin/python

#?*?coding:?UTF8?*

#?

#?Face?Detection?using?OpenC.?Based?on?sample?code?from:

#?

#?Usage:?python

import?sys,?os

fromimport?*

fromimport?*

from?PIL?import?Image,?ImageDraw

from?math?import?sqrt

def?detectObjects(image):

"""Converts?an?image?to?grayscale?and?prints?the?locations?of?any?faces?found"""

grayscale?=?cvCreateImage(cvSize(,?),?8,?1)

cvCvtColor(image,?grayscale,?C_BGR2GRAY)

storage?=?cvCreateMemStorage(0)

cvClearMemStorage(storage)

cvEqualizeHist(grayscale,?grayscale)

cascade?=?cvLoadHaarClassifierCascade(

'/usr/share/opencv/haarcascades/',

cvSize(1,1))

faces?=?cvHaarDetectObjects(grayscale,?cascade,?storage,?,?2,

C_HAAR_DO_CANNY_PRUNING,?cvSize())

result?=?[]

for?f?in?faces:

((,?,?,?))

return?result

def?grayscale(r,?g,?b):

return?int(r?*?.b?*?.)

def?process(infile,?outfile):

image?=?cvLoadImage(infile);

if?image:

faces?=?detectObjects(image)

im?=?(infile)

if?faces:

draw?=?(im)

for?f?in?faces:

(f,?outline=())

(outfile,?"JPEG",?quality=)

else:

print?"Error:?cannot?detect?faces?on?%s"?%?infile

if?__name__?==?"__main__":

process('',?'')

能啊,你在ai申請(qǐng)一個(gè)api賬,然后python編個(gè)程序調(diào)用api就可以了

python 虛擬人臉,虛擬人臉生成  第3張