用照片预测人的年龄【图像回归】
在图像分类任务中,卷积神经网络 (CNN) 是非常强大的神经网络架构。 然而,鲜为人知的是,它们同样能够执行图像回归任务。
图像分类和图像回归任务之间的基本区别在于分类任务中的目标变量(我们试图预测的东西)不是连续的,而回归任务中的目标变量是连续的。 例如,如果我们需要在不同的狗和猫品种之间进行分类,它将属于分类任务的范围。 然而,如果我们需要根据房屋图像来预测房价,这将是一个回归任务。

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器
我在人寿保险行业工作,当今该行业在全球范围内发生的重大变化之一就是简化客户的入职流程。 不同的公司正在努力使保险销售过程变得更简单、直观和无麻烦。 在这个方向上,深度学习技术对于解决问题非常有用。 例如,如果深度学习模型可以预测一个人的年龄、性别、吸烟状况和体重指数(这些是计算给定承保金额的正确保费或拒绝/推迟承保的最关键因素), 保险公司可以为客户大大简化保险销售流程,并可能增加销售额。
我们知道,根据人的图像预测性别相对简单,这属于图像分类任务。如果你有兴趣,可以参考下这篇文章。
另一方面,图像回归任务(例如根据图像预测人的年龄)是相对难以完成的任务。 处理此任务的更简单方法是通过将不同年龄分组到一个桶中(即创建年龄范围)来使其成为分类任务。 然而,就保单销售而言,这并没有解决目的(通常死亡率或发病率因年龄和性别而异)。 因此,我尝试创建一个模型来预测该人的确切年龄。
1、偏差和数据选择问题
处理图像尤其是人物图像的主要问题是,公共领域免费提供的大多数数据源都存在明显的种族偏见。 Fastai 的杰里米·霍华德 (Jeremy Howard) 在他的一次深度学习课程讲座中谈到了这一点。 这些在公共领域提供的图像存在偏见,因为大多数捕获的图像都是白人,如果我们基于这些图像创建任何模型,那么它很可能不会在印度或亚洲血统的图像上表现良好 人们。
为了在一定程度上解决这个问题,我精心挑选了三个数据源(均在公共领域可用):
- IMDB-Wiki 人脸数据集
- UTK 人脸数据集
- Appa 真实人脸数据集
这些数据集是使用 0 到 100 岁之间所有年龄段的不同来源/图像创建的,如果我们将这些数据组合在一起,那么严重的种族偏见问题就会在一定程度上得到消除。
2、项目介绍
由于一些奇怪的原因,我为这个项目工作的 Kaggle Kernel 没有成功提交。 所以,我把笔记本放到了我的 GitHub 上。
以下是需要强调的几个要点:
- 使用 Fastai v1 模型并选择 CNN 架构 — ResNet34 来运行该模型。 我尝试使用更复杂的架构,例如 ResNet50,但发现验证错误更高。
- 在这个notebook中,我使用了图像调整大小技术,其中图像尺寸逐渐增加,这有助于获得更高的精度。 这是一项非常棒的技术,每次我们需要处理 CNN 时都必须使用它。
- 使用 L1 Smooth Loss(Huber 损失),其表现优于 L1 或 L2 损失。
- 在该项目期间,我学习了使用 Fastai 的判别学习技术,其中我们可以将 NN 架构拆分为不同的部分,并为 NN 架构的不同部分分配不同的权重衰减和学习率值。
- 最后,使用 Fastai Pytorch Hooks 和 Spotify Annoy 创建了图像相似度模型(在我看来效果不是很好。
年龄回归模型代码:
class AgeModel(nn.Module):def __init__(self):super().__init__()layers = list(models.resnet34(pretrained=True).children())[:-2]layers += [AdaptiveConcatPool2d(), Flatten()]layers += [nn.BatchNorm1d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)]layers += [nn.Dropout(p=0.50)]layers += [nn.Linear(1024, 512, bias=True), nn.ReLU(inplace=True)]layers += [nn.BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)]layers += [nn.Dropout(p=0.50)]layers += [nn.Linear(512, 16, bias=True), nn.ReLU(inplace=True)]layers += [nn.Linear(16,1)]self.agemodel = nn.Sequential(*layers)def forward(self, x):return self.agemodel(x).squeeze(-1)
在这里,你可以看到,在ResNet34的架构中,在删除处理分类任务的层之后,我们添加了可以处理回归任务的部分。
损失函数代码:
class L1LossFlat(nn.SmoothL1Loss):def forward(self, input:Tensor, target:Tensor) -> Rank0Tensor:return super().forward(input.view(-1), target.view(-1))
使用平滑 L1 损失,其表现优于 L1 或 L2 损失。
学习器代码:
learn = Learner(data_wiki_small, model, model_dir = "/temp/model/", opt_func=opt_func, bn_wd=False, metrics=root_mean_squared_error,callback_fns=[ShowGraph]).mixup(stack_y=False, alpha=0.2)learn.loss_func = L1LossFlat()
现在,我们将看到模型的一些预测:

