1. 程式人生 > >基於CNN的人臉 性別、年齡識別

基於CNN的人臉 性別、年齡識別

CNN應用之性別、年齡識別

作者:hjimce

一、相關理論

  本篇博文主要講解2015年一篇paper《Age and Gender Classification using Convolutional Neural Networks》,個人感覺這篇文獻沒啥難度,只要懂得Alexnet,實現這篇文獻的演算法,會比較容易。其實讀完這篇paper之後,我一直在想paper的創新點在哪裡?因為我實在沒有看出paper的創新點在哪裡,估計是自己水平太lower了,看文獻沒有抓到文獻的創新點。難道是因為利用CNN做年齡和性別分類的paper很少嗎?網上搜索了一下,性別預測,以前很多都是用SVM演算法,用CNN搞性別分類就只搜尋到這一篇文章。個人感覺利用CNN進行圖片分類已經不是什麼新鮮事了,年齡、和性別預測,隨便搞個CNN網路,然後開始訓練跑起來,也可以獲得不錯的精度。

  性別分類自然而然是二分類問題,然而對於年齡怎麼搞?年齡預測是迴歸問題嗎?paper採用的方法是把年齡劃分為多個年齡段,每個年齡段相當於一個類別,這樣性別也就多分類問題了。所以我們不要覺得現在的一些APP,功能好像很牛逼,什麼性別、年齡、衣服型別、是否佩戴眼鏡等識別問題,其實這種識別對於CNN來說,基本上是鬆鬆搞定的事,當然你如果要達到非常高的識別精度,是另外一回事了,就需要各種調參了。

言歸正傳,下面開始講解2015年paper《Age and Gender Classification using Convolutional Neural Networks》的網路結構,這篇文章沒有什麼新演算法,只有調參,改變網路層數、卷積核大小等……所以如果已經對Alexnet比較熟悉的,可能會覺得看起來沒啥意思,這篇papar的相關原始碼和訓練資料,文獻作者有給我們提供,可以到Caffe zoo model:

https://github.com/BVLC/caffe/wiki/Model-Zoo  或者文獻的主頁:http://www.openu.ac.il/home/hassner/projects/cnn_agegender/。下載相關訓練好的模型,paper性別、年齡預測的應用場景比較複雜,都是一些非常糟糕的圖片,比較模糊的圖片等,所以如果我們想要直接利用paper訓練好的模型,用到我們自己的專案上,可能精度會比較低,後面我將會具體講一下利用paper的模型進行fine-tuning,以適應我們的應用,提高我們自己專案的識別精度。

二、演算法實現

因為paper的主頁,有提供網路結構的原始碼,我將結合網路結構檔案進行講解。

1、 網路結構

     

Paper所用的網路包含:3個卷積層,還有2個全連線層。這個算是層數比較少的CNN網路模型了,這樣可以避免過擬合。對於年齡的識別,paper僅僅有8個年齡段,相當於8分類模型;然後對於性別識別自然而然是二分類問題了。

然後影象處理直接採用3通道彩色影象進行處理,圖片6都統一縮放到256*256,然後再進行裁剪,為227*227(訓練過程隨機裁剪,驗證測試過程通過矩形的四個角+中心裁剪),也就是說網路的輸入時227*227的3通道彩色影象,總之基本上跟Alexnet一樣。

網路模型:

(1)第一層:採用96個卷積核,每個卷積核引數個數為3*7*7,這個就相當於3個7*7大小的卷積核在每個通道進行卷積。啟用函式採用ReLU,池化採用最大重疊池化,池化的size選擇3*3,strides選擇2。然後接著再來一個區域性響應歸一化層。什麼叫區域性響應歸一化,自己可以檢視一下文獻:《ImageNet Classification with Deep Convolutional Neural Networks》,區域性響應歸一化可以提高網路的泛化能力。

 

區域性響應歸一化,這個分成兩種情況,一種是3D的歸一化,也就是特徵圖之間對應畫素點的一個歸一化。還有一種是2D歸一化,就是對特徵圖的每個畫素的區域性做歸一化。區域性響應歸一化其實這個可有可無,精度提高不了多少,如果你還不懂上面那個公式也沒有關係。我們可以利用最新的演算法:Batch Normalize ,這個才牛逼呢,2015年,我覺得最牛逼的演算法之一,不僅提高了訓練速度,連精度也提高了。過程:通過7*7大小的卷積核,對227*227圖片卷積,然後特徵圖的個數為96個,每個特徵圖都是三通道的,這個作者沒有講到卷積層的stride大小,不過我們大體可以推測出來,因為paper的網路結構是模仿:ImageNet Classification with Deep Convolutional Neural Networks的網路結構的,連輸入圖片的大小也是一樣的,這篇文獻的第一層如下所示:

 

我們可以推測出,paper選擇的卷積步長為4,這樣經過卷積後,然後pad為2,這樣經過卷積後圖片的大小為:(227-7)/4+1=56。然後經過3*3,且步長為2的大小,進行重疊池化,可以得到:56/2=28*28大小的圖片,具體邊界需要補齊。下面是原文的第一層結構示意圖:

 

  1. layers {  
  2.   name: "conv1"
  3.   type: CONVOLUTION  
  4.   bottom: "data"
  5.   top: "conv1"
  6.   blobs_lr: 1
  7.   blobs_lr: 2
  8.   weight_decay: 1
  9.   weight_decay: 0
  10.   convolution_param {  
  11.     num_output: 96
  12.     kernel_size: 7
  13.     stride: 4
  14.     weight_filler {  
  15.       type: "gaussian"
  16.       std: 0.01
  17.     }  
  18.     bias_filler {  
  19.       type: "constant"
  20.       value: 0
  21.     }  
  22.   }  
  23. }  
  24. layers {  
  25.   name: "relu1"
  26.   type: RELU  
  27.   bottom: "conv1"
  28.   top: "conv1"
  29. }  
  30. layers {  
  31.   name: "pool1"
  32.   type: POOLING  
  33.   bottom: "conv1"
  34.   top: "pool1"
  35.   pooling_param {  
  36.     pool: MAX  
  37.     kernel_size: 3
  38.     stride: 2
  39.   }  
  40. }  
  41. layers {  
  42.   name: "norm1"
  43.   type: LRN  
  44.   bottom: "pool1"
  45.   top: "norm1"
  46.   lrn_param {  
  47.     local_size: 5
  48.     alpha: 0.0001
  49.     beta: 0.75
  50.   }  
  51. }  
(2)第二層:第二層的輸入也就是96*28*28的單通道圖片,因為我們上一步已經把三通道合在一起進行卷積了。第二層結構,選擇256個濾波器,濾波器大小為5*5,卷積步長為1,這個也可以參考AlexNet的結構。池化也是選擇跟上面的一樣的引數。
  1. layers {  
  2.   name: "conv2"
  3.   type: CONVOLUTION  
  4.   bottom: "norm1"
  5.   top: "conv2"
  6.   blobs_lr: 1
  7.   blobs_lr: 2
  8.   weight_decay: 1
  9.   weight_decay: 0
  10.   convolution_param {  
  11.     num_output: 256
  12.     pad: 2
  13.     kernel_size: 5
  14.     weight_filler {  
  15.       type: "gaussian"
  16.       std: 0.01
  17.     }  
  18.     bias_filler {  
  19.       type: "constant"
  20.       value: 1
  21.     }  
  22.   }  
  23. }  
  24. layers {  
  25.   name: "relu2"
  26.   type: RELU  
  27.   bottom: "conv2"
  28.   top: "conv2"
  29. }  
  30. layers {  
  31.   name: "pool2"
  32.   type: POOLING  
  33.   bottom: "conv2"
  34.   top: "pool2"
  35.   pooling_param {  
  36.     pool: MAX  
  37.     kernel_size: 3
  38.     stride: 2
  39.   }  
  40. }  
  41. layers {  
  42.   name: "norm2"
  43.   type: LRN  
  44.   bottom: "pool2"
  45.   top: "norm2"
  46.   lrn_param {  
  47.     local_size: 5
  48.     alpha: 0.0001
  49.     beta: 0.75
  50.   }  
  51. }  

