CoreML模型分析

2023-10-29

准备工作

  1. 首先得有一个Xcode以及一个简单的添加了CoreMLFramework的工程;
  2. 下载模型,如官方推荐的MobileNetV2
  3. 将模型导入到工程中,并添加到你的编译项目中
  4. 双击打开,会看到这么一个页面:

在这里插入图片描述
5. 然后点击

在这里插入图片描述
就可以进入到模型自动生成的头文件中:
在这里插入图片描述

模型分析

1.关键词@interface

通过搜索关键词interface,我们可以得到三个结果:

@interface MobileNetV2Input : NSObject
@interface MobileNetV2Output : NSObject
@interface MobileNetV2 : NSObject

其中MobileNetV2Input是模型输入的类,Output是输出类,它们都继承自NSObject,最后的MobileNetV2是模型类。

2.MLFeatureProvider

在这里插入图片描述
这个协议定义了一个属性featureNames以及一个从某个featureName获取featureValue的方法featureValueForName,需要注意的是,这里的featureNames是一个NSSet!这一点非常重要,涉及到CoreML多输出的实现方法。

3.MobileNetV2Input

在这里插入图片描述
对输入而言,最重要的就是构造和初始化,这里CoreML提供了很多初始化的方法,从最简的传入CVPixelBufferRef到其他各种图像URL等方法,目的就是要完成对各个属性的赋值。因为我们这个模型输入只要一个图像,所以就只需要对image赋值即可。

4.MobileNetV2Output

在这里插入图片描述
前面已经说过Input只需要给各个属性值赋值,Output则需要能够表示模型的输出,并提供获取模型输出的方法,即模型输出的表示和获取方法。

5.MobileNetV2

如注释所说,这个类主要负责模型的加载和计算过程。

initWithMLModel:(MLModel *)model

initWithConfiguration:(MLModelConfiguration *)configuration error:(NSError * _Nullable __autoreleasing * _Nullable)error

initWithContentsOfURL:(NSURL *)modelURL error:(NSError * _Nullable __autoreleasing * _Nullable)error

initWithContentsOfURL:(NSURL *)modelURL configuration:(MLModelConfiguration *)configuration error:(NSError * _Nullable __autoreleasing * _Nullable)error

loadWithConfiguration:(MLModelConfiguration *)configuration completionHandler:(void (^)(MobileNetV2 * _Nullable model, NSError * _Nullable error))handler

loadContentsOfURL(NSURL *)modelURL configuration:(MLModelConfiguration *)configuration completionHandler:(void (^)(MobileNetV2 * _Nullable model, NSError * _Nullable error))handler

这些函数的目的都是初始化一个MobileNetV2实例,从函数名和参数我们看出,CoreML提供了多种灵活的初始化方法,来应对不同的使用场景。可以直接从一个MLModel类创建一个新的MobileNetV2实例,也可以从.mlmodelc的URL来加载,还可以通过MLModelConfiguration来决定是否要对模型进行特殊配置,最后两个load开头的函数是异步加载。

predictionFromFeatures:(MobileNetV2Input *)input error:(NSError * _Nullable __autoreleasing * _Nullable)error

predictionFromFeatures:(MobileNetV2Input *)input options:(MLPredictionOptions *)options error:(NSError * _Nullable __autoreleasing * _Nullable)error

predictionFromImage:(CVPixelBufferRef)image error:(NSError * _Nullable __autoreleasing * _Nullable)error

predictionsFromInputs:(NSArray<MobileNetV2Input*> *)inputArray options:(MLPredictionOptions *)options error:(NSError * _Nullable __autoreleasing * _Nullable)error

这四个函数都是用来完成预测,得到模型预测结果,只不过传入的参数不一样。前面两个的主要参数都是MobileNetV2Input,区别是是否使用MLPredictionOptions来做一些预测配置;predictionsFromInputs的主要参数也是MobileNetV2Input,只不过是多个MobileNetV2Input组成的NSArray,来适配多输入场景。predictionFromImage可能是我们最常用的一个方法,输入是一个CVPixelBufferRef,根据模型其格式也会做相应的调整,比如MobileNetV2就是:

color (kCVPixelFormatType_32BGRA) image buffer, 224 pixels wide by 224 pixels high