每张照片的第一行文字是真实年龄,第二行是模型预测的年龄
还不错!
3、结束语
这是我参与过的最长的项目之一,但我必须说我在这个过程中学到了很多东西。 其中很少有判别性学习技术、通过重构模型来构建合适模型的方法、图像调整大小技术等。
原文链接:用照片预测年龄 - BimAnt
相关文章:
用照片预测人的年龄【图像回归】
在图像分类任务中,卷积神经网络 (CNN) 是非常强大的神经网络架构。 然而,鲜为人知的是,它们同样能够执行图像回归任务。 图像分类和图像回归任务之间的基本区别在于分类任务中的目标变量(我们试图预测的东西)不是连续…...
Fork项目新分支如何同步
这里以seata项目为示例: 一、添加Fork仓库的源仓库 git remote add seata gitgithub.com:seata/seata.git二、fetch git fetch seata...
Linux 常用压缩格式
Linux 常用压缩格式简介 Linux系统用户可以根据自己的需求选择合适的压缩工具来进行文件压缩和解压操作。Linux系统中常用的压缩软件都有相应的命令行工具,并且可以通过软件包管理器进行安装。主要有gzip、bzip2、zip、tar、7z。 gzip:gzip是一个广泛使…...
高效背单词——单词APP安利
大英赛,CET四六级,以及考研英语,都在不远的未来再度来临,年复一年的考试不曾停息,想要取得好成绩,需要我们的重视并赋予相应的努力。对于应试英语,词汇量是不可忽略的硬性要求。相比于传统默写&…...
力扣 字母异位词分组 哈表 集合
👨🏫 力扣 字母异位词分组 ⭐ 思路 由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。 🍑 AC code class Solut…...
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL存储过程 1. 介绍2. 使用3. 变量①系统变…...
使用SpringBoot进行游戏服务器开发
背景: 之前一直只考虑用JavaSe进行游戏服务器开发,目前项目使用了Spring,发现还是非常好的,好处如下: 好处1:依赖注入非常方便,我们只使用Spring最基本的功能即可,这样子就算是有一些模块不使用Spring管理…...
数据结构——树状数组
文章目录 前言问题引入问题分析树状数组lowbit树状数组特性初始化一个树状数组更新操作前缀和计算区间查询 总结 前言 原题的连接 最近刷leetcode的每日一题的时候,遇到了一个区间查询的问题,使用了一种特殊的数据结构树状数组,学习完之后我…...
Untiy 使用RotateAround()方法实现物体围绕某个点或者某个物体旋转
Untiy 实现物体围绕指定点或者某个物体旋转,可使用RotateAround()方法。 语法: public void RotateAround(Vector3 point, Vector3 axis, float angle); 其中,point:旋转中心点位置; axis:要围绕的轴,如x,y,z angel…...
图像分类(五) 全面解读复现ResNet
解读 Abstract—摘要 翻译 更深的神经网络往往更难以训练,我们在此提出一个残差学习的框架,以减轻网络的训练负担,这是个比以往的网络要深的多的网络。我们明确地将层作为输入学习残差函数,而不是学习未知的函数。我们提供了非…...
使用html2canvas转换table为图片时合并单元格rowspan失效,无边框显示问题解决(React实现)
最近使用 html2canvas导出Table表单为图片,但是转换出的图片被合并的单元格没有显示边框 查了原因是因为我为tr设置了背景色,然后td设置了rowspan,设置了rowspan的单元格就会出现边框不显示的问题。 解决方法就是取消tr的背景色,然…...
pandas教程:Time Series Basics 时间序列基础
文章目录 11.2 Time Series Basics(时间序列基础)1 Indexing, Selection, Subsetting(索引,选择,取子集)2 Time Series with Duplicate Indices(重复索引的时间序列) 11.2 Time Seri…...
【C++初阶】STL详解(四)vector的模拟实现
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
Zookeeper学习笔记(2)—— Zookeeper API简单操作
前置知识:Zookeeper学习笔记(1)—— 基础知识-CSDN博客 Zookeeper集群搭建部分 前提:保证zookeeper集群处于启动状态 环境搭建 依赖配置 <dependencies><dependency><groupId>junit</groupId><arti…...
YOLOv8-Seg改进:Backbone改进 |Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构
🚀🚀🚀本文改进:Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构,包括nextvit_small, nextvit_base, nextvit_large,相比较yolov8-seg各个版本如下: layersparametersgradientsGFLOPsnextvit_small61033841075...
DocCMS keyword SQL注入漏洞复现 [附POC]
文章目录 DocCMS keyword SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 DocCMS keyword SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测…...
利用(Transfer Learning)迁移学习在IMDB数据上训练一个文本分类模型
1. 背景 有些场景下,开始的时候数据量很小,如果我们用一个几千条数据训练一个全新的深度机器学习的文本分类模型,效果不会很好。这个时候你有两种选择,1.用传统的机器学习训练,2.利用迁移学习在一个预训练的模型上训练…...
pom.xml格式化快捷键
在软件开发和编程领域,"格式化"通常指的是将代码按照一定的规范和风格进行排列,以提高代码的可读性和维护性。格式化代码有助于使代码结构清晰、统一,并符合特定的编码规范。 格式化可以包括以下方面: 缩进:…...
【短文】【踩坑】可以在Qt Designer给QTableWidge添加右键菜单吗?
2023年11月18日,周六上午 今天早上在网上找了好久都没找到教怎么在Qt Designer给QTableWidge添加右键菜单的文章 答案是:不可以 在Qt Designer中无法直接为QTableWidget添加右键菜单。 Qt Designer主要用于创建界面布局和设计,无法直接添加…...
Git常用配置
git log 美化输出 全局配置参数 git config --global alias.lm "log --no-merges --color --dateformat:%Y-%m-%d %H:%M:%S --authorghost --prettyformat:%Cred%h%Creset - %Cgreen(%cd)%C(yellow)%d%Cblue %s %C(bold blue)<%an>%Creset --abbrev-commit"…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
