不會深度學習怎麼寫人臉識別

一、前言

今天給大家帶了的人臉識別非常簡單,不需要大家瞭解TensorFlow,只需要對Python基本語法有一定了解。由於TensorFlow的火爆,把人臉識別再度推向我們的視線。像前段時間比較火的dee pfake,和人臉支付技術。雖然現階段人臉識別仍有很大的爭議性,但是它已經走進我們的視線當中了。很多小區在門禁系統中加入了人臉識別的功能,有些景區也添加了刷臉通道。但是對於技術的爭議不是今天探討的課題。下面開始我們的準備工作。

二、準備工作

今天是通過使用百度的SDK來實現的,首先我們要進入AI開放平臺

AI開放平臺界面

我們選擇開放能力->人臉與人體識別->人臉識別,進入後或出現下面page1的界面,點擊立即使用

點擊後出現page2的界面。登錄自己的賬號就可以了。進去後我們會看到如下page3界面。如果沒有應用就創建應用:

如果應用的話就管理應用。然後我們看到page4中幾個重要的參數。分別是AppID、API Key、Secret Key。到這裏我們的準備工作就完成了。初步準備工作完成了,我們還需要做一件事,就是下載人臉識別的SDK。我們可以點擊page4中的服務端SDK下載Python對應的SDK,也可以使用pip下載:

pip install baidu-aip

接下來我們就可以着手代碼的編寫了。

三、實現人臉識別

使用SDK實現人臉識別非常簡單,下面我會從最簡單的人臉識別開始。然後識別多個人臉,再到情緒識別、年齡識別等。

3.1、人臉識別

人臉識別非常簡單,首先需要我們上面申請到的3個參數:

# 導入需要用的模塊
from aip import AipFace

# 準備AppID、API Key、Secret Key
APP_ID = '18101974'
API_KEY = 'HG5NFSFpfBiqqmBYVBpXQFKs'
SECRET_KEY = 'ytdOFrcBxZvvGlMKGtmkmpBQ6arbjupx'

# 調用人臉檢測
client = AipFace(APP_ID, API_KEY, SECRET_KEY)

# 圖片的類型,三種可選BASE64、URL、FACE_TOKEN
image_type = 'URL'
# 圖片的url
iamge = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577292322895&di=f7fa123b95016762f1f0c3d2999328c4&imgtype=0&src=http%3A%2F%2Fww1.sinaimg.cn%2Flarge%2Fc7b64b24jw1f7k7i3aap4j20qo1407ck.jpg'

# 識別人臉
face_data = client.detect(iamge, image_type)

在識別人臉時,我們調用了client.detect()方法,在上面的例子中,接收了兩個參數。分別是image和image_type。參數詳情如下:

參數名稱 參數類型 參數作用
image string 圖片信息(總數據大小應小於10M),圖片上傳方式根據image_type來判斷
image_type string 圖片類型 BASE64:圖片的base64值,base64編碼後的圖片數據,編碼後的圖片大小不超過2M;URL:圖片的 URL地址( 可能由於網絡等原因導致下載圖片時間過長);FACE_TOKEN: 人臉圖片的唯一標識,調用人臉檢測接口時,會爲每個人臉圖片賦予一個唯一的FACE_TOKEN,同一張圖片多次檢測得到的FACE_TOKEN是同一個

可以看到,image_type可以爲三種值,這裏我們選用url的方式。

其返回的爲json數據,具體數據就不給大家展示了,其結構如下和image鏈接的圖片如下:

其中,左邊爲image鏈接的圖片。雖然很漂亮,但是這不是我們研究的重點,我們把視線轉移到右邊這段冷冰冰的文字,我選取幾個重要參數和大家說一下:

參數名稱 參數類型 參數作用
face_list array 人臉信息列表
+face_probability double 人臉置信度,範圍【0~1】,代表這是一張人臉的概率,0最小、1最大。
+location array 人臉的位置
++left double 人臉區域離左邊界的距離
++top double 人臉區域離上邊界的距離
++width double 人臉區域的寬度
++height double 人臉區域的高度
++rotation int64 人臉框相對於豎直方向的順時針旋轉角,[-180,180]
+face_num int 人臉的個數

從上面的數據中,我們可以獲取人臉的位置。我們可以將檢測到的人臉裁剪下來,這就需要用的Pillow模塊了。其安裝如下:

pip install pillow

Pillow模塊的一些簡單操作可以看看這篇博客,因爲我們只使用截圖功能所以還是非常簡單的。我們在上面的基礎上加如下代碼

# 從Pillow中導入Image模塊
from PIL import Image
import urllib

# 將image保存到本地文件
resp = urllib.request.urlopen(image_url)
f = open('im.jpg', 'wb')
f.write(resp.read())

# 使用Image模塊,打開剛剛保存的圖像
im = Image.open('im.jpg')

# 獲取face_data中人臉的位置
left = face_data['result']['face_list'][0]['location']['left']
top = face_data['result']['face_list'][0]['location']['top']
width = face_data['result']['face_list'][0]['location']['width']
height = face_data['result']['face_list'][0]['location']['height']

# 截取人臉
face_im = im.crop((left, top, left+width, top+height))
face_im.save('face_im.jpg')

代碼執行後截取的face_im.jpg如下:

上面這段代碼有許多不嚴謹的地方,因爲現在是簡單的實現功能,所以沒太在意。接下來我們實現更復雜的人臉識別,雖然在技術上要複雜的多,但是在代碼上卻沒有什麼太多的添加。

3.2、多人臉識別

也非常簡單,我們執行上面代碼,發現即使我們識別多人臉的圖片,face_num依舊是1。這並非是識別失敗,而是由一個參數決定的,即 max_face_num。其類型爲string,默認值爲1,所以我們只能識別一個人臉,我們將 識別人臉代碼修改如下:

# 類型依舊是URL
image_type = 'URL'
# 一張包含多個人臉的image
image = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577296093031&di=f88c884ea4440935055c704fd20c0549&imgtype=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20180209%2F3a8e9aca0b8c481298246a26451bf242.jpeg'

# 準備參數
options = {}
options['max_face_num'] = '4'

# 識別人臉,比之前多了個options,options爲字典類型
face_data = client.detect(image, image_type, options)

我們修改後,face_data將最多返回四個人臉數據。所以我們需要多face_list進行遍歷:

# 將url中的圖片保存到本地
resp = urllib.request.urlopen(image_url)
f = open('im.jpg', 'wb')
f.write(resp.read())

# 打開圖片
im = Image.open('im.jpg')
# 用於區分圖片
n = 0
# 遍歷face_list
for i in face_data['result']['face_list']:
    n += 1
    left = i['location']['left']
    top = i['location']['top']
    width = i['location']['width']
    height = i['location']['height']

    # 截圖並保存
    face_im = im.crop((left, top, left + width, top + height))
    face_im.save('face_im' + str(n) + '.jpg')

執行上面代碼後我們截取到如下幾個人臉(左邊爲原圖,右邊爲人臉):

因爲設置max_face_num爲4,所以檢測到了四張人臉。

3.3、情緒識別

識別情緒也非常簡單,我們在傳入參數時再添加如下參數:

# 準備參數
options = {}
options['face_field'] = 'expression'

在添加該參數後,返回數據中,face_list下多了參數 expression 。具體結構如下:

在這裏插入圖片描述

我們識別其中藍色的即爲識別出來的情緒。

除此之外,我們還可以識別性別、年齡、顏值、是否帶眼睛、單雙眼皮、情緒等…更詳細的內容可以參考其官方文檔Python-SDK

四、總結

除了上面這些簡單操作外,SDK還提供了更加複雜的人臉服務。像人臉註冊、人臉更新、身份驗證等功能,這種面相企業的應用,個人認爲還是不要過度依賴。無止境的廣告短信,莫名其妙的推銷電話,這些都是信息泄露的後果。在大數據時代,人類沒有隱私可言。即使是對於軟件行業的人來說,很多東西依舊是無可奈可。所以我們需要多加註意,對自己的隱私多留一份心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章