用照片预测人的年龄【图像回归】

news2024/12/27 13:34:43

在图像分类任务中,卷积神经网络 (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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1214428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WireGuard 组网教程:快速构建安全高效的私密网络并实现内网穿透

文章目录 1 引言1.1 什么是WireGuard1.2 WireGuard可以用来做什么1.3 WireGuard原理1.4 WireGuard安装 2 WireGuard组网实现内网穿透2.1 前提条件2.2 网络拓扑结构2.3 具体步骤2.3.1 中继服务器配置2.3.2 其他peer2.3.3 测试 2.4 WireGuard配置文件说明 3 WireGuard工具3.1 wg-…

智慧环保:科技驱动下的环境保护新篇章

智慧环保:科技驱动下的环境保护新篇章 环境保护已经成为当今社会的重要议题,而科技的飞速发展为我们开启了智慧环保的新篇章。在这篇文章中,我们将介绍智慧环保所带来的机会和创新,以及科技在环境保护中的重要作用。 智慧环保的理…

Topaz Video AI:引领视频质量革命,让您的内容焕发新生

随着数字媒体的日益普及,视频质量的重要性日益凸显。无论是个人用户还是专业团队,都需要确保他们的视频内容具有最佳的质量。但是,由于各种原因,如设备限制、环境干扰等,往往导致视频质量不尽如人意。这时,…

基于SSM的员工信息管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

[Android]创建TabBar

创建一个包含“首页”、“分类”和“我的”选项卡的TabBar并实现切换功能,通常可以通过使用TabLayout结合ViewPager或ViewPager2来完成。以下是一个基本的示例,展示了如何使用Kotlin和XML来实现这个功能。 1.添加依赖项到build.gradle dependencies {/…

linux 网络 cat /proc/net/dev 查看测试网络丢包情况

可以通过 cat /proc/net/dev 查看测试网络丢包情况,drop关键字,查看所有网卡的丢包情况 还可以看其他数据, /proc/net/下面有如下文件

德迅云安全为您介绍关于抗D盾的一些事

抗D盾概述: 抗D盾是新一代的智能分布式云接入系统,接入节点采用多机房集群部署模式,隐藏真实服务器IP,类似于网站CDN的节点接入,但是“抗D盾”是比CDN应用范围更广的接入方式,适合任何TCP 端类应用包括&am…

kubernetes--资源调度

目录 一、自动调度 1. Pod 启动创建过程: 2. 调度过程: 2.1 调度分为几个部分: 2.2 常见的预算策略( Predicate ): 2.3 常见的优选策略(priorities): 二、定向调度&…

【Vue】内置指令

hello,我是小索奇,本章带大家掌握核心的内置指令,一起study吧 内置指令 v-text v-text用于将一个变量的值渲染为元素的文本内容 注意v-text只能接受字符串类型的值,对于对象类型,会调用toString()方法 与插值表达式区别就是它会替换标签中…

wpf devexpress 排序、分组、过滤数据

这个教程示范在GridControl如何排序数据,分组数据给一个行创建一个过滤。这个教程基于前一个教程。 排序数据 可以使用GridControl 排序数据。这个例子如下过滤数据对于Order Date 和 Customer Id 行: 1、对于Order Date 和 Customer Id 行指定Colum…

11_聚类算法

文章目录 1 聚类1.1 什么是聚类1.2 相似度/距离公式1.3 聚类的思想 2 K-means算法2.1 K-means算法步骤2.2 K-means算法思考2.3 K-means算法优缺点 3 解决K-Means算法对初始簇心比较敏感的问题3.1 二分K-Means算法3.2 K-Means算法3.3 K-Means||算法3.4 Canopy算法3.4.1 Canopy算…

ElasticSearch 安装(单机版本)

文章目录 ElasticSearch 安装(单机版本)环境配置下载安装包调整系统参数安装启动并验证 ElasticSearch 安装(单机版本) 此文档演示 ElasticSearch 的单机版本在 CentOS 7 环境下的安装方式以及相关的配置。 环境配置 Linux 主机一…

【电路】MOS管开关电路

目录 简介: MOS管导通特性 应用实例: MOS管的作用-开关 更好的理解方式: 仿真: 简介: MOS管也就是常说的场效应管(FET),有结型场效应管、绝缘栅型场效应管(又分为…

JVM jstat 查看内存新生代老年代回收情况,排查oom

jstat 命令 jstat - [-t] [-h] [ []] option:我们经常使用的选项有gc、gcutil vmid:java进程id interval:间隔时间,单位为毫秒 count:打印次数 每秒打印一次 jstat -gc 9162 1000S0C:年轻代第一个survivor的容量…

Django(七、模型层)

文章目录 模型层模型层前期准备使用django ORM要注意 代码演示:切换MySQL数据库如何查看django ORM 底层原理? 单表操作模型层之ORM常见关键字基础的增删改查常用的关键字 常见的十几种查询基于双下滑线的查询 模型层 模型层前期准备 使用django ORM要…

【汇编】mov和add指令、确定物理地址的方法、内存分段表示法

文章目录 前言一、学习汇编指令——用中学1.1 汇编指令分析汇编输出分析 二、确定物理地址的方法2.1 什么叫做物理地址2.2 8086中的物理地址2.3 8086CPU给出物理地址的方法2.4 “段地址16偏移地址物理地址”的本质含义 三、内存分段表示法3.1 用分段的方式管理内存3.2 同一段内…

SAM分割模型的5个典型用例

Meta AI 于2023 年推出的分割任意模型 (SAM) 彻底改变了我们对图像分割的质量标准。 给定输入图像,SAM 尝试分割图像中的所有对象并生成分割掩模。 使用 SAM,你可以分割对象,然后,可以使用模型来利用该信息,例如用于为…

Spring cloud负载均衡@LoadBalanced LoadBalancerClient

LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…

kubectl 本地远程链接k8s多个集群,远程管控多集群,查看日志 部署服务(windows版)

文章目录 一、前言二、windows上安装kubectl和mobaxterm2.1 准备安装包2.2 安装kubectl2.3 链接k8s集群2.4 查看某一个pod的容器日志2.5 切换context 上下文配置,实现在多个k8s集群间动态切换 一、前言 现如今是一个万物皆上云 的时代,各种云层出不穷&am…

【Rust】快速教程——从hola,mundo到所有权

前言 学习rust的前提如下: (1)先把Rust环境装好 (2)把VScode中关于Rust的插件装好 \;\\\;\\\; 目录 前言先写一个程序看看Rust的基础mut可变变量let重定义覆盖变量基本数据类型复合类型()和 [ …