iOS 18(macOS 15)Vision 中新增的任意图片智能评分功能试玩

概述
在 WWDC 24 中库克“大厨”除了为 iOS 18 等平台重磅新增了 Apple Intelligence 以外,苹果也利用愈发成熟的机器学习引擎扩展了诸多内置框架,其中就包括 Vision。

想用本机人工智能自动为我们心仪的图片打一个“观赏分”吗?“如意如意,就如你心意吧”。
在本篇博文中,您将学到如下内容:
- 概述
- 1. Vision 框架简介
- 2. 图片“令人愉悦”的美学属性
- 3. 拒绝临渊羡鱼,撸起袖子上手实验!
- 总结
Apple Intelligence 的大幕正徐徐拉开,那小伙伴们还等什么呢?
让我们先来品尝点 AI 甜点吧!Let’s go!!!😉
1. Vision 框架简介
Vision 是苹果在 iOS 11(macOS 10.13)引入的一款将计算机视觉算法应用在图片和视频上以便完成各种任务的框架。

Vision 框架结合了机器学习(ML,Machine Learning)技术和 Swift 新并发特性,可以出色的在应用程序中执行计算机视觉任务。

Vision 特别擅长下面几种任务:
- 跟踪人和动物的身体姿势或对象的轨迹;
- 识别 18 种不同语言的文本;
- 检测人脸和人脸标志,如眼睛、鼻子和嘴巴等;
- 执行手动跟踪以启用新设备交互;
- 计算图片的美学评分以确定它们到底有多么让人“流连忘返”;

要开始使用 Vision 框架,一般的流程是:
- 为对应的分析类型创建一个请求(有 25 个以上的请求可供选择),每个请求都符合 VisionRequest 协议;
- 执行请求以获得观察结果或观察结果数组,以及请求的详细分析信息;
- 将定制的 Core ML 模型用于分类或对象检测等任务;
从 iOS 18(macOS 15)开始,苹果利用最新的 Swift 6 编译器大大简化了 Vision 的调用方式并且开始全面支持 Swift 现代化并发模型。


接下来,我们就从 Vision 众多 Request 中挑一个来看看它到底有多么强大、使用起来又是多么的方便吧!
2. 图片“令人愉悦”的美学属性
从 iOS 18(macOS 15)开始,苹果为 Vision 新增了一个 CalculateImageAestheticsScoresRequest 请求类型:

使用它我们可以轻而易举的分析任意图片的“美学分数”(Image Aesthetics Scores)。
虽然目前苹果开发官网对于 CalculateImageAestheticsScoresRequest 的介绍还“寥若晨星”,不过通过 WWDC 24 相关视频释放出的信号来看 —— 这个新请求主要目的是用来“评判”我们所拍摄相片在将来会有多么的令人“回味无穷”。

除了图片的“品质(quality)”以外,我们还可以使用 CalculateImageAestheticsScoresRequest 来分析图片是否为一张功能图片(Utility Image)。至于到底何为“功能图片”,请大家在观赏 WWDC 24 中对应的视频时“细细品味”吧。
想要进一步了解 WWDC 2024 中对于 Vision 的全新和增强功能,请小伙伴们猛戳如下链接观赏官方视频:
- Discover Swift enhancements in the Vision framework
现在,我们对 CalculateImageAestheticsScoresRequest 的所有了解都只是“纸上谈兵”。小伙伴们何不同我一起“御驾亲征”,来亲自感受一下它的高强本领呢!
3. 拒绝临渊羡鱼,撸起袖子上手实验!
目前 CalculateImageAestheticsScoresRequest 请求需要 iOS 18(iPadOS 18)或 macOS 15 系统,并且无法通过模拟器来执行。
虽然我的手机还未更新至 iOS 18 beta,但好在 mac 已经“捷足先登”升级至 macOS 15 beta3 了,所以最简单的方法就是在 mac 的 playground 中运行测试代码。
用 Xcode 16 新建一个 Playground 项目,并输入如下内容:
import AppKit
import Visionlet imageNames = ["1.jpeg", "2.JPG"]for imageName in imageNames {if let image = NSImage(named: imageName), let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil) {let request = CalculateImageAestheticsScoresRequest()Task {do {let observation = try await request.perform(on: cgImage)let desc = observation.descriptionlet score = observation.overallScoreprint("[\(imageName)] desc: \(desc), score: \(score.formatted(.number.precision(.fractionLength(2))))")} catch {print(error.localizedDescription)}}}
}
随后我们需要将几张测试图片放入 Playground 中:

