Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at People Data

Predict a person's age from an image of their face

Originally released in 2015 as a pre-trained model for the launch of the IMDB-WIKI dataset by the Computer Vision Lab at ETH Zurich, this model is based on the VGG-16 architecture and is designed to run on cropped images of faces only. The model was then fine-tuned on the dataset for the 2015 Looking At People Age Estimation Challenge. An ensemble of these models won first place at the challenge.

Number of layers: 40 | Parameter count: 134,674,341 | Trained size: 540 MB |

Training Set Information

Performance

Examples

Resource retrieval

Get the pre-trained net:

In[1]:=
NetModel["Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at \
People Data"]
Out[1]=

Basic usage

Guess the age of a person from a photograph. First, obtain the trained net:

In[2]:=
(* Evaluate this cell to get the example input *) CloudGet["https://www.wolframcloud.com/obj/1eda5805-bb0b-4b5f-887e-1c72a8e5c4dc"]
Out[2]=

Obtain the probability distribution over all possible ages:

In[3]:=
(* Evaluate this cell to get the example input *) CloudGet["https://www.wolframcloud.com/obj/61efc7f0-015e-4017-837d-2f970275a712"]
Out[3]=

Plot the probability distribution over possible ages:

In[4]:=
ListPlot[probabilities, Filling -> Axis, PlotRange -> All]
Out[4]=

The recommended estimator of the age is the mean of the probability mass function:

In[5]:=
Mean@WeightedData[Range[0, 100], probabilities]
Out[5]=

By default, the mode is used as the estimator:

In[6]:=
MaximalBy[Value][probabilities]
Out[6]=

This net is designed to work with cropped images of faces only. If the photograph is not a facial image, the results may be unexpected:

In[7]:=
(* Evaluate this cell to get the example input *) CloudGet["https://www.wolframcloud.com/obj/9743eb15-2d28-4f28-b488-c0cf12e317fd"]
In[8]:=
NetModel["Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at \
People Data"][img]
Out[8]=

Crop the photograph:

In[9]:=
crop = ImageTrim[img, #] & /@ FindFaces[img]
Out[9]=

Guess the age of a person from the cropped image:

In[10]:=
NetModel["Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at \
People Data"][crop]
Out[10]=

Net information

Inspect the number of parameters of all arrays in the net:

In[11]:=
NetInformation[
 NetModel["Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at \
People Data"], "ArraysElementCounts"]
Out[11]=

Obtain the total number of parameters:

In[12]:=
NetInformation[
 NetModel["Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at \
People Data"], "ArraysTotalElementCount"]
Out[12]=

Obtain the layer type counts:

In[13]:=
NetInformation[
 NetModel["Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at \
People Data"], "LayerTypeCounts"]
Out[13]=

Display the summary graphic:

In[14]:=
NetInformation[
 NetModel["Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at \
People Data"], "SummaryGraphic"]
Out[14]=

Export to MXNet

Export the net into a format that can be opened in MXNet:

In[15]:=
jsonPath = Export[FileNameJoin[{$TemporaryDirectory, "net.json"}], NetModel["Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at \
People Data"], "MXNet"]
Out[15]=

Export also creates a net.params file containing parameters:

In[16]:=
paramPath = FileNameJoin[{DirectoryName[jsonPath], "net.params"}]
Out[16]=

Get the size of the parameter file:

In[17]:=
FileByteCount[paramPath]
Out[17]=

The size is similar to the byte count of the resource object:

In[18]:=
ResourceObject[
  "Age Estimation VGG-16 Trained on IMDB-WIKI and Looking at People \
Data"]["ByteCount"]
Out[18]=

Represent the MXNet net as a graph:

In[19]:=
Import[jsonPath, {"MXNet", "NodeGraphPlot"}]
Out[19]=

Requirements

Wolfram Language 11.2 (September 2017) or above

Resource History

Reference