大多数浏览器和
Developer App 均支持流媒体播放。
-
Understanding Images in Vision Framework
Learn all about the many advances in the Vision Framework including effortless image classification, image saliency, determining image similarity, and improvements in facial feature detection, and face capture quality scoring. This packed session will show you how easy it is to bring powerful computer vision techniques to your apps.
资源
- Analyzing Image Similarity with Feature Print
- Classifying images for categorization and search
- Detecting Objects in Still Images
- Highlighting Areas of Interest in an Image Using Saliency
- Image Classification with Vision and CoreML
- Recognizing Objects in Live Capture
- Selecting a selfie based on capture quality
- Tracking Multiple Objects or Rectangles in Video
- Vision
- 演示幻灯片 (PDF)
相关视频
WWDC22
WWDC21
WWDC20
WWDC19
-
下载
早上好! 我叫 Brittany Weinert 我是来自 Vision 框架团队的软件工程师 今年 我们团队 带来了许多新技术和新产品
因为我们有太多 新东西要介绍 所以我们接下来 将深入研究这些新特点 如果你对我们完全不了解 也不要担心 我想你依然可以跟得上 我们希望 我们今天推出的这些新功能 能够激励你对我们团队有更多了解 并且能够将其运用到你的 App 当中 今天我们将谈论到 四个全新的主题 显着性 图像分类 图像相似性和面部质量 我们也做了一些技术升级 包括目标跟踪程序 面部标记 新的探测器以及 优化了的 Core ML 机器学习框架支持系统 今天 我要和大家分享的是显著性 让我们从定义开始 我要给你们看一张照片 需要你们注意 第一眼就吸引你们的地方 当你第一次看到这张照片 三只海雀坐在悬崖上 你有没有注意到 自己首先看到的是什么 根据我们的模型 大部分人首先看到的 是海雀的脸 这就是显著性 它包含两种类型 基于注意力类 以及基于客体性类型 我们在海雀图像上 看到的覆盖层叫做热图 是基于注意力的显著性产生的 但在我们探讨更多的可视化示例之前 我想先介绍每个算法的基础知识
基于注意力的显著性 是人类预期的显著性 我的意思是 基于注意力的显著性模型 是产生于人们在看到一系列图像时 所看到的东西 这意味着当人们看到图像时 热图会反射 并突出显示他们首先看到的地方
另一方面 基于对象的显著性 在图像中进行主题分割训练 以突出前景对象或图像的主题 因此在热图中 主体或前景对象会突出显示 现在我们来看一些例子 这是早先的海雀 这是覆盖在图像上的 基于注意力的热图
这是基于对象的热图 正如我所说 人们往往先看海雀的脸 所以海雀头部周围的区域 在基于注意力的热图上非常明显 对于对象 我们只是试图找到主题 在这种情况下 这是三个海雀 所以所有的海雀都会突出显示 00:02:48.486 --> 00:02:50.206 A:middle 下面让我们来看看
显著性在人物图像中的表现 基于注意力的显著性 人民面部周围的区域 往往是最突出的 不出所料 因为我们倾向于先看人的脸 对于基于对象的显著性 如果这个人是形象的主体 整个人应该突出显示
因此我要说 基于注意力的显著性 在两种显著性中更为复杂 因为它是由许多 人为因素决定的
决定注意力的显着性 以及突出与否的主要因素 是对比度 面部 主体 视野和光线
但有趣的是 它也可能受到感知运动的影响 在这个例子中 伞的颜色真的很亮眼 所以伞周围的区域是显著的 不过路也很突出 因为我们的眼睛 试图追踪伞的前进方向
对于基于对象的显著性 我们只是找出了打伞的人 我可以整天这样做 给你们展示更多的例子 但老实说 想要理解显著性 最好的方法还是自己尝试一下 在这里我鼓励大家 下载 Saliency App
接下来让我们来研究一下 从显著性请求中返回的内容 主要是热图 到目前为止我向你展示的图像里 热图已经缩放 重叠 着色 并放到图像上 但实际上 热图是一个非常小的 CV 像素缓冲 由 0 到 1 的浮点数组成 0 表示不存在 1 表示最显著 还需要进行额外的处理 才能做得到 和你在这里看到的效果完全一样 不过现在我们一起来看 如何提出最基本的请求
好了 现在首先我们开始 使用一个 VNImageRequestHandler 来处理一个单一的图像
下一步 选择你想要运行的算法 在这种情况下选择 AttentionBasedSaliency 如果你一直想使用同样的算法
接下来 你可以像通常那样执行请求 如果成功了 那么就应用 VNSaliencyImageObservation 填充请求中的结果属性
要访问热图 你需要像这样 调用 VNSaliencyImageObservation上的
pixelBuffer 属性 如果你想做基于对象的显著性 那你就 必须 要将请求名称和 revision 更改为 Objectness
因此 值得注意的是 基于注意力的是 VNGenerateAttentionBasedSaliencyImageRequest 基于对象的事 VNGenerateObjectnessBasedSaliencyImageRequest 那么现在 除了热图之外 我们来看另一个工具 即边界框 边界框能够标记出来 图像的所有显著区域 00:06:05.156 --> 00:06:06.726 A:middle 对于以注意力为基础的显著性来说
你应该始终有一个边界框 那就以对象为基础的显著性来说 你可以增加到用三个边框 加以标记
边界框在 相对于图像的标准化坐标空间中 原始图像和左下角是原点 非常类似于 Vision 中 其他算法返回的边界框 所以我写了一个小方法 演示如何得到边界框 并且使用它们 这里我们有一个 VNSaliencyImageObservation 你只需进入 访问其 salientObjects 属性 之后就会得到 一个边界框列表 你可以像这样进行使用 好了 现在你已经知道了 如何去制定一个请求 也明白了什么是显著性 那接下来我们就一起来看一些用例 首先为了有趣一点 你可以使用显著性作为一个图形蒙版 来编辑你的照片 这里你拥有热图 在左侧 我已经降低了非显著区域的饱和度 而在右侧 我为所有非显著区域 添加了高斯模糊 它真的让主体显眼了 00:07:25.536 --> 00:07:27.246 A:middle 另一个显著性的例子是
你可以增强你照片的观看体验 就比如你现在在家里 坐在沙发 哪怕你的电视或者电脑 已经进入待机模式 它也在进入你的照片库 很多时候 这些照片显示的算法 可能看似有点笨拙 它们放大图像中看似随机的部分 而不是 总是你所期望的 但是有了显著性的帮助 你总是能够知道主题在哪里 所以 你可以得到 像这样更像纪录片的效果 最后 显著性对其他视觉算法非常有用
假设我们有一个图像 我们想要在图像中 对对象进行分类
我们通过可以运行基于对象的显著性 来获取图像中的对象 将图像裁剪到 基于对象的显著性返回的边界框 并通过运行算法 以及运行图像分类算法 找出对象是什么 因此 由于边界框 你不仅能够知道 它们在图像中的位置 而且还可以通过 挑选其中包含这些对象的边界框
现在 你已经可以使用 Core ML 对事物进行分类 但今年 Vision 已经为提供了新的图像分类技术 由 Rohan 来介绍
早上好 我叫 Rohan Chandra 是一名来自 Vision 团队的研究员 今天 我将要跟大家谈论 今年 Vision API 提供的 一些新的 图像分类请求
现在作为一项任务 图像分类基本上是回答了这个问题 我的图像中的对象是什么
许多人已经对图像分类比较熟悉 你可能已经根据自己的数据 使用过 Create ML 或者 Core ML 来训练自己的分类网络 正如我们去年 在 Vision with Core ML 中展示的
其他人 可能对图像分类感兴趣 但觉得自己 缺乏开发自己网络的资源或专业知识 在实践中 从零开始开发一个大规模的分类网络 可能需要数百万张图像的标注 数千小时的培训 以及非常专业的开发领域知识
我们这里 Apple 已经完成了这个过程 所以我们希望与你们
以便你可以利用这项技术 而无需投入 大量时间或资源 来自己开发 我们还努力在 API 中添加工具 以帮助你 用有意义的方式 对 App 的结果进行推测和理解
现在我们在这里 讨论的网络 实际上是我们自己 用来为照片搜索体验提供支持的网络 这是我们专门开发的网络 为了在设备上高效运行 而不需要任何服务端处理 我们还开发了它 来识别超过一千种 不同类别的对象
现在值得注意的是 这是一个多标签网络 能够识别单个图像中的多个对象 而不是更典型的单标签网络 试图专注于识别图像中的 单个大型中心对象
现在 当我们谈论这个新的分类 API 时 我认为首先想到的问题之一 是它可以实际识别的对象是什么 那么 分类器可以预测的对象集称为分类系统
分类系统具有层次结构 在类之间具有方向关系
这些关系基于共享的语义含义 例如狗类可能会有像比格犬 00:11:26.616 --> 00:11:29.156 A:middle 卷毛狗 哈士奇狗和其他子类
从这个意义上来说 父类倾向于更一般化 而子类则是父类更具体的实例 当然你也可以使用 ImageRequest.known 分类查看整个分类
现在 在我们构建分类法时 我们应用了一些特定的规则
首先这些分类 必须在视觉上可识别
也就是说 我们要避免更多抽象概念 如假日或节日
我们也避免任何 可能被认为 具有争议性或冒犯性的类别 以及与名字 名词 形容词或基本形状有关的类别
最后我们省略了职业 这在一开始可能看起来很奇怪 但是如果 我们询问工程师的样子 请考虑你会得到什么样的答案 除了睡眠不足 和通常粘在电脑屏幕上之外 可能没有一个更简单的描述 可以适用于每一位工程师
让我们看一下你需要使用的代码 以便对图像进行分类
为原图像添加 ImageRequestHandler 下一步 执行 VNClassifyImageRequest 并检索你的观察结果 现在 在本例中 你实际上得到了一组观察结果 分类系统中的每个类 都有一个观察结果及其相关的置信度 在单标签问题中 你可能会期望 这些概率总和为 1 但这是一个多标签分类网络 每个预测都是 与特定类相关的 独立置信度
因此它们不会总和为 1 而是要在一个类中 进行比较 而不是跨越不同的类 所以我们不能简单地 用最大值来确定我们的最终预测 你可能想知道 我如何处理这么多类别 这么多的数字 我们在 API 中 实现了一些关键工具 来帮助你理解结果
现在为了在 API 中 00:13:22.086 --> 00:13:23.916 A:middle 讨论这些工具
我们首先需要定义一些基本术语 第一个是 当你对一个类有信心时 我们通常会将它 与特定于类的阈值进行比较 我们将其称为操作点 如果类的置信度高于阈值 那么我们就说 类存在于图像中 如果类置信度低于类阈值 那么我们就说 对象不在图像中 从这个意义上说 我们想要选取阈值 使得具有目标类的对象 通常具有高于阈值的置信度 而没有目标类的图像 通常具有低于阈值的分数 然而 机器学习并非一帆风顺 而且在某些情况下 网络不确定 置信度也相应降低 例如 当对象所处光线奇怪 或者出现角度奇怪时 就可能发生这种情况 那么 我们如何选择阈值呢
根据我们对阈值的选择 产生三种不同类型的搜索 我们可以有三种不同的制度 和方法
为了使这 更具体一点 假设我有一个图像库 我已经对其进行了分类 并存储了结果 假设在这个特定的案例中 我正在寻找摩托车的图像 现在我要选择阈值 这样摩托车图像的置信度 通常高于此阈值 而没有摩托车图像的 置信度通常低于此阈值 那么如果我选择一个低阈值 会发生什么 正如你在我身后看到的 当我应用这个低阈值时 我确实得到了 我的摩托车图像 但我也得到了右下角的 这些轻型摩托的图像 如果我的用户 是摩托车爱好者 他们可能会对这个结果感到有点恼火
当我们谈论 试图最大化 在整个库检索的 目标类别的百分比的搜索时 并不关心 这些错过的预测 我们就说摩托车存在时 实际上不存在 我们通常谈论的 是高召回搜索
现在我可以通过 简单地返回尽可能多的图像 来最大程度地召回 但是我会得到 大量的这些错误预测 我是说我的目标类 实际不存在但显示存在 所以我们需要 找到一个更平衡的阈值来召回 让我们来看看 如何更改代码 以执行此高召回搜索
这里我有和以前 相同的代码片段 但这次我执行了 hasMinimumPrecision 和特定召回值的筛选 对于我的观察数组中的 每个观察 只有当与类相关的置信度 达到我指定的召回级别时 它才能够被保留下来 现在确定这一点 所需的实际操作点 对于每个类都是不同的 这是我们根据 对分类系统中每个类的 网络分类情况 确定的 不过过滤系统 会自动为你处理 你所要做的就只是 指定你想操作的召回级别
所以我们在这里讨论的 是一种高召回搜索 但是如果我有一个 不能容忍这些错误预测的 App 比如我说摩托车 存在但实际上不存在 也就是说我要绝对确定 我检索的图像 实际上确实包含一辆摩托车 那么让我们回到 我们的图像库 看看如果应用更高的阈值 会发生什么 正如你在我身后看到的 当我应用我的高阈值时 实际上我只得到摩托车图像 但总体上 我得到的图像要少得多
当我们谈论一种搜索 试图最大限度地 提高检索图像中 目标类的百分比 忽略一些 更模糊的图像 这些图像可能包含目标类 那么我们说 这通常谈论的是高准确度搜索 又一次就像高召回一样 我们需要找到一个 更平衡的操作点 在这个点上我可以接受 目标类出现在我的结果中的可能性 但我得到的图像 并不会太少
现在让我们来看一下 如何通过修改代码 来执行这个高精度的搜索 这里有相同的代码片段 但这次我的过滤筛选 是用 hasMinimumRecall 和我指定的准确度值完成的 同样只有当与之相关的 置信度达到 我指定的准确度水平时
对于每一个类 实际需要的阈值 都是不同的 但是过滤系统会自动 为我处理这个问题 我需要做的就是 告诉它我想要的操作精度
所以我们在这里 谈到了两个不同的极端 一个是高召回 另一个是高准确度 但在实践中 最好找到两者之间的平衡点
那么我们现在就来看看如何做到这一点 了解发生了什么 我首先需要介绍一下 什么是准确度 和召回曲线 在实践中 需要做出权衡 增加一单位的准确度或召回率 会导致另一方面的减少 我可以将这种权衡 用图形表示 对于每个操作点
例如 当我实现召回 0.7 的操作点 我发现我得到了 相应的 0.74 准确度 我可以通过 计算多个操作点 来形成我的完整曲线
正如我之前所说 我希望在这条曲线上 找到一个平衡点 它可以达到对我的 App 有意义的召回和准确度 下面让我们看看 如何更改代码来实现它 以及准确度和召回曲线 如何发挥作用 我在这里使用 hasMinimumPrecision 进行过滤 在这里我指定了最小准确度 和召回值 当我指定 MinimumPrecision 时 我实际上是在图表中 选择我想要操作的区域 当我用 forRecall 选择一个召回点时 我会沿着曲线选择一个点 作为我的操作点 现在如果操作点 在我选择的有效区域中 那么这就是过滤系统 在查看特定类时
如果操作点 不在有效区域中 则没有满足 我所述约束的操作点 并且该类将始终 从我的结果中过滤掉
从这个意义上讲 你需要做的就是 提供你想要操作的 准确度和召回率 过滤系统将 自动为你确定必要的阈值 总而言之 我在执行图像分类时 得到的观察 实际上是一个观察数组 分类中的每个类 都有一个值
因为这是一个多标签的问题 所以置信度之和不等于1 相反,我们有独立的 置信值 在0到1之间每个类都有一个 我们需要了解准确度和召回 以及它们如何 应用于我们的特定用例 以便应用 hasMinimumPrecision 或 hasMinimumRecall 进行过滤筛选 这对我们的 App 有意义 所以这就总结了 图像分类部分 我想换个时间 再探讨相关的话题 图像相似性
当我们谈论 图像相似性时 我们真正的意思是 一种描述图像内容的方法 和比较这些描述的另一种方法
描述图像内容 最基本方法是 使用源像素本身
也就是说 我可以搜索 其他具有接近 或完全相同像素值的图像 并检索它们
然而如果我以这种方式进行搜索 它会非常脆弱 很容易被旋转 或光照增强等 微小变化所影响 这些变化会大幅改变像素值 但不会改变图像中的 语义内容 我真正想要的是 对图像内容的 更高级描述 可能有点儿像自然语言 我可以使用我之前描述的 图像分类 API 以便提取 描述我的图像的一组词 然后我可以检索 具有类似分类的其他图像 我甚至可以 将它与词向量结合起来 来解释 类似但不完全匹配的单词 如 cat 和 kitten 如果我执行这样的搜索 我可能会在一般意义上 得到类似的对象 但这些对象的 出现方式以及 它们之间的关系 可能会有很大差异 同样我也会受到 分类方法的限制 也就是说 在我的图像中 出现的任何不在 分类网络分类系统中的对象 都不能在这样的搜索中表示出来
我真正想要的是 对图像中出现的对象的 高级描述 这些对象没有 固定在精确的像素值上 但仍然受到注意 我也希望这适用于 任何自然图像 而不仅仅是在特定的分类中 事实证明 这种表征学习 是我们分类网络 作为其训练过程的一部分 自然产生的
网络的上层 包含执行分类所需的所有显著信息 同时丢弃 对该任务没有帮助的 任何冗余 或不必要信息 我们可以利用 这些上层作为特征描述符 就是我们所说的 FeaturePrint
FeaturePrint 是一个向量 这些内容 不受特定分类系统的约束 甚至不受分类网络 所训练的分类系统限制 它只是 在训练过程中 利用网络对图像的了解
如果我们查看这对图像 我们可以比较 它们 FeaturePrint 的相似程度 并且值越小 两个图像 在语义上越相似 我们可以看到 尽管这两张猫的图像 在视觉上是不同的 但它们具有 比视觉上相似的不同动物 更相似的 FeaturePrint 为了使这个更具体一点 下面我们来看 一个具体的例子 假设我在屏幕上有 源图像 我想找到其他 语义相似的的图像 我将选取一个图像库 计算每个图像的 FeaturePrint 然后检索那些 与源图像具有 最相似 FeaturePrint 的图像 当我用咖啡厅里 一位绅士的图像做这件事时 我发现我也同时得到了 咖啡厅和餐厅里 其他人的图像 如果我把注意力 集中在一份报纸上 我就会看到其他报纸的图片 如果我把焦点放在茶壶上 我会看到其他的茶壶图像
现在我想邀请 Vision 团队在舞台上 帮我做个演示 演示下如何进一步扩展 图像相似性
大家好 我叫 Brett 今天我们将用一种非常有趣的方式 来展示图像相似性 我们创造性地称之为 图像相似性游戏
这里是玩法说明 你在一张纸上画些东西 然后请几个朋友 尽可能的重新创作出 你的原作 所以我将从画原图开始
好 接下来点击 Continue 将其作为原始文件进行扫描
然后保存
现在我的团队 将扮演参赛者的角色 他们将尽可能地把这个画得最好
当他们正在绘图时 我要告诉你 这个示例 App 现在作为示例代码 可在开发者文档网站上提供给你 而且我们正在使用 VisionKit 文档扫描仪 扫描我们的绘图 你可以在我们的 文字识别会议中了解更多
再给他们
几秒钟的时间 五 四 三 好 我想他们都已经完成了 好的现在我们把它们拿出来 开始扫描 第一位参赛者作品
非常不错
这有可能会是冠军 再来看看第二位选手的
也很不错 很棒 接下来三号选手
我觉得也很好 第四位
这个我就不知道了 我们要看会出现什么情况 好了 我们把这些保存下来 其实可以发现 获胜者是一号参赛者 恭喜 现在我划过去 我们可以看到 这些面孔在语义上更相似 它们更接近原始绘图 而树在语义上是不同的 这与原来的图像 有一些差别 这就是图像相似度游戏 下面让我们把舞台 交给我的伙伴 Rohan 谢谢大家 我想快速浏览 演示 App 中的一个片段 向大家展示 我们如何确定获胜的选手
这里我有一部分代码 它比较了每个参赛者绘画的 FeaturePrint 和 Brett 绘画的 FeaturePrint 现在我通过 App 中定义的 featureprintObservationForImage 函数 提取了参赛者的 FeaturePrint 一旦我有了每一个 FeaturePrint 我就需要确定它 与原始绘图的相似程度 我可以使用 computeDistance 来做到这一点 它会反馈给我一个浮点值 浮点值越小 说明两个图像越相似 因此 一旦我为每个参赛者 确定了这个 我则只需要对它们进行排序 就可以确定获胜者
好了 这就是 关于图像相似性部分的阐释 现在有请我的搭档 Sergey 由他和大家共同探讨 人脸识别技术的 变化和发展
大家上午好 我是 Sergey Kamensky 是来自 Vision 框架团队的 一名软件工程师 我很高兴 今天能与大家分享 今年框架中的更多新特性 我们先来谈谈人脸识别技术 记不记得 两年前 当我们介绍 Vision 框架时 我们还谈到了人脸检测识别 今年 我们将对该算法进行新的修改 那么 变化是什么呢
首先 与之前的 65 点消除相比 我们现在发展到了 76 点消除 76 点消除给了我们 更大的密度 来表示不同的面部区域 其次我们现在报告 每个标志点的置信度得分 正如我们之前报告的那样 这是对单个平均置信度得分的对比 不过最大的改进 来自瞳孔检测 如你所见 右侧的图像检测到瞳孔的 准确度要高得多 00:28:23.516 --> 00:28:25.886 A:middle 我们来看看
客户端代码示例
这个代码片段 将在整个演示过程中重复 所以我们第一次将逐行进行 另外,我在我的样本中 没有使用边界条件 只是为了简化演示 那么在开发 App 时 你也许应该使用适当的错误处理 来避免不想要的边界情况 下面我们回到示例上来
为了得到你的 面部标志 首先你需要创建一个 DetectFaceLandmarksRequest 然后,你需要创建 ImageRequestHandler 将需要处理的图像传递给它 然后使用 该请求处理器 来处理你的请求 最后 你需要查看结果 这张人脸 在 Vision 框架中的 所有相关结果 都将以 faceObservation 的形式出现 faceObservation 得出一些 检测到的对象观察 它继承了边界框属性 并且还在其级别上 添加了几个其他属性 来描述人脸 这次我们对 标记属性感兴趣 标记属性属于 FaceLandmarks2D 类 FaceLandmarks2D 类 由置信度得分组成 这是整个集合 和多个面部区域的 单个平均置信度得分 其中每个面部区域 由 FaceLandmarksRegion2D 类表示 让我们仔细看一下 这个类的属性 首先是 pointCount PointCount 将告诉你 有多少点代表 特定的面部区域 此属性将显示不同的值 具体取决于 你如何配置请求 比如 65 点消除 还是 76 点消除
normalizedPoints 属性 将表示实际的标记点 而 precisionEstimatesPerPoint 将表示 实际标记点的 实际置信度得分
我们来看看所需的代码 这与上一张幻灯片中 代码片段相同 但现在我们将从 一个稍微不同的角度来看待它 我们想看看 在 Vision 框架中如何修改算法 如果你获取此代码段 并用去年的 SDK 重新编译它 你将得到的请求对象 将配置如下 Revision 属性将设置为 Revision2 Cancellation 属性将设置为 Cancellation65Points 从技术上讲 去年我们没有消除属性 但如果我们这样做的话 可以将它设置为一个单一的值 另一方面 如果你获取相同的代码片段 并用今年的 SDK 重新编译它 你将得到的是 Revision 属性将被设置为 Revision3 Cancellation 属性 将被设置为 Cancellation76Points
这实际上代表了 Vision 框架在默认情况下 如何处理算法修订的原理 如果你不能指定修订版 我们将提供 编译和链接代码所依据的 SDK支持的最新版本 当然 我们始终建议 明确设置这些属性 这只是为了保证 将来的确定性行为 现在让我们使用 今年开发的一项新指标 面部捕捉质量 屏幕上有两个图像 你可以清楚地看到 其中一幅图像 是在更好的照明 和聚焦条件下拍摄的 我们想开发一个度量标准 将图像作为一个整体来看待 并给出一个分数 用来说明面部捕捉质量 的好坏 因此 我们提出了面部捕捉质量指标 我们用这种方法 训练我们的模型 因此如果图像是用弱光 或弱焦点拍摄的 或一个人有负面表情 那他们的得分就会更低 如果我们在这两个图像上 运行此指标 我们将得到我们的分数 这些是浮点数 你可以将它们相互比较 你可以说 得分更高的图像 就是质量更好的图像 接下来我们看一下代码示例
这与我们之前看到的 几张幻灯片非常相似 不同之处 在于请求类型和结果 由于我们使用的图像没变 我们可以再次查看 faceObservation 的结果 但现在我们要看一下 faceObservation 的不同属性 即面部捕捉质量属性 我们一起来看些其他的例子 假设 我有一系列图像 可以通过自拍相机 或照片连拍中的连拍模式获得 你要问自己一个问题 哪张照片 拍摄的质量最好
现在你可以做的是 对每一张图像运行我们的算法 分配分数 对它们进行排名 最亮的地方的图像 是以最佳质量捕捉的图像 我们试着去理解 如何解释 面部捕捉质量指标的结果 在幻灯片上 我有两个图像序列 每个序列都是同一个人的 每个序列由 在面部捕获质量方面 得分最低和最高的图像表示 对于这些范围 我们能说些什么呢
存在一些重叠区域 但也有一些区域 属于某一区域 而不属于另一个区域 如果你有另一个序列 可能会发生 完全没有重叠区域的情况 在这里我提出的观点是 不应将面部捕捉质量 与阈值进行比较
在这个特定的例子中 如果我选择 0.52 我将会错过左边的所有图像 而且我几乎可以得到 刚刚超过右边中点的 所有图像
但是什么是面部捕捉质量呢
我们定义面部捕获质量 是对同一主题的比较 或排名测量 现在比较和相同 是这句话的关键词 如果你在想 很酷我有这个很棒的新指标 我将用它开发我的 选美比赛 App
我想可能不是一个好主意 在选美比赛 App 中 你必须比较不同人的面孔 而这并不是该指标 开发和设计的目的
这就是人脸技术的改变和发展
下面我们来看一下 今年新增加的 探测技术
我们正在推出人体探测器 探测由人头和躯干组成的 人体上半身 还有一个宠物探测器 一个探测猫和狗的 动物探测器 动物探测器能为你提供边界框 除了边界框之外 它还为你提供了一个标签 说明检测到哪种动物
我们来看看 客户端代码示例
两个片段 一个用于人体探测器 一个用于动物探测器 与我们之前的情况非常相似 非常相似 同样差异在于你创建的 请求类型和结果中 现在对于人类探测器部分 我们关心的只是边界框 因此我们用其为 DetectedObjectObservation 服务
另一方面 对于动物探测器 我们也需要标签 因此我们使用 源于检测到的对象观察的 RecognizedObjectObservation 它延续了边界框 但也在边界框上添加了标签属性 这是新的探测器 下面让我们来看看 今年有关追踪的新内容 我们正在为追踪技术 设计一个新修订版 今年的变化是 边界框扩展区域 有所改进 我们现在可以更好的处理 遮挡问题 我们这次是以 机器学习为基础的 我们可以在多个 处理器设备上 以低功耗运行 我们来看一个示例 我这里有一个微视频剪辑 视频中一个男人在森林里跑步 他有时出现在树后 如你所见 跟踪器能够成功地 重新捕捉跟踪对象 并继续跟踪序列
谢谢
我们来看看客户端代码示例 这与我们去年 展示的片段完全相同 它代表了 你可以想象到的 最简单的跟踪序列 它会连续 5 帧 跟踪你感兴趣的对象
我想逐行解释 但在这里我想强调两点 首先是我们使用 SequenceRequestHandler
这与我们目前 在整个演示中使用的 ImageRequestHandler 完全不同 SequenceRequestHandler 在处理帧序列时用于 Vision 你需要在 帧与帧之间 缓存一些信息
第二点是 在实现跟踪序列时 需要从迭代编号 n 中 获取结果 并将其作为输入 提供给持续时间数 n+1 当然如果你使用 当前版本 SDK 重新编译 则默认情况下 请求的 revision 将设置为 Revision2 不过我们也 建议明确设置它 这就是跟踪
让我们来看看 有关 Vision 和 Core ML 集成的消息 去年 我们展示了 Vision 和 Core ML 的集成 并展示了 如何通过 Vision API 运行 Core ML 模型 这样做的好处是 你可以使用 1 到 5 个 不同的图像请求处理程序重载 来将你手中的图像 转换为 Core ML 模型所需的 图像类型 大小和颜色方案 我们将为你运行推理 并将来自 Core ML 模型的 输出或结果 打包到 Vision 观察值中
现在假设你有 一个不同的任务 例如你想进行 图像样式传输 你需要至少有两个图像 即图像内容和图像样式 你可能还需要 一些混合比例 说明在内容上需要应用多少样式 所以现在我有三个参数
今年 我们将推出 API 在这里我们可以 通过 Vision 将多个输入用于 Core ML 这包括多个图像输入 此外在输出部分 这个示例仅显示了一个输出 但是如果你有多个 特别是如果你有 多个相同类型 那么当它们后面 以观察形式出现时 很难区分开来 那么今年我们做了什么 我们在观察中 引入了一个新的字段 该字段完全映射到 输出部分中显示的名称
我们来看看输入和输出 我们将在下一张幻灯片中 使用它们
这是一段代码片段 它表示如何通过 Vision 使用 Core ML
突出显示的部分 显示了今年的新内容 我们现在先暂时保存它们 我们去查看代码 稍后再返回 要通过 Vision 运行 Core ML 首先需要 记录 Core ML 模型
然后你需要围绕它创建 Vision CoreMLmodel 包装器 之后你需要创建 Vision CoreMLRequest 并传入该包装器
下一步 创建 ImageRequestHandler 处理你的请求 然后查看结果
现在 使用我们今年添加的新 API 只有你去年 可以使用的图像是默认图像 或者主图像 是传递给 ImageRequestHandler 的图像 但这也是需要 将图像名称分配给 CoreMLModel 包装器的 inputImageFeatureName 字段
所有其他参数 无论图像与否 都必须通过 CoreMLmodel 包装的 featureProvider 属性传递 如你所见 图像样式和混合比例 是以这种方式传递的
最后当你查看结果时 你可以查看 出现的观察结果的 featureName 并且你可以在此情况下 将其与 imageResult 进行比较 这正是 Core ML 输出部分中 出现的名称 这样你就可以 相应地处理结果
今天的演示 到这里就要结束了 想要获得其他详细信息 请参阅幻灯片上的链接 谢谢大家 [掌声]
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。