(3)第三層:濾波器個數選擇384,卷積核大小為3*3。

  1. layers {  
  2.   name: "conv3"
  3. 相關推薦

    深度學習(十四)基於CNN性別年齡識別

    CNN應用之性別、年齡識別 作者:hjimce 一、相關理論   本篇博文主要講解2015年一篇paper《Age and Gender Classification using Convolutional Neural Networks

    基於CNN人臉 性別年齡識別

    CNN應用之性別、年齡識別作者:hjimce一、相關理論  本篇博文主要講解2015年一篇paper《Age and Gender Classification using Convolutional Neural Networks》,個人感覺這篇文獻沒啥難度,只要懂得Alexnet,實現這篇文獻的演算法,會

    人臉性別年齡識別

    本文是對age-gender-estimation專案的詳細講解,它給出了使用keras進行性別和年齡識別的完整流程。 資料 採用的資料集為imdb-wiki,這是一個包含 20,284名人的460,723張以及維基百科上imdb的 62,328張共計523,051 張人

    人臉屬性分析--性別年齡和表情識別

    人臉屬性指的是根據給定的人臉判斷其性別、年齡和表情等,當前在github上開源了一些相關的工作,大部分都是基於tensorflow的,還有一部分是keras,CVPR2015曾有一篇是用caffe做的. CSDN github https:/

    沫沫金原創提供:完整的根據身份證獲取省份性別年齡生日及頁面驗證

    數字 部分 ast script cit key oot test log 概述: 身份證的校驗,識別,分離,處處可見。最近H5移動端的項目就需要掃碼獲取身份證,根據身份證自動識別省份、性別、年齡、生日信息。這裏分享完善版,希望大家喜歡。 環境: 依賴jQuery、Boot

    通過身份證分析出生年月日性別年齡的SQL語句

    int rda mat get sta 字符串格式化 pan pre class update [表名] set [性別]=(case when (left(right([身份證],2),1) % 2 = 0) then ‘女‘ else ‘男‘ end ) where

    Excel表格身份證號碼如何一鍵提取性別年齡出生年月

    身份證號 cap 是你 學會 不同的 位數 http ted 有效 Excel報表想必每一個職場人士每一天都要接觸到,不知道大家有沒有發現這樣一個問題,不知道如何提取Excel表格裏面的信息,那麽今天小編教大家幾個非常簡單的小技巧,輕松幫你快速提取身份證裏面的性別、年齡、出

    Excel表格×××號碼如何一鍵提取性別年齡出生年月

    Excel報表想必每一個職場人士每一天都要接觸到,不知道大家有沒有發現這樣一個問題,不知道如何提取Excel表格裡面的資訊,那麼今天小編教大家幾個非常簡單的小技巧,輕鬆幫你快速提取×××裡面的性別、年齡、出生日期。 1、 提取Excel×××的性別 想必大家都非常好奇是如何提取的,其實不知道

    安卓使用Java語言從身份證號碼中截取出生日期省份性別年齡

    宣告:本文是看了大神程式碼作為筆記摘入,也添加了相關聯文章的URL。 1.首先每個省份相對應的身份證號開頭碼都是不一樣的,且公民身份證號碼是特徵組合碼,由十七位數字本體碼和一位數字驗證碼組成。排列從左至右一次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。

    基於Tensorflow訓練物體人像識別的模型

    領導突發奇想一個idea,於是踏上了瞭解Tensorflow機器學習框架之路,踩過很多坑,做個記錄。各位看官看的時候有些訓練方式可能已經過時或者不對,見諒。 參考文件 環境配置: ubuntu 16.0.4 Python 2.7 tensorflow

    python tensorflow 基於cnn實現手寫數字識別

    感覺剛才的程式碼不夠給力,所以再儲存一份基於cnn的手寫數字自識別的程式碼 # -*- coding: utf-8 -*- import tensorflow as tf from tensorflow.examples.tutorials.mnist

    java通過身份證號碼獲取出生日期性別年齡

    身份證號碼: 15位:6位地址碼+6位出生年月日(900101代表1990年1月1日出生)+3位順序碼 18位:6位地址碼+8位出生年月日(19900101代表1990年1月1日出生)+3位順序碼+1位校驗碼 地區碼: 1、 第一、二位表示省(自治區、直

    通過身份證號動態獲取生日性別年齡

    $('#idNumber').blur(function (){ var UUserCard = $("#idNumber").val(); if(UUserCard!=null&&

    [052]TensorFlow Layers指南:基於CNN的手寫數字識別

    TensorFlow Layers module 為容易的建立一個神經網路提供了高水平的API介面。它提供了很多方法幫助建立dense(全連線)層和卷積層,增加啟用函式和應用dropout做歸一化。在這個教程中,你會學到如何用layers構建一個卷積神經網路用於

    2.實現一個通訊錄; 通訊錄可以用來儲存1000個人的資訊,每個人的資訊包括: 姓名性別年齡電話住址 提供方法: 1. 新增聯絡人資訊 2. 刪除指定聯絡人資訊 3. 查詢指定聯

    實現一個通訊錄  通訊錄可以用來儲存1000個人的資訊,每個人的資訊包括:  姓名、性別、年齡、電話、住址   提供方法: 1.新增聯絡人資訊 2.刪除指定聯絡人資訊  3.查詢指定聯絡人4.修改聯絡人資訊5.顯示所有聯絡人資訊 6. 清空所有聯絡人 7. 以名字排序所有聯絡

    SmileyFace——基於OpenCV的人臉人眼檢測面部識別程序

    tro 識別 open HR tps 應用 動態 框圖 顯示 項目地址 https://github.com/guoyaohua/SmileyFace 開發環境 Visual Studio 2010 MFC + OpenCV 功能描述 靜態圖像人臉檢測 視頻人臉追蹤檢測

    基於pythonface++實現人臉檢測人臉識別

    face++做的人臉識別應該是我目前接觸到的效果最好的了。這家公司也是個獨角獸,專門做人臉識別這塊的,返回的照片的資訊很全,也好呼叫。不過只提供線上的,不提供離線sdk沒法做一些實時性的東西。 import requests from json import JSONDecoder import

    基於 CNN年齡性別檢測

    自2012年深度學習火起來後,AlexNet,vgg16,vgg19,gooGleNet,caffeNet,faster RCNN等,各種模型層出不群,頗有文藝復興時的形態。 在各種頂會論文中,對年齡和性別的檢測的論文還是比較少的。而本文將要講解的是2015年的一篇cvpr

    人臉屬性識別演算法 | 性別+種族+年齡+表情

     內容梗概   隨著社會的發展,快速有效的自動身份驗證在安防領域變的越來越迫切。由於生物特性是人的內在屬性,具有很強的自身穩定性和個體差異性,是身份驗證的最理想依據。利用人臉屬性進行身份驗證又是最自然直接的手段,相比其它人體生物特性,它具有直接、友好、方便的特點,更容易

    人臉識別——基於CNN的模型實現

    本文是基於吳恩達《深度學習》卷積神經網路第四周習題而做。通常人臉識別問題分為兩類:人臉驗證和人臉識別,人臉驗證可以作為人臉識別的前提,具體的講解可以觀看達叔《深度學習》教程,在此預設大家對人臉識別問題已有了解。 所需的第三方庫如下,其中所用的資料集和輔助程式可點選此處下載。