keras實現網路照相機的實時性別/年齡預測
目錄
1、簡介
你是否曾經有過這樣的時刻:猜測另一個人的年紀?下面這個簡單的神經網路模型也許可以幫助你。
下面這個你即將執行的demo將會從網路照相機中獲取動態的視訊流,並給獲取到的人臉打上年齡和性別的標籤。想象一下,如果我們把一個這樣的網路照相機放在你的門口,檢測每一個經過的人的性別和年紀,是不是很酷?
我的執行環境是:windows,python3.5。當然,其他作業系統也是可以的。
2、工作流程
如下是整個工作的流程。
(1)輸入影象
首先,通過cv2模組,從網路視訊流中獲取照片
# 0 means the default video capture device in OS video_capture = cv2.VideoCapture(0) # infinite loop, break by key ESC while True: if not video_capture.isOpened(): sleep(5) # Capture frame-by-frame ret, frame = video_capture.read()
(2)人臉檢測
灰度化,再用cv2模組「CascadeClassifier」獲取人臉
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=10,
minSize=(self.face_size, self.face_size)
)
人臉檢測的結果:一系列人臉的座標[x, y, w, h]
(3)人臉分割
由於人臉檢測可能不一定的框住整張臉,因此將人臉加上40%的周邊,從而幫助獲取整個臉部。
# placeholder for cropped faces face_imgs = np.empty((len(faces), self.face_size, self.face_size, 3)) for i, face in enumerate(faces): face_img, cropped = self.crop_face(frame, face, margin=40, size=self.face_size) (x, y, w, h) = cropped cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 200, 0), 2) face_imgs[i,:,:,:] = face_img
我們把分割後的人臉輸入到模型,接下來就是預測predict了。
(4)特徵提取和年齡性別檢測
對於年齡預測,模型的輸出是101個值,年齡從0~100的概率預測值,這101個值的和為1。
所以,我們把概率乘以對應的年齡值再相加,就得到最後預測的年齡。
if len(face_imgs) > 0:
# predict ages and genders of the detected faces
results = self.model.predict(face_imgs)
predicted_genders = results[0]
ages = np.arange(0, 101).reshape(101, 1)
predicted_ages = results[1].dot(ages).flatten()
最後,我們畫一下結果圖。
性別預測是一個二分類問題。模型的輸出是1個範圍在0~1的值,值越大,表示模型認為是「男性」的概率越大。
# draw results
for i, face in enumerate(faces):
label = "{}, {}".format(int(predicted_ages[i]),
"F" if predicted_genders[i][0] > 0.5 else "M")
self.draw_label(frame, (face[0], face[1]), label)
cv2.imshow('Keras Faces', frame)
if cv2.waitKey(5) == 27: # ESC key press
break
3、深入理解
對於那些不滿足於demo,想要知道更多關於模型如何建立和訓練的同學,這部分可以滿足你的要求。
我們輸入模型的每一張圖片,都進行了上述的預處理:人臉檢測和補充周邊
神經網路的特徵提取使用的是Wide Residual Networks精簡版的WideResNet結構。使用CNN學習人臉特徵,從不太抽象的邊緣、角落特徵到更加抽象的眼睛、嘴巴等特徵。WideResNet更獨特的地方在於,作者減少了原始residual模型的深度,增加了寬度,所以訓練的速度快了幾倍。具體論文:https://arxiv.org/abs/1605.07146
4、延伸閱讀
模型的可能性是無窮盡的,它的輸出很大程度上依賴於你給的輸入。比如你給的輸入是很多標註為很有吸引力的照片,那麼,你就會教會模型從網路實時視訊流中辨別一個人的魅力指數。
以下是一系列相關的專案,資料集: