年龄识别之AgeNet

论文:AgeNet: Deeply Learned Regressor and Classifier for Robust Apparent Age Estimation

ICCV2015

 

论文提出了一种基于人脸的年龄识别网络AgeNet。该网络同时基于分类和回归对年龄进行预测,然后将2个分支的特征进行融合,得到更好的预测结果。并且在ChaLearn 2015 Apparent Age Competition 取得了最好的结果。

 

主要贡献:

  1. 提出了端到端的年龄识别方案AgeNet,并且了融合了回归和分类2个模。训练过程中,分别基于年龄数值进行回归,基于年龄的高斯分布作为label进行分类。
  2. 为了减少小数据上的过拟合,使用了迁移学习的策略。
  3. 取得了ICCV2015 Looking at People Challenge - Track 1 Apparent Age Estimation 第一名的成绩

 

整体网络结构:

使用的主干网络结构为GoogLeNet ,

网络结构的修改包括,去掉多余的2个loss层。在每一个Relu操作之前,增加BN操作,去除所有的dropout。

 

Label制作:

年龄的训练标签,可以使用下面3种方式表示。

(1)1-dimension real-value encoding,就是使用具体的一维数值表示

(2)0/1 encoding,使用one-hot形式表示

(3)Label distribution encoding,基于分布表示,

j表示按照时间顺序的年龄,比如0到85,

y表示标签,

σ 表示label的标准差,

最终标签分布如下,

Loss函数:

回归,

分类,

 

训练流程:

首先使用CASIA-WebFace 进行人脸识别训练。然后使用CACD ,Morph-II ,WebFaceAge 进行真实年龄的微调。最后使用Morph-II 进行表面年龄的微调。

 

人脸预处理:

(1)Face Detection 人脸检测

(2)Facial Landmark Localization 人脸关键点定位,包括左眼中心,右眼中心,鼻子尖,嘴巴左角,嘴巴右角。

(3)Face Normalization 人脸标准化,论文采用了基于外部(Exterior )和内部(Interior )的2种人脸标准化方法。

基于Exterior 的方法,既包括了外部的信息,也包括了全面的纹理信息。

基于organs 的方法,仅仅包括了内部的人脸五官。

2种方法都将人脸归一化到256*256大小。

 

集成学习:

(1)模型集成Model Ensemble ,将分类和回归进行集成。

(2)人脸模板集成Face Template Ensemble,采用不同的人脸标准化方法,不同的crop大小。

 

实验结果:

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我们可以使用PyTorch库来实现人脸年龄识别。首先需要准备数据集,可以使用一些公开的人脸数据集,如IMDB-WIKI或UTKFace。这里以IMDB-WIKI数据集为例。 1. 数据集准备 首先下载IMDB-WIKI数据集,可以从以下链接中下载: https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/static/imdb_crop.tar https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/static/wiki_crop.tar 将下载好的数据集解压到指定目录中,然后使用OpenCV库读取图片并进行预处理。 2. 模型搭建 我们可以使用CNN网络来构建人脸年龄识别模型。这里我们使用ResNet网络作为基础网络,并在其后面添加全连接层进行分类。具体代码如下: ```python import torch.nn as nn import torchvision.models as models class AgeNet(nn.Module): def __init__(self, num_classes): super(AgeNet, self).__init__() self.resnet = models.resnet18(pretrained=True) self.fc = nn.Linear(1000, num_classes) def forward(self, x): x = self.resnet(x) x = self.fc(x) return x ``` 3. 模型训练 我们可以使用PyTorch的DataLoader和Dataset来加载数据集,然后使用交叉熵损失函数和随机梯度下降优化器进行训练。具体代码如下: ```python import torch.optim as optim from torch.utils.data import DataLoader from torchvision.transforms import transforms # 数据预处理 train_transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) test_transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # 加载数据集 train_dataset = AgeDataset(train_data, train_labels, transform=train_transform) test_dataset = AgeDataset(test_data, test_labels, transform=test_transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) # 模型训练 model = AgeNet(num_classes=101).to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) for epoch in range(10): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data[0].to(device), data[1].to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 100 == 99: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100)) running_loss = 0.0 ``` 4. 模型预测 使用训练好的模型对新的人脸图片进行预测,具体代码如下: ```python import torch.nn.functional as F # 模型预测 def predict_age(image): image = test_transform(image).unsqueeze(0) output = model(image.to(device)) pred = F.softmax(output, dim=1) pred = torch.argmax(pred).item() return pred ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值