年龄识别(resnet_transfer_learning)

1,本文思路:

  1. 对DEX文章DEX Deep EXpectation of apparent age from a single image的基本感悟
    本文的结果在2015年Chalearn LAP的比赛中拿到了年龄识别比赛项目的第一名。作者的基本思路是做转移学习(transfer learning)。他的文章主要有两个方面的贡献:
  • 构建了一个大型的人脸年龄数据库imdb和wiki数据库,其中imdb有大约461871张人脸,而wiki有62359张人脸。这是现在公布在网上的最大的人脸年龄的数据库。但是这个数据库的缺点是(1)缺少15岁及以下的人脸图片,所以最后训练得到的模型对15岁以下的人物图片预测结果不好;(2)因为是从网上爬取的明星图片,包含大量误差噪声。但是这个年龄数据库已经是现有的最好的年龄数据库了。
  • 选用了VGG16的网络,并且通过imagenet比赛上的模型,利用自己的imdb-wiki的数据库进行了finetuning,最后用classification+expected value的方式获得了3.221的mae值,赢得了比赛第一名。
    详细步骤请查阅论文。
  1. 对ordinary regressiong文章Ordinal Regression With Multiple Output CNN for Age Estimation的基本感悟
    本文是2016年发表在cvpr上的文章,这篇文章利用排序回归的方式构建了一个轻量级的神经网络,效果同样十分好。改文章同样有这两个方面的贡献:
  • 构建了一个亚洲人脸数据库,所有数据是从人人网上爬取的,并且进行了分类整理。该数据库有160K张人脸图片,同样十分庞大。但是数据分布主要在15到40岁之间。现该数据集还没有公布出来
  • 自己设计了一个3层的卷积神经网络,利用排序回归的思想进行了年龄回归,在morph数据库上测试mae为3.27。效果十分好。
    详细步骤请查阅论文。
  1. 对以上两篇文章结果的个人感悟
    DEX思路效果好,结果稳定,适应情况多,但是模型太大,运算时间长。
    Ordinary Regression思路,效果好,模型小,可以做到实时性,但是我在实际测试使用过程中预测结果不稳定。
    而且两篇文章的训练数据库都缺少1-15岁的数据集部分。
    我从实用性的角度,希望能构建一个预测结果稳定,运行速度快,而且预测范围广泛的网络模型,便选择了使用resnet-50网络模型,结合Tutu公司的1-15岁的人脸数据库以及imdb-wiki数据库,通过finetuning的方式构建了满足以上要求的网络模型。

2,训练过程

  1. 图像预处理

  2. 网络结构

3,模型结果展示

年龄识别

1,对参考论文Ordinal Regression with Multiple Output CNN for Age Estimation理解

  1. 简介:
    该论文是2016年最新的一篇关于年龄识别的论文。它的主要贡献在于提出了一种新的结合深度学习网络和回归模型的端到端的学习方法进行年龄识别,该方法既没有传统年龄识别方法需要手动构造特征进行学习过程的繁琐,又没有一些深度学习网络的庞大,它通过仅仅3层卷积层和一个全连接层就实现快速而准确地年龄识别过程。同时该论文还构造了一个新的年龄数据库AFAD(Asian Face Age Dataset),从人人网上爬下了约164,432张人脸图,年龄分布从15岁到40岁,其中有63,680张女性人脸图以及100,752张男性人脸图。

五,opencv2.x模块highgui模块介绍

一,opencv2.x 模块highgui介绍

opencv被设计的能偶适应各种应用程序,也能用于需要功能丰富的UI框架或者是一点都不需要UI的应用。但是某些时候我们需要快速尝试一些功能并且能将其可视化,所以就设计了HighGUI这个模块,用于帮助显示数据。
该模块主要提供了以下一些简单易用的接口:

  1. 建造和操作窗口,这些窗口能够显示图像和存储图像内容。
  2. 对窗口增加控制条,能够处理一些简单的鼠标事件和键盘命令。
  3. 将图像写入内存或磁盘,或者从内存和磁盘读取图像
  4. 从相机或者是文件读取视频,或者将视频写入文件。