6.MLModelConfiguration

在这里插入图片描述
模型初始化时传入的配置类,最重要的就是这个computeUnits属性,可以设置只使用CPU、CPU和GPU以及所有设备三个选项:

MLComputeUnitsCPUOnly = 0
使用这个选项,则模型只能使用CPU来进行计算。
MLComputeUnitsCPUAndGPU = 1
使用这个选项,则模型可以使用CPU和GPU,但是不包括neural engine。
MLComputeUnitsAll = 2
使用这个选项,系统会自动选择计算设备,包括neural engine。

7.MLPredictionOptions

在这里插入图片描述
模型预测时的配置,最重要的是可以通过usesCPUOnly属性来控制是否仅仅使用CPU来进行推断,实测有效!

8. MLPredictionOptions 和 MLModelConfiguration的关系

根据目前的测试结果,这两个config都是有效的,最大的区别在于,MLPredictionOptions是Core ML1.0的设计,且属性值usesCPUOnly默认是False,即Core ML1.0默认使用GPU来进行推断;而MLPredictionOptions是2.0新增的,在模型初始化的时候就传入参数来确定计算设备,更重要的是,现在可以控制除了CPU和GPU之外的neural engine,当设置为ALL时,系统会自动选择使用最佳设备。针对这两种功能相似的结构体,有一个判断原则,功能更多的一定是后来出现的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CoreML模型分析 的相关文章

  • mgwt - 以编程方式改变方向

    是否可以在 gwt mgwt 应用程序中更改强制执行特定的屏幕方向 可以说我希望用户始终以横向模式使用应用程序 这取决于 是作为phonegap应用程序 而不是在浏览器内部 如果您作为 Web 应用程序运行 则不需要t get any co
  • 如何在 Swift 中使用indexesOfObjectsPassingTest:

    IndexOfObjectsPassingTest 的声明在 Swift 中看起来像这样 func indexesOfObjectsPassingTest predicate AnyObject Int CMutablePointer
  • UITableView:显示 tableFooterView 时运行代码?

    我正在使用 UIView表页脚视图 http developer apple com library ios documentation uikit reference UITableView Class Reference Referen
  • AFNetworking XML 请求问题

    我在用着AFNetworking 2使用 JSON 响应 它工作正常 现在我必须将其转换为 XML 而不是使用 JSON 因为服务器响应是 XML 格式的 在我搜索之后 我找到了这段代码 但它不起作用 与 Charles 我发现请求是错误的
  • 使用 NSString 进行 UTF8 解码

    我是 Objective C 新手 尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http developer apple com library mac documentation Coc
  • 如何开始复杂级别的跨平台移动应用开发? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • `navigator.geolocation.getCurrentPosition()` 在 iOS PWA 上挂起

    我有这个片段 const getCurrentPosition gt new Promise
  • 错误域=kAFAssistantErrorDomain 代码=209“(空)”

    我面临着一个问题SFSpeechRecognizer 启动应用程序几秒钟后 我开始收到错误消息 错误域 kAFAssistantErrorDomain 代码 209 空 和 错误 域 kAFAssistantErrorDomain 代码 2
  • 有关 Swift 编译器选项的文档

    您好 我想开始在 Apple Swift 语言上运行一些微基准测试 然而 我觉得很难找到有关编译器优化的不同选项的适当文档 我读过很多关于其他人的语言微基准的问题和文章 但是如果能有一些关于该主题的可靠文档那就太好了 在最新的测试版中 使用
  • CALayer边框奇怪问题

    我正在向 CALayer 添加边框 但有一些奇怪的行为 在我应用的边框之后出现模糊边框 参见屏幕截图 这是我的代码 void configureLabel self hidden YES self textAlignment NSTextA
  • 为什么 iOS 启动屏幕很慢?

    我的 iOS 应用程序启动屏幕大约需要 3 5 秒 我有一张将在启动屏幕后加载的地图 我的用户必须等待启动屏幕加载 然后再等待 3 秒才能加载地图 有没有办法最大限度地减少启动屏幕时间 基本上这种延迟意味着you在启动过程中做了一些非常错误
  • 从命令行添加 Xcode 开发者帐户

    我正在尝试使用xcodebuild allowProvisioningUpdates在我只能通过命令行访问的计算机 Azure Devops macOS 托管计算机 上 不幸的是 根据man xcodebuild为了使用 allowProv
  • 构建错误重复符号 arclite.o

    我正在尝试构建我的 Xcode 项目 但收到下面显示的错误 请帮我解决这个错误 提前谢谢您 duplicate symbol non lazy classes in Applications Xcode app Contents Devel
  • 贴纸包会在模拟器上使 iMessage 崩溃,但在 iPhone 上不会崩溃

    按照 Apple 的在线说明和视频在 Xcode 中创建了一个贴纸包 所有图像的尺寸均正确且远低于文件大小阈值 如果我在我的实体 iPhone 上构建并运行贴纸包 一切都会完美运行 如果我在模拟器上构建并运行贴纸包 对于任何模拟的 iPho
  • “预期的 ';'在 Swift 下的顶级声明符之后”

    我正在尝试将所有颜色设置在一个 Swift 文件中 该文件可以在我的整个应用程序中使用 下面的代码会导致 import Foundation import UIKit class DotColors let tsblueColor UICo
  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • watchOS 错误:控制器接口描述中的未知属性

    我将 WKInterfacePicker 添加到情节提要中 并将其连接到界面控制器中的 IBOutlet 运行应用程序时 它在控制台中显示一条错误消息 控制器的接口描述 watchPicker 中的未知属性 Code interface I
  • 访问目标 c 中的类方法。使用 self 还是类名?

    我正在学习 iOS 编程 并且对以下有关关键字 self 的使用的代码感到困惑 据我了解 self就像Java的this 它指的是当前实例 当我想调用类方法时 通常的方式应该是这样 PlayingCard validSuits 但是侵入实例
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • UIView 圆角 - Swift 2.0?

    我会尝试将一些项目更新到 Swift 2 0 我有一个视图 左上角有一个圆角 在 Swift 没有警告 没有错误 只是没有圆角 这就是它在 Swift let maskPath UIBezierPath roundedRect conten