值得注意的是,我们必须利用 mac 本机 macOS 15 的“原生力量”,所以 Playground 的运行平台需要设置为 macOS:

最后,用不同图片测试一下它们的“艺术美感”吧:

[1.jpeg] desc: ImageAestheticsScoresObservation(overallScore: 0.52685547, isUtility: true, uuid: 22EBF9CD-2FBE-42F7-9D20-ED883EE024F4, confidence: 1.0), score: 0.53
[2.JPG] desc: ImageAestheticsScoresObservation(overallScore: 0.7636719, isUtility: false, uuid: B34CEA6E-8E1F-498A-AE42-7F301BE905D5, confidence: 1.0), score: 0.76
可以看到风景图片得分会远高于“垃圾箱”图片的得分,正应了那句古话:“银烛秋光冷画屏,轻罗小扇扑流萤;停车坐爱枫林晚,霜叶红于二月花”,棒棒哒!💯
总结
在本篇博文中,我们讨论了苹果开发中的 Vision 框架,并介绍 iOS 18(macOS 15)其新增的为任意图片“观赏度”恣意评分的功能,这是通过本地机器学习来实现的。
感谢观赏,再会啦 😎
相关文章:
iOS 18(macOS 15)Vision 中新增的任意图片智能评分功能试玩
概述 在 WWDC 24 中库克“大厨”除了为 iOS 18 等平台重磅新增了 Apple Intelligence 以外,苹果也利用愈发成熟的机器学习引擎扩展了诸多内置框架,其中就包括 Vision。 想用本机人工智能自动为我们心仪的图片打一个“观赏分”吗?“如意如意&…...
如何实现若干子任务一损俱损--浅谈errgroup
errgroup 是 Go 语言官方扩展库 x/sync 中的一个包,它提供了一种方式来并行运行多个 goroutine,并在所有 goroutine 都完成时返回第一个发生的错误(如果有的话)。这对于需要并行处理多个任务并等待它们全部完成,同时需…...
并查集的基础题
## 洛谷p1196 绿 35m 点到祖先的距离 代码: #include<bits/stdc.h> using namespace std; const int N3e510; int f[N],dist[N],num[N];//num计算祖先有多少儿子 ,dist计算距离祖先有几个 int zx(int x){ if(f[x]x)return x;//x没爸爸 e…...
[论文翻译] LTAChecker:利用注意力时态网络基于 Dalvik 操作码序列的轻量级安卓恶意软件检测
LTAChecker: Lightweight Android Malware Detection Based on Dalvik Opcode Sequences using Attention Temporal Networks 摘要: Android 应用程序已成为黑客攻击的主要目标。安卓恶意软件检测是一项关键技术,对保障网络安全和阻止异常情况至关重要。…...
HTTPS链接建立的过程
HTTPS(HyperText Transfer Protocol Secure)建立链接的过程主要是通过TLS(Transport Layer Security)协议来实现的。HTTPS的链接建立过程可以分为以下几个步骤: 1. **客户端发起请求** - 客户端向服务器发送一个请求&…...
文档控件DevExpress Office File API v24.1 - 支持基于Unix系统的打印
DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库,不用安装Microsoft Office,就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…...
IP地址封装类(InetAddress类)
文章目录 前言一、IP地址是什么?二、IP地址封装类 1.常用方法2.实操展示总结 前言 当我们想要获取到通信对方的IP地址、主机地址等信息时,我们可以使用InetAddress类。InetAddress类在java的net包中。 一、IP地址是什么? IP地址 (Internet Pr…...
数据库设计规范化
在数据库设计中,尤其是在关系型数据库管理系统中,规范化(Normalization)是一种通过减少数据冗余和依赖关系来优化数据库表结构的过程。规范化可以确保数据的完整性和减少数据更新时的问题。规范化的过程通常遵循一系列标准或范式&…...
预约咨询小程序搭建教程,源码获取,从0到1完成开发并部署上线
目录 一、明确需求与规划功能 二、选择开发工具与模板 三、编辑小程序内容 四、发布与运营 五、部分代码展示 制作一个预约咨询小程序,主要可以分为以下几个步骤: 一、明确需求与规划功能 明确需求: 1.确定小程序的服务对象…...
leetcode217. 存在重复元素,哈希表秒解
leetcode217. 存在重复元素 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums [1,2,3,1] 输出:true 示例 2&#x…...
QT:QString 支持 UTF-8 编码吗?
在 Qt 中,字符串的处理主要依赖于 QString 类。QString 内部并不是直接使用 UTF-8 编码来存储数据的。相反,QString 使用 Unicode(特别是 UTF-16)来存储文本,以支持多语言环境的国际化应用。这种设计使得 QString 能够…...
我主编的电子技术实验手册(13)——电磁元件之继电器
本专栏是笔者主编教材(图0所示)的电子版,依托简易的元器件和仪表安排了30多个实验,主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】,精心设计的【实验步骤】,全面丰富的【思考习…...
odoo from样式更新
.xodoo_form {.o_form_sheet {padding-bottom: 0 !important;border-style: solid !important;border-color: white;}.o_inner_group {/* 线框的样式 *//*--line-box-border: 1px solid #666;*//*box-shadow: 0 1px 0 #e6e6e6;*/margin: 0;}.grid {display: grid;gap: 0;}.row …...
Oracle(52)分区表有哪些类型?
分区表在Oracle数据库中主要分为以下几种类型: 范围分区(Range Partitioning)列表分区(List Partitioning)哈希分区(Hash Partitioning)组合分区(Composite Partitioning࿰…...
大黄蜂能飞的起来吗?
Bumblebee argument 虽然早期的空气动力学证明大黄蜂不能飞行——因为体重太重,翅膀太薄,但大黄蜂并不知道,所以照飞不误。 背景 在20世纪初,科学家们通过研究发现,大黄蜂的身体与翼展的比例失调,按照…...
虹科新品 | PDF记录仪新增蓝牙®接口型号HK-LIBERO CL-Y
新品发布!HK-LIBERO CE / CH / CL产品家族新增蓝牙接口型号HK-LIBERO CL-Y! PDF记录仪系列新增蓝牙接口型号 HK-LIBERO CL-Y HK-LIBERO CE、HK-LIBERO CH和HK-LIBERO CL,虹科ELPRO提供了一系列高品质的蓝牙(BLE)多用途…...
Bytebase 2.22.1 - SQL 编辑器展示更丰富的 Schema 信息
🚀 新功能 SQL 编辑器直接展示表,视图,函数,存储过程等各种 Schema 详情。OpenAI 功能进入社区版(免费),现在您可以通过配置自有 OpenAI key 在 SQL 编辑器中启用自然语言转 SQL 功能。支持在 …...
SQL Server Management Studio的使用
之前在 https://blog.csdn.net/fengbingchun/article/details/140961550 介绍了在Windows10上安装SQL Server 2022 Express和SSMS,这里整理下SSMS的简单使用: SQL Server Management Studio(SSMS)是一种集成环境,提供用于配置、监视和管理SQL…...
Python 爬虫项目实战一:抖音视频下载与网易云音乐下载
一、项目背景 随着互联网的发展,爬虫技术在数据采集和资源获取中发挥着重要作用。本文将以实际案例为例,使用Python语言实现两个热门的爬虫项目:抖音视频文件下载和网易云音乐下载。通过这些实例,读者可以了解如何利用Python编写…...
CAMDS=中国汽车MDS
1、定义和缩写 MSDS(材料安全数据表, Material Safety Data Sheets),德语为SDB(Sicherheitsdatenbltter),是一种传达材料和混合物安全相关信息的工具,包括来自供应链和下游用户相关材料安全报告的信息。它们旨在为专业用户提供使用这些物质和制剂的必要信息和处理建议,…...
MySQL常用命令速查手册,用户权限控制功能实现说明。
MySQL常用命令全攻略 连接与退出MySQL 通过命令行连接到MySQL服务器: mysql -u username -p系统会提示输入密码。 退出MySQL命令行界面: exit;或使用快捷键 Ctrl D。 数据库操作 创建新数据库: CREATE DATABASE database_name;查看所有数据库…...
单片机AD采样十大滤波算法详解与应用
1. 单片机AD采样滤波算法概述在嵌入式系统开发中,ADC采样是获取模拟信号的关键环节。然而实际应用中,采样值常会受到各种干扰影响,导致数据波动甚至错误。作为一名有着十年嵌入式开发经验的工程师,我总结了十种最实用的AD采样滤波…...
Vue微商城实战:从零搭建高效开发环境与核心配置
1. 环境准备:搭建Vue开发基础 第一次用Vue做微商城项目时,我对着官方文档折腾了半天环境配置,结果运行时报错一片红。后来才发现是node版本和脚手架不兼容的问题。这里分享下我总结的零失败配置方案,帮你避开90%的初期坑点。 首先…...
ESP32轻量libcurl移植:HTTP/HTTPS客户端开发指南
1. 项目概述libcurl-esp32是一个专为 ESP32 平台定制的轻量化 libcurl 移植库,其核心目标是在 PlatformIO 构建环境下,为嵌入式固件开发者提供标准curl/curl.h头文件接口及对应运行时功能。该库并非完整移植上游 libcurl 的全部特性(如 FTP、…...
别再傻傻分不清!一张图看懂PMOS、NMOS和CMOS在电路设计中的真实区别
从物理特性到电路设计:PMOS、NMOS与CMOS的实战解析 在电子工程领域,MOSFET晶体管就像乐高积木一样构成了现代集成电路的基础模块。但面对PMOS、NMOS这对"双胞胎"时,许多初学者常常陷入困惑——为什么数字电路总爱用CMOS结构&#x…...
Go语言的Web框架:从Gin到Echo
Go语言的Web框架:从Gin到Echo 1. 引言 Web框架是现代Web应用开发的重要工具,它提供了路由、中间件、参数处理等功能,大大简化了Web应用的开发过程。Go语言作为一种高效、简洁的编程语言,拥有丰富的Web框架生态。本文将介绍Go语言…...
Windows Defender Remover:系统安全组件深度管理完全指南
Windows Defender Remover:系统安全组件深度管理完全指南 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors/…...
快马平台十分钟速成:用自然语言驱动你的第一个任务管理Agent原型
最近在尝试用AI技术简化日常任务管理,发现用自然语言驱动的任务管理Agent特别有意思。这种Agent能理解我们随口说的任务需求,自动分类整理,比传统手动输入方便多了。今天就来分享如何在十分钟内快速搭建这样一个原型,特别适合想验…...
AI赋能前端开发:让快马平台智能生成仪表盘页面架构与代码
最近在做一个数据可视化项目时,遇到了一个典型的前端开发需求:需要快速搭建一个专业级的仪表盘页面。这个页面需要包含数据概览卡片、图表展示区和用户留言列表三大核心模块。作为一个独立开发者,既要考虑UI美观度,又要兼顾代码质…...
高级编程 第二节:生成器和迭代器
一、迭代器和可迭代对象 1、迭代器对象 定义: 类中定义了__iter__和__next__函数 __iter__函数返回self,也就是自身 __next__函数返回下一个数据,如果没有数据了,则要返回StopIteration的异常 满足这三个条件的对象,就是迭代器对象。 class MyRange():def __init__(…...
