前面有测试过基于 caffe 的性别和年龄估计 - 论文阅读 - 基于CNN的年龄和性别分类 这里学习下 Github 中基于 Tensorflow 的性别和年龄估计.

Github - Age-Gender-Estimate-TF 路径

该实现采用 Tensorflow 来实现性别和人脸年龄估计.

  • 首先采用 dlib 对图片进行人脸检测与人脸对齐.
  • 然后, 采用深度 CNN 来估计年龄和性别.

该实现可以一次性估计图片中多个人脸. 如:

<h2>1. 依赖环境</h2>

  • CentOS7, Python2.7.14 (Python3 可能存在 Bug)
  • tensorflow==1.4
  • dlib==19.7.99
  • cv2
  • matplotlib==2.1.0
  • imutils==0.4.3
  • numpy==1.13.3
  • pandas==0.20.3

<h2>2 数据集准备</h2>

  • 下载数据集: [1] - imdb-crop [2] - wiki_crop</p>
  • <p>解压压缩数据集到 data/ 路径, 可以得到如下形式的图片路径:</p>
/path/to/project/data/imdb_crop/00/somepictures
/path/to/project/data/imdb_crop/01/somepictures
....
/path/to/project/data/imdb_crop/99/somepictures
  • 制作 tfrecords 数据集: 运行以下 python 脚本, 可将图片转化为 tfrecords.
python convert_to_records_multiCPU.py --imdb --nworks 8
<p>--imdb - 使用 imdb 格式数据集 --nworks 8 - 采用 8 个 CPU 核来并行地转化数据集. 由于需要先对图片中人脸进行检测和对齐, 非常耗时. 所以推荐多 CPU 核并行计算. 32 cores 的 Intel E5-2667 v4 耗时接近 50 分钟.

<h2>3 模型训练</h2>

将图片转化为 tfrecords 后, 可以得到类似于下面的路径:

/path/to/project/data/train/train-000.tfrecords
......
/path/to/project/data/test/test-000.tfrecords

这里采用 FaceNet 网络结构, 其基于 inception-resnet-v1 提取特征.
采用 facenet 中预训练模型, 来加速网络训练.
为了将预训练模型适用于这里, 对预训练模型进行了转换.
可以从下面下载转化后的预训练 facenet 断点权重.(可选, 也可以从零开始网络训练)
[1] - mega.nz

[2] - BaiduPan

解压得到:

/path/to/project/models/checkpoint
/path/to/project/models/model.ckpt-0.data-00000-of-00001
/path/to/project/models/model.ckpt-0.index
/path/to/project/models/model.ckpt-0.meta
  • 开始模型训练
python train.py --lr 1e-3 --weight_decay 1e-5 --epoch 6 --batch_size 128 --keep_prob 0.8 --cuda
--cuda - 采用 GPU 训练模型
  • 采用 tensorboard 可视化训练
tensorboard --logdir=./train_log

<h2>4 模型测试</h2>

  • 测试得到的所有训练模型:
python test.py --images "./data/test" --model_path "./models" --batch_size 128 --choose_best --cuda
--cuda - 采用 GPU 进行测试 --choose_best - 测试所有的训练模型,并返回最佳模型.
  • 仅测试得到的最新的训练模型:
python test.py --images "./data/test" --model_path "./models" --batch_size 128 --cuda
  • 在图片上测试得到的模型
python eval.py --I "./demo/demo.jpg" --M "./models/" --font_scale 1 --thickness 1
--I - 测试图片路径 --font_scale 1 --thickness 1 - 表示当图片中的文本标签过小或过大时, 来调整文本大小和宽度.

作者也提供了训练好的模型以供下载, 用于测试.
[BestModel - BaiduPan]

为了得到源自 Web Cam 的图片, 在运行 demo.py 时, 可能需要卸载 cv2, 并重新进行 Source 安装.

python demo.py 

<h2>Reference</h2>

[1] - Face Alignment with OpenCV and Python
[2] - davidsandberg/facenet
[3] - IMDB-WIKI – 500k+ face images with age and gender labels
[4] - Dex: Deep expectation of apparent age from a single image - ICCV2015
[5] - [Deep expectation of real and apparent age from a single image without facial landmarks - IJCV2016]

Last modification:October 9th, 2018 at 09:31 am