随机推荐

  • 区块链-技术简介(*)

    1 什么是区块链 区块链技术是利用块链式数据结构来验证与存储数据 利用分布式节点共识算法来生成和更新数据 利用密码学的方式保证数据传输和访问的安全 利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式 简单
  • PTA(Basic Level) 1029_旧键盘 Python实现

    1029 旧键盘 Python实现 下面是题目信息 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及实际被输入的文字 请你列出肯定坏掉的那些键 输入格式 输入在 2 行中分别给出应该输入的文
  • 【AI PC端算法优化】二,一步步优化自然饱和度算法

    上一节的RGB转灰度图算法我又做了两个相关优化 加入了多线程以及去掉了上次SSE计算中的一些重复计算 现在相对于传统实现已经可以获得4倍加速 同时我也在做一个AVX2的优化 所以不久后我将发布一个RGB转灰度图算法优化的升级版 尝试触摸这一
  • 华为手机上的网上邻居怎么用_华为手机如何无线连接电脑

    不少朋友都会使用手机作为猫无线上网 那你知道如何用华为手机连接电脑3G上网 下面是小编给大家整理的一些有关华为手机连接电脑的方法 希望对大家有帮助 华为手机连接电脑的方法首先要确保已经安装了华为手机的驱动 接着在电脑的网上邻居那里点击右键
  • 浅谈对集群、分布式、分布式集群、微服务的理解

    我认为集群是个物理形态 分布式是个工作方式 分布式其实也是物理形态 这里相比较而言的 当集群中的服务器都做同样的事情时 集群就是一个集群 当集群中的服务器各司其职时 他就变成了分布式 所以说分布式中的每一个节点都可以是集群 但是集群并不一定
  • ES6的迭代器与迭代协议Symbol.iterator

    前言 ES6新增了两个协议 可迭代协议 对象必须具有Symbol Iterator属性 属性值为一个函数 当这个对象被迭代时 就会调用该函数 返回一个迭代器 迭代器协议 描述了迭代器对象的具体规则 迭代器 迭代器 它是用于访问集合类的标准访
  • 如何解决pip更新问题.WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.

    出现如图所示 当直接输入python m pip install upgrade pip更新还报错的时候 输入命令 python m pip install pip 结果如图所示 亲测有效
  • mysql注解参数_MySQL主从复制参数注解

    MySQL主从复制参数注解 master所有参数 1 log bin mysql bin 1 控制master的是否开启binlog记录功能 2 二进制文件最好放在单独的目录下 这不但方便优化 更方便维护 3 重新命名二进制日志很简单 只需
  • String的intern()方法浅析

    简介 String intern 方法是一种手动将字符串加入常量池中的native方法 原理如下 如果在当前类的常量池中存在与调用intern 方法的字符串等值的字符串 就直接返回常量池中相应字符串的引用 否则在常量池中复制一份该字符串 J
  • 连续不等_从“Jensen不等式”导出几个著名不等式

    常用的著名不等式 从Jensen不等式出发导出其他一些知名不等式 加权AG不等式 对 有 证明 记 因为对数函数为凸函数 使用加权琴生不等式 可得 Young不等式 若 则 证明 利用上述 加权AG不等式有 记 带入整理可得Young不等式
  • 2.2设备树的规范(dts和dtb)——DTB格式

    本节讲述设备树的dtb格式 上节讲述了dts格式 回顾上节 在dts文件和dtsi文件中 可以使用C语言的define和include 使用方法和作用也同C语言相同 编写dts文件后 需要使用dtc工具将dts文件编译成dtb文件 dtc工
  • Linux应用开发程序测试

    文章目录 前言 一 通过SDK开发应用程序 创建工程 将该工程的 elf 文件运行在我们搭建的Linux上 3 SDK调试 小总结 1 打开SDK 创建Linux应用程序工程 2 编写代码 3 编译代码 4 将可执行文件拷贝到开发板根文件系
  • Python,OpenCV应用轮廓逼近算法,检测对象的形状

    上一篇博客 我们学习了如何利用Python OpenCV计算轮廓的中心 这一节学习仅运用轮廓的基本属性来检测其形状 三角形 正方形 矩形 五边形 圆 1 利用轮廓逼近 将曲线上的点数减少为更简单的近似版本的过程 2 基于该轮廓逼近 检查每种
  • 自学网络安全,学习路线图必不可少,【282G】初级网络安全学习资源分享!

    前言 在自学网络安全的时候 我们总会遇到一些问题 我们可以在网上看到很多关于前端的这些问题 你们都是怎么学网络安全web前端的 零基础 怎么自学好网络安全 网络安全需要学多久 都学哪些知识 想成为一名合格的网络安全工程师 需要掌握哪些技能
  • SpringBoot第 6 讲:SpringBoot+jersey跨域文件上传

    一 创建Maven项目 参考 SpringBoot第 1 讲 HelloWorld 秦毅翔的专栏 CSDN博客 二 修改pom xm
  • 爬虫保存cookies时重要的两个参数(ignore_discard和ignore_expires)的作用

    代码如下 由于临时做的实例采用登录云打码平台的cookies import requests from lxml html import etree from fake useragent import UserAgent from htt
  • golang rpcx记录一次解决 context deadline exceeded的问题

    测试同时并发一万个应用去调用另一个微服务应用结果出现了上下文切换超时的问题 默认的超时时间只有一秒时间 程序在高并发的场景下很容易触发这个错误 最简单的解决办法就是把超时时间调大一点 以前设置的是一秒 现在调成五秒 另一种解决办法就是优化自
  • FHD、4K、8K为何物

    转自 http www 4k123 com thread 145 1 1 html 近段时间 分辨率是一个很热的话题 4K与8K两个词频繁曝光于各大行业网站 8月23日 联合国旗下的国际电讯联盟通过以日本NHK电视台所建议的7680x432
  • Springboot2.0快速入门(第一章)

    目录 一 SpringBoot简介 1 1 回顾什么是Spring 1 2 Spring是如何简化Java开发的 1 3 什么是SpringBoot 二 Hello World 2 1 准备工作 2 2 创建基础项目说明 2 3 创建第一个
  • CoreML模型分析

    准备工作 首先得有一个Xcode以及一个简单的添加了CoreMLFramework的工程 下载模型 如官方推荐的MobileNetV2 将模型导入到工程中 并添加到你的编译项目中 双击打开 会看到这么一个页面 5 然后点击 就可以进入到模型