四,opencv2.x模块core介绍(三)

一,opencv模块core内容第三部分——Drawing Functions(绘图函数)

绘图函数可以再任意深度的矩阵(图像)上工作。这些函数就是在图像矩阵上绘出特定的图像。主要有以下几种简单的绘图功能。

  1. 绘制文字putText
  2. 绘制矩形rectangle
  3. 绘制圆形circle
  4. 绘制椭圆ellipse
  5. 绘制线段line
  6. 绘制箭头arrowedLine
  7. 绘制曲线polylines
  8. 其余一些帮助函数clipLine, ellipse2Poly, fillConvexPoly, fillPoly, getTextSize, InitFont

三,opencv2.x模块core介绍(二)

一,opencv模块core内容第二部分——Operations on Arrays(对数组的操作)

计算机图像都是以矩阵的形式存储一个个像素点,而这些各种矩阵在计算机内存中实际上是以数组的形式真实存在的,只不过是通过类和面向对象的方式将其封装成了和matlab类似的矩阵。所以,各种对矩阵(数组)的操作也是opencv中核心内容之一。其基本功能和作用就相当于matlab中那些对矩阵操作的函数。

二,opencv2.x模块core介绍(一)

一,opencv模块core内容第一部分——Basic Structures(基本数据结构)

该模块中包含了opencv所利用到的最基本的数据结构,是opencv最基础最核心,也是最需要掌握的内容,本章节主要介绍opencv2.x基于c++的类,只是顺带提一下opencv1.x中的基于c语言类型的数据结构。
opencv2.x中最基础的数据类型有如下几个:
DataType——数据类型
Point_,Point3_——点(x,y,z)
Size_——尺寸(width*heigth)
Rect_,RotatedRect——矩形(x,y,width,height)
TermCriteria——终止条件
Matx——小矩阵
Vec——向量
Scalar_——标量
Range——范围
Ptr——指针(重点,难点,需花时间)
Mat,Mat_——矩阵(最重要,最核心,需要很多时间)
InputArray,OutputArray——输入输出数组
NartMatIterator——矩阵迭代
SparseMat,SparseMat_——稀疏矩阵
Algorithm——算法

一,opencv2.x介绍

一,opencv概览

opencv(open source computer vision library:opencv官网是一个开源的计算机视觉库,该库包含了几百个计算机视觉处理算法。opencv库现阶段已经更新到3.x版本,但由于其不稳定性,故多采用opencv2.x版本。opencv1.x版本是基于c语言撰写的API,而opencv2.x是基于c++撰写的API。
opencv采用模块结构,这代表着该库包含了一些分享的或者是静态的库。下面就是各个主要模块的介绍:

  • core-核心模块,该模块定义了opencv里面的基本的数据结构,包含了多维数组Mat和一些被其他模块使用的基本函数。
  • imgproc-一个图像处理模块,该模块包含了线性和非线性的图像处理滤波器,几何图像转换(缩放,仿射变换,视图弯曲,映射),彩色空间变换,直方图等等。
  • video-视频分析模块,该模块包含运动估计,背景去除和目标追踪算法。
  • calib3d-3d校准模块,该模块包含基本的多视图几何算法,单一和立体摄像机校准,目标姿势估计,立体一致性算法和3d重建元素等。
  • features2d-2d特征模块,改模块包含了显著特征检测器,描述符和描述符匹配器。
  • objdetect-目标检测模块,该模块包含了目标检测和预定义类的实例(例如faces,eyes,mugs,people,cars等等)。
  • highgui-该模块包含了一些处理视频捕获,图像和视频编码,以及一些简单的用户界面能力的易于使用的接口。
  • gpu-该模块包含了为不同的opencv模块使用的GPU加速算法。
  • 其他-其他一些模块为帮助模块,例如FLANN和Google测试包装器,Python绑定等等。

,