人臉實踐篇:基於 Caffe 的年齡 & 性別識別
人臉檢測及對應屬性的識別是現在比較流行的一個技術之一。今天我們“計算機視覺戰隊”就和大家說說該技術的一些詳細細節。
隨著社會的發展,快速有效的自動身份驗證在安防領域變的越來越迫切。
由於生物特性是人的內在屬性,具有很強的自身穩定性和個體差異性,是身份驗證的最理想依據。利用人臉屬性進行身份驗證又是最自然最直接的手段,相比其它人類生物特性,它具有直接、方便的特點,更容易被使用者所接受且不易察覺。
近幾年也是有很多相關的Paper及技術得到了實現,如:
-
2015年的一篇文章就簡單得到了實現,只要你懂得Alexnet,實現這篇文獻的演算法,會比較容易。最後的實驗結果,Gender accuracy 在86.8%,Age預測精準的值準確率在50.7%,預測年齡段準確率在 84.7%,使用的資料集是Adience;
-
基於傳統方法也有,比如基於LBP,亮度、形狀直方圖的多尺度特徵融合的性別識別,在性別識別中融入資訊理論概念,對PCA、LDA等經典識別演算法進行簡化,在簡化過程中根據資訊熵、互資訊量等指標提出一套特徵選擇理論。最後結果,Gender accuracy基於畫素增強為87.85%,基於shape features可以達到91.59%,基於LBP紋理特徵也可以到達93.46%,利用三種特徵可以得到95.33%,都是在常用的FERET資料集中。
-
基於形狀特徵和深度神經網路的現實人臉性別分類,先對人臉進行對齊操作,用深度網路的方法進行分類,在LFW資料庫的非正向人臉樣本部分做實驗,識別率可達到89.3%。
性別識別
性別識別是利用計算機視覺來辨別影象中的人臉性別屬性。 多年來,人臉性別因為實際場景的需求,如 在身份認證、人機介面、視訊檢索以及機器人視覺中的潛在應用而備受關注。
性別識別是一個複雜的大規模二分類問題,分類器將資料錄入並劃分男女性別。目前性別識別方法主要有:基於特徵臉的性別識別演算法(等傳統方法)及基於深度學習方法。
基於特徵臉的性別識別演算法
基於特徵臉的性別識別演算法主要是使用PCA。在計算過程中通過消除資料中的相關性,將高維影象降低到低維空間,而訓練集中的樣本則被對映成低維空間中的一點。當需要判斷測試圖片性別時,就需要先將測試圖片對映到低維空間中,然後計算離測試圖片最近樣本點是哪一個,將最近樣本點的性別賦值給測試圖片即可。
下面我們主要講深度學習方法,那我們開始吧!
年齡及性別識別
import os
import numpy as np
import matplotlib.pyplot as plt
import sys
import caffe
%matplotlib inline
caffe_root = './caffe/'
sys.path.insert(0, caffe_root + 'python')
plt.rcParams['figure.figsize'] = (10, 10)
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
然後我們讀取均值檔案:
mean_filename='./mean_file/mean.binaryproto'
proto_data = open(mean_filename, "rb").read()
temp = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)
mean = caffe.io.blobproto_to_array(temp)[0]
讀取之前訓練好的模型檔案:
age_net_pretrained='./models/age_net.caffemodel'
age_net_model_file='./deploy_age.prototxt'
age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,mean=mean,channel_swap=(2,1,0),raw_scale=255,image_dims=(256, 256))
讀取Label檔案:
age_list=['(0, 2)','(4, 6)','(8, 12)','(15, 20)','(25, 32)','(38, 43)','(48, 53)','(60, 100)']
gender_list=['Male','Female']
讀取預測影象及預測結果:
example_image = './example_image.jpg'
input_image = caffe.io.load_image(example_image)
_=plt.imshow(input_image)
prediction = age_net.predict([input_image])
print('predicted age:', age_list[prediction[0].argmax()])
prediction = gender_net.predict([input_image])
print('predicted gender:', gender_list[prediction[0].argmax()])
特徵視覺化
做這個的原因,是想通過學習特徵過程,其重點學習的特徵到底是什麼樣子的,好讓我們有一個空間想象力。
COV1第一層卷積濾波器學習特徵的視覺化結果,該層主要學習顏色、紋理、邊緣等特徵,屬於較低層特徵。
COV1第一層卷積後的視覺化結果:
END
今天主要以簡單的操作為主,詳細的框架介紹及訓練和情感屬性識別,我們會在“ 計算機視覺協會 ” 知識星球 給同學們詳細解釋。之後,我們“ 計算機視覺戰隊 ” 公眾號平臺 也會詳細和大家一起學習,分享相關的知識推送。
如果想加入我們“ 計算機視覺戰隊 ”,請掃二維碼加入學習群。 計算機視覺戰隊 主要涉及 機器學習、深度學習 等領域,由來自於各校的碩博研究生組成的團隊,主要致力於 人臉檢測、人臉識別,多目標檢測、目標跟蹤、影象分割等 研究方向。
