1. 程式人生 > >keras實現網路照相機的實時性別/年齡預測

keras實現網路照相機的實時性別/年齡預測

目錄

1、簡介

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、延伸閱讀

模型的可能性是無窮盡的,它的輸出很大程度上依賴於你給的輸入。比如你給的輸入是很多標註為很有吸引力的照片,那麼,你就會教會模型從網路實時視訊流中辨別一個人的魅力指數。

以下是一系列相關的專案,資料集: