一、前言
今天給大家帶了的人臉識別非常簡單,不需要大家瞭解TensorFlow,只需要對Python基本語法有一定了解。由於TensorFlow的火爆,把人臉識別再度推向我們的視線。像前段時間比較火的dee pfake,和人臉支付技術。雖然現階段人臉識別仍有很大的爭議性,但是它已經走進我們的視線當中了。很多小區在門禁系統中加入了人臉識別的功能,有些景區也添加了刷臉通道。但是對於技術的爭議不是今天探討的課題。下面開始我們的準備工作。
二、準備工作
今天是通過使用百度的SDK來實現的,首先我們要進入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還提供了更加複雜的人臉服務。像人臉註冊、人臉更新、身份驗證等功能,這種面相企業的應用,個人認爲還是不要過度依賴。無止境的廣告短信,莫名其妙的推銷電話,這些都是信息泄露的後果。在大數據時代,人類沒有隱私可言。即使是對於軟件行業的人來說,很多東西依舊是無可奈可。所以我們需要多加註意,對自己的隱私多留一